当前位置: 首页 > news >正文

MMDetection(简称 mmdet)是 OpenMMLab 开发的开源目标检测框架,基于 PyTorch 构建

MMDetection(简称 mmdet)是 OpenMMLab 开发的开源目标检测框架,基于 PyTorch 构建,以模块化、高性能和易扩展著称。它支持多种主流目标检测算法(如 Faster R-CNN、Mask R-CNN、YOLOX、DETR、Sparse R-CNN、RTMDet 等),并提供统一的训练/推理/评估接口。其核心优势包括:

✅ 模块化设计:模型组件(backbone、neck、head、loss、data pipeline)高度解耦,便于复用与定制;
✅ 全面的算法覆盖:涵盖两阶段、单阶段、anchor-free、transformer-based、实时轻量级等各类方法;
✅ 高性能训练与推理:支持混合精度训练(AMP)、分布式训练、ONNX/TensorRT 模型导出;
✅ 丰富的预训练模型与基准结果:在 COCO、Pascal VOC、Cityscapes 等数据集上提供大量 SOTA 模型权重与配置文件;
✅ 完善的文档与社区支持:提供详细教程、API 文档、Colab 示例及活跃的 GitHub 社区。

典型使用流程:

  1. 安装:pip install openmim && mim install mmdet
  2. 准备数据(按 COCO 或自定义格式组织)
  3. 选择/修改配置文件(.py格式,支持继承与覆盖)
  4. 训练:python tools/train.py configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py
  5. 推理/测试:python tools/test.py ... --out results.pkl
  6. 可视化/分析:python tools/analysis_tools/analyze_logs.py等工具辅助
# 示例:加载预训练 Faster R-CNN 并推理frommmdet.apisimportinit_detector,inference_detector config_file='configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py'checkpoint_file='checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'model=init_detector(config_file,checkpoint_file,device='cuda:0')result=inference_detector(model,'demo.jpg')

在 MMDetection 中自定义新 backbone(如 EfficientNetV2)需遵循其模块化设计规范,主要分为以下 5 个步骤:

1. 实现 Backbone 类
继承torch.nn.Module,实现forward()init_weights()方法,并确保输出多尺度特征(通常为list[Tensor],对应不同 stage 的输出),符合 mmdet 的 neck 输入要求(如 FPN 需要 C2/C3/C4/C5)。
示例骨架(简化版 EfficientNetV2-S):

# mmdet/models/backbones/efficientnet_v2.pyimporttorch.nnasnnfrommmcv.cnnimportbuild_norm_layerfrommmcv.runnerimportBaseModulefromtorchvision.models.efficientnetimportefficientnet_v2_sclassEfficientNetV2(BaseModule):def__init__(self,pretrained=None,init_cfg=None,out_indices=(1,2,3,4),# 对应 stem + 4 stagesnorm_cfg=dict(type='BN',requires_grad=True)):super().__init__(init_cfg)self.model=efficientnet_v2_s(pretrained=False)# 替换原始 classifier head 为 Identity(保留 backbone)self.model.classifier=nn.Identity()self.out_indices=out_indices self.norm_cfg=norm_cfgdefforward(self,x):# 提取各 stage 特征(需根据 torchvision 源码结构调整)features=[]x=self.model.features[0](x)# stemif0inself.out_indices:features.append(x)fori,stageinenumerate(self.model.features[1:],1):x=stage(x)ifiinself.out_indices:features.append(x)returntuple(features)definit_weights(self):ifself.init_cfgisnotNone:super().init_weights()else:# 加载 torchvision 预训练权重(可选)ifself.modelisnotNoneandhasattr(self.model,'features'):pass# 可调用 load_state_dict 或使用 mmcv 的 load_checkpoint

2. 注册模块
mmdet/models/backbones/__init__.py中添加导入和注册:

from.efficientnet_v2importEfficientNetV2 __all__=['EfficientNetV2']

并在mmdet/models/__init__.py确保 backbone 模块被导入。

3. 添加预训练权重加载逻辑(可选但推荐)

  • 若使用 torchvision 官方权重,可在init_weights()中调用load_state_dict()
  • 更规范做法:将权重转为 mmdet 兼容格式(去除 classifier、重命名 key),保存为.pth,并通过init_cfg=dict(type='Pretrained', checkpoint='path/to/efficientnet_v2_s.pth')在 config 中指定。

4. 编写配置文件(config)
在 config 中引用新 backbone(例如configs/my_configs/efficientnetv2_faster_rcnn.py):

_base_='../faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py'model=dict(backbone=dict(type='EfficientNetV2',pretrained=None,# 或设为 None,由 init_cfg 控制out_indices=(1,2,3,4),init_cfg=dict(type='Pretrained',checkpoint='https://download.pytorch.org/models/efficientnet_v2_s-dd5fe13b.pth')),neck=dict(type='FPN',in_channels=[24,48,64,128],# 根据 EfficientNetV2-S 各 stage 输出通道调整out_channels=256,num_outs=5))

⚠️ 注意:in_channels必须与 backbone 实际输出通道严格匹配(EfficientNetV2-S 各 stage 输出:24, 48, 64, 128)。

5. 验证与训练

  • 运行python tools/misc/print_config.py configs/my_configs/efficientnetv2_faster_rcnn.py检查配置是否解析成功;
  • 使用python tools/train.py configs/my_configs/efficientnetv2_faster_rcnn.py启动训练;
  • 可通过python tools/browse_dataset.py可视化数据流,确认 backbone 输出 shape 正确。

📌 补充建议:

  • 利用mmcvget_root_logger()记录调试信息;
  • 推荐参考 mmdet 官方已支持的ResNet,VisionTransformer等 backbone 实现;
  • 如需支持自动 shape 推断,可重写self._out_features属性或配合ChannelMapper适配 neck。
http://www.jsqmd.com/news/1195885/

相关文章:

  • Java NIO内存管理机制剖析
  • 效率的馈赠与创意的觉醒:AI时代的人文主义复兴
  • HarmonyOS7居中吸附对比页实战:ScrollSnap Center 模式的强化展示
  • 几百台电脑补丁、权限、故障都靠人工?运维该看的管理面
  • Java Comparator接口实战:解锁Arrays.sort()的多维度排序策略
  • 深入解析SM320C6748-HIREL SPI模块:从时序参数到多从机系统设计
  • Spring Boot 之 BeanDefinitionLoader 详解
  • 2026 录音转会议纪要APP推荐:成本分析后只留这个不踩雷
  • 飘柔甜美花漾洗发水实测:香氛持久与柔亮效果深度解析
  • ultralytics-yolo的训练、预测、export内部流程图
  • C++标准库与C++11实战指南:从容器算法到智能指针与移动语义
  • 高速信号完整性:重定时器(Retimer)原理、配置与实战调试指南
  • 一文讲清人才培养:从选人、育人到用人的5步闭环
  • C++ COM组件开发实战:ATL/WTL实现跨语言对话框的完整指南
  • 阿里云云监控 CMS 2.0 推 Session Replay 与热力图:穿透前端迷雾,优化用户体验
  • 绍兴上虞区打井多少钱一米,上虞打井电话,软土平原打井找谁 - 瑞溪泉水利
  • C++ WebSocket++库实战:构建高性能实时通信应用
  • 双指针算法精解:从盛水容器到LeetCode高频题实战
  • 折叠式共源共栅运算放大器:从理论到实践的设计指南
  • Python多因子选股模型:从因子挖掘到机器学习策略回测实战
  • Arduino作为ROS小车硬实时执行器的设计与实现
  • 【Java踩坑笔记】45_日志打印对象用toString,生产环境可能引发雪崩
  • 深入解析TI C6748 DSP:架构、开发与优化实战指南
  • MATLAB中FFT频谱分析实战:从基础语法到频谱泄露与补零策略
  • TensorFlow 是由 Google 开发并开源的端到端开源机器学习框架,广泛用于构建和训练深度学习模型(如神经网络)
  • 2026年7月最新亨得利官方服务项目及价格查询|服务热线及门店地址权威信息通知 - 亨得利官方博客
  • LT8710控制器解决长距离电源线电压降问题
  • 撒尿的小孩,蚂蚁,以及沉默的天气——论人类认知的三重牢笼
  • AI聚合平台技术解析:多模型集成与Sider实战指南
  • 2026 抖音视频在线解析怎么选:零成本使用,年省360元服务费