Date: 2020/10/31
Coder: CW
Foreword:
目标检测领域的玩家对 anchor 应该都不会陌生了,anchor是锚,是一种先验框,密布在图像上。在anchor-base的机制下,网络会筛选出最有可能包含目标对象的anchor然后调整它们的位置得到最终预测结果。
anchor是和 feature map(非原图像)上的每个特征点相对应的,通常是多对一的关系,即特征图上每个特征点可拥有多个大小和宽高比不同的anchor。需要注意的是,anchor的坐标是对应于输入图像的。
对于anchor相关的理论知识,这里不再过多阐述。本文聚焦于anchor-base机制下anchor生成的源码实现,详细解析如何为特征图上每个特征点生成对应不同大小和宽高比的anchor。
Anchor模版
同一特征图上每点的anchor都是一样的,因此可以生成一个anchor模版(不仅仅是一个anchor,通常是大小和宽高比不同的多个anchor),然后所有特征点的anchor就可以由这个模版经过位移得到。
要生成anchor模版,我们仅需要指定anchor大小和宽高比就OK。
anchor模版(i)scales代表anchor的面积,通常anchor是方形,因此这里用边长代替。
下面这部分需要小推导一下,记s为边长,h为高,w为宽,则:
那么:
anchor模版(ii)另外,一种面积大小对应多个宽高比例,因此这里需要做一下维度的扩充,具体在以上代码注释有说明。
计算出各种面积与宽高比例下的anchor宽高后,我们还需要确定anchor的中心位置,通常设置在左上角(0,0)位置。这样,这个模版就刚好能作为特征图的第一个点的anchor,其余特征点也很方便能够由它通过位移得到。
anchor模版(iii)你是不是发现了一个问题——anchor模版左上角坐标是负数?是的,确实是这样,但是没关系,不用方,因为后续网络预测出来的坐标如果不在有效坐标范围内通常都会进行后处理的。
由模版经过位移得到所有特征点的Anchor
有了anchor模版,接下来就可以根据特征点之间的位置关系让这个模版经过位移得到所有特征点对应的anchor了。
这里的grid_sizes是特征图的大小(高、宽),strides是原图到特征图的下采样率,即缩小了多少倍,两者都是list,里面的每项对应不同的特征图。下图中cell_anchors是各个特征图的anchor模版。
生成anchor(i)然后,对各个不同大小的特征图独立处理,这里需要注意下,相邻特征点之间在原图上的间隔是stride,也就是说,它们的anchor也应该相隔这个距离。这里的shifts是所有特征点的anchor对应于anchor模版中的anchor的四个角对应的位移距离。
生成anchor(ii)位移值计算出来后,实施位移即可得到所有特征点的所有anchor。
生成anchor(iii)End
这部分内容相对简单,但是在anchor-base机制下的detection任务几乎都会用到这块,因此CW认为可以整理出来作为一个常用部件,方便集成到项目代码中。
网友评论