MMDetection论文总览

1.MMdetection 主要特征

  1. 模块化设计:将检测框架解耦为不同的部分可以轻易组合
  2. 支持多个不同的框架
  3. 高效率:所有的基础bbox和mask操作都在GPU运行
  4. SOTA

2.支持的框架

MMdetection包含目标检测和实例分割方法的高质量实现。支持的方法如下:

Single-stage方法

  • SSD:一个经典且广泛使用的单阶段检测架构(2015)。
  • RetinaNet:一个使用Focal Loss的高性能单阶段检测器(2017)。
  • GHM:一个使用梯度调和机制(gradient harmonizing mechanism)来提升单阶段检测器(2019)。
  • FCOS:一个全卷积的anchor-free的单阶段检测器(2019)。
  • FSAF:一个具有特征选择的anchor-free模块的单阶段检测器(2020)。

Two-stage方法

  • Fast R-CNN:一个经典的目标检测器,需要预先计算的目标框(2015)。
  • Faster R-CNN:一个端到端的训练的广泛使用的检测器(2015)。
  • R-FCN:比Faster R-CNN快的全卷积目标检测器(2016)。
  • Mask R-CNN:目标检测与实例分割结合的经典方法(2017)。
  • Grid R-CNN:使用网格引导定位机制作为bbox回归的方案(2018)。
  • Mask Scoring R-CNN:通过预测mask IoU来对Mask R-CNN进行提升(2019)。
  • Double-Head R-CNN:使用不同的head来进行分类和定位(2019)。

Multi-stage方法

  • Cascade R-CNN:一个强力的多阶段目标检测方法(2017)。
  • Hybird Task Cascade:一个多阶段多分支的目标检测和实例分割方法(2019)。

通用的模块和方法

  • Mixed Precision Training:使用半精度浮点FP16来训练深度神经网络(2018)。
  • Soft NMS:一个NMS的可选方法(2017)。
  • OHEM:一个在线采样方法可以挖掘训练中的难样本(2016)。
  • DCN:形变卷积和形变RoI池化(2017)。
  • DCNv2:模块化的形变操作(2018)。
  • Train from Scratch:使用随机初始化来代替ImageNet的预训练(2018)。
  • ScratchDet:从scratch训练的另一个探索(2018)。
  • M2Det:一个新的特征金字塔网络来构造更多的高效的特征金字塔(2018)。
  • GCNet:全局信息模块可以高效对全局信息进行建模(2019)。
  • Generalized Attention:一个通用的注意力表达(2019)。
  • SyncBN:在GPUs中同步批归一化信息。
  • Group Normalization:一个简单的对BN的可选方案(2018)。
  • Weight Standardization:对卷积层中的微小批(micro-batch)权重进行标准化(2019)。
  • HRNet:一个新的backbone学习可靠地高分辨率表示(2019)。
  • Guided Anchoring:一个新的anchoring框架可以预测稀疏的和任意形状的anchors(2019)。
  • Libra R-CNN:一个新的目标检测平衡学习的框架(2019)。

3.架构

模型表示

主要的模型的组件如下:

  • Backbone:将图片转换为特征图,例如没有最后一个全连接层的ResNet50。
  • Neck:链接backbone和heads的部分,对backbone得到的原始特征图进行优化和提炼,例如FPN。
  • DenseHead(AnchorHead/AnchorFreeHead):对特征图的密集位置进行操作如RPN-Head,RetinaHead,FCOSHead
  • RoIExtractor:从一个或多个特征图进行类似RoIPooling的操作来提取ROIwise特征。类似的例子就是从相同的特征金字塔层级提取RoI特征,如SingleRoIExtractor。
  • RoIHead(BBoxHead/MaskHead):使用RoI特征作为输入然后使用RoI-wise任务的预测,例如bbox 分类回归,mask预测。

可以通过组合以上的组件得到自己的方法。

训练流程

设计了一个通用的训练框架使用hook机制的方法来进行解耦。训练过程都使用了一个类似的工作流,训练的eopch和验证的epoch迭代的运行并且验证的epochs是可选的。在每个epoch中,我们前向和后向模型很多次。为了使得流程更加自由且可以定制化,以下是最小的流程图。

  • 单阶段的检测器
    • Backbone-> Neck -> DenseHead
  • 双阶段的检测器
    • Backbone->Neck---------------RoHead
    •                         DenseHead

4.Benchmarks

实验设置

  • 数据集:支持VOC和COCO
  • 实现细节:(1)图片最大为1333*800,没有改变比例。(2)使用8个GPU训练,总共的batch size是16(每个GPU2图片)和一个单独的gpu用来推理。(3)训练策略类似Detectron,“1x”和“2x”分别意味着12epochs和24epochs。
  • 评估准则:使用标注你的评估尺度对于COCO数据集,多个IoU阈值从0.5到0.95,。RPN网络的结果使用AR平均召回率,检测的结果使用mAP。

Benchmarking结果

  • 主结果:测试了这些方法的推理速度和bbox/mask AP
  • 和其他代码库的对比:测试了相同设备的内存使用率,结果表明和maskrcnn-benchmark类似且低于其余的。
  • 不同GPU的推理速度:好的GPU速度更快
  • 混合精度训练:MMDET支持混合精度训练来减小GPU内存和加速训练且性能保持一样。这个maskrcnn-benchmark支持混合精度训练使用apex,其中SimpleDet也有它自己的实现。当batch size提高到12的时候,FP16训练的内存减少到接近FP32的一般。另外,混合精度训练更加内存高效当它被使用到更简单的框架如RetinaNet。
  • 多节点尺度:分布式训练也可以不错。

5.拓展学习

回归损失

论文中对比了不同的IoU loss对于不同的权重学习率lw的影响,给出了图表。

归一化层

通常由于GPU显存的限制batchsize通常设置为1或者2,因此BN层通常是固定参数的。配置BN层有两个选项:(1)是否更新统计E(x)和Var(x)。(2)是否优化仿射权重\gamma和\beta,遵循的pytorch的命名。这里将这两个表示为eval和requires_grad。eval=True意味着数据不会更新,requires_grad=True意味着\gamma和\beta在训练时进行更新。除了冻结BN层,也有其他的归一化层来解决小批量的问题,例如SyncBN和Group Normalization。首先评估不同的设置对于BN层的影响,然后比较BN和SyncBN与GN。

  • BN设置:实验表明eval=True与requires_grad=True默认效果比较好。
  • 不同的归一化策略:BN严重依赖于大的batchsize来精确的估计数据E(x)和Var(x)。在目标检测中,batchsize通常小于分类,通常的措施是使用预训练的backbone的statistics并且在训练的时候不去更新它们。表示为FrozenBN。SyncBN计算多个GP的均值和方差。GN将特征的通道划分为组然后计算每个组的均值和方差,用于对抗小batch size的问题。这几个BN可以很方便的在配置文件中指定。

这里有两个问题:(1)如何区分不同的归一化层的效果。(2)哪里去加入归一化层。 为了回答这两个问题,做了以下实验,将resnet50的maskrcnn的BN层使用FrozenBN,SyncBN,和GN替代。组的数目设置为32.其他设置和模型架构保持一样。2fc bbox head被4conv1fc 和GN层替代,也加入了FPN和bbox mask heads。做了另外两组实验学习这两个变化,另外,也探索了bbox head的不同的数量的卷积层。

结果表明:(1)FrozenBN,SyncBN,和GN达到了相似的效果如果只是替换BN。(2)在FPN和bbox/mask head中添加SyncBN或者GN并不会得到提升。(3)使用4conv1fc代替2fc bbox head同将归一化层加入FPN和bbox mask head都会提升性能。(4)在bbox head中更多的卷积层将会有更高的精度。

训练尺度

mmdetection中默认的图片尺寸为1333*800。作为一个简单的数据增广方法,多尺度训练通常被采用。当使用多尺度训练的时候,每次迭代会随机选择一个尺度,图片将会被缩放到选择的尺度大小。主要有两种随机选择方法,一个是使用预定一个尺度集合然后随机选择一个,另一个是定义一个尺度范围,然后随机生成其中的一个尺度。前一种方法叫做value模式,后一种方法叫range模式。

我们使用不同的尺度和随机模式训练mask rcnn,并且应用了2x lr schedule因为更多的训练增强通常需要更长的lr schedule epoch。从实验看出,range模式表现稍微比value模式好一点。

其他超参数

主要讲了smoothl1_beta和allowed_border的超参数设置。

 

论文原文

更多细节可以参考论文原文

你可能感兴趣的:(计算机视觉,计算机视觉,人工智能,算法)