目标检测中长出现的anchor,表示固定的参考框。

anchor技术:
将问题转换为“这个参考框中有没有认识的目标,目标偏离参考框多远”
首先预设一组不同尺度,不同位置的固定参考框,覆盖几乎所有位置和尺度
每个参考框负责检测,与其交并比大于阈值(训练预设值,常用0.5或0.7)的目标

计算每个像素256-d的9个尺度下的值,得到9个anchor,
我们给每个anchor分配一个二进制的标签(前景背景)。
我们分配正标签前景给两类anchor:
1)与某个ground truth(GT)包围盒有最高的IoU重叠的anchor(也许不到0.7)
2)与任意GT包围盒有大于0.7的IoU交叠的anchor。注意到一个GT包围盒可能分配正标签给多个anchor。
我们**分配负标签(背景)**给与所有GT包围盒的IoU比率都低于0.3的anchor。
非正非负的anchor对训练目标没有任何作用,由此输出维度为(2*9)18,一共18维。

假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分foreground和background,
所以每个点由256-d feature转化为cls=2k scores;而每个anchor都有[x, y, w, h]对应4个偏移量,所以reg=4k coordinates

补充,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练。

Anchor设计总结
设计目标检测算法时,anchor设置应该考虑一下几个方面 (以RetinaNet为例):

(1)anchor的密度:由检测所用feature map的stride决定,这个值与前景阈值密切相关,如同样检测{32}尺度,FPN阈值0.7用P2,RetinaNet前景阈值0.5用P3。

(2)anchor的范围:RetinaNet中是anchor范围是32~512,这里应根据任务检测目标的范围确定,按需调整anchor范围,或目标变化范围太大如MS COCO,这时候应采用多尺度测试,当然,实际应用中需考虑多尺度测试的复杂度问题。

(3)anchor的形状数量:RetinaNet每个位置预测三尺度三比例共9个形状的anchor,这样可以增加anchor的密度,但stride决定这些形状都是同样的滑窗步进,需考虑步进会不会太大,如RetinaNet框架前景阈值是0.5时,一般anchor大小是stride的4倍左右。

(4)检测层Pn的数量:RetinaNet中是P3~P7共5个检测层,如需检测更小的目标,可以考虑加入P2检测层。

(5)检测层Pn的感受野:前面计算了RetinaNet中是ResNet+FPN的感受野在检测中、大目标时都是够用的,检测小目标时略显疲乏,kaiming最新论文《Rethinking ImageNet Pre-training》既然告诉我们预训练模型没那么重要时,那检测任务就可以着重考虑按照感受野的需求设计ConvNet。
总之,要做到anchor以足够密度实现全覆盖。

参考:https://zhuanlan.zhihu.com/p/55824651