DenseBox

论文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=xixt,dyt=yiyt,dxb=xixb,dyb=yiyb}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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值