也许你正在学习计算机视觉的路上,并且已经深入研究了图像分类和滑动窗口检测器。
在掌握了这些概念之后,了解最新技术(SOTA)目标检测,往往会变得令人望而生畏和晦涩难懂,尤其是在理解Anchor时。
毋庸讳言,深入大量流行的YOLO、SSD、R-CNN、Fast RCNN、Faster RCNN、Mask RCNN和RetinaNet,了解Anchor是一项艰巨的工作,尤其是在您对实际代码了解有限时。
如果我告诉你,你可以利用今天深入学习目标检测背后的Anchor呢?本文目标是帮助读者梳理Anchor的以下内容:
- What:anchor是什么?
- Where:如何以及在何处对图像生成anchor以用于目标检测训练?
- When:何时可以生成anchor?
- Why:为什么要学习偏移而不是实际值?
- How:如何在训练过程中修正选定的anchor以实现训练对象检测模型?
1、What:anchor是什么?
anchor是指预定义的框集合,其宽度和高度与数据集中目标的宽度和高度相匹配。
预置的anchor包含在数据集中存在的目标大小的组合,如:数据中目标存在的不同长宽比(ratio)、大小(scale)和位置(location)。通常,在图像中的每一个位置预置4-10个anchor。
典型的目标检测网络的训练过程如下:生成预置anchor,将生成的anchor与ground truth配对,配对成功的分配给前景类别,其余anchor分配给背景类别,然后进行sampling和训练。
而推理过程就是对anchor的分类和回归,score大于阈值的anchor进一步做后处理计算,小于阈值的作为背景舍弃,这样就得到了目标检测的结果。
2、Where:如何以及在何处对图像生成anchor,以用于目标检测训练
本质上,生成anchor是为了确定一组合适的框,这些框适合数据中的大多数目标,并将假设的、均匀分布的框放置在图像上;
为了理解锚定框是如何被生成的,假设有一个包含小目标的256px * 256px图像,其中大多数目标尺度位于40px * 40px或80px * x 40px之间。下面从三个方面考量anchor:
a、aspect ratios(长宽比):因为假设的ground turth宽高比在1:1和2:1之间。因此,应至少考虑两个纵横比(1:1和2:1),用来生成此示例数据集的anchor。
b、scales (大小):指对象的长度或宽度占其包含图像的总长度或宽度的比例。
c、location(位置):除了框的形状,还需要Anchor空间位置信息,即的坐标。
例如,假设一个图像的宽度=256px=1个单位,那么一个40px宽的对象占据40px/256px=0.15625个单位的宽度,即这个对象占据整个图像宽度的15.62%。
为了选择一组最能代表数据的尺度,我们可以考虑具有最极端值的对象侧度量,即数据集中所有对象的所有宽度和高度之间的最小值和最大值。如果我们的示例数据集中最大和最小的比例是0.15625和0.3125,并且我们要为anchor选择三个比例,那么三个潜在的比例可能是0.15625、0.3125和0.234375(前面两个尺度的均值)。
如果使用上面提到的两个aspect ratios(长宽比,1:1和2:1)和scales (大小,0.15625、0.234375和0.3125)来建立此示例数据集的一组anchors,那么将在任何一个位置将总共有六个anchors。
目标检测器采用这样的规则来生成anchor,假设检测器网络输入的特征图是4-channel 8*8,然后可以在每个单元格中心上生成6个不同aspect ratios和scales的anchor,那么总共384个,这样就尽可能的涵盖所有可能性。
3、When:什么时候在图像上生成anchor?
检测器不预测anchor,而是为每个anchor预测一组值:a、anchor坐标偏移(offset),b、每个类别的置信度得分。
这意味着在每次图像推理过程中都将始终使用相同的anchor,并且将使用网络预测的偏移(offset)来更正该anchor。
知道了这一点,就很容易理解anchor需要初始化,并将此数据结构存储在内存中,以供实际使用时,如:在训练中与ground ruth匹配,在推断时将预测的偏移量应用于anchor。在这些点上,anchor的实际生成其实都已经生成了。
4、Why:为什么要学习偏移而不是实际值?为什么要学习偏移系数而不是偏移量
- 为什么要学习偏移而不是实际值?
Anchor已经粗略地“框住了”输入图像中的目标,明显的一个问题是,框的不够准确。因为受限于Anchor的生成方式,Anchor的坐标永远都是固定的那几个。所以,如果我们需要预测相对于Anchor的offset,那么,就可以通过预测的offset调整锚框位置,从而得到更精准的bounding box。
- 为什么要学习偏移系数而不是偏移量
以SSD为例,需要预测的ground turth计算方式如下:
首先,对于预测的bounding box的w和h可以通过anchor进行缩放,但有一个基本的要求,就是h和w都必须为正值,而网络最后一层的预测输出是没法保证正负的,所以最简单的方法就是对预测输出求exp,这样就保证了预测值恒为正。那么反过来,对预测目标就是求log。
其次,对cx和cy除以宽和高的处理是为了做尺度归一化。例如,大的box的绝对偏移量一般较大,而小的box的绝对偏移量一般较小,除以宽和高消除这种影响。即两个框大小不一,但相对值却一致。
5、How:如何在训练过程中修正选定的anchor以实现训练对象检测模型?
(1)回归任务:训练过程中,网络回归任务学习的target并不是feature map上每个位置的所有anchor的offset,而是与ground truth匹配的anchor的实际偏移,背景框的anchor偏移保持为零。
这意味着,一旦anchor内的像素空间被完全视为背景,则anchor不需要调整坐标。换言之,由于分配给背景类别的anchor根本不应该移动或更正,因此没有要预测的偏移量。
(2)分类任务:分类损失通常是使用在总背景框的子集来处理类不平衡。还记得在我们的示例中,每个位置有6个框,总共有384个建议吗?好吧,大多数都是背景框,这就造成了一个严重的类别不平衡。
解决这类不平衡问题的一个流行的解决方案是所谓的 hard negative mining ——根据预先确定的比率(通常为1:3; foreground:background)选择一些高权重背景框。
在分类损失中处理类不平衡的另一个流行方法是降低易分类实例的权重损失贡献,这就是RetinaNet的focal loss情况。
(3)推理过程:为了获得最终的一组目标检测,网络的预测偏移量被应用到相应的anchor中,可能会有成百上千个候选框,但最终,测器会忽略所有被预测为背景的盒子,保留通过某些标准的前景检测结果,并应用NMS纠正同一对象的重叠预测。
如本文开头所述,了解SOTA的目标检测算法,通常会变得令人望而生畏和晦涩难懂,但一旦您了解anchor的作用,目标检测就有了全新的理解。
更多内容请关注公众号:AI约读社,期待与您的相遇!
本文暂时没有评论,来添加一个吧(●'◡'●)