论文:DenseBox: Unifying Landmark Localization with End to End Object Detection(CVPR 2015)
代码:CaptainEven/DenseBox
文章目录
DenseBox
针对问题:
- 小目标
- 遮挡
提出了可以end to end 训练的全卷积网络,对整张图片进行卷积计算,无需推荐区域,计算共享,训练一步到位;多任务学习与关键点结合,进一步提高了目标检测的准确性
Ground Truth Generation
裁剪包含人脸和足够背景信息的patch并调整大小(240 x 240),中间人脸的高度大约为50像素,在单一尺度上训练网络,多尺度上进行评估(图像金字塔,虽然精度高了,速度太慢)。
如下图所示:ground truth map为5通道,大小为60×60,下采样因子为4。第一通道表示类别(正负样本)的conidence score,初始化为0,在正标签区域设置为1,这与分割任务中的mask标签类似,正标签区域是一个半径为
r
c
r_c
rc的圆,位于面边界盒的中心。半径
r
c
r_c
rc与目标框大小成比例(0.3),其余4个通道用像素位置与最近目标框左上角
p
t
=
(
x
t
,
y
t
)
p_t=(x_t,y_t)
pt=(xt,yt)、右下角
p
b
=
(
x
b
,
y
b
)
p_b=(x_b,y_b)
pb=(xb,yb)的距离确定(与框四条边距离),所以一个目标labe可以表示为一个五维向量:
t
i
=
{
s
,
d
x
t
=
x
i
−
x
t
,
d
y
t
=
y
i
−
y
t
,
d
x
b
=
x
i
−
x
b
,
d
y
b
=
y
i
−
y
b
}
i
t_i = \{s, dx_ t = x _i − x_ t , dy_ t = y_ i −y_ t , dx_ b = x_ i − x_ b , d y_ b = y_ i − y_ b \}_ i
ti={s,dxt=xi−xt,dyt=yi−yt,dxb=xi−xb,dyb=yi−yb}i
网络对应位置的预测输出就是:
t
^
i
=
{
s
^
,
d
x
^
t
,
d
y
^
t
,
d
x
^
b
,
d
y
^
b
}
i
\hat t_i = \{\hat s, d\hat x_ t , d\hat y_ t , d\hat x_ b , d\hat y_ b \}_ i
t^i={s^,dx^t,dy^t,dx^b,dy^b}i
根据预测和标签就可以求
L
o
s
s
\mathcal Loss
Loss,文中采用了简单的
L
2
L_2
L2 损失
注意,如果一个patch有多个人脸,除中间位置处人脸外,其它人脸在设定的一定范围内仍认定为正样本,超出范围则为负样本。
模型架构
主要参考VGG19的架构,采用VGG19前12层权重进初始化,最后有两条分支,类似FasterRCNN的检测头,一条是类别(正负样本)预测支路cls(1通道),一条是位置预测支路loc(4通道),所以实际上有两个输出:
(output_score): Sequential(
(0): Conv2d(768, 512, kernel_size=(1, 1), stride=(1, 1))
(1): Dropout(p=0.5, inplace=False)
(2): Conv2d(512, 1, kernel_size=(1, 1), stride=(1, 1))
)
(output_loc): Sequential(
(0): Conv2d(768, 512, kernel_size=(1, 1), stride=(1, 1))
(1): Dropout(p=0.5, inplace=False)
(2): Conv2d(512, 4, kernel_size=(1, 1), stride=(1, 1))
)
特征融合
如上图所示:将conv3_4和conv4_4的特征进行了融合: conv4_4特征图分辨率低,感受野大,更适合检测大目标,采用双线性插值对conv4_4特征图上采样,分辨率与conv3_4特征图(感受野相对较小,细节多,适合检测小目标)匹配后,与之融合(通道合并)
Balance Sampling
- Ignoring Gray Zone:正、负标签区域边界上像素点很难区分开(就跟国与国之间的边界之争,解决不了就先搁置,又如:RPN中,Anchor和目标框IoU>0.7设为正样本,<0.3为负样本,0.3<IoU<0.7范围内的样本忽略),让其稀里糊涂地参与训练可能会降低模型的精度,索性在训练的时候忽略掉( f i g n i = 1 f^i_{ign}=1 figni=1)
- Hard Negative Mining:挖掘困难样本,预测不好的样本很容易被选中,对这些样本进行梯度下降学习可以使预测更稳健,噪声更小:将输出像素损失递减顺序排序,前1%为困难负样本,从困难负样本中抽取一半,另一半从非困难负样本中随机抽取( f s e l i = 1 f^i_{sel}=1 fseli=1),最后保持正负样本比例1:1
- Loss with Mask:mask对应前面挑选出来的样本,加上权重参数
λ
l
o
c
\lambda_{loc}
λloc平衡损失
其它细节
- 前面裁剪的patch都是中间有一个目标(正patch),负样本只可能出现在周围区域,为了充分挖掘整个数据集中的负样本,从训练图像中随机裁剪patch(并不需要以一个目标框为中心进行裁剪),并调整大小(240×240),正patch与随机patch的比例为1:1。此外,为了进一步提高模型的鲁棒性,还将每个patch进行随机抖动、左右翻转、平移(25像素)和缩放变形([0.8,1.25])。
- Batch大小设置为10,损失梯度和输出梯度必须按照参与训练像素点个数进行缩放,这样在多任务学习中损失梯度和输出梯度都是相似的。全局学习率从0.001开始,每迭代100K次,学习率就除以10,默认动量项权重0.9、权重衰减因子0.0005
Refine with Landmark Localization
DenseBox是全卷积网络,只需叠加几层就可以实现Landmark 定位(如下图)。假设有N个Landmark Landmark 的ground truth map就有N 个通道,每个通道对应一个Landmark(如下图:车上的7号Landmark与表示右后车轮上 Landmark的特定通道对应),每个像素代表该处为该Landmark 的置信分数,Landmark 的ground truth map与前面ground truth map的第一通道(类别s)设置是一样的, Landmark相当于人脸。注意:Landmark毕竟是一个点,默认Landmark对应正标签区域
r
l
=
1
r_l=1
rl=1,太大了影响精度
Refine阶段将landmark heatmaps 和 face score map融合,接着对Detection进一步Refine得到(Refine score),相当于共有四个输出,损失可写成以下形式, L r f \mathcal L_{rf} Lrf 为 Refine score的损失:
其中,
λ
d
e
t
\lambda_{det}
λdet和
λ
l
m
\lambda_{lm}
λlm分别取 1 和 0.5
(output_score): Sequential(
(0): Conv2d(768, 512, kernel_size=(1, 1), stride=(1, 1))
(1): Dropout(p=0.5, inplace=False)
(2): Conv2d(512, 1, kernel_size=(1, 1), stride=(1, 1))
)
(output_loc): Sequential(
(0): Conv2d(768, 512, kernel_size=(1, 1), stride=(1, 1))
(1): Dropout(p=0.5, inplace=False)
(2): Conv2d(512, 4, kernel_size=(1, 1), stride=(1, 1))
)
(output_landmark): Sequential(
(0): Conv2d(768, 512, kernel_size=(1, 1), stride=(1, 1))
(1): Dropout(p=0.5, inplace=False)
(2): Conv2d(512, 4, kernel_size=(1, 1), stride=(1, 1))
)
(output_refine_score): Sequential(
(conv6_1_det): Conv2d(5, 64, kernel_size=(3, 3), stride=(1, 1))
(conv6_2_det): Conv2d(64, 64, kernel_size=(5, 5), stride=(1, 1))
(upsampling): Upsample(scale_factor=2, mode='bilinear',align_corners=True)
(conv6_3_det): Conv2d(64, 1, kernel_size=(1, 1), stride=(1, 1))
)
参考文献
【1】人脸检测之DenseBox
【2】DenseBox详解
【3】人脸检测之DenseBox