anchor box 是指在目标检测过程中,一组预先定义的框的集合,用来标识出被检测到的物体,其width和height 与数据集中物体的width 和 height 相匹配。这些预定义的anchor box的尺寸包含了数据集中所有可能被检测到的物体的尺寸组合,eg. 应该包括不同的ratio 和 scale。通常预先定义 4-10 个anchor box作为图像中各个位置的候选anchor box。
在计算机视觉领域中,深度神经网络在图像分类、目标检测领域表现出了卓越的性能。 首先, 滑窗检测器在前向传播过程中定位单个物体。后来,滑窗检测器被可以处理整个图像并输出多个检测结果的single-shot、 two-stage 检测器所取代。这些检测器很大程度上是基于anchor box 的概念来优化滑窗检测算法的速度和效率。这是因为滑窗检测器需要多次前向传播来处理图像,但大部分前向传播过程只处理了背景像素。
如图所示:
Figure 1: Sliding window detector
训练目标检测网络的典型任务包括提出anchor boxes 或者 用传统computer vision 技术来搜索潜在的anchor。将一部分anchor boxes与 ground truth boxes 进行匹配,剩余未被匹配的anchors被当作背景处理,用这样的思路训练出正确的分类器。需要注意的是,预定义的anchor boxes可以理解为给卷积神经网络输出的feature map上的每一个点都预测固定数量的尺寸不一的boxes。
从本质上讲,提出anchor 就是确定一个适合数据集中大多数物体尺寸的boxes的集合。在图像上放置假设的、间隔均匀的boxes并创建一种映射关系,将feature map的输出映射到图像中的每个位置。
要了解如何提出 anchor boxes, 假设我们的目标检测数据集中原始图像的大小是256256,图像中包含一些物体,其大小在8080 ~ 80*40 之间。而通常目标检测项目中,检测框(ground truth boxes)通常的宽高比为1:1或2:1。因此,在anchor boxes提出过程中,应至少考虑提出1:1、2:1两种anchor boxes。图像中这些物体的大小比例(ratio)将定义为其长度、宽度(以像素为单位)占整个图像长度、宽度(以像素为单位)的比例。
e.g 假设图像width = 256 px = 1 unit, 那么一个 40px宽的object 占据 40px / 256px = 0.15625个宽度单位, 也就是说,这个物体占整个图像总宽度的15.625%。 类似的,数据集中每张图片的每个object都有对应的宽度、高度比例(ratio)来表示object的大小。
为了选择最能代表整个数据集中物体大小的一组比例,我们可以找到最大、最小物体作为参照,即数据集中所有对象的所有宽度、高度比例的最大值和最小值(将宽度ratio、高度ratio放在一起找最大、最小值)。若如果数据集中的最大和最小比例为0.15625和0.3125,而我们要为anchor boxes提议选择三个比例,则三个比例可能为0.15625、0.234375和0.3125。 如果使用上述两个boxes的宽高比(1:1和2:1)和这三个比例(0.15625、0.234375和0.3125)为该数据集提议anchor boxes,我们将总共有六个锚定框可以在所有输入图像中的任意位置中提议。
要掌握这些anchor boxes的位置,请看图2,图中显示的是图像上一个均匀分布的8×8网格。可以在每个单元格中心上提出一个anchor box。事实上,我们说的是在每个位置上提出六个框,共384个。在每个位置上,我们可以为每个box的宽高比和之前选择的object比例的组合提出一个框,每个网格中心点总共有六个框。在每个位置上提出不同长宽比和比例的盒子,以覆盖所有的可能性。object detector采取这种方法来详尽地提出anchors。
Figure 2 : Image with 8*8 grid over it
为了得到卷积神经网对图2中网格的每个位置做出的预测,考虑一个4-channel的8×8 feature map,每个通道输出每个位置一个anchor box的x、y、width和height。而事实上,每个grid中心点都有6个anchor boxes, 所以有 46 channel的88 featuremap。通常应用到anchor boxes概念的网络架构所输出的特征图是8的倍数,是因为卷积神经网基本上对输入进行了下采样,同时通过二维卷积和池化操作保留了重要的空间特征,完全卷积层输出了密集的特征图,如图3所示。
Figure 3: Conv layers showing how down-sampling occurs and how each progressive feature map is smaller.
还有一种情况需要注意,物体的大小可能小于图像中网格(grid)大小,在对input image生成网格的过程中,一个网格中可能包含了多个小物体。可以通过提出更精细的网格并相应调整特征图输出形状来解决。更好的是,可以使用多个网格,并将它们映射到卷积层中的不同卷积层,就像SSD和RetinaNet的预测头使用的特征金字塔网络一样。
在下一小节中,我们讨论在inference阶段生成 ground truth batches 或解释预测结果时,如何需要在图像上不同位置提出anchors。
如上所属,一组anchor boxes可以描述整个数据集,并被一次性提出。在对每个特征图位置的每个提议的anchor box应用预测偏移之前,可以在任何时刻进行。object detector 并不预测boxes确切的坐标数值,而是会为每个提出的anchor box(anchor box proposal) 预测一组坐标offset和物体所属类别的confidence score。在对神经网络输出进行解释之前,网络并不会将feature map中的坐标映射到input image的某个位置。
理论上来说,由于每幅图像总是与同一套固定形式的anchor box相关联,并且ground truth 在训练过程中也不会发生改变,所以并不需要多次提出anchor box,也不需要多次将anchor box与ground truth 或背景进行匹配。当然,这些取决于个人代码编写。通常提议的anchor boxes与ground truth的提议发生在一个batch generator内。有时候提议生成层(proposal generating layers) 会被加入到网络结构当中,目的将anchor数据添加到网络输出tensor中,但不论如何,anchor boxes的生成过程的逻辑都是类似的。
在了解这一点后,我们可以更快了解何时在图像中生成anchor box proposal,或更确切地说,系统何时真正需要初始化这些anchor boxes并将数据结构传入内存以备使用——在 batch generation time将proposal与ground truth 进行匹配并且在inference 阶段将预测的offsets 应用到proposal中去。在上述这些时间节点,anchor boxes必须已经被提出了。
Ground truth batches 必须包含需要学习的目标offsets,并且要包含提议的anchors。后者在训练阶段并不会被使用但是的确避免了在inference阶段将anchors、offset预测与其他数据结构或代码相关联的情况。目标offset 应为将anchor box proposal 移动至与之匹配的ground truth所需的精确数值;同时,若预测为背景(background)则offset为0,因为背景不需要纠正。
概括地说,anchor-based batch generators 构建了一个learning target —— 在训练过程中将考虑图像中的每个anchor box,无论这个anchor是否被判断为foreground 或者 background。按照上述例子,一个batch 从6个anchor box开始,分别位于8*8个grid的中心点,总共384个anchor box。
每个anchor box 都会通过以下步骤与ground truth 进行匹配:
现在来探索一下一个batch究竟是什么样的。首先拥有一个拥有全部提议anchor box的集合(在我们的示例中是384 个),与ground truth 匹配的框将会包含它所属的object category(类别)并且会更新offset来纠正anchor box的位置。被认定为模棱两可的或是背景的anchor box会将offset保持为0。 这些offset是需要被我们的神经网络去拟合的。这些是在bounding box regression 阶段需要被学习的数值。
确定哪些背景offset将被用于权重更新,并且丢弃不匹配的anchor box的过程将会在损失函数阶段出现。
神经网络预测了每个feature map位置上所有提议的offset。 这意味着ground truth数据包含了anchor box到ground truth box 的真实offset,而背景box的真实offset保持为零。 这些零值将被忽略,否则background anchor box 的offset会被计算到Loss中。这是因为:object detection是关于learning查找foreground object的,并且通常仅对foreground 最小化bound box回归损失(在预测的偏移量和正确的偏移量之间)。 换句话说,背景部分不应该对目标检测的过程产生影响,背景中并不包含物体,所以当然不存在anchor与ground truth之间的offset。
通常 classification Loss 通过使用全部background boxes的子集来处理class imbalance的问题。这是因为对每个点都有6个提议的anchor boxes,总共有384个,那么大部分的box都将是背景,这就造成了class imbalance问题。一种常用的解决方式就是采用hard negative mining方法 —— 根据一个自定义的ratio(通常是1:3,foreground:background)来选择哪些background box会被使用在Loss计算中。另一种常用的方法是降低易分类物体的权重(down-weighting loss contributions of easily classifiable examples),就像在RetinaNet中所用到的Focal Loss一样。
未完待续。。
https://www.wovenware.com/blog/2020/06/anchor-boxes-in-object-detection-when-where-and-how-to-propose-them-for-deep-learning-apps/#.X_6FEOgzZD_
https://d2l.ai/chapter_computer-vision/anchor.html
https://ww2.mathworks.cn/help/vision/ug/anchor-boxes-for-object-detection.html
https://towardsdatascience.com/anchor-boxes-the-key-to-quality-object-detection-ddf9d612d4f9
https://blog.roboflow.com/what-is-an-anchor-box/