anchor机制讲解
什么是anchor boxes
anchor boxes是一组提前预定义的边框,这些框的宽高和数据集中目标物体的宽高大体是一致的,换句话说,数据集中的绝绝大多数物体都能找到与其大小一致的anchor box。举例来说,如果数据集中包含苹果、猫,那么这组anchor boxes中就需要有和苹果、猫大小相仿的边框。为了尽可能多的覆盖数据集中可能出现的目标推的宽高,这些边框具有不同的宽高比(aspect ratio)和尺度(scale)。
边框可以反应一个物体的大致信息,边框的位置反应物体的大致位置,宽高比反应物体的身材比例,尺度反应物体的大小。
为什么需要anchor boxes
其实,物体检测方法是非常直观的,就是在图片上,截一小块,检测这一小块包不包含物体,如果包含物体,该物体的位置就是刚刚截取的这个小块的位置,同时再预测一下它的类别是什么。那这种检测方法和anchor box又有什么关系呢? 其实,刚刚截取的这个小块就是一个anchor box。
往往,图片上的每一处位置都有可能出现目标物体,并且目标的大小是不确定的。那有什么办法能检出所有的物体呢?最容易想到的办法就是,以一个像素为中心截取小块时,截取很多个不同宽高比和大小的小块,每个小块都检测一下,这样就可以做到不漏掉这个像素上的任何宽高比和大小的物体了;为了检出图像中不同位置的物体,从左到右,从上到下,把图像扫描一遍,每个像素上都取很多小块进行检测,这样就可以保证不同位置、不同大小的物体都不漏掉了。Fig. 1是一个扫描检查的示例。
这种方法容易理解并且确实有效,但是缺点也是突出的----计算量太大了。假如一张图片大小为640*640,在图像中每一个像素上取10个不同宽高比不同大小的框做检测,则需要检测的框就会有640 x 640 x 10 = 4096000,太多了。或者,可以看一下retinanet (传送门)中用的锚框数量,如图Fig. 2所示,图中只显示了所有框的1%,再多就看不清楚了。那怎么改进呢?
其实,这种方法有两个明显可以改善的点,一是4096000个扫描框重叠(overlap)太多了,一是这些框里有很多框是背景,不包含物体,没有检测的必要。所以,设法在保证覆盖(cover)整张图的基础上,略去重叠太严重的框,避开背景框,找高质量的、可能包含目标物体的候选框进行检测就显得尤为重要,可以以此来降低运算量,提高检测速度。
anchor boxes就是我们在检测之前确定的一系列候选框。我们默认,图片上会出现的所有物体,都会被我们设定的anchor boxes所覆盖。anchor box选择的好坏直接关系到两个方面:一是能不能很好的覆盖整张图,一是能不能框住图片中可能出现的每个物体。所以anchor box的设定非常重要,既关系到精度的好坏,又关系到速度的快慢(速度仅就以上所说的扫描法而言)。
anchor boxes是怎么生成的
举例来说明:假如要在一个数据集上做物体检测, 该数据集的图片分辨率均为256 pixel 256 pixel, 数据集里绝大多数数目标物体的尺寸为 40 pixel 40 pixel或80 pixel * 40 pixel。
高宽比(aspect ratio)的确定
这说明数据集中绝大多数物体的真值边框的高宽比为1:1和2:1. 根据这个信息就可以确定锚框的高宽比信息:为这个数据集设计anchor boxes时其高宽比至少需要包括1:1和2:1. 这里举例为方便就只取1:1和2:1.
尺度(scale)的确定
尺度是指物体的高或宽与图片的高或宽之间的比值。以像素为单位表示目标物体和图片的尺寸,如果图片的宽为256 pixel,物体的宽为40 pixel,则该物体的尺度为40/256=0.15625,也就是说该物体占了图片15.62%的宽度。
为了选一组能更好的代表数据集里目标的尺度的尺度,我们应该以数据集中目标物体的尺度最大值和最小值为上下限。如,数据集中物体的尺度的最小值和最大值分别为0.15625和0.3125,我们准备在这个范围内设置3种scale,则可以选择 {0.15625, 0.234375, 0.3125}。
anchor boxes数量的确定
我们的scales为 {0.15625, 0.234375, 0.3125},aspect ratios为{1:1, 2:1}, 则每一个锚点上的一组锚框的数量为3 2 = 6个,如Fig.3所示,即有3种大小的,每一种大小都有两种高宽比。按照以上方法所说,锚点是指256256图像中的每一个像素,按基于anchor的神经网络目标检测来讲,锚点为网络最终输出特征图上的每一个点。
Anchor boxes 在目标检测中是怎么用的?
Anchor boxes的用途
在网络中anchor boxes被用来编码目标物体的位置。目标检测一般是不会直接检测物体边框的绝对坐标的,取而代之的是检测其相对某一个锚框的偏移量,如Fig.4中绿色真值框对蓝色边框的偏移。数据集中所有的目标均会被编码成对anchor boxes的偏移。如图Fig.2, 锚框有非常多个,对一张图片来说,可能包含多个物体,有非常多个anchor boxes, 那怎么用anchor boxes对真值进行编码呢?
anchor boxes对真值bounding box编码的步骤
a. 对每一个anchor box,算出其和哪一个真值bounding box的交并比(intersection over union score)最大
b. 如果交并比>50%,则当前anchor box负责当前真值bounding box对应物体的检测,求真值bounding box对该anchor box的偏移
c. 如果交并比介于40%与50%之间,不能确定该anchor是不是包含该物体,属于含糊框。
d. 如果交并比<40%,则认为该anchor框到的都是背景,将该anchor划分为背景类。
除了被分配物体的锚框外,对只含背景的锚框和含糊框,偏移赋0,分类赋背景。
所有的锚框是训练时的样本
编码之后,物体检测类网络的回归目标变成回归编码好的偏移量了。网络的输入为图片,输出为每一锚框的分类和偏移量。网络最终输出的特征图上的每一个像素都有一组锚框(假如一组锚框的数量为6个,宽高比为2:1和1:1, 尺度为0.15625, 0.234375, 0.3125,如Fig.3所示),设网络最终输出的特诊图分辨率为7*7,则该回归网络中的锚框数量总数为7x7x6=296个。网络接收到的真值为这296个anchor box是否为背景的分类信息(如果包含物体,则分离为物体类别)和每个anchor到目标物体bounding box的偏移量(含糊框和背景框的偏移量为0),网络的输出为296个框的偏移量和分类信息。
对一个训练好的网络,其输出中,只包含背景的锚框的分类为背景,偏移为0;包含物体的锚框,其分类为物体的类别,偏移为锚框与物体真实边框之间的偏移。
为什么要回归偏移量而不是绝对坐标
神经网络的特性之一是位移不变性,对一张包含树的照片,不管树在这张图片的左上角还是右下角,网络输出的分类都是树,分类结果不会因为树在照片中位置的变化而变化。所以,对于一棵树,不管它在图片中的位置是什么,回归网络都偏向于为它输出相同的位置坐标,可见位移不变性和我们需要的位置坐标变化是冲突的,这显然是不行的。转而回归偏移的话,不管树在图像中的什么位置,其对它所在的锚框的偏移量基本是一致的,更加适合神经网络回归。
输出特征图和锚框有什么关系呢?锚框不是应该放在输入图上吗,为什么说输出特征图上的每一个点一组锚框
如Fig.5所示,输出特征图(最右边3 x 3的小特征图)上的任何一个点都可以映射到输入图片上(感受野的意思),也就是说按照比例和网络的下采样,对输出特征图上的任意一点,在输入图片上都可以成比例找到它的对应位置。例如,在输出特征图上(0, 0)的点在输入图片上的对应位置为(2, 2), 网络的输出特征维度为3 3 84 ( = 3 3 6 14),则输出特征图上点(0, 0)处的84个通道对应的值为输入图(2, 2)位置上6个锚框的偏移量和分类值。3 3 84 = 3 3 6 14中的6为6个anchor box, 14中的4为(x,y,w,h)的偏移量,14中的10为类别数。
通过这样的隐式映射关系,将所有的anchor box都放在了输入图片上。
说明
在不至引起误会的情况下,文中没有明确区分锚框(anchor box)和边框(bounding box)。锚框是指预定义的,根据目标物体设定的先验框;边框是能框住物体的真实框,和cv2.boundingRect(c)得到的一致,c为轮廓。