自从anchor方法在目标检测领域出现时,就以其良好的效果被用于各种算法中,如yolo、SSD等等。但是anchor生成是按照预先设置好的规则来生成了,为了保证算法的检测效果,需要生成大量的anchor,其中绝大部分都是没用的anchor,为了提升这部分的效率,并保证效果,Jiaqi Wang等人在"Region Proposal by Guided Anchoring"文章中提出Guided anchor方法。这个方法能生成少量的但是有效的anchor,如下图所示,其效果很明显。
1、文章思路
目标的位置和输入的图像相关,目标的大小和输入的图像以及位置相关。假设box的参数为(x,y,w,h)(x, y, w, h)(x,y,w,h),其中(x,y)(x, y)(x,y)是box的中心位置,www和hhh分别是box的宽度和高度,则对于给定的一副图像III,其对应box的概率为:
p(x,y,w,h∣I)=p(x,y∣I)p(w,h∣x,y,I)p(x, y, w, h|I) = p(x, y|I)p(w, h|x, y, I)p(x,y,w,h∣I)=p(x,y∣I)p(w,h∣x,y,I)
2、网络架构
首先作者设计了一个anchor生成模块,这个模块包含两个部分:位置预测和大小预测。而不同位置的anchor,其特征范围是不一样的,因此作者设计了一个特征自适应模块(feature adaptation module)。主干网络采用FPN时,其网络结构如下图:
3、网络详细描述
3.1 anchor位置预测
位置预测输出的是某个位置(i,j)(i, j)(i,j)存在anchor的概率p(i,j∣FI)p(i, j | F_I)p(i,j∣FI)。产生这个概率的是一个1×11\times11×1的卷积层+sigmoid函数。概率大于预先定义的阈值ϵL\epsilon_LϵL。
3.2 anchor大小预测
大小预测分支为每个位置预测最佳的大小(w,h)(w, h)(w,h)。但是直接预测大小会导致精度不高,其原因是目标的大小变化范围比较大。因此采用如下的等式:
w=σ⋅s⋅edw,h=σ⋅s⋅edhw=\sigma \cdot s \cdot e^{dw}, h=\sigma \cdot s \cdot e^{dh}w=σ⋅s⋅edw,h=σ⋅s⋅edh
大小预测分支输出dw,dhdw, dhdw,dh,然后用上式计算出(w,h)(w, h)(w,h)。sss是步长,σ\sigmaσ是一个经验值,文章中取值为σ=8\sigma=8σ=8。
大小预测分支的网络构成如下:1×11\times11×1网络输出两通道的数据,分别表示dwdwdw、dhdhdh,然后计算真是位置的层。
3.3 anchor-Guided特征自适应
为什么需要这个网络结果:在传统的RPN或者单阶段检测器,特征层上每个位置上的anchor具有相同的大小和尺度,因此特征层可以具有一直的表达。但是在Guided anchor模型中,anchor的大小随着位置的变化而变化,因此不能按以前的方式生成特征层。
理论上,大的anchor是在大区域上生成特征,而小的anchor是在小区域上生成特征。按照这个原则来设计anchor-guided特征自适应模块。在每个位置上按照anchor大小来生成特征:
fil=NT(fi,wi,hi)\bold{f}_i^l = N_T(\bold{f}_i, w_i, h_i)fil=NT(fi,wi,hi)
其中fi\bold{f}_ifi是在第iii个位置上的特征,(wi,hi)(w_i, h_i)(wi,hi)是其对应的anchor的大小。
其网络结构如下:采用3×33\times33×3可变形卷积层。首先预测anchor的大小,然后利用可变形卷积层来获取fIlf_I^lfIl。然后再进行分类以及box的回归。
3.4 训练
1)目标函数
训练的目标函数是由传统的分类回归损失(LclsL_{cls}Lcls,LregL_{reg}Lreg)和anchor定位(LlocL_{loc}Lloc)和大小(LshapeL_{shape}Lshape)预测损失组成:
L=λ1Lloc+λ2Lshape+Lcls+LregL=\lambda_1L_{loc}+\lambda_2L_{shape}+L_{cls}+L_{reg}L=λ1Lloc+λ2Lshape+Lcls+Lreg
2)anchor定位
定位anchor位置时,希望在ground-truth boxes中心位置的anchor多,远离中心位置的anchor少,并且获取较大的IOU。文章中作者定义了三个区域:
a)中心区域CR=R(xg′,yg′,σ1w′,σ1h′)CR=R(x_g', y_g', \sigma_1w', \sigma_1h')CR=R(xg′,yg′,σ1w′,σ1h′),在中心区域的点都是正样本;
b)忽略区域IR=R(xg′,yg′,σ2w′,σ2h′)−CRIR=R(x_g', y_g', \sigma_2w', \sigma_2h')-CRIR=R(xg′,yg′,σ2w′,σ2h′)−CR,其中σ2>σ1\sigma_2>\sigma_1σ2>σ1。这部分区域在训练时,不向后传递梯度。
c)外围区域OROROR:除去CRCRCR和IRIRIR的区域其他部分。这个部分当作负样本区域。
作者是在FPN上使用这个模块,因此需要考虑相邻特征层之间的影响。每一个特征层应该只对应一个范围内的尺度。只有一个特征层的尺度满足目标映射到该层的尺度时,才将该目标的CRCRCR区域设置在该层。
loss采用Focal loss
3)anchor大小
确定每个anchor的最佳大小分为两步:首先需要确定和ground-truth box匹配的anchor;其次预测能覆盖box的最好的宽和高。Guided anchor中的宽和高是一个变量,而不是预先定义好的。因此需要采用与之前方法不同的方法。
定义可变anchor awh={(x0,y0,w,h)∣w>0,h>0}a_{wh}=\{(x_0, y_0, w, h) | w > 0, h >0\}awh={(x0,y0,w,h)∣w>0,h>0}和ground truth box gt=(xg,yg,wg,hg)gt=(x_g, y_g, w_g, h_g)gt=(xg,yg,wg,hg)的IOUIOUIOU为vIoUvIoUvIoU
vIoU(awh,gt)=maxw>0,h>0IoUnormal(awh,gt)vIoU(a_{wh}, gt) = \underset{w>0,h>0}{max}IoU_{normal}(a_{wh}, gt)vIoU(awh,gt)=w>0,h>0maxIoUnormal(awh,gt)
其中IoUnormalIoU_{normal}IoUnormal是IoUIoUIoU的typical定义。
但是计算vIoU(awh,gt)vIoU(a_{wh}, gt)vIoU(awh,gt)是非常复杂的,很难在端到端的网络上实现。因此对于给定点(x0,y0)(x_0, y_0)(x0,y0),用若干个常用的www和hhh的值来代表所有的值。然后用这些采样的值来计算vIoU(awh,gt)vIoU(a_{wh}, gt)vIoU(awh,gt)。文章中,在训练阶段,作者用了9对(w,h)(w, h)(w,h)来估算vIoUvIoUvIoU。
大小的损失函数定义如下:
Lshape=L1s(1−min(wwg,wgw))+L1s(1−min(hhg,hgh))L_{shape}=L_1^s(1-min(\frac{w}{w_g}, \frac{w_g}{w})) + L_1^s(1-min(\frac{h}{h_g}, \frac{h_g}{h}))Lshape=L1s(1−min(wgw,wwg))+L1s(1−min(hgh,hhg))
(w,h)(w, h)(w,h)和(wg,hg)(w_g, h_g)(wg,hg)分别表示预测的大小和对应ground-truth box的大小。L1sL_1^sL1s是平滑的L1L_1L1 loss。