
人工智能计算机视觉深度学习模型评测【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmdetection点击查看免费下载导读本文是一份面向 MMDetectionOpenMMLab Detection Toolbox开发者的端到端实战指南完整讲解如何在标准数据集上训练、测试与推理自定义检测模型。全文以 Cityscapes 数据集上训练一个定制版Cascade Mask R-CNN R50为例用自研 Neck以AugFPN为示例替换默认的FPN并在训练管线中注入Rotate/TranslateX自动数据增强。读完本文你将掌握四大核心能力标准数据集的准备与格式转换、基于注册机制自定义模型组件、编写继承式配置文件、以及使用tools/train.py与tools/test.py完成完整的训练-测试闭环。整体流程只需四步① 准备标准数据集 → ② 编写自定义模型模块 → ③ 编写配置文件 → ④ 训练、测试与推理。下文将结合仓库源码逐一深入。第一步准备标准数据集1.1 数据目录结构本文以标准 Cityscapes 数据集为例。MMDetection 建议将数据集根目录软链接到$MMDETECTION/data下目录结构如下mmdetection ├── mmdet ├── tools ├── configs ├── data │ ├── coco │ │ ├── annotations │ │ ├── train2017 │ │ ├── val2017 │ │ ├── test2017 │ ├── cityscapes │ │ ├── annotations │ │ ├── leftImg8bit │ │ │ ├── train │ │ │ ├── val │ │ ├── gtFine │ │ │ ├── train │ │ │ ├── val │ ├── VOCdevkit │ │ ├── VOC2007 │ │ ├── VOC2012如果你的目录结构不同则需要相应修改配置文件中的路径。另一种更优雅的做法是通过环境变量指定数据根目录从而完全避免改动配置文件export MMDET_DATASETS$data_root配置解析时会用$MMDET_DATASETS替换数据根路径这一机制使得同一份配置可以无缝迁移到不同机器、不同数据挂载点。从仓库中的 基础数据集配置 可以看到数据根路径默认值即为data/cityscapes/并通过data_root变量引用dataset_type CityscapesDataset data_root data/cityscapes/1.2 将 Cityscapes 标注转换为 COCO 格式MMDetection 的 Cityscapes 实例分割配置依赖 COCO 格式的标注文件例如annotations/instancesonly_filtered_gtFine_train.json因此需要先用仓库自带的转换脚本tools/dataset_converters/cityscapes.py完成格式转换pip install cityscapesscripts python tools/dataset_converters/cityscapes.py ./data/cityscapes --nproc 8 --out-dir ./data/cityscapes/annotations./data/cityscapesCityscapes 数据根目录--nproc 8使用 8 个进程并行转换可显著提速--out-dir ./data/cityscapes/annotations转换后 JSON 标注的输出目录。1.3 预训练权重准备目前configs/cityscapes下的配置文件使用COCO 预训练权重初始化模型。如果网络不可用或较慢请务必提前手动下载预训练模型否则训练开始阶段会因为无法加载权重而报错。这一机制在自定义配置中通过load_from字段指定详见第四步它只加载权重、不参与模型结构定义。第二步编写自定义模型以 AugFPN Neck 为例第二步的核心是用你自己的模块替换或扩展现有检测器。这里假设我们要在 Cascade Mask R-CNN R50 检测器中实现一个新的 Neck ——AugFPN替换默认的FPN。2.1 新建 AugFPN 模块文件首先在mmdet/models/necks/下新建文件augfpn.pyimport torch.nn as nn from mmdet.registry import MODELS MODELS.register_module() class AugFPN(nn.Module): def __init__(self, in_channels, out_channels, num_outs, start_level0, end_level-1, add_extra_convsFalse): pass def forward(self, inputs): # implementation is ignored pass这里最关键的一行是MODELS.register_module()装饰器。从仓库的 注册表实现 可以看到MODELS是 MMDetection 提供的 17 个注册节点之一它是 MMEngine 根注册表的子注册表# manage all kinds of modules inheriting nn.Module MODELS Registry(model, parentMMENGINE_MODELS, locations[mmdet.models])注册机制的本质是建立字符串类型名 → 类对象的映射。装饰器把AugFPN类以AugFPN为键登记进MODELS注册表之后配置文件里typeAugFPN就会被自动解析为这个类。你可以参照仓库中真实的 FPN 实现 来理解一个标准 Neck 的接口约定——其__init__签名恰好包含示例中出现的全部参数MODELS.register_module() class FPN(BaseModule): def __init__( self, in_channels: List[int], out_channels: int, num_outs: int, start_level: int 0, end_level: int -1, add_extra_convs: Union[bool, str] False, ... ) - None:从 FPN 的源码实现可以进一步理解这些参数的含义in_channels各尺度输入特征图的通道数列表与 backbone 的out_indices输出一一对应out_channels每个输出尺度统一的通道数num_outs输出特征金字塔的层数start_level/end_level从 backbone 的哪一层开始/结束构建金字塔end_level-1表示取到最后一层add_extra_convs是否在金字塔之上追加下采样卷积如 RetinaNet 场景源码中True会被归一化为on_input。FPN 的__init__中还包含长度断言如num_outs num_ins - start_level新实现的 Neck 建议同样保留这类输入校验避免配置错误在训练中途才暴露。2.2 导入模块两种方式二选一方式一修改mmdet/models/necks/__init__.py在 necks 包初始化文件 中追加一行导入并同步加入__all__from .augfpn import AugFPN仓库中每个内置 NeckFPN、PAFPN、DyHead等都是通过这种集中导出的方式完成注册的例如from .fpn import FPN ... __all__ [FPN, BFP, ...]方式二在配置文件中使用custom_imports推荐零侵入不想改动仓库源码时可以在配置文件里动态导入新模块custom_imports dict( imports[mmdet.models.necks.augfpn], allow_failed_importsFalse)custom_imports会在配置加载阶段主动执行指定模块的导入从而触发MODELS.register_module()完成注册。这种方式让自定义代码完全独立于仓库本体便于后续升级、复用与分发。2.3 在配置中替换 Neck配置层面只需要把neck字段的type换成AugFPN并传入所需参数neckdict( typeAugFPN, in_channels[256, 512, 1024, 2048], out_channels256, num_outs5)对比仓库中 Cascade Mask R-CNN 基础配置 里默认的 FPN 配置可以直观看到两者结构完全一致、仅type不同这正是注册机制带来的即插即用体验neckdict( typeFPN, in_channels[256, 512, 1024, 2048], out_channels256, num_outs5),第三步编写自定义配置文件3.1 配置继承策略第三步是为自己的训练设定准备一份完整配置。假设配置文件位于configs/cityscapes/目录下命名为cascade-mask-rcnn_r50_augfpn_autoaug-10e_cityscapes.py通过_base_字段继承三份基础配置从而只突出必要的修改点# The new config inherits the base configs to highlight the necessary modification _base_ [ ../_base_/models/cascade-mask-rcnn_r50_fpn.py, ../_base_/datasets/cityscapes_instance.py, ../_base_/default_runtime.py ]三份基础配置分别提供模型结构cascade-mask-rcnn_r50_fpn.py、数据加载与评测cityscapes_instance.py、默认运行时设置default_runtime.py。3.2 模型部分替换 Neck 与调整类别数model dict( # set None to avoid loading ImageNet pre-trained backbone, # instead here we set load_from to load from COCO pre-trained detectors. backbonedict(init_cfgNone), # replace neck from defaultly FPN to our new implemented module AugFPN neckdict( typeAugFPN, in_channels[256, 512, 1024, 2048], out_channels256, num_outs5), # We also need to change the num_classes in head from 80 to 8, to match the # cityscapes datasets annotation. This modification involves bbox_head and mask_head. roi_headdict( bbox_head[ dict( typeShared2FCBBoxHead, in_channels256, fc_out_channels1024, roi_feat_size7, # change the number of classes from defaultly COCO to cityscapes num_classes8, bbox_coderdict( typeDeltaXYWHBBoxCoder, target_means[0., 0., 0., 0.], target_stds[0.1, 0.1, 0.2, 0.2]), reg_class_agnosticTrue, loss_clsdict( typeCrossEntropyLoss, use_sigmoidFalse, loss_weight1.0), loss_bboxdict(typeSmoothL1Loss, beta1.0, loss_weight1.0)), dict( typeShared2FCBBoxHead, in_channels256, fc_out_channels1024, roi_feat_size7, # change the number of classes from defaultly COCO to cityscapes num_classes8, bbox_coderdict( typeDeltaXYWHBBoxCoder, target_means[0., 0., 0., 0.], target_stds[0.05, 0.05, 0.1, 0.1]), reg_class_agnosticTrue, loss_clsdict( typeCrossEntropyLoss, use_sigmoidFalse, loss_weight1.0), loss_bboxdict(typeSmoothL1Loss, beta1.0, loss_weight1.0)), dict( typeShared2FCBBoxHead, in_channels256, fc_out_channels1024, roi_feat_size7, # change the number of classes from defaultly COCO to cityscapes num_classes8, bbox_coderdict( typeDeltaXYWHBBoxCoder, target_means[0., 0., 0., 0.], target_stds[0.033, 0.033, 0.067, 0.067]), reg_class_agnosticTrue, loss_clsdict( typeCrossEntropyLoss, use_sigmoidFalse, loss_weight1.0), loss_bboxdict(typeSmoothL1Loss, beta1.0, loss_weight1.0)) ], mask_headdict( typeFCNMaskHead, num_convs4, in_channels256, conv_out_channels256, # change the number of classes from default COCO to cityscapes num_classes8, loss_maskdict( typeCrossEntropyLoss, use_maskTrue, loss_weight1.0))))要点解读backbonedict(init_cfgNone)显式关闭 ImageNet 预训练主干初始化改为通过下文load_from加载 COCO 预训练的完整检测器权重以获得更稳定的训练起点三阶段级联bbox_head与mask_head全部从 80 类改为 8 类Cityscapes 实例分割数据集只有 8 个类别类别数不匹配会直接导致网络输出维度与标注维度不一致。三个Shared2FCBBoxHead的target_stds依次递减[0.1,0.1,0.2,0.2]→[0.05,...]→[0.033,...]这是 Cascade R-CNN 由粗到精回归的标准设计与 基础配置 保持一致仅类别数不同如果只做检测不做分割可同时考虑将mask_head移除但本文示例是完整的实例分割模型。3.3 数据部分自定义训练管线AutoAugment重写train_pipeline在原有RandomResize/RandomFlip基础上插入AutoAugment自动增强# over-write train_pipeline for new added AutoAugment training setting train_pipeline [ dict(typeLoadImageFromFile), dict(typeLoadAnnotations, with_bboxTrue, with_maskTrue), dict( typeAutoAugment, policies[ [dict( typeRotate, level5, img_border_value(124, 116, 104), prob0.5) ], [dict(typeRotate, level7, img_border_value(124, 116, 104)), dict( typeTranslateX, level5, prob0.5, img_border_value(124, 116, 104)) ], ]), dict( typeRandomResize, scale[(2048, 800), (2048, 1024)], keep_ratioTrue), dict(typeRandomFlip, prob0.5), dict(typePackDetInputs), ] # set batch_size per gpu, and set new training pipeline train_dataloader dict( batch_size1, num_workers3, # over-write pipeline with new training pipeline setting datasetdict(pipelinetrain_pipeline))AutoAugment的底层实现位于 augment_wrappers.py它继承自RandomChoice调用时从policies列表中等概率随机挑选一个增强策略作用于图像。其policies参数结构为List[List[dict]]——外层列表的每个元素是一条候选策略内层是若干按顺序执行的基础变换。这里定义了两条策略策略 1仅Rotatelevel5概率 0.5策略 2Rotatelevel7后接TranslateXlevel5概率 0.5。Rotate与TranslateX注册于 geometric.pyimg_border_value(124, 116, 104)指定旋转/平移后填充的边界颜色即图像边缘填充色。所有几何增强都会同步更新gt_bboxes、gt_masks等标注因此无需担心标注错位问题。3.4 优化器、学习率与训练循环# Set optimizer optim_wrapper dict( typeOptimWrapper, optimizerdict(typeSGD, lr0.01, momentum0.9, weight_decay0.0001)) # Set customized learning policy param_scheduler [ dict( typeLinearLR, start_factor0.001, by_epochFalse, begin0, end500), dict( typeMultiStepLR, begin0, end10, by_epochTrue, milestones[8], gamma0.1) ] # train, val, test loop config train_cfg dict(max_epochs10, val_interval1)优化器SGDlr0.01, momentum0.9, weight_decay0.0001外层用OptimWrapper包装这是 MMEngine 的标准写法学习率策略先线性热身前 500 iter 从0.001倍起步线性上升到目标学习率再使用MultiStepLR在第 8 个 epoch 将学习率衰减为原来的0.1gamma0.1共训练 10 个 epoch训练循环max_epochs10每个 epoch 结束做一次验证val_interval1。3.5 加载 COCO 预训练权重# We can use the COCO pre-trained Cascade Mask R-CNN R50 model for a more stable performance initialization load_from https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco/cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pthload_from指定从 OpenMMLab 模型库下载 COCO 上预训练的 Cascade Mask R-CNN R50 权重文件。与init_cfg结构初始化不同load_from属于权重级别的迁移初始化只加载参数、跳过结构差异例如 head 的类别数不同会导致对应层被自动跳过配合backbonedict(init_cfgNone)使用即可实现COCO 检测器 → Cityscapes 微调的迁移学习范式。第四步训练新模型配置就绪后一条命令即可启动训练python tools/train.py configs/cityscapes/cascade-mask-rcnn_r50_augfpn_autoaug-10e_cityscapes.pytools/train.py的入口实现位于 tools/train.py它提供了一系列实用的命令行参数可在不修改配置文件的情况下调整训练行为参数作用config位置参数训练配置文件路径--work-dir指定日志与模型权重保存目录--amp开启自动混合精度训练--auto-scale-lr根据 batch size 自动缩放学习率--resume断点续训不指定值时自动从 work-dir 中最近的 checkpoint 恢复--cfg-options以keyvalue形式覆盖任意配置项支持嵌套与列表值--launcher分布式启动器none/pytorch/slurm/mpi日志、checkpoint 和可视化结果默认输出到./work_dirs/config文件名/目录训练过程中的验证指标也会按val_interval1的设定在每个 epoch 结束后打印。更详细的多卡训练如tools/dist_train.sh与调度器用法可进一步参考仓库的 训练指南。第五步测试与推理使用tools/test.py加载训练好的权重例如第 10 个 epoch 的 checkpoint完成测试python tools/test.py configs/cityscapes/cascade-mask-rcnn_r50_augfpn_autoaug-10e_cityscapes.py work_dirs/cascade-mask-rcnn_r50_augfpn_autoaug-10e_cityscapes/epoch_10.pth测试将依据配置中继承自 cityscapes_instance.py 的评测器输出结果——该基础配置同时启用了两个评测器CocoMetric基于 COCO 格式标注计算bbox检测与segm分割指标CityScapesMetric输出 Cityscapes 官方风格的实例分割评测结果。tools/test.py同样支持--cfg-options、--launcher等参数且支持--out保存预测结果、--format-only仅格式化输出用于官方评测提交配置中注释部分给出了test集与format_only的示例写法。对于单张图片的推理演示仓库 demo 目录 提供了image_demo.py等脚本可用于快速可视化模型效果。更完整的测试与推理细节可参考 测试指南。深入理解这套自定义流程背后的机制注册机制Registry是自定义的基石MMDetection 3.x 的模块化核心是 MMEngine 的注册表体系。mmdet/registry.py 中定义了MODELS、DATASETS、TRANSFORMS、OPTIMIZERS、PARAM_SCHEDULERS、HOOKS、METRICS等 17 个注册节点分别管理模型、数据、变换、优化器、学习率调度器、钩子与评测指标。任何被REGISTRY.register_module()装饰的类都可以通过配置文件中的type字符串被实例化——这就是为什么自定义 Neck 只需要写一个类 注册 在配置里改 type三步即可无缝接入既有检测器。训练管线中的每个环节都可替换本文示例仅自定义了 Neck 与数据增强但同样的范式可推广到检测器的每个组件Backbone新增骨干网络对应BACKBONES或MODELS注册Head自定义检测/分割头如bbox_head、mask_headLoss自定义损失函数Optimizer / 学习率调度器 / Hook自定义训练时运行配置。详细的组件定制指南见 Customize Models运行时设置优化器、梯度裁剪、训练调度、钩子等的定制见 Customize Runtime Settings。总结本文以Cityscapes Cascade Mask R-CNN R50 AugFPN AutoAugment为完整案例走通了 MMDetection 自定义模型开发的全部环节数据准备与格式转换 → 基于MODELS注册机制实现新 Neck → 通过_base_继承编写配置文件替换 Neck、调整类别数、注入自动增强、自定义优化与调度→ 使用tools/train.py训练 → 使用tools/test.py测试与推理。整个过程清晰地体现了 MMDetection 3.x注册机制 配置驱动的设计哲学任何组件都可通过实现一个类 注册 修改配置三步完成替换而无需改动框架核心代码。这套方法论可直接迁移到 backbone、head、loss、optimizer、hook 等所有组件是二次开发与算法研究的通用起点。赞分享人工智能计算机视觉深度学习模型评测【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmdetection点击查看免费下载相关推荐MMDetection 模型微调完全指南基于 COCO 预训练权重在新数据集上微调以 Cityscapes 为例MMDetection 模型微调完全指南基于 COCO 预训练权重在新数据集上微调以 Cityscapes 为例 在 MMDetection 中使用在大人工智能计算机视觉深度学习模型评测MMDetection 模型训练实战指南从标准数据集到自定义数据集的完整训练流程MMDetection 模型训练实战指南从标准数据集到自定义数据集的完整训练流程 本文是 MMDetection 官方用户指南中 docs/en/user_g人工智能计算机视觉深度学习模型评测基于 MMDetection 在 Cityscapes 数据集上训练与评估目标检测、实例分割模型实战指南基于 MMDetection 在 Cityscapes 数据集上训练与评估目标检测、实例分割模型实战指南 Cityscapes 是面向城市场景理解的经典街景数据人工智能计算机视觉深度学习模型评测创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考