持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
候选区域
候选区域 (Region proposal) 也称区域提议,要了解什么是候选区域,我们首先需要了解什么是区域,在目标检测上下文中,区域是整个图像的一部分,且该部分中的像素值非常相似。而候选区域是整个图像中较小的部分,且该部分包含特定目标对象的可能性较高。候选区域对于目标定位非常重要,因为我们需要从图像中提取候选对象,而对象位于这些区域之中的几率很高。接下来,我们将通过研究为图像内的人物生成边界框来学习如何生成候选区域。
选择性搜索
选择性搜索是在对象检测中常用的区域提议算法,它的运行速度很快,且具有很高的召回率。它首先将图片划分成很多小区域,然后基于颜色、纹理、大小和形状相似度合并这些小区域得到较大的尺寸区域。候选区域可以使用一个名为 selectivesearch 的 Python 库生成。
selectivesearch 库中的选择性搜索通过使用 Felzenszwalb 和 Huttenlocher 的基于图的分割方法,基于像素的强度对图像进行分割,生成数千个候选区域。然后,选择性搜索算法将这些分割后的区域作为初始输入,迭代执行以下步骤:
- 将分割后的区域相对应的所有边界框添加到候选区域列表中
- 根据相似度将相邻的小区域分组
- 在每次迭代中,将形成较大的区域并将其添加到候选区域列表中。因此,我们采用自下而上的方法创建了从较小区域到较大区域的候选区域
- 选择性搜索使用基于颜色,纹理,大小和形状的四个相似性度量来合并生成候选区域
候选区域有助于识别图像中可能感兴趣的对象。因此,我们可以将定位操作转换为分类操作,将每个区域分类为是否包含感兴趣的对象。
利用选择性搜索提取图像中的候选区域
在本节中,我们利用选择性搜索提取图像中的候选区域。
首先,像安装其他第三方库一样安装 selectivesearch:
pip install selectivesearch
导入相关的库,并加载图像:
import matplotlib.pyplot as plt
import cv2
import selectivesearch
img = cv2.imread('4.png')
提取候选区域:
img_lbl, regions = selectivesearch.selective_search(img, scale=100, min_size=2500)
参数 min_size 用于限制候选区域的大小,此处限制其至少应为 2500 像素,参数 scale 设置有效的观察范围,较大的 scale 会导致偏向于生成较大区域。
检查最终获取的候选区域数,并将区域大小大于 2500 像素的所有区域存储到候选项元组 candidates 中:
print(len(regions))
candidates = set()
for r in regions:
if r['rect'] in candidates:
continue
# 排除小于2500像素的区域
if r['size'] < 2500:
continue
x, y, w, h = r['rect']
candidates.add(r['rect'])
利用 candidates 绘制结果图像:
import matplotlib.patches as mpatches
fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
for x, y, w, h in candidates:
rect = mpatches.Rectangle(
(x, y), w, h, fill=False, edgecolor='red', linewidth=1)
ax.add_patch(rect)
plt.show()
绘制的结果图像如下所示,可以看出,我们从图像中提取了多个区域: