本篇博客是基于我的SSD工程,想进一步加深对目标检测的理解。在该工程基础上完善新的RefineDet方法。第一帖,由于长期evernote,以后会逐步转为CSDN。
论文参考:Single-Shot Refinement Neural Network for Object Detection
论文链接:https://arxiv.org/abs/1711.06897
代码链接:https://github.com/sfzhang15/RefineDet
主要包括三部分结构:
Anchor Refinement Modual(ARM):类似RPN部分,用来提取anchor,过滤掉部分负样本候选框(1:3比例),减小分类器的搜索范围只区分前景和背景,并回归出前景的anchor用于检测模块。
Transfer Connection Block(TCB):将特征进行细化,并与深层特征进行 Eltw sum操作(对应元素求和)。作为当前layer的特征输入到检测模块。
Object Detection Modual(ODM):典型的SSD结构,多层特征进行concat后,softmax分类,smooth L1 回归。
需要注意TCB模块,结构如下:
该模块上层是ARM的输入,经过两次33 conv后,与深层的deconv的特征进行Eltw sum。然后在经过两次 33 conv输出作为OBM输入。没有特别大的创新(后期参考DetNet的block块,用dilated conv代替验证下效果)
作者的backbone采用VGG16(the conv4_3, conv5_3, conv fc7, and conv6_2 feature layers)和Resnet101(res3b3, res4b22, res5c, and res6)作为ARM的四个蓝色框
参考源码自定义ARM输出层为:
conv layer | size |
---|---|
relu4_3 | 64*64 |
relu7 | 32*32 |
relu8_2 | 16*16 |
relu9_2 | 8*8 |
relu10_2 | 4*4 |
relu11_2 | 2*2 |
relu12_2 | 1*1 |
需要注意:fc6和fc7采用conv层替代,conv6 的输入为32×32,采用dilated方式;conv7采用11卷积,输出32×32,同时增加5个类似ssd的conv输出层*
损失函数定义如下:
L ( { p i } , { x i } , { c i } , { t i } ) = 1 N a r m ( ∑ i L b ( p i , [ l i ∗ ⩾ 1 ] ) + ∑ i [ l i ∗ ⩾ 1 ] ) L r ( x i , g i ∗ ) ) + 1 N o d m ( ∑ i L m ( c i , l i ∗ ) + ∑ i [ l i ∗ ⩾ 1 ] ) L r ( t i , g i ∗ ) ) \mathcal L( \{p_i\} ,\{x_i\},\{c_i\},\{t_i\}) = \\ \frac{1}{N_{arm}}\big(\sum_i\mathcal L_b(p_i,[l_i^*\geqslant1])+\sum_i [l_i^*\geqslant1])\mathcal L_r(x_i,g_i^*)\big) \\ +\\ \frac{1}{N_{odm}}\big(\sum_i \mathcal L_m(c_i,l_i^*)+\sum_i [l_i^*\geqslant1])\mathcal L_r(t_i,g_i^*)\big) L({pi},{xi},{ci},{ti})=Narm1(i∑Lb(pi,[li∗⩾1])+i∑[li∗⩾1])Lr(xi,gi∗))+Nodm1(i∑Lm(ci,li∗)+i∑[li∗⩾1])Lr(ti,gi∗))
以VGG-16为特征提取网络的RefineDet320在达到实时的前提下能在VOC 2007测试集上达到80以上的mAP,这个效果基本上是目前看到过的单模型在相同输入图像情况下的最好成绩
后续会补充code,有问题请留言