雷锋网 AI 科技评论按:去年 10 月,香港中文大学-商汤联合实验室在 OpenMMLab 的首期计划中,开放了 MMCV 和 MMDetection(初期版本)。其初衷是为了在计算机视觉的一些重要方向建立统一而开放的代码库,并不断把新的算法沉淀其中。在过去的半年多时间,这些代码库已经产生了重要影响,越来越多的 MMLab 以外的研究团队开始把 MMDetection 作为实现新的目标检测算法的基础,并不断将其新算法回馈到 MMDetection 中。
最近,OpenMMLab 第二期正式发布,由多个大学和机构的研究人员联合提出了新一代 Open MMLab Detection,这将有效促进目标检测领域的应用和新方法的研究与发展。
本文中,我们介绍了一个目标检测工具箱 MMDetection,它包含了丰富的目标检测和实例分割方法以及相关的组件和模块。这个工具箱由 MMDet 团队主导开发,该团队曾打破了 2018 年 COCO 挑战赛的检测记录并获得冠军。此后,MMDetection 逐渐发展成为一个统一的平台,涵盖了许多主流检测方法和现代模块。它不仅包括训练和推理代码,而且还为 200 多个网络模型提供了权重参数。我们相信这个工具箱是迄今为止最完整的检测工具箱。
本文介绍了该工具箱的各种特点。此外,我们还对不同的方法、组件及其超参数进行了基准研究。我们希望工具箱和基准能够提供完善、灵活的工具包来复现现有方法并开发自定义的新探测器,从而为日益壮大的研究社区服务。
目标检测和实例分割都是基本的计算机视觉任务。检测流程通常比分类任务更复杂,并且不同的实现环境可能导致截然不同的结果。为了提供高质量的代码库和统一的基准测试,我们使用 PyTorch 构建了一个目标检测和实例分段代码库 MMDetection。
MMDetection 有几个主要的特点:
模块化设计。我们将目标检测的网络架构分解为不同的组件,并且可以通过多样化的模块组合来轻松地构建自定义的目标检测架构。
支持多样化的模型架构。该工具箱支持各类主流检测架构,包括单阶段、双阶段和多阶段的检测架构。
计算效率高。所有基础元件和模块都进行了 GPU 实现,训练速度比其他代码库(包括 Detectron [ https://github.com/facebookresearch/detectron ],maskrcnn-benchmark [ https://github.com/facebookresearch/maskrcnn-benchmark ] 和 SimpleDet 等)更快。
最先进的检测性能。工具箱由 2018 年 COCO 目标检测冠军 MMDet 团队主导开发,并且模型性能还在持续不断地提升。
除了介绍代码库和基准测试结果外,我们还报告了训练目标检测器的过程和最佳方法。并讨论了关于超参数、体系结构、训练策略的烧蚀实验。我们希望该研究能够有助于未来的研究,并促进不同方法之间的比较。
MMDetection 包含主流目标检测和实例分割方法的高质量实现。下图中提供了与其他代码库相比支持的架构和功能的摘要。MMDetection 支持比其他代码库更多的方法和功能,特别是相比最新的代码库。
图 1 MMDetection 工具箱支持的检测模型数量上远远超过了其他现有目标检测代码库
一、模型表示
虽然不同探测器的模型架构不同,但它们具有共同的组件,可以粗略地概括为以下类:
主干网络(Backbone):其作用是从图像中抽取特征,将图像从像素空间转换到高维的特征空间,例如 VGG 和 ResNet-50 等都是常用的主干网络;
衔接部分(Neck):连接主干网络和头部的结构。它对主干网络生成的原初始特征图执行一些优化或重新配置,例如特征金字塔网络(FPN)就是一种典型的 Neck。
密集连接头(DenseHead):用于在特征图所映射的密集位置上进行操作,包括 AnchorHead 和 AnchorFreeHead,代表性操作有 RPN、Retina、FCOS 等。
RoI 抽取器:从一个或多个特征映射中提取 RoIPooling 类算子特征。从相应级别的特征金字塔中提取 RoI 特征的示例是 SingleRoIExtractor。
RoI 连接头(BBoxHead / MaskHead):将 RoI 特征作为输入并计算出对于的任务结果,包括 bbox 的位置、分类或者分割的预测结果。
通过这些通用模块,我们可以通过简单地创建一些新组件并组装现有组件来进行开发与探索。
图 2 单阶段和两阶段检测器的架构分解图
二、训练流程
我们设计了一个带钩子触发的标准训练流程。该方法不仅可以用于目标检测,还可以用于其他计算机视觉任务,例如图像分类和语义分割。许多任务的训练过程可通用类似的工作流程,其中训练和验证流程可以循环的运行,并且验证流程可选。在每个周期,我们都会在模型上运行多次前传和反传操作。
为了使流程更加灵活和个性化,我们定义了一个最小流程单位,其他行为由钩子来触发。为了运行自定义训练流程,我们希望在某些特定步骤之前或之后执行一些自定义操作。我们定义了一些时间点,用户可以在其中插入任何可执行方法(钩子),在运行的各个时期,都能实现在优先级之后的指定时间点触发插入的钩子。MMDetection 中的典型训练流程如下图所示,验证流程未在图中显示。
图 3 典型训练流程
一、实验设置
数据集。MMDetection 支持 VOC 类型和 COCO 类型的数据集。我们采用 MS COCO 2017 作为所有实验的主要基准,因为它更具挑战性,并且使用更广泛。
其它参数。(1) 在不改变宽高比的情况下,将图像调整为最大尺寸 1333×800。(2) 我们使用 8 个 V100 GPU 进行训练,总批量为 16(每个 GPU 2 个图像)和单个 V100 GPU 进行推理。(3) 训练计划与 Detectron 相同。「1x」和「2x」分别表示 12 个时期和 24 个时期,级联模型采用「20e」,表示 20 个时期。
评估指标。我们采用 COCO 数据集的标准评估指标,其中应用了 0.5 到 0.95 的多个 IoU 阈值。区域生成网络(RPN)的结果用召回率(AR)测量,检测结果用 mAP 评估。
二、基准结果
1、主要结果
我们对 COCO 2017 val 的不同方法进行了基准测试,包括 SSD,RetinaNet,Faster RCNN,Mask RCNN,Cascade R-CNN,Hybrid Task Cascade 和 FCOS 。我们使用四种广泛使用的主干网络来评估这些结果,包括 ResNet-50,ResNet-101,ResNet-101-32x4d 和 ResNeXt101-64x4d。
在图中我们展现了这些方法的推理速度和他们的边界框(bbox)与实例分割(mask)AP 值之间的关系。推理时间由单个 Tesla V100 GPU 测试得出。
图 4 不同方法的基准测试结果
2、与其他代码库的比较
除了 MMDetection 之外,还有其他流行的代码库,如 Detectron,maskrcnn-benchmark 和 SimpleDet。它们分别建立在 caffe21,PyTorch 和 MXNet 的深层学习架构之上。我们从性能、速度和内存三个方面来对 MMDetection 和 Detectron(@ a6a835f),maskrcnnbenchmark(@ c8eff2c)和 SimpleDet(@ cf4fce4)进行比较。
Mask R-CNN 和 RetinaNet 分别代表两级探测仪和单级探测器。由于这些代码库也在开发中,因此在其模型仓库中报告的结果可能已过时,并且这些结果是在不同的硬件上所进行的测试。为了公平比较,我们提取最新的代码并在相同的环境中进行测试,结果显示在下图中。
图 5 不同代码库在性能、速度和内存的比较
不同架构所得内存以不同方式进行测量。MMDetection 显示所有 GPU 的最大内存,maskrcnn-benchmark 显示 GPU 0 的内存,Detectron 使用 caffe2 API 测量 GPU,SimpleDet 测量 NVIDIA 提供的命令显示的内存。通常,MMDetection 和 maskrcnn-benchmark 的实际内存使用率相似且低于其他内存。
3、不同 GPU 的推理速度
不同的研究人员可能会使用各种 GPU,这里我们展示了常见 GPU 的速度基准,例如 TITAN X,TITAN Xp,TITAN V,GTX 1080 Ti,RTX 2080 Ti 和 V100。我们对每种类型的 GPU 进行了三种模型的评估,并将最终的推理速度展示在下图中。需要注意的是,这些服务器的其他硬件并不完全相同,例如 CPU 和硬盘,但结果可以为速度基准提供基础的参考。
图 6 不同 GPU 的推理速度基准
4、混合精度训练
MMDetection 支持混合精度训练,以减少 GPU 内存并加快训练速度,同时性能几乎保持不变;支持以 apex2 为基础的混合精度训练;SimpleDet 也有不同的实现方式;Detectron 目前还不支持混合精度训练。我们在同一个 V100 节点上测试了三个代码库,并在下图中展示了 MMDetection 与 maskrcnn-benchmark、SimpleDet 的比较结果。
图 7 混合精度训练测试结果
此外,我们研究了更多模型,以确定混合精度训练的有效性。如下图所示,我们可以了解到更大的批量大小可以节省更多内存。当批量增加到 12 时,FP16 训练的内存减少到 FP32 训练的近一半;并且混合精度训练在应用于 RetinaNet 等更简单的框架时内存效率更高。
图 8 不同模型在 MMDetection 上的混合精度训练结果
5、多节点可扩展性
由于 MMDetection 支持多个节点上的分布式训练,因此我们分别在 GPU 不同的节点上测试其可扩展性。我们采用 Mask R-CNN 作为基准测试方法,并在另一个 V100 节点上进行实验。接着我们采用不同的节点数量时,基本学习率被调整为线性,实验结果展示在下图中。
图 9 Mask R-CNN 在多个节点上的训练速度
通常我们采用多任务损失函数来训练目标检测器,该目标检测器由分类和回归的特征表示。最广泛采用的回归损失函数是 Smooth L1 Loss;但最近也出现了更多的回归损失函数,例如,Bounded IoU Loss,IoU Loss,GIoU Loss,Balanced L1 Loss。L1 Loss 也是衍生的一种损失函数。然而这些损失函数通常以不同的方法和设置实现。
在这里,我们评估同一环境下的所有损失。值得注意的是,最终的测试性能会随着回归损失函数的不同损失权重而变化,因此我们执行粗网格搜索以找出每个损失的最佳损失权重。下图结果表明,通过简单地增加 Smooth L1 Loss 的损失权重,最终性能可以提高 0.5%。
图 10 不同损失权重下不同回归损失的比较
在没有调整损失重量的情况下,L1 Loss 函数比 Smooth L1 Loss 函数性能高 0.6%,而增加损失权重不会带来进一步的增益。L1 Loss 比 Smooth L1 Loss 具有更大的损耗值,尤其是对于相对准确的边界框,差距更明显。根据分析结果,提高定位精度较好的边界框梯度将有利于定位。L1 Loss 的损失值已经非常大,所以增加损失权重不会带来增益。
对于端到端速度更快的 R-CNN,Balanced L1 Loss 函数的 mAP 值比 L1 Loss 高 0.3%,这与采用预先计算方法的实验结果略有不同。然而,我们发现 Balanced L1 Loss 可以在 IoU balanced 采样或平衡 FPN 的基线上的带来更高的增益。除了 Bounded IoU Loss 函数外,基于 IoU 的损失表现略好于具有最佳损耗权重的基于 L1 的损失。GIoU Loss 比 IoU Loss 高 0.1%,Bounded IoU Loss 与 Smooth L1 Loss 具有相似的性能,但前者需要更大的损失权重值。
由于 GPU 内存有限,训练检测器时用到的数据量通常很小(1 或 2),因此 BN 层通常置为典型设定。配置 BN 层有两个选项:是否更新统计数据 E(x)和 Var(x),以及是否优化仿射权重 γ 和 β。按照 PyTorch 的参数名称,我们将这两个选项分别表示为 eval 和 requires-grad。eval = True 表示不更新统计数据;requires-grad = True 意味着 γ 和 β 在训练期间被优化。除了冻结 BN 层外,还有其他标准化层也可以解决小批量的问题,例如 Synchronized BN(SyncBN)[25] 和 Group Normalization(GN)。
图 11 不同 BN 设置和 LR 时间表的结果
在这里我们研究两个问题:不同的归一化层如何相互比较?在哪里为检测器添加标准化层?
为了回答这两个问题,我们用 ResNet-50-FPN 进行 Mask R-CNN 的三次实验,并分别用 FrozenBN,SyncBN 和 GN 代替主干中的 BN 层,下图中的结果显示出:
(1)如果我们只用相应标准化层替换主干中的 BN 层,FrozenBN,SyncBN 和 GN 也能够实现类似的性能。
(2)将 SyncBN 或 GN 添加到 FPN 和 bbox / mask head 不会带来进一步的好处。
(3)用 4conv1fc 替换 2fc bbox head 以及向 FPN 和 bbox / mask head 添加归一化层可将性能提高约 1.5%。
(4)具有更多卷积层的 bbox head 将展现出更高的性能。
图 12 采用不同归一化层添加在不同组件上的对比
作为典型的惯例,训练图像被调整大小到预定义的比例而不改变纵横比。以前的研究通常更喜欢 1000×600 的规模,现在通常采用 1333×800。
在 MMDetection 中,我们采用 1333×800 作为默认训练数据规模。结果如下图所示,其中 1333×[640:800:32] 表示较长的边缘固定为 1333,较短的边缘是从 {640,672,704,736,768 的池中随机选择的,800},对应「值」模式。设置 1333×[640:800] 表示在 640 和 800 之间随机选择较短边缘,这对应于「范围」模式。
图 13 不同训练数据规模的比较
从结果中我们可以了解到,「范围」模式与具有相同最小和最大尺度的「值」模式执行类似或稍微好一些。通常更宽的范围带来更多改进,特别是对于更大的最大尺度。具体地,就 bbox 和 mask 的 AP 值而言,[640:960] 比 [640:800] 高 0.4%且高 0.5%。但是,较小的最小比例(如 480)将无法获得更好的性能。
MMDetection 主要遵循 Detectron 中的超参数设置,以及根据我们所需要进行设定。根据经验,我们发现 Detectron 的一些超参数不是最优的,特别是对于 RPN。在下图中,我们列出了可以进一步提高 RPN 性能的那些超参数。虽然调整可能有利于性能,但在 MMDetection 中我们默认采用与 Detectron 相同的设置,并将此研究留作参考。
图 14 RPNResNet-50 超参数的研究结果
我们提供了下图中某些方法的详细基准测试结果。
R-50 和 R-50(c)分别表示 pytorch 类型和 caffe 类型的 ResNet-50 主干网络。在瓶颈残差模块中,pytorch 类型的 ResNet 采用了 1x1 步幅,1 卷积层;然后是采用了 3x3 步幅,2 卷积层;而 caffe 类型的 ResNet 采用 1x1 步幅,2 卷积层;然后是 3x3 步幅,1 卷积层。
图 15 COCO val2017 的不同检测方法的结果(APb 和 APm 分别表示 box 和 mask 的 mAP 值)
更多详细设置和组件方面的信息,请参阅 https://github.com/open-mmlab/mmdetection/blob/master/MODEL_ZOO.md 。
原文链接
https://arxiv.org/abs/1906.07155
GitHub 地址
雷锋网 AI 科技评论 雷锋网