近年来,随着深度学习的崛起,计算机视以为到飞速发展。目标检测做为计算机视觉的基础算法,也搭上了深度学习的快车。基于Proposal的检测框架,从R-CNN到Faster R-CNN,算法性能愈来愈高,速度愈来愈快。另外一方面,直接回归Bounding Box的框架,从YOLO到SSD,在保持速度优点的同时,性能也逐渐获得提高。“深度学习大讲堂”往期介绍过这方面的进展,在此再也不赘述。
近期,咱们在PASCAL VOC2012目标检测上提交的结果mAP性能达到87.9,刷新了世界记录,排名第一名。算法
方法上,基于Faster R-CNN [1],咱们作了一系列的算法改进,使得性能相比Baseline获得显著提高。本文主要给你们分享咱们作出的这些算法上的改进技巧,以及一些工程上的实践经验。
1.寻找更优的网络结构
”Features matter.” 去年MSRA凭借ResNets [2]取得了多项任务性能上的突破。以ResNet-101为基准,有没有网络能够提供更优的特征?咱们验证了如下几个网络。
a) 进一步增长网络深度。在12GB显存容量的限制下,101层的网络已是极限。然而,若是把预训练模型的BN层参数融合进前一层卷积层,而后去掉BN层,则能够容纳ResNet-152。根据咱们的实验,在ImageNet DET数据集上,去掉BN层的ResNet-152比保留BN层的ResNet-101还要差约1个点。这说明BN层的做用仍是比较重要的。
b) BN层的训练策略。咱们发现训练时若是更新BN层的参数,相比固定参数,性能会降低一大截。缘由多是Faster R-CNN训练时batch size只有1,batch之间的均值/方差变化太大,太不稳定。
c) MSRA和Facebook相继公开了本身训练的ResNets模型。后续MSRA又提出了Identity Mapping版本的ResNets [3]。咱们验证发现,Identity Mapping版本的ResNet-101检测性能略优于MSRA的原始ResNet-101模型和Facebook的模型。
2. 改进RPN Proposal
在Faster R-CNN框架里面,RPN提取Proposal和FRCN对Proposal进行分类实际上是2个独立的问题。针对RPN,咱们作出了如下2处改进:
a) 均衡正负Anchor比例。理想状态下,RPN 正负Anchor的比例是1:1。咱们发现,在batch size比较大(256)的状况下,这个比例会很是悬殊。特别是目标数量比较少的图像,正的Anchor数量会很是少。这样训练出来的模型会偏向于背景类别,容易漏检。咱们对这个比例作了限制,让负样本数量不超过正样本的1.5倍,发现Proposal的召回率能够提升5个点。
b) 级联RPN。受CRAFT [4]的启发,咱们设计了本身的级联RPN。[4]中先获得标准的RPN Proposal,而后用一个分类性能更强的FRCN分支来改进Proposal质量。咱们则是用了2个标准的RPN(图 1)。第一个RPN用滑窗获得的Proposal做为Anchor,第二个RPN用第一个RPN输出的Proposal做为新的Anchor位置。相比[4],咱们的算法优点是实现简单,额外增长的计算量很是少。对于中大目标,能够明显提高Proposal位置的准确度。
图 1 Cascade RPN网络结构。其中虚线框表示这一层能够省略。
3. 全局上下文建模
每一个Proposal对应原始图像中的一个ROI区域。对这个ROI区域进行分类时, FRCN先把ROI映射到中间特征图上,而后在中间特征图上作裁剪(RoIPooling)。裁剪出来的小特征图输入到CNN分类器中。能够看到,CNN分类只使用了ROI区域内的局部特征。实际上,ROI周围的上下文信息对于判断这个ROI类别是颇有帮助的。例如对一个乒乓球分类,很容易和光源混淆。若是知道周围有乒乓球拍、乒乓球台等目标,则更容易判断这是个乒乓球。 全局上下文建模是从整幅图像提取特征,而后和每一个Proposal的局部特征相融合,用于分类。去年MSRA [2]使用全局上下文,获得了1个点的性能提高。然而他们没有发布具体的实现细节。咱们实现的全局上下文网络结构如图 2所示。
图 2 全局上下文建模网络结构。
咱们发现,对于图中的全局上下文网络分支,训练时若是采用随机初始化,性能提高很是有限。若是用预训练的参数初始化,在ImageNet DET验证集上能够获得超过3个点的性能提高。对于ResNets,RoIPooling后面的conv5有9层卷积。而Faster R-CNN finetune时通常初始学习速率又会设得比较小(0.001)。这就致使从头训练这9层卷积比较困难。所以,这里预训练显得尤其重要。另外,[2]还把全局上下文特征同时用于分类和Bounding Box回归。咱们发现全局上下文特征对于Bounding Box回归没有帮助,只对分类有帮助。
4. 训练技巧
a) 平衡采样。不少数据集存在样本不均衡的问题,有些类别特别多,有些类别特别少。训练模型时,从一个图像列表中依次读取样本训练。这样的话,小类样本参与训练的机会就比大类少。训练出来的模型会偏向于大类,即大类性能好,小类性能差。平衡采样策略就是把样本按类别分组,每一个类别生成一个样本列表。训练过程当中先随机选择1个或几个类别,而后从各个类别所对应的样本列表中随机选择样本。这样能够保证每一个类别参与训练的机会比较均衡。在PASCAL VOC数据集上,使用平衡采样性能能够提高约0.7个点。
b) 难例挖掘(OHEM [5])。使用了难例挖掘后,收敛更快,训练更稳定。在ImageNet DET数据集上,性能能够提高1个多点。
c) 多尺度训练。使用多尺度训练的话,可让参与训练的目标大小分布更加均衡,使模型对目标大小具备必定的鲁棒性。
5. 预测技巧
预测阶段,咱们用了多尺度预测,水平翻转,和检测框投票。这些策略的具体实如今不少文献中都有描述。这里咱们能够分享一下多个检测结果的融合策略。当使用多尺度预测,水平翻转,还有多模型Ensemble时,对于同一张测试图像,咱们会获得好几组结果。对于这些结果,最直观的融合方式就是把全部的检测框放在一块儿,而后用非极大值抑制(NMS)处理一下。可是咱们发现另外一种方式效果更好,就是把RPN和FRCN分开来作。先对RPN作多尺度、水平翻转、多模型的融合,获得一组固定的Proposal以后,再对FRCN进行多尺度、水平翻转、多模型的融合。RPN的融合用NMS更好,FRCN的融合用对Proposal的置信度和Bounding Box位置取平均值的方式更好。 总结
本文总结了咱们作出的一些Faster R-CNN改进技巧,并分享了算法实现过程当中遇到的细节问题。正如谚语所言,”The devil is in the details.” 但愿咱们的这些算法细节对同行以及相关的算法爱好者们提供必定的帮助和指引。咱们抛砖引玉,期待同行们也能够分享本身的经验网络