点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
直观上,我们如何预测图像中的边界框?第一个最明显的技术是滑动窗口。我们定义一个任意大小的窗口,并在图像中“滑动”它。在每一步中,我们分类窗口是否包含我们感兴趣的对象。这就是我们所想的,对吧?那么,锚框将是它的“深度学习”版本。它更快,也更精确。
我们不只是滑动一个窗口,而是同时滑动一组不同大小和形状的窗口。有些是小的用于小物体,有些是大的用于大物体,有些是高而瘦的用于人,有些是短而宽的用于公交车。
这些预定义的“窗口”就是锚框。它们就像你放在图像上的一堆模板。我们不需要到处搜索;我们只需检查每个模板(锚框)是否适合(或接近适合)一个物体。然后,我们的模型学会调整这些模板(锚框)以完美匹配它找到的物体。
定义
锚框是预定义的各种大小和宽高比的边界框,作为目标检测的参考点。模型不是从头开始预测框,而是调整这些锚框以更好地适应实际物体,从而提高检测的准确性和效率。
锚框与边界框
首先,我们取一个锚框,并系统地将其放置在整个图像上,类似于滑动窗口方法。
然而,注意到这些锚框中没有一个完美匹配图像中的实际物体。由于我们只使用一种形状和大小的锚框,它无法捕捉到不同尺寸和宽高比的物体。因此,仅靠这种方法不足以进行准确的目标检测。
架构看起来更像这样;锚框应用于特征图,然后它们被细化为边界框
关于锚框
什么是特征图?
特征图是由卷积神经网络(CNN)创建的图像的处理版本。它们在不同细节层次上捕捉重要模式,如边缘、纹理和物体形状。锚框不是放置在原始图像上,而是放置在特征图上,使模型能够更有效地进行预测。
为什么锚框应用于特征图而不是图像?
1. 计算效率
示例:
2. 更丰富的特征表示
3. 尺度不变性(有效检测小和大物体)
目标检测中的一个巨大挑战是物体有不同的尺寸。有些物体可能小而远,而有些物体可能大而近。如果我们将锚框直接放置在图像上,它们将具有相同的尺度,使得检测不同尺寸的物体变得困难。如果我们将锚框直接放置在图像上,它们将具有固定的大小,并且不会调整以适应不同物体的大小。
示例:
想象我们正在尝试检测图像中的汽车:
如果我们只使用一个固定大小的锚框(例如100×100像素),它将无法正确匹配小汽车和大汽车:
当图像通过CNN时,它会在不同层次创建多个特征图:
通过在特征图上放置锚框,模型可以自动调整以检测:
早期层 — 检测小物体
示例:
想象我们正在检测图像中的汽车。远处的小汽车可能只有30×30像素。
深层 — 检测大物体
示例:
前景中的大汽车可能是300×300像素。
多尺度锚框 — 覆盖所有尺寸
我们不在特征图的不同层上只使用一种大小的锚框,而是应用多种大小的锚框。这样,我们可以在同一图像中检测小物体和大物体。
多尺度锚框示例:
在CNN的不同层,我们可能放置以下大小的锚框:
4. 两阶段检测器中的更快区域提议
示例:
锚框是如何生成的?
虽然锚框应用于特征图,但我们仍然需要决定它们的形状、大小和宽高比。关键问题包括:
为了捕捉不同尺度和形状的物体,我们使用一组多样化的锚框。这些框需要仔细选择以与数据集中常见的物体对齐。
如何选择锚框?
选择锚框涉及手动设计和数据驱动优化的结合:
手动选择:
使用K-Means聚类:
在目标检测中生成锚框
一旦确定了锚框的大小和宽高比,我们生成多个不同大小和变化的锚框。这些变化包括:
这导致了一组大量的锚框,确保可以有效地检测各种形状和大小的物体。
在推理过程中如何生成锚框?
生成锚框的确切方法取决于所使用的目标检测算法。
示例:Faster R-CNN和区域提议网络(RPN)的作用
在Faster R-CNN中,区域提议网络(RPN)负责生成潜在的对象位置。
RPN如何与锚框一起工作:
锚框变化示例
假设我们定义了一个16×16大小的锚框,并应用:
这导致每个区域有6个锚框:
这确保我们覆盖多种物体形状(方形、宽、高)和多种物体大小(小到大)。
通过使用多样化的锚框,模型可以准确检测小而远的物体和大而近的物体。
从锚框到边界框
锚框不是最终的边界框;它们只是预定义的参考形状,用于帮助模型预测实际物体位置。为了将锚框转换为最终的边界框,模型根据图像中的物体调整(或“回归”)它们。让我们通过一个示例逐步分解这个过程。
步骤1:在特征图上生成锚框
示例:
假设我们有一个10×10的特征图,在每个位置上放置3个不同大小的锚框:
由于我们有100个空间位置(10×10特征图)和每个位置3个锚框,我们最终得到300个锚框。
步骤2:预测物体得分
评估每个锚框以确定是否包含物体。
示例:
步骤3:调整锚框(边界框回归)
即使锚框接近物体,它也可能没有完美对齐。因此,模型调整(或“回归”)锚框坐标以更好地适应物体。
模型为每个锚框预测四个调整(偏移):
新的边界框坐标计算如下:
示例:
步骤4:去除冗余框(非最大抑制)
示例:
最终结果
经过所有这些步骤,我们得到一个最终边界框,紧密地围绕检测到的物体。
示例总结:
【参考资料】
终于理解目标检测中的锚框(2D和3D):https://www.thinkautonomous.ai/blog/anchor-boxes/
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~