密集型目标检测网络_目标检测网络之 R-FCN

R-FCN是一种目标检测网络,通过在全卷积网络后添加位置敏感得分图来增强位置信息敏感性,解决了深层网络对物体位置敏感度下降的问题。文章介绍了R-FCN的原理,包括位置敏感RoI池化、在线难样本挖掘(OHEM)和损失函数,并探讨了类敏感和类无关两种分类方法。实验表明,OHEM能提高检测性能而不增加训练时间。
摘要由CSDN通过智能技术生成

R-FCN 原理

R-FCN作者指出在图片分类网络中具有平移不变性(translation invariance),而目标在图片中的位置也并不影响分类结果;但是检测网络对目标的位置比较敏感.因此Faster R-CNN将ROI的特征提取操作放在了最后分类网络中间(靠后的位置)打破分类网络的平移不变性,而不能直接放在网络的末尾.但是这样存在的问题是ROI特征提取不共享计算,导致计算量较大.

一般来讲,网络越深,其具有的平移旋转不变性越强,这个性质对于保证分类模型的鲁棒性有积极意义。然而,在检测问题中,对物体的定位任务要求模型对位置信息有良好的感知能力,过度的平移旋转不变性会削弱这一性能。研究发现,对于较深的全卷积神经网络(Inception、ResNet 等),Faster-RCNN检测框架存在着一个明显的缺陷:检测器对物体的位置信息的敏感度下降,检测准确度降低。一般来讲最直观的解决方法是将RPN的位置向浅层移动(比如在ResNet中将RPN嵌入到conv4_x的位置),但这样做会明显增加 Fast-RCNN 部分的计算量,使得检测速度明显变慢。

为了引入平移敏感性,作者在全卷积网络的最后层之后添加了一个1x1卷积层输出position-sensitive score map.每张score map中存放的是所有目标的某一部位的特征图.每个目标被分成\(k\times k\)个网格区域(同Faster R-CNN的ROIPooling的参数,k通常取7或14等. score map的数量设置为\(k^2(C+1)\),对应ROI的\(k\times k\)个bin的特征图.示意图如下:

在位置敏感特征图之后接上Position-sensitive RoI pooling:

输入特征图上的第(i,j)个bin位置的值为第(i,j)个score map上该bin对应位置的均值(这里采用了average pooling 的过程,当然用 max pooling 也可以),这样得到一个通道数为C+1的\(k\times k\)大小的特征图对应C+1个类别的得分,对每个类别的得分求和(或求平均)作为每个类别的score,然后通过softmax得到最大值对应的类别作为输出.

所谓"位置敏感",其主要思想是在特征聚集时人工引入位置信息,从而有效改善较深的神经网络对物体位置信息的敏感程度。

position-sensitive regression

与Faster R-CNN类似,接上与position-sensitive score map并列的回归层(1x1卷积,输出(bg/fg)x(dx, dy, dw, dh)x(score_maps_size^2)),在经过RoI pooling后每一个RoI会得到 4 个偏移量(这里在实现时还分背景/前景,所以是8个数值)。

计算速度提升: PSROI Pooling通过对ROI共享特征图的方式, 以及通过用全局平均池化代替全连接层进行分类特征提取, 提高了计算速度.

在该网络框架下,所有可学习的层,都是卷积形式,在训练时可以很方便地进行 Online Hard Example Mining (OHEM, 在线难样本挖掘) ,几乎不会增加训练时间。

损失函数

分类的softmax损失加前景目标的回归损失.

分类

R-FCN分类分支中支持两种不同的方法: 类敏感和类无关: class-aware and agnostic, 这两者的区别:

class-agnostic 方法对每个目标框输出8个数值(2类fg/bg x 4坐标), 而class-aware输出(cls+1)x4个.agnostic 方法占用内存更少,运行速度更快. mAP跟训练有关,可能会有些差别.

class-agnostic 方法通常作为预处理器,后边需要接上分类器进一步对目标框进行分类.

Atrous 技巧

作者将最后1个池化层的步长从2减小到1,那么图像将从缩小32倍变成只缩小16倍,这样就提高了共享卷积层的输出分辨率。而这样做就要使用Atrous Convolution算法,具体参见论文Semantic Image Segmentation With Deep Convolutional Nets and Fully Connnected CRFS

实验结果,通过下表可以看出训练时RPN产生300个ROI, 结果就已经足够好,沿用Faster R-CNN的2000的设置,反而有所下降. 另外可看出OHEM可以将结果提高3个百分点, 并且使用 OHEM 不会给训练带来额外的时间消耗.

R-FCN C++版

RFCN OHEM 代码理解

训练时在前向传播得到所有N个proposal的loss,从大到小排序后选择前B个ROI进行反向传播,其它的则忽略.而测试时和原来一样,不做改变. 核心实现为BoxAnnotatorOHEM层, 使用方式如下:

layer {

bottom: "rois"

bottom: "per_roi_loss"

bottom: "labels"

bottom: "bbox_inside_weights"

top: "labels_ohem"

top: "bbox_loss_weights_ohem"

name: "annotator_detector"

type: "BoxAnnotatorOHEM"

box_annotator_ohem_param {

roi_per_img: 128

ignore_label: -1

}

propagate_down: false

propagate_down: false

propagate_down: false

propagate_down: false

}

注意到bottom里边有个per_roi_loss 是每个roi的loss(SmoothL1Loss+SoftmaxWithLoss), 参数roi_per_img表示最大的 top N 个 RoI 用于反向传播。 实现中使用std::sort(sorted_idx.begin(), sorted_idx.end(), [bottom_loss](int i1, int i2){return bottom_loss[i1] > bottom_loss[i2]; });对loss值排序取前roi_per_img个作为输出, 而其它roi被设置成被忽略的label(ignore_label=-1)和loss_weight=0.

另外,在设置上OHEM的一个区别是将bg_thresh_lo 设置为0, 不使用OHEM时设置为0.1(正样本周围的负样本,这也算是一种简单的难样本挖掘方式,但是设置为0.1可能导致没有样本被选中,因此也可以设置成0). 将bg_thresh_lo 设置为0使得可以从更宽泛的样本中选择难样本.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值