MMDetection 中 InstaBoost 数据增强实战基于概率图引导 Copy-Pasting 的实例分割提升方案【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetectionInstaBoost 是一种基于概率图引导 Copy-Pasting 的数据增强方法利用已有实例掩码mask标注通过随机抖动与局部外观相似度引导的物体复制粘贴来扩充训练集从而在不改变骨干网络结构、不增加推理开销的前提下显著提升实例分割精度。本文以 MMDetection 仓库configs/instaboost/目录下的官方配置为骨架结合mmdet/datasets/transforms/instaboost.py源码与对应测试完整讲解如何在 MMDetection 数据流水线中启用 InstaBoost、逐参数调优并给出基于 Mask R-CNN / Cascade Mask R-CNN 的 4x 训练实践与性能基准。1. InstaBoost 是什么方法背景与核心思想InstaBoost全称InstaBoost: Boosting Instance Segmentation via Probability Map Guided Copy-Pasting是发表于 ICCV 2019 的数据增强方法论文作者即提供了本目录下配置的实现。方法的核心观察是实例分割需要大量训练样本而现有标注中的 mask 本身就蕴含着可以重复利用的监督信息同时自然图像背景区域存在大量像素冗余为复制粘贴提供了空间。整个方法由两部分构成基于 mask 标注的随机抖动random jittering增强直接在实例 mask 上施加平移、缩放、旋转、颜色扰动等随机变换利用背景像素冗余把物体搬运到新位置。论文报告该方法仅凭随机抖动即可在 COCO 上为 Mask R-CNN 带来 1.7 mAP、在 Pascal VOC 上带来 3.3 mAP 的提升。位置概率图location probability map引导放置基于局部外观相似度估计图像上每个位置摆放物体的可行性在该概率图引导下选择复制粘贴的目标位置避免把物体放到语义不合理的位置。配合概率图引导论文将 R101-Mask R-CNN 在实例分割上的成绩从 35.7 mAP 提升到 37.9 mAP且没有修改 backbone 或网络结构。从方法性质上讲InstaBoost 属于典型的训练期train-time数据增强它只影响训练数据流水线不参与推理因此不会增加训练之外的计算复杂度也不影响推理效率可以无缝集成到任意实例分割模型的训练流程中。这也正是本目录下所有配置都能直接套用在 Mask R-CNN、Cascade Mask R-CNN 等不同检测器上的原因。2. 环境准备安装 instaboostfastInstaBoost 的增强核心由 C/Python 加速库instaboostfast提供MMDetection 侧只负责数据格式转换与流水线编排。使用前需要先安装pip install instaboostfast该依赖是可选依赖只有真正启用 InstaBoost 增强时才需要。如果未安装就运行包含InstaBoost变换的训练配置MMDetection 会在实例化变换时抛出ImportError提示先执行上述安装命令见 mmdet/datasets/transforms/instaboost.py。此外源码中还做了一个细节处理instaboostfast在导入时会修改 matplotlib 的默认后端可能影响后续可视化因此 MMDetection 在导入后会将后端恢复为原值见 mmdet/datasets/transforms/instaboost.py。3. 在 MMDetection 数据流水线中启用 InstaBoost3.1 流水线位置与最小配置MMDetection 已将 InstaBoost 完整集成进数据流水线pipeline启用方式非常简洁在LoadImageFromFile之后、LoadAnnotations之前插入一个InstaBoost变换。以官方提供的 mask-rcnn_r50_fpn_instaboost-4x_coco.py 为例train_pipeline [ dict(typeLoadImageFromFile, backend_args{{_base_.backend_args}}), dict( typeInstaBoost, action_candidate(normal, horizontal, skip), action_prob(1, 0, 0), scale(0.8, 1.2), dx15, dy15, theta(-1, 1), color_prob0.5, hflagFalse, aug_ratio0.5), dict(typeLoadAnnotations, with_bboxTrue, with_maskTrue), dict(typeResize, scale(1333, 800), keep_ratioTrue), dict(typeRandomFlip, prob0.5), dict(typePackDetInputs) ]放置位置是有讲究的InstaBoost需要读取原始图像与实例标注所以必须放在LoadImageFromFile之后而LoadAnnotations尚未执行因此它直接依赖上游已经载入的instances字段由数据集的load annotations逻辑在流水线之前填充。在 mask-rcnn_r50_fpn_1x_coco.py 基础配置中原流水线是LoadImageFromFile - LoadAnnotations - Resize - RandomFlip - PackDetInputsInstaBoost 变体仅将InstaBoost插在中间其余保持一致。3.2 InstaBoost 变换的参数全解以下参数直接透传给instaboostfast的InstaBoostConfig其含义与取值范围在 mmdet/datasets/transforms/instaboost.py 的 docstring 中有完整定义参数默认值含义与说明action_candidate(normal, horizontal, skip)候选动作集合支持normal常规复制粘贴、horizontal水平翻转后粘贴、vertical垂直翻转、skip跳过action_prob(1, 0, 0)与action_candidate一一对应的动作概率长度必须一致(1, 0, 0)表示只做常规复制粘贴scale(0.8, 1.2)复制粘贴时物体随机缩放的最小比例, 最大比例范围dx15允许的最大 x 轴偏移量 实例宽度 / dxdx 越小偏移幅度越大dy15允许的最大 y 轴偏移量 实例高度 / dydy 越小偏移幅度越大theta(-1, 1)允许的旋转角度范围最小角度, 最大角度单位为度color_prob0.5对图像施加颜色增强color augmentation的概率hflagFalse是否启用概率图引导heatmap guided为False时退化为纯随机抖动复制粘贴aug_ratio0.5每个样本实际应用 InstaBoost 增强的概率是 MMDetection 侧单独控制、不传给底层库的参数关键点解读hflagFalse时走的是随机抖动路线即论文中单独即可带来提升的第一部分hflagTrue时启用位置概率图引导第二部分代价是训练时会额外计算概率图。dx/dy与偏移量成反比关系调小数值会增大物体位移幅度增强强度随之上升但过小可能导致物体粘贴位置明显不合理。aug_ratio在 instaboost.py 中以np.random.choice([0, 1], p[1 - self.aug_ratio, self.aug_ratio])的方式对每个样本随机决定是否执行增强起到以一定概率使用该变换的混合效果。3.3 变换内部的数据流转源码级解读InstaBoost继承自mmcv.transforms.BaseTransform通过TRANSFORMS.register_module()注册可被配置中的dict(typeInstaBoost)直接构建。其transform方法的数据流如下见 mmdet/datasets/transforms/instaboost.py从results取出img与instances若当前样本没有实例直接原样返回不做任何处理调用_load_anns把 MMDetection 内部格式的标注bbox、bbox_label、mask、ignore_flag转换为 instaboost 期望的输入格式bbox 由[x1, y1, x2, y2]转成[x1, y1, w, h]见 instaboost.py。其中ignore_flag ! 0的实例会被放入ignore_anns不参与增强按aug_ratio决定是否调用instaboost.get_new_data(anns, img, self.cfg, backgroundNone)执行实际的复制粘贴调用_parse_anns将 instaboost 返回的新标注还原为 MMDetection 格式宽或高非正的异常框会被过滤见 instaboost.py并把处理后的img与instances写回results。对应地仓库测试 tests/test_datasets/test_transforms/test_instaboost.py 验证了三条行为经变换后图像 dtype 仍为np.uint8、instances字段依然存在、以及repr输出为InstaBoost(aug_ratio0.5)——其中第三点说明__repr__只暴露aug_ratio作为该变换的摘要信息。4. 4x 训练计划为 InstaBoost 定制的调度与配置4.1 为什么是 48 Epochs增强带来的免费样本增加了每个 epoch 的有效数据量但论文作者与官方实验共同的经验是为了在精度与训练时间之间取得平衡使用 InstaBoost 的模型统一训练 48 个 Epoch即 4x 计划而不是常规的 1x12 epochs。本目录所有发布模型均按此约定训练其余训练/测试配置则严格沿用原框架。4.2 学习率与训练配置max_epochs 48配合如下学习率调度见 mask-rcnn_r50_fpn_instaboost-4x_coco.pyparam_scheduler [ dict( typeLinearLR, start_factor0.001, by_epochFalse, begin0, end500), dict( typeMultiStepLR, begin0, endmax_epochs, by_epochTrue, milestones[32, 44], gamma0.1) ] train_cfg dict(max_epochsmax_epochs)其中LinearLR负责前 500 iter 的线性 warmupMultiStepLR在第 32 和第 44 epoch 将学习率乘以 0.1相比 1x 计划12/16 epoch 衰减整体拉长。4.3 显存与检查点管理由于训练时长翻倍配置还额外做了两点工程化处理# only keep latest 3 checkpoints default_hooks dict(checkpointdict(max_keep_ckpts3))只保留最近 3 个 checkpoint避免长训练周期把磁盘写满。显存方面官方基准显示 R50-FPN Mask R-CNN 训练占用约 4.4 GBX101-64x4d-FPN 约 10.7 GB详见下文结果表与 metafile.yml。5. 训练与评估命令与基准结果5.1 单机多卡训练MMDetection 标准训练入口是 tools/train.py配合 tools/dist_train.sh 进行多卡训练bash tools/dist_train.sh configs/instaboost/mask-rcnn_r50_fpn_instaboost-4x_coco.py 8单卡直接运行python tools/train.py configs/instaboost/mask-rcnn_r50_fpn_instaboost-4x_coco.py注意模型基准在 COCO 数据集上训练需要按 configs/base/datasets/coco_instance.py 中的约定准备好data/coco/数据目录annotations/instances_train2017.json与train2017/图像等。5.2 官方基准结果以下结果均使用coco_2017_train训练、coco_2017_val测试论文原报告中为test-dev数据来自 configs/instaboost/README.md 与 metafile.yml网络BackboneLr schd训练显存 (GB)Inf time (fps)box APmask AP配置文件Mask R-CNNR-50-FPN4x4.417.540.636.6mask-rcnn_r50_fpn_instaboost-4x_coco.pyMask R-CNNR-101-FPN4x6.4-42.538.0mask-rcnn_r101_fpn_instaboost-4x_coco.pyMask R-CNNX-101-64x4d-FPN4x10.7-44.739.7mask-rcnn_x101-64x4d_fpn_instaboost-4x_coco.pyCascade Mask R-CNNR-101-FPN4x6.012.043.738.0cascade-mask-rcnn_r101_fpn_instaboost-4x_coco.py各模型的权重文件.pth与训练日志.log.json可从 OpenMMLab 官方模型库下载具体 URL 见 metafile.yml 中每个模型的Weights字段如 R50 模型的mask_rcnn_r50_fpn_instaboost_4x_coco_20200307-d025f83a.pth。需要说明的是表中的Inf time为 V100 单卡、FP32、分辨率 (800, 1333) 条件下的官方测速值R101 与 X101 两行的 fps 在官方表格中未提供以-标注不做编造。6. 如何复用到自己的检测器自定义接入指南InstaBoost 与具体检测器解耦只依赖图像 实例 mask 标注这一前提因此可以方便地移植到任意实例分割模型。接入步骤归纳如下基础配置从对应模型的 1x 配置继承例如 Cascade Mask R-CNN 变体以 cascade-mask-rcnn_r50_fpn_1x_coco.py 为_base_见 cascade-mask-rcnn_r50_fpn_instaboost-4x_coco.py改写 train_pipeline在LoadImageFromFile与LoadAnnotations之间插入InstaBoost变换注意测试流水线test_pipeline不需要加增强只作用于训练用train_dataloader dict(datasetdict(pipelinetrain_pipeline))覆盖基础配置的训练流水线延长训练计划将max_epochs改为 48并同步调整MultiStepLR的milestones[32, 44]即上述第 4 节的完整套路安装依赖并启动训练确认instaboostfast已安装后按第 5 节的命令运行。7. 使用注意事项与调参建议前提条件InstaBoost 依赖实例 mask 标注纯 bbox 目标检测任务如只有with_bboxTrue的数据集无法获得增强收益因为复制粘贴需要 mask 定义物体区域若流水线中LoadAnnotations未开启with_maskTrue需先补充 mask 标注源。hflag的取舍追求论文完整方案概率图引导时开启hflagTrue并配套action_candidate/action_prob组合若只想要轻量随机抖动保持默认False即可。官方发布模型默认使用hflagFalse的随机抖动配置。增强强度控制aug_ratio控制应用比例scale、dx、dy、theta控制几何变换幅度color_prob控制颜色扰动概率。小数据集或类别不平衡场景可适当调大aug_ratio如 0.81.0以放大增广效果物体密集、相互遮挡严重的场景建议缩小dx/dy或调低aug_ratio避免产生过多遮挡重叠。忽略实例源码中ignore_flag ! 0的实例会被跳过增强见 instaboost.py因此标注中标记为 ignore 的困难区域不会被意外搬运。与其他增强的配合InstaBoost 位于Resize、RandomFlip之前先完成基于原始分辨率的复制粘贴再做常规几何变换这与官方 1x 基线中Resize - RandomFlip的顺序保持兼容。8. 结论InstaBoost 提供了一条零网络改动、零推理开销的实例分割提精路径在 MMDetection 中只需在LoadImageFromFile之后插入一个InstaBoost变换、安装instaboostfast、并把训练计划延长至 48 epochs即可在 Mask R-CNN / Cascade Mask R-CNN 系列模型上获得 box/mask AP 的稳定提升。其底层实现mmdet/datasets/transforms/instaboost.py与测试用例tests/test_datasets/test_transforms/test_instaboost.py都已在当前仓库中直接可用读者可以基于本文的参数对照表与基准数据快速将其接入自己的实例分割训练流程。引用若在论文或报告中引用 InstaBoost 方法官方给出的 BibTeX 如下源自 configs/instaboost/README.mdinproceedings{fang2019instaboost, title{Instaboost: Boosting instance segmentation via probability map guided copy-pasting}, author{Fang, Hao-Shu and Sun, Jianhua and Wang, Runzhong and Gou, Minghao and Li, Yong-Lu and Lu, Cewu}, booktitle{Proceedings of the IEEE International Conference on Computer Vision}, pages{682--691}, year{2019} }【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考