MMDetection 2.x 的兼容性¶
MMDetection 2.25.0¶
为了支持 Mask2Former 进行实例分割,Mask2Former 用于全景分割的原始配置文件需要重命名 PR #7571。
v2.25.0 之前 | v2.25.0 之后 |
'mask2former_xxx_coco.py' represents config files for **panoptic segmentation**.
|
'mask2former_xxx_coco.py' represents config files for **instance segmentation**.
'mask2former_xxx_coco-panoptic.py' represents config files for **panoptic segmentation**.
|
---|
MMDetection 2.21.0¶
为了支持 CPU 训练,批量整理中散射的逻辑已经改变。我们建议使用 MMCV v1.4.4 或更高版本。有关更多详细信息,请参考 MMCV PR #1621。
MMDetection 2.18.1¶
MMCV 兼容性¶
为了修复 BaseTransformerLayer 中错误的权重引用错误,MultiheadAttention 的批处理优先模式中的逻辑已经改变。我们建议使用 MMCV v1.3.17 或更高版本。有关更多详细信息,请参考 MMCV PR #1418。
MMDetection 2.14.0¶
MMDetection 2.12.0¶
从 v2.12.0 到 v2.18.0(可能更长)的版本发布过程中,MMDetection 正在进行重大的重构,以实现更通用和便捷的用法。在 v2.12.0 中,MMDetection 不可避免地带来了一些 BC-breakings,包括 MMCV 依赖项、模型初始化、模型注册和掩码 AP 评估。
MMCV 版本¶
MMDetection v2.12.0 依赖于 MMCV 1.3.3 中的最新功能,包括 BaseModule
用于统一的参数初始化、模型注册,以及 CUDA 运算符 MultiScaleDeformableAttn
用于 可变形 DETR。请注意,MMCV 1.3.2 已经包含了 MMDet 使用的所有功能,但存在已知问题。因此,我们建议用户跳过 MMCV v1.3.2 并使用 v1.3.2,尽管 v1.3.2 可能适用于大多数情况。
统一的模型初始化¶
为了统一 OpenMMLab 项目中的参数初始化,MMCV 支持 BaseModule
,它接受 init_cfg
,以允许模块的参数以灵活和统一的方式初始化。现在,用户需要在训练脚本中显式调用 model.init_weights()
来初始化模型(如 此处,之前这是由检测器处理的。**下游项目必须相应地更新其模型初始化才能使用 MMDetection v2.12.0**。有关详细信息,请参考 PR #4750。
统一的模型注册¶
为了轻松使用在其他 OpenMMLab 项目中实现的主干网络,MMDetection v2.12.0 继承了在 MMCV (#760) 中创建的模型注册表。这样,只要主干网络在 OpenMMLab 项目中受支持,并且该项目也使用 MMCV 中的注册表,用户就可以通过简单地修改配置,而无需将该主干网络的代码复制到 MMDetection 中,来在 MMDetection 中使用该主干网络。有关更多详细信息,请参考 PR #5059。
掩码 AP 评估¶
在 PR 4898 和 V2.12.0 之前,小、中、大实例的掩码 AP 是根据边界框面积而不是实际掩码面积计算的。这会导致更高的 APs
和 APm
,但更低的 APl
,但不会影响整体掩码 AP。 PR 4898 通过在掩码 AP 计算中删除 bbox
来更改它,以使用掩码面积。新的计算不会影响整体掩码 AP 评估,并且与 Detectron2 一致。
与 MMDetection 1.x 的兼容性¶
MMDetection 2.0 经历了重大的重构,并解决了了许多遗留问题。它与 1.x 版本不兼容,即使用这两个版本中的相同模型权重进行推理会产生不同的结果。因此,MMDetection 2.0 重新对所有模型进行了基准测试,并在模型库中提供了它们的链接和日志。
主要差异体现在四个方面:坐标系、代码库约定、训练超参数和模块化设计。
坐标系¶
新的坐标系与 Detectron2 一致,并将最左上角像素的中心视为 (0, 0),而不是该像素的左上角。因此,该系统将 COCO 边界框和分割注释中的坐标解释为 [0, width]
或 [0, height]
范围内的坐标。此修改会影响与边界框和像素选择相关的所有计算,这更加自然和准确。
具有 (x1, y1) 和 (x2, y2) 角点的框在新的坐标系中的高度和宽度计算为
width = x2 - x1
和height = y2 - y1
。在 MMDetection 1.x 和之前的版本中,高度和宽度都添加了“+ 1”。此修改体现在三个方面回归中的边界框转换和编码/解码。
IoU 计算。这会影响地面实况和边界框之间的匹配过程以及 NMS 过程。尽管如此,对兼容性的影响非常小。
边界框的角点为浮点类型,不再进行量化。这应该提供更准确的边界框结果。这也使边界框和 RoI 不需要具有 1 的最小大小,尽管如此,其影响很小。
锚点与特征网格点中心对齐,并为浮点类型。在 MMDetection 1.x 和之前的版本中,锚点为
int
类型,并且没有中心对齐。这会影响 RPN 中的锚点生成以及所有基于锚点的算法。ROIAlign 更好地与图像坐标系对齐。新实现采用自 Detectron2。与 MMDetection 1.x 相比,当 RoI 用于裁剪 RoI 特征时,RoI 默认会偏移半个像素。可以通过设置
aligned=False
而不是aligned=True
来使用旧行为。掩码裁剪和粘贴更加准确。
我们使用新的 RoIAlign 来裁剪掩码目标。在 MMDetection 1.x 中,边界框在用于裁剪掩码目标之前会被量化,裁剪过程由 numpy 实现。在新实现中,用于裁剪的边界框不会被量化,而是被发送到 RoIAlign。这种实现极大地提高了训练速度(每次迭代约 0.1 秒,训练 Mask R50 1x 调度时约 2 小时),并且应该更准确。
在 MMDetection 2.0 中,“
paste_mask()
” 函数有所不同,并且应该比以前版本中的函数更准确。此更改遵循 Detectron2 中的修改,可以将 COCO 上的掩码 AP 提高约 0.5%(绝对值)。
代码库约定¶
MMDetection 2.0 改变了类别标签的顺序,以便更自然地减少回归和掩码分支中的未使用参数(没有 +1 和 -1)。这会影响模型所有分类层的类别标签顺序。回归分支和掩码头的最终层不再保留 K+1 个通道,用于 K 个类别,并且它们的类别顺序与分类分支一致。
在 MMDetection 2.0 中,标签 “K” 表示背景,标签 [0, K-1] 对应于 K = num_categories 个目标类别。
在 MMDetection 1.x 和之前的版本中,标签 “0” 表示背景,标签 [1, K] 对应于 K 个类别。
注意:softmax RPN 的类别顺序在版本<=2.4.0 中仍然与 1.x 中的相同,而 sigmoid RPN 不受影响。所有头部的类别顺序从 MMDetection v2.5.0 开始统一。
R-CNN 中未采用低质量匹配。在 MMDetection 1.x 和之前的版本中,
max_iou_assigner
将在 RPN 和 R-CNN 训练中为每个地面真实框匹配低质量框。我们观察到这有时不会将最完美的 GT 框分配给某些边界框,因此 MMDetection 2.0 在新系统中默认情况下不允许在 R-CNN 训练中进行低质量匹配。这有时会略微提高框 AP(约 0.1% 的绝对值)。为宽度和高度分别设置比例因子。在 MMDetection 1.x 和之前的版本中,比例因子是在
keep_ratio=True
模式下的单个浮点数。这略有不准确,因为宽度和高度的比例因子存在细微差异。MMDetection 2.0 采用针对宽度和高度的单独比例因子,AP 提升约 0.1%(绝对值)。配置文件名称约定已更改。MMDetection V2.0 采用新的名称约定来维护逐渐增长的模型库,如下所示
[model]_(model setting)_[backbone]_[neck]_(norm setting)_(misc)_(gpu x batch)_[schedule]_[dataset].py,
其中 (
misc
) 包括 DCN 和 GCBlock 等。有关更多详细信息,请参阅 配置文件文档MMDetection V2.0 使用新的 ResNet Caffe 主干来减少加载预训练模型时的警告。大多数新主干的权重与以前相同,但没有
conv.bias
,除了它们使用不同的img_norm_cfg
。因此,新主干不会引发意外键警告。
训练超参数¶
训练超参数的更改不会影响模型级别的兼容性,但会略微提高性能。主要变化是
通过设置
nms_post=1000
和max_num=1000
,nms 后的提议数量从 2000 更改为 1000。这会略微提高掩码 AP 和 bbox AP,约 0.2%(绝对值)。Mask R-CNN、Faster R-CNN 和 RetinaNet 的默认框回归损失从平滑 L1 损失更改为 L1 损失。这导致框 AP 总体提高(约 0.6% 的绝对值)。但是,对于级联 R-CNN 和 HTC 等其他方法使用 L1 损失不会提高性能,因此我们保持这些方法的原始设置。
为了简便起见,RoIAlign 层的样本数量设置为 0。这会导致掩码 AP 略微提高(约 0.2% 的绝对值)。
默认设置在训练期间不再使用梯度裁剪,以加快训练速度。这不会降低大多数模型的性能。对于某些模型(例如 RepPoints),我们继续使用梯度裁剪来稳定训练过程并获得更好的性能。
由于通常不使用梯度裁剪,因此默认预热比例从 1/3 更改为 0.001,以实现更平滑的预热过程。尽管如此,在我们重新基准测试期间,影响发现可以忽略不计。
将模型从 1.x 升级到 2.0¶
要将由 MMDetection V1.x 训练的模型转换为 MMDetection V2.0,用户可以使用脚本 tools/model_converters/upgrade_model_version.py
来转换模型。转换后的模型可以在 MMDetection V2.0 中运行,性能会略有下降(不到 1% 的 AP 绝对值)。详细信息可以在 configs/legacy
中找到。
pycocotools 兼容性¶
mmpycocotools
是 OpenMMlab 对官方 pycocotools
的分支,适用于 MMDetection 和 Detectron2。在 PR 4939 之前,由于 pycocotools
和 mmpycocotool
具有相同的包名,如果用户已安装 pycocotools
(在同一个环境下首先安装了 Detectron2),那么 MMDetection 的安装将跳过安装 mmpycocotool
。因此,MMDetection 会因为缺少 mmpycocotools
而失败。如果 MMDetection 在 Detectron2 之前安装,它们可以在同一个环境下运行。PR 4939 弃用 mmpycocotools,转而使用官方 pycocotools。在 PR 4939 之后,无论安装顺序如何,用户都可以在同一个环境下安装 MMDetection 和 Detectron2。