Anchor在计算机视觉中称为描点或者描框,在目标检测中,作为描框anchor box应用于各个目标检测的网络模型中,也称为先验框。

 

来历,及应用场景:

Anchor最新在Faster rcnn被提出及应用,后被YOLOV2借鉴,及应用与YOLO之后的各个版本。之后的各个目标检测框架都基本采用Anchor Box进行目标检测。

那么就要说到,为什么要提出AnchorBox。那就要追根到之前的目标框的选择方式。

在Fast rcnn中,要提取2000个候选框,通过Selective Search和EdgeBoxes等方法,然后对这个2000个候选框再进行判断及NMS等操作,最后筛选出最终的方框。然而,这部分工作存在时间瓶颈,而且每个特征都可能被重复多次计算,于是Faster rcnn采用RPN网络,引入Anchor box,通过网络去获取候选框,从而大大减少了时间开销。AnchorBox的原理是基于SPPNet,每个特征点都可以映射到原图片的相对应的像素点。

而对于YOLO系列,原本是通过直接预测坐标从而得出候选框,再Faster rcnn采用Anchor Box之后,YOLOV2发现使用Anchor Box可以简化问题,从而使网络模型更容易学习,于是,YOLO也从此应用上了AnchorBox

 

关于Anchor Box的相关问题

1.Faster rcnn及YOLO中,AnchorBox到真实框的转换公式

很多人都了解Faster rcnn及YOLO,也都知道他们都使用了Anchor Box,然而,却不知道他们的Anchor Box的区别。

(1).Faster rcnn:

Gx = Aw * dw + Ax Gw = Aw * exp(dw)

Gy = Ah * dh + Ay Gh = Ah * exp(dh)

其中G代表的是真实框,A代表的是先验框AnchorBox,d代表的是预测的输出值

其中Ax,Ay为AnchorBox的中心点坐标,Aw,Ah为AnchorBox在对应原图的相对宽高。

(2).YOLO:

bx = sigmoid(tx) + cx bw = Pw * exp(tw)

by = sigmoid(ty) + cy bh = Ph * exp(th)

其中b代表的是真实框,而cx,cy是grid cell在feature map中的左上角坐标,而Pw,Ph同Faster rcnn一致,都为相对原图的box宽高。

值得注意的是,Faster rcnn和YOLO在求中心点坐标的时候存在差异,因为Ax,Ay对应的是AnchorBox的中心点坐标,所以要通过求偏移量Aw*dw来对中心点进行校正,因为存在向左或向右偏移,所以偏移量存在正负。而YOLO中cx,cy为左上角坐标,所以实际中心点坐标相对于grid左上角坐标,只存在向下及向右偏移,所以采用了sigmoid,将偏移量限定在0-1之间。

 

2.为什么Faster rcnn的中心点坐标偏移量采用Aw*dw?

为什么要乘以AnchorBox的Aw,而不直接预测出偏移量呢?一个合理的解释如下:

目标检测之AnchorBox详解

 

对于两个不同尺度的同个物体,CNN提取的特征y是一致的,假设求边框回归的函数映射为f,即f(y)是一致的,这代表了求出来的中心点坐标的偏移量也一致,但从上图可知,大尺寸的坐标偏移量会偏大点,所以,要乘以AnchorBox的宽高,进行规格化处理。

 

3.为什么求宽高时要采用exp函数

其原因有如下两点

(1).因为宽高都为正数,所以要限制为大于0,所以采用exp函数

(2).因为将尺度缩放至对数空间,可以减小训练过程中不稳定的梯度变化。

 

4.训练过程中,ground truth要与哪个Anchor Box进行配对。

每个grid cell存在多个Anchors Box,那么要与哪个Anchor Box进行配对呢。在YOLO训练过程中,会通过groud truth的中心点坐标将其分配到某个grid cell中,再与当前的grid cell中Anchor Box进行一一配对,选取IOU最大的作为最终配对,正样本,而剩下的Anchor Box不进行配对。而现在其他模型,为了提高召回率及平衡正负样本的比例分布,往往取IOU大于某个阈值,比如0.5的均做为正样本,而在某个范围内,比如0.4-0.5之间的,作为中立样本,而低于某个阈值的,比如0.4的,作为负样本,然后,负样本会以loss进行倒叙排序,取出前正样本数*3的负样本数进行训练。

 

5.Anchor Box的尺寸设定

在大多数目标检测网络,如Faster rcnn,在选取Anchor Box的尺寸上为人工设定,而对于YOLO系列,从YOLOV2版本使用Anchor Box开始,便是使用K-mean聚类,通过训练集,从数据集中获取Anchor Box。

 

6.Anchor Box的生成

有两种生成方法:

第一种,有两个参数,第一个是scales = [128,256,512],第二个是ratios = [0.5,1,2].

scales代表的是anchor box在输入图片的box大小,即面积为scales^2的box。

ratios代表在面积恒定的条件下,对宽高进行缩放,使宽高比例为ratios的box。

第二种,有三个参数,第一个是base_size = 16,第二个是anchor_scales = [8,16,32],第三个事anchor_ratios = [0.5,1,2]

base_size代表的是特征层一个像素点对应输入原图片的大小,因为缩小了16倍,所以特征输出层的一个像素点的感受野为原图片的16*16。

anchor_scales是将base_size*anchor_scales 即得到最终的anchor box的大小,即16*[8,16,32] = [128,256,512]

anchor_ratios与第一种方法的含义相同。

值得注意的是,我们提到的Anchor Box的大小,都是指对应在原输入图片的大小,而非输出特征层。

Scale的边框大小也是指原输入图片的大小,而非输出特征层。