MMDection(机翻)

MMDection

摘要

我们介绍了MMDetection,这是一个对象检测工具箱,其中包含一组丰富的对象检测和实例分割方法以及相关的组件和模块。 该工具箱从赢得了COCO Challenge 2018检测轨道的MMDet团队的代码库开始。它逐渐发展成为一个涵盖许多流行检测方法和现代模块的统一平台。 它不仅包括训练和推理代码,而且还为200多个网络模型提供权重。 我们认为该工具箱是迄今为止最完整的检测工具箱。在本文中,我们介绍了此工具箱的各种功能。 此外,我们还对不同的方法,组件及其超参数进行了基准研究。我们希望该工具箱和基准可以通过提供灵活的工具箱来重新实现现有方法并开发自己的新检测器,从而为不断发展的研究社区服务。

介绍

对象检测和实例分割都是计算机视觉的基本任务。 检测框架的流程通常比类似分类的任务更为复杂,并且不同的实现设置可能导致非常不同的结果。 为了实现提供高质量代码库和统一基准的目标,我们构建了MMDetection,即对象检测和实例分段代码与PyTorch一起使用。

MMDetection的主要特征是:(1)模块化设计。 我们将检测框架分解为不同的组件,并且可以通过组合不同的模块轻松构建自定义的对象检测框架。 (2)支持多种现成的框架。 该工具箱支持流行的和当代的检测框架,有关完整列表,请参见第2节。 (3)效率高。所有基本的bbox和mask操作都在GPU上运行。 训练速度比其他代码库(包括Detectron [10],maskrcnn-benchmark [21]和SimpleDet [6])快或可比。 (4)最新技术。 该工具箱源自MMDet团队开发的代码库,该团队在2018年赢得了COCO检测挑战赛的冠军,我们一直在推动它向前发展。

除了介绍代码库和基准测试结果外,我们还报告了我们在训练目标检测器方面的经验和最佳实践。 进行并讨论了关于超参数,架构,训练策略的消融实验。 我们希望这项研究可以使将来的研究受益,并促进不同方法之间的比较。

其余部分组织如下。 我们首先介绍各种支持的方法,并重点介绍MMDetection的重要功能,然后介绍基准测试结果。 最后,我们在一些选定的基线上显示了一些消融研究。

支持框架

MMDetection包含流行的对象检测和实例分割方法的高质量实现。 表1总结了与其他代码库相比受支持的框架和功能。MMDetection比其他代码库支持更多的方法和功能,尤其是对于最近的代码库。 清单如下

单阶段方法

  • SSD [19]:一种经典且被广泛使用的具有简单模型架构的单级检测器,于2015年提出。

  • RetinaNet [18]:2017年提出的一种具有焦损的高性能单级检测器。

  • Fast R-CNN [9]:经典的目标检测器,需要预先计算的建议,于2015年提出。

  • 更快的R-CNN [27]:一种经典且广泛使用的两阶段目标检测器,可以端到端进行训练,于2015年提出。

  • R-FCN [7]:2016年提出的全卷积目标检测器,具有比Faster R-CNN更快的速度。

  • Mask R-CNN [13]:2017年提出的一种经典且广泛使用的对象检测和实例分割方法。

  • 网格R-CNN [20]:网格导向的定位机制,作为边界框回归的替代方法,于2018年提出。

  • Mask Scoring R-CNN [15]:通过预测2019年提出的Mask IoU,对Mask R-CNN进行了改进。

  • 双头R-CNN [35]:2019年建议使用不同的分类和本地化头。

多阶段方法

  • Cascade R-CNN [2]:一种强大的多阶段目标检测方法,于2017年提出。
  • Hybrid Task Cascade(混合任务级联):多阶段多分支对象检测和实例分割方法,于2019年提出。

结构

模型表示

尽管不同检测器的模型架构不同,但是它们具有共同的组件,可以将其大致归纳为以下几类。

Backbone 骨干是将图像转换为特征图的部分,例如没有最后一个完全连接层的ResNet-50,通常使用一个FCN(全卷积神经网络)

Neck 脖子是连接骨干和头部的部分。它对由主干网生成的原始特征图执行一些改进或重新配置。 一个示例是功能金字塔网络(FPN)。

DenseHead (AnchorHead/AnchorFreeHead) DenseHead是在要素地图的密集位置上操作的部分,包括AnchorHead和AnchorFreeHead,例如RPNHead,RetinaHead,FCOSHead。

RoIExtractor RoIExtractor是使用类似RoIPooling的运算符从单个或多个特征图中提取RoIwise特征的部分。 从相应的要素金字塔级别提取RoI要素的示例是SingleRoIExtractor

RoIHead (BBoxHead/MaskHead) RoIHead是将RoI功能作为输入并进行RoI明智的任务特定预测(例如边界框分类/回归,蒙版预测)的部分。

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

  • backbone: 通常使用一个FCN(全卷积神经网络)来提取feature maps(特征图),例如:ResNet, MobileNet.
  • neck: 这个组件是放在backbones和heads之间的,例如:FPN(特征金字塔网络), PAFPN.
  • Rolhead: 这个组件是用于一些指定的任务,例如:bbox prediction and mask prediction.
  • roi extractor: 这个组件是用来从feature maps(特征图)中提取ROI features的。例如:RoI Align.
  • loss: 这个组件是放在head组件中用来计算损失的。例如: FocalLoss, L1Loss以及 GHMLoss.

培训管道

我们设计了具有挂钩机制的统一培训流水线。 该训练流水线不仅可以用于物体检测,还可以用于其他计算机视觉任务,例如图像分类和语义分割

许多任务的训练过程共享相似的工作流程,其中训练时期和验证时期是迭代运行的,而验证时期是可选的。 在每个时期,我们通过多次迭代来前进和后退模型。为了使流水线更加灵活和易于定制,我们定义了一个最小流水线,该流水线只是反复转发模型。其他行为由挂钩机制定义。 为了运行自定义培训过程,我们可能希望在某些特定步骤之前或之后执行一些自定义的操作。 我们定义了一些时间点,用户可以在其中注册任何可执行的方法(挂钩),包括运行前,训练前,训练后,训练前,训练后,训练前,val epoch,val epoch之后,val iter之前,val iter之后,val iter之后 ,运行后。在优先级之后的指定时间点触发已注册的挂接。 MMDetection中的典型训练管道如图2所示。图中未显示验证时期,因为我们在每个时期之后使用评估钩子来测试性能。 如果指定,它与训练时期具有相同的管道。

基准

实验设置

Dataset(资料组) MMDetection支持VOC样式和COCO样式的数据集。 我们将MS COCO 2017作为所有实验的主要基准,因为它更具挑战性且被广泛使用。 我们将火车拆分用于训练,并报告val split 的性能。

**Implementation details(实展细节) ** 如果没有其他指定,我们采用以下设置。 (1)在不改变宽高比的情况下,将图像调整为最大尺寸为1333×800。 (2)我们使用8个V100 GPU进行训练,总批量大小为16(每个GPU 2张图像),并使用单个V100 GPU进行推理。 (3)训练时间表与Detectron [10]相同。 “ 1x”和“ 2x”分别表示12个纪元和24个纪元。 级联模型中采用“ 20e”,表示20个纪元

Evaluation metrics.(评价标准) 我们对COCO数据集采用标准评估指标,其中应用了从0.5到0.95的多个IoU阈值。 使用平均召回率(AR)测量区域提议网络(RPN)的结果,并使用mAP评估检测结果。

对标结果

主要结果 我们对COCO 2017 val的不同方法进行了基准测试,包括SSD [19],RetinaNet [18],Faster RCNN [27],Mask RCNN [13]和Cascade R-CNN [18],混合任务Cascade [4]和FCOS [32] ]。 我们用四个广泛使用的主干评估所有结果,即ResNet-50 [14],ResNet-101 [14],ResNet-101-32x4d [37]和ResNeXt101-64x4d [37]。 我们在图3中报告了这些方法和bbox / mask AP的推理速度。推理时间在单个Tesla V100 GPU上进行了测试。

与其他代码库的比较 除了MMDetection,还有其他流行的代码库,例如Detectron [10],maskrcnn-benchmark [21]和SimpleDet [6]。 它们分别建立在caffe21,PyTorch [24]和MXNet [5]的深度学习框架上。 我们从三个方面对MMDetection与Detectron(@ a6a835f),maskrcnnbenchmark(@ c8eff2c)和SimpleDet(@ cf4fce4)进行了比较:性能,速度和内存。 掩模R-CNN和RetinaNet是两级和单级检测器的代表。 由于这些代码库也正在开发中,因此其模型库中报告的结果可能已过时,并且这些结果将在不同的硬件上进行测试。 为了公平地比较,我们提取最新的代码并在相同的环境中对其进行测试。 结果显示在表2中。不同框架报告的内存以不同的方式进行测量。 MMDetection报告所有GPU的最大内存,maskrcnn-benchmark报告所有GPU 0的内存,这两个都采用PyTorch API “ torch.cuda.max memorylocated()”。

Detectron用caffe2 API“ caffe2.python.utils.GetGPUMemoryUsageStats()”报告GPU,SimpleDet报告“ nvidiasmi”显示的内存,nvidiasmi是NVIDIA提供的命令行实用程序。

通常,MMDetection和maskrcnn-benchmark的实际内存使用情况相似,并且低于其他内存。

不同GPU上的推理速度 不同的研究人员可能会使用各种GPU,在这里我们展示了常见GPU的速度基准,例如TITAN X,TITAN Xp,TITAN V,GTX 1080 Ti,RTX 2080 Ti和V100。 我们在每种类型的GPU上评估了三种模型,并在图4中报告了推理速度。请注意,这些服务器的其他硬件(例如CPU和硬盘)并不完全相同,但是结果可以为该模型提供基本的印象。 速度基准。

混合精度训练 MMDetection支持混合精度训练,以减少GPU内存并加快训练速度,而性能却几乎保持不变。 maskrcnn-benchmark支持使用apex2进行混合精度训练,并且SimpleDet也具有自己的实现。 Detectron还不支持。 我们报告结果并与表3中的其他两个代码库进行比较。我们在同一V100节点上测试所有代码库。此外,我们研究了更多模型以找出混合精度训练的有效性。 如表4所示,我们可以了解到,批量越大,节省的内存越多。 当批次大小增加到12时,FP16训练的内存将减少到FP32训练的近一半。此外,将混合精度训练应用于RetinaNet等更简单的框架时,其内存效率更高。

多节点可扩展性 由于MMDetection支持在多个节点上进行分布式训练,因此我们分别在8、16、32、64个GPU上测试其可伸缩性。 我们采用Mask R-CNN作为基准测试方法,并在另一个V100集群上进行实验。 根据[11],当采用不同的批次大小时,基本学习率会线性调整。 图5中的实验结果表明MMDetection对多个节点实现了近乎线性的加速。

大量研究

借助MMDetection,我们对一些重要的组件和超参数进行了广泛的研究。 我们希望该研究可以为更好的做法提供启发,以便在不同方法和设置之间进行公平比较。

回归损失

通常采用多任务损失来训练对象检测器,该对象检测器由分类和回归分支组成。 最广泛采用的回归损失是平滑L1损失。 最近,提出了更多的回归损失,例如有界IoU损失[33],IoU损失[32],GioU损失[28],平衡L1损失[23]。 L1损失也是一个直接的变体。 但是,这些损失通常以不同的方法和设置来实现。 在这里,我们评估在相同环境下的所有损失。 注意,最终性能随分配给回归损失的不同损失权重而变化,因此,我们执行粗网格搜索以找到每种损失的最佳损失权重。

表5中的结果表明,仅通过增加Smooth L1 Loss的损失权重,最终性能可以提高0.5%。 如果不调整损耗权重,则L1损耗将比“平滑L1”高0.6%,而增加损耗权重将不会带来进一步的收益。 与平滑L1相比,L1损耗具有更大的损耗值,尤其是对于相对准确的边界框。 根据[23]中的分析,提高位置更好的边界框的梯度将有利于本地化。 L1损失的损失值已经很大,因此,增加损失权重并不能更好地发挥作用。 平衡的L1损耗实现的mAP比端到端Faster R-CNN的L1损耗高0.3%,这与采用预先计算的建议的[23]中的实验略有不同。 但是,我们发现,平衡的L1损耗会导致在建议的IoU平衡采样或平衡FPN的基线上获得更高的增益。 除了有界IoU损耗外,基于IoU的损耗的性能略好于基于L1的损耗,并且具有最佳的损耗权重。 GIoU损失比IoU损失高0.1%,Bounded IoU损失的性能与Smooth L1损失相似,但需要更大的损失权重。

归一化

由于有限的GPU内存,训练检测器时使用的批处理大小通常很小(1或2),因此,通常将BN层冻结为常规惯例。 有两个用于配置BN层的选项。 (1)是否更新统计量E(x)和Var(x),以及(2)是否优化仿射权重γ和β。 在PyTorch的参数名称之后,我们将(1)和(2)表示为eval并要求grad。 eval = T rue表示不更新统计信息,并且要求grad = T rue表示在训练过程中还优化了γ和β。 除了冻结BN层之外,还有其他标准化层可以解决小批量的问题,例如同步BN(SyncBN)[25]和组标准化(GN)[36]。 我们首先评估骨干网中BN层的不同设置,然后将BN与SyncBN和GN进行比较。

BN settings

我们评估不同的评估组合,并要求在1x和2x训练计划下在Mask R-CNN上毕业。 表6中的结果表明,当我们分别重新计算统计信息(eval为假)并固定仿射权重(要求grad为假)时,以小批量更新统计信息会严重损害性能。 与eval = T rue相比,需要grad = T rue,就bbox AP而言它降低了3.1%,而对于mask AP而言降低了3.0%。 在1倍学习率(lr)计划下,确定仿射权重或不仅仅产生微小差异,即0.1%。 当采用更长的lr计划时,使可仿射权重可训练的性能优于将这些权重固定约0.5%。 在MMDetection中,eval = T rue,要求grad = T rue被用作默认设置

**Different normalization layers ** 不同的归一化层

批处理规范化(BN)在现代CNN中被广泛采用。 但是,它在很大程度上取决于大批量的大小以精确地估计统计量E(x)和Var(x)。 在对象检测中,批次大小通常比分类中小得多,典型的解决方案是使用预先训练的主干的统计信息,而不是在训练过程中更新它们,称为FrozenBN。 最近,提出了SyncBN和GN,并证明了它们的有效性[36,25]。 SyncBN计算跨多个GPU的均值和方差,而GN将特征通道划分为组,并计算每个组内的均值和方差,这有助于解决小批量问题。 仅在配置文件中进行简单修改即可在MMDetection中指定FrozenBN,SyncBN和GN。

在这里,我们研究两个问题。 (1)不同的归一化层之间如何比较? (2)在哪里向探测器添加归一化层? 为了回答这两个问题,我们使用ResNet-50-FPN进行了Mask R-CNN的三个实验,并分别用FrozenBN,SyncBN和GN替换了骨干中的BN层。 组号在[36]之后设置为32。 其他设置和模型架构保持不变。 在[36]中,将2fc bbox头替换为4conv1fc,并且还将GN层添加到FPN和bbox / mask头中。 我们还要进行另外两组实验来研究这两种变化。 此外,我们为bbox head探索了不同数量的卷积层。

表7中的结果表明(1)如果仅用相应的主干替换骨干中的BN层,FrozenBN,SyncBN和GN将达到类似的性能。 (2)将SyncBN或GN添加到FPN和bbox / mask头不会带来进一步的收益。 (3)将2fc bbox头替换为4conv1fc,并在FPN和bbox / mask头上添加归一化层,可使性能提高约1.5%。 (4)bbox head中更多的卷积层将导致更高的性能。

5.3. Training Scales 训练量表

按照惯例,训练图像会在不更改宽高比的情况下调整为预定义的比例。 以前的研究通常更喜欢使用1000×600的比例,现在通常采用1333×800的比例。 在MMDetection中,我们采用1333×800作为默认训练比例。 作为一种简单的数据扩充方法,也通常使用多尺度训练。 没有系统的研究来检查选择合适的训练量表的方法。 知道这一点对于促进更有效的培训至关重要。 当采用多尺度训练时,将在每次迭代中随机选择一个尺度,并将图像调整为所选的尺度。 主要有两种随机选择方法,一种是预定义一组标尺并从中随机选择一个标尺,另一种是定义标尺范围,并在最小和最大标尺之间随机生成一个标尺。 我们将第一种方法称为“值”模式,将第二种方法称为“范围”模式。 具体来说,“范围”模式可以看作是“值”模式的一种特殊情况,其中预定义比例尺的间隔为1。

我们用不同的尺度和随机模式训练Mask R-CNN,并采用2x lr计划,因为更多的训练增强通常需要更长的lr计划。 结果显示在表8中,其中1333×[640:800:32]表示较长的边固定为1333,较短的边是从{640,672,704,736,768, 800},对应于“值”模式。 设置1333×[640:800]表示较短的边缘是在640和800之间随机选择的,这对应于“范围”模式。 从结果可以看出,在相同的最小和最大刻度下,“范围”模式的性能与“值”模式相似或稍好。 通常,范围更大会带来更多的改进,尤其是对于更大的最大比例。 具体来说,就bbox和mask AP而言,[640:960]比[640:800]高0.4%和0.5%。 但是,较小的最小刻度(如480)将无法获得更好的性能

Other Hyper-parameters. 其他超参数

MMDetection主要遵循Detectron中的超参数设置,并探索我们自己的实现。 根据经验,我们发现Detectron的某些超参数不是最佳的,特别是对于RPN。 在表9中,我们列出了可以进一步改善RPN性能的那些。 尽管微调可能会提高性能,但在MMDetection中,默认情况下我们采用与Detectron相同的设置,此研究仅供参考。

smoothl1 beta

大多数检测方法都采用平滑L1损耗作为回归损耗,实现为割炬。其中(x <beta,0.5 ∗ x 2 / beta,x − 0.5 ∗ beta)。参数beta是L1项和MSELoss项的阈值。 根据经验,该值在RPN中默认设置为1 9,具体取决于经验回归误差的标准偏差。实验结果表明,较小的beta可能会稍微改善RPN的平均召回率(AR)。 在5.1节的研究中,我们发现损失权重为1时,L1损失的表现优于平滑L1。当将beta设置为较小的值时,平滑L1损失将更接近L1损失,等效损失权重更大, 导致更好的性能

allowed border

在RPN中,在特征图的每个位置上都会生成预定义锚。 训练期间,超出图像边界超出允许范围的锚点将被忽略。 默认情况下,它设置为0,这意味着超出图像边界的所有锚点都将被忽略。 但是,我们发现放宽该规则将是有益的。 如果将其设置为无穷大,这意味着所有锚点都不会被忽略,则AR将从57.1%提高到57.7%。 这样,在训练过程中,边界附近的地面真实物体将具有更多匹配的正样本。

上一篇:loss函数之L1Loss与MSELoss


下一篇:【Win10+RTX3090】Windows下最新版本mmdetection的安装/环境配置流程