MMDetection: 开源检测工具箱和基准【PyTorch】

MMdetection项目地址

由香港中文大学、浙江大学、悉尼大学等众多大学共同发表的MMDetection: Open MMLab Detection Toolbox and Benchmark中为了提供高质量的代码库和统一的基准,提出了MMDetection目标检测工具箱,它包含了丰富的目标检测和实例分割方法以及相关的组件和模块。

它不仅包括训练和推理代码,而且还提供了200多个模型的权值。是目前为止最完整的检测工具箱。此外他们还对不同的方法、组件及其超参数进行了基准测试研究。他们希望工具箱和基准能够通过提供一个灵活的工具箱来重新实现现有的方法并开发自己的新检测器,从而为不断增长的研究社区提供服务。

目标检测和实例分割都是基本的计算机视觉任务。检测框架的管道通常比分类类任务更复杂,不同的实现设置可能导致非常不同的结果。

MMDetection的主要特点是:

(1)模块化设计。我们将检测框架分解为不同的组件,通过组合不同的模块可以很容易地构建定制的对象检测框架。

(2)支持多框架开箱即用。工具箱支持流行的和现代的检测框架,完整的列表见第2节。

(3)效率高。所有基本的bbox和mask操作都在gpu上运行。训练速度比其他代码库(包括Detectron[10]、maskrcnn-benchmark[21]和SimpleDet[6])更快或者等同的。

(4)技术水平。这个工具箱来自于MMDet团队开发的代码库,他们在2018年赢得了COCO检测挑战,我们一直在推动它向前发展。

除了介绍代码基和基准测试结果之外,我们还报告了我们训练目标检测器的经验和最佳实践。对超参数、结构和训练策略进行了消融实验(有些像控制变量法)。我们希望本研究能对未来的研究有所帮助,并有助于不同方法之间的比较。

文章先介绍了各种支持的方法,重点介绍了MMDetection的重要特性,然后给出了测试结果。

支持框架

Single-stage Methods

方法提出时间特性
SSD2015经典而广泛使用的单级探测器,具有简单的模型结构
RetinaNet2017具有Focal Loss(聚焦损失)的高性能单级探测器
GHM2019用来改进单级检波器的梯度协调机制
FCOS2019全卷积anchor-free(无锚框)单级检波器
FSAF2019用于单级探测器的特征选择anchor-free(无锚框)模块

Two-stage Methods

方法提出时间特性
Fast R-CNN2015一个经典的目标探测器,需要预先计算的proposals
Faster R-CNN2015一个经典和广泛使用的两级目标探测器,可以端到端训练
R-FCN2016一个比R-CNN更快的全卷积目标检测器
Mask R-CNN2017一个经典和广泛使用的对象检测和实例分割方法
Grid R-CNN2018一个网格引导的定位机制,作为边界框回归的替代
Mask Scoring R-CNN2019通过预测mask IoU的改进的Mask R-CNN
Double-Head R-CNN2019用于分类和定位的不同heads

Multi-stage Methods

方法提出时间特性
Cascade R-CNN2017一个强大的多级目标检测方法
Hybrid Task Cascade2019一种多阶段多分支对象检测和实例分割方法

通用模块和方法

方法提出时间特性
Mixed Precision Training2018使用半精度浮点数(FP16)训练深度神经网络
Soft NMS2017NMS的替代品
OHEM2016一种在线抽样方法,挖掘硬样本用于训练
DCN2017可变型卷积和可变型ROI池化
DCNv22018modulated deformable operators调整的变性操作
Train from Scratch2018训练由随机初始化代替ImageNet预训练
ScratchDet2018另一个关于从零开始训练的探索
M2Det2018提出新的特征金字塔网络,以构建更有效的特征金字塔
GCNet2019全局上下文块,可以有效地对全局参数进行建模
Generalized Attention2019通用注意公式
SyncBN跨gpu的同步批处理规范化,我们采用了PyTorch的官方实现。
Group Normalization2018BN的简单替代品
Weight Standardization2019对卷积层的权值进行标准化,进行微批量训练
HRNet2019一个新的骨干,重点学习可靠的高分辨率表示
Guided Anchoring2019一种新的锚定方案,可以预测稀疏和任意形状的锚
Libra R-CNN2019一个新的框架面向平衡学习的目标检测

3.结构

模型的表示

虽然不同检测器的模型架构不同,但是它们有共同的组件,这些组件可以大致归纳为以下几个类

Backbone 主干是将图像转换成特征图的部分,例如没有最后一个完全连接层的ResNet-50。

Neck 脖子是连接脊柱和头部(backbone and heads)的部分。它对主干生成的原始特征图执行一些细化或重新配置。以特征金字塔网络(FPN)为例。

DenseHead (AnchorHead/AnchorFreeHead) DenseHead是对feature map的密集位置进行操作的部分,包括AnchorHead和AnchorFreeHead。e.g., RPNHead,RetinaHead, FCOSHead.

RoIExtractor RoIExtractor是使用类似于RoI Pooling 的操作从单个或多个feature map中提取RoIwise特征的部分。一个从相应层次特征金字塔中提取RoI特征的例子是SingleRoIExtractor。

RoIHead (BBoxHead/MaskHead)RoIHead是将RoI特性作为输入进行RoI-wise特定任务预测的部分,如bounding box classification/regression, mask prediction。

通过上述抽象,单级和两级检测器的框架如图1所示。我们可以通过简单地创建一些新组件和组装现有组件来开发自己的方法。

MMDetection: 开源检测工具箱和基准【PyTorch】

Training Pipeline

我们设计了统一的具有hooking机制的训练Pipeline。该训练管道不仅可以用于目标检测,还可以用于图像分类、语义分割等计算机视觉任务。许多任务的培训过程共享一个类似的工作流,其中Train epochs训练期和validation epochs验证期迭代运行,验证期是可选的。在每个epoch中,我们通过多次迭代对模型进行forward前进和backward后退。为了使管道更加灵活和易于定制,我们定义了一个最小管道,它只是重复地前向传播模型。其他行为由hook机制定义。为了运行自定义培训流程,我们可能需要在某些特定步骤之前或之后执行一些自定义操作。

我们定义了一些用户可以注册任何可执行方法(hook)的时间点,包括before run, before train epoch, after train epoch,

before train iter, after train iter, before val epoch, afterval epoch, before val iter, after val iter, after run。已注册的hook在指定的时间点按优先级触发。一个典型的MMDetection训练管道如图2所示。由于在每一个训练epoch结束后使用evaluation hooks来测试模型表现,所以在图中没有显示validation epoch,如果要定义的话,跟训练epoch一样。

MMDetection: 开源检测工具箱和基准【PyTorch】

其余内容请参见论文