MMDetection 是基于 PyTorch 的开源目标检测工具箱,属于 OpenMMLab 生态。它封装了 Faster R-CNN、YOLO、RetinaNet、Mask R-CNN 等数十种经典目标检测/分割算法,支持快速搭建、训练、验证和部署目标检测模型,解决了传统目标检测任务中「算法实现复杂、工程化难度高、调参效率低」的痛点,广泛应用于科研和工业落地场景。
一、前置准备:环境搭建与核心依赖安装
1. 核心依赖说明
MMDetection 运行依赖三大核心组件,版本兼容性要求严格(需重点匹配),避免出现安装失败或运行报错:
PyTorch&torchvision:深度学习核心框架,提供模型训练/推理的底层支持;MMEngine:OpenMMLab 生态的核心引擎,提供训练调度、配置管理、日志记录等基础功能;MMCV:OpenMMLab 生态的计算机视觉基础库,提供数据增强、模型组件、推理加速等工具(必须安装带 CUDA 支持的版本,否则性能大幅下降);MMDetection:目标检测工具箱核心,提供各类目标检测算法实现和配置文件。
2. 环境搭建步骤(推荐 conda 虚拟环境)
步骤 1:创建并激活 conda 虚拟环境
bash
# 创建 Python 3.9 虚拟环境(兼容性最佳,支持大部分 MMDetection 版本)
conda create -n mmdet_env python=3.9
# 激活虚拟环境
conda activate mmdet_env
步骤 2:安装 PyTorch(匹配 CUDA 版本,优先 GPU 加速)
MMDetection 要求 PyTorch 版本 ≥ 1.8.0,推荐安装对应本地 CUDA 版本的 PyTorch(无 GPU 则安装 CPU 版本,仅用于入门测试)。
-
GPU 版本(推荐,需提前安装 CUDA 11.7+/12.0+) 参考 PyTorch 官网 获取对应安装命令,以 CUDA 11.8 为例:
bashpip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 -
CPU 版本(无 GPU 设备,运行速度较慢)
bashpip3 install torch torchvision torchaudio
步骤 3:安装 MMCV(带 CUDA 加速,核心关键步骤)
MMCV 提供两种安装方式,优先选择预编译包安装(快速无编译),避免手动编译耗时且容易报错。
-
查看当前环境的 PyTorch 版本和 CUDA 版本(验证兼容性):
pythonimport torch print(f"PyTorch 版本:{torch.__version__}") print(f"CUDA 版本:{torch.version.cuda}") -
下载并安装 MMCV 预编译包(匹配 PyTorch 和 CUDA 版本): 打开 MMCV 预编译包下载地址,找到对应「PyTorch 版本」「CUDA 版本」「Python 版本」的预编译包,复制下载链接,使用 pip 安装(以 PyTorch 2.0.0、CUDA 11.8、Python 3.9 为例):
bashpip install mmcv==2.0.1 -f https://download.openmmlab.com/mmcv/dist/cu118/torch2.0.0/index.html -i https://pypi.tuna.tsinghua.edu.cn/simple国内用户可使用清华镜像加速,避免下载超时。
步骤 4:安装 MMDetection(核心工具箱)
bash
# 方式 1:安装稳定版(推荐,落地优先)
pip install mmdet -i https://pypi.tuna.tsinghua.edu.cn/simple
# 方式 2:安装最新开发版(适合科研,获取最新算法)
git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple
步骤 5:环境验证(确认安装成功)
运行以下代码,验证 MMDetection 是否安装成功,并查看支持的模型列表:
python
import mmdet
from mmdet.apis import init_detector, inference_detector
# 验证库导入是否成功
print(f"MMDetection 版本:{mmdet.__version__}")
print("MMDetection 环境配置成功!")
# 查看内置模型配置文件(部分核心模型)
from mmdet.utils import get_config_file
print("\n核心模型配置文件示例:")
print("Faster R-CNN 配置:", get_config_file("faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py"))
print("YOLOv3 配置:", get_config_file("yolo/yolov3_d53_mstrain-608_273e_coco.py"))
3. 关键版本兼容性说明(避坑核心)
| MMDetection 版本 | MMCV 版本 | PyTorch 版本 | CUDA 版本 |
|---|---|---|---|
| 3.0.0+(稳定版) | 2.0.0+ | 1.8.0 - 2.0.0 | 11.1+ |
| 2.28.0+ | 1.7.0+ | 1.6.0 - 1.13.0 | 10.2+ |
落地建议 :优先选择上表中的稳定版组合,避免版本不匹配导致的各类报错(如 ModuleNotFoundError、CUDA error 等)。
二、MMDetection 核心认知:架构与核心概念
1. 整体架构(OpenMMLab 生态)
MMDetection 基于 OpenMMLab 生态构建,核心依赖「MMEngine」和「MMCV」,整体架构分层清晰:
- 底层:MMEngine:提供训练调度、优化器管理、日志记录、 checkpoint 保存等通用功能,无需重复开发;
- 中层:MMCV:提供计算机视觉专属工具,如数据增强、图像预处理、模型组件(卷积层、注意力层)、推理加速等;
- 上层:MMDetection:封装各类目标检测/分割算法(Faster R-CNN、YOLO 等),提供完整的配置文件和训练/推理接口,用户可快速调用和修改。
2. 核心概念(快速上手关键)
(1) 配置文件(*.py)
MMDetection 的核心是「配置驱动」,所有模型参数、训练参数、数据集参数都通过配置文件管理,无需修改核心代码。配置文件支持「继承」和「覆盖」,可基于官方默认配置快速修改,大幅提升调参效率。
官方默认配置文件位于 mmdet/configs/ 目录下,按算法分类(如 faster_rcnn/、yolo/),每个算法提供多个不同规模的配置(如 r50_fpn、r101_fpn)。
(2) 预训练模型权重(*.pth)
官方提供了大量基于 COCO 数据集训练的预训练模型权重,可直接用于推理或迁移学习,下载地址位于配置文件对应的注释中,或通过 OpenMMLab 模型库 获取。
预训练权重会自动缓存到 ~/.cache/mmdet/ 目录下,若下载失败可手动下载后放入该目录。
(3) 数据集格式(COCO / VOC)
MMDetection 原生支持 COCO 和 VOC 两种主流目标检测数据集格式,其中 COCO 格式用于大规模训练,VOC 格式用于小型自定义数据集,后续实战将以 VOC 格式为例(更易标注和落地)。
三、快速入门:预训练模型推理(无需训练,直接落地)
使用 MMDetection 官方预训练模型,可快速实现单张图片、批量图片、视频的目标检测推理,核心流程为「加载配置文件→加载预训练权重→初始化模型→执行推理→结果可视化与保存」。
完整实战代码(Faster R-CNN 模型)
python
import cv2
import os
from mmdet.apis import init_detector, inference_detector, show_result_pyplot
# 1. 配置参数设置(核心:配置文件路径 + 预训练权重路径)
config_file = "faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py" # 模型配置文件
checkpoint_file = None # 预训练权重(None 表示自动下载官方预训练权重)
img_path = "test_cat_dog.jpg" # 测试图像路径(替换为你的测试图像)
output_dir = "mmdet_inference_results" # 推理结果保存目录
# 2. 创建结果保存目录
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 3. 配置设备(优先使用 GPU,无 GPU 则使用 CPU)
device = "cuda:0" if cv2.cuda.getDeviceCount() > 0 else "cpu"
print(f"使用设备:{device}")
# 4. 初始化目标检测模型(加载配置 + 预训练权重)
model = init_detector(
config_file,
checkpoint_file,
device=device,
cfg_options=None # 额外配置覆盖(无需修改时设为 None)
)
print("模型初始化成功,开始执行推理...")
# 5. 执行推理(支持单张图片、批量图片、视频帧)
result = inference_detector(model, img_path)
# 6. 结果可视化与保存
# 方式 1:使用官方自带可视化工具,直接显示并保存
show_result_pyplot(
model,
img_path,
result,
score_thr=0.5, # 置信度阈值,过滤低置信度检测框
out_file=os.path.join(output_dir, "inference_result.jpg") # 保存结果图像
)
# 方式 2:手动解析检测结果,自定义绘制(更灵活)
def visualize_custom_result(img_path, result, model, score_thr=0.5, save_path=None):
"""
自定义可视化检测结果:绘制检测框、类别、置信度
"""
# 读取原始图像
img = cv2.imread(img_path)
if img is None:
raise Exception("无法读取图像,请检查文件路径是否正确")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 解析检测结果(MMDetection 输出格式:(类别数, 检测框数, 5),最后一维为 [x1, y1, x2, y2, 置信度])
class_names = model.CLASSES
for cls_idx, cls_result in enumerate(result):
for bbox in cls_result:
x1, y1, x2, y2, score = bbox
if score < score_thr:
continue # 过滤低置信度检测框
# 绘制检测框(红色,线宽 2)
cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2)
# 绘制类别与置信度标签(白色背景,黑色文字)
label = f"{class_names[cls_idx]} {score:.2f}"
label_size, _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)
y1_label = max(int(y1), label_size[1] + 10)
cv2.rectangle(
img,
(int(x1), y1_label - label_size[1] - 10),
(int(x1) + label_size[0], y1_label),
(255, 255, 255),
-1
)
cv2.putText(
img,
label,
(int(x1), y1_label - 5),
cv2.FONT_HERSHEY_SIMPLEX,
0.5,
(0, 0, 0),
1
)
# 保存结果图像(转换回 BGR 格式,适配 cv2 保存)
if save_path is not None:
img_bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
cv2.imwrite(save_path, img_bgr)
return img
# 自定义可视化并保存结果
custom_result_img = visualize_custom_result(
img_path,
result,
model,
score_thr=0.5,
save_path=os.path.join(output_dir, "custom_inference_result.jpg")
)
print(f"推理完成,结果已保存至 {output_dir} 目录")
核心知识点解析
- 模型初始化 :
init_detector()负责加载配置文件和预训练权重,自动完成模型构建和设备部署,无需手动定义网络结构; - 推理执行 :
inference_detector()支持单张图片(字符串路径)、批量图片(列表路径)、视频帧(numpy 数组)输入,返回格式为符合 MMDetection 规范的检测结果; - 置信度阈值 :
score_thr=0.5过滤置信度低于 0.5 的检测框,减少误检,可根据场景调整(如高精度场景设为 0.7,低漏检场景设为 0.3); - 类别解析 :
model.CLASSES包含预训练模型支持的所有类别(COCO 数据集为 80 类),可直接用于解析检测结果的类别索引。
扩展:视频目标检测推理
python
import cv2
from mmdet.apis import init_detector, inference_detector
# 1. 配置参数
config_file = "faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py"
checkpoint_file = None
video_path = "test_road.mp4" # 测试视频路径
output_video_path = "mmdet_road_detection.mp4"
device = "cuda:0" if cv2.cuda.getDeviceCount() > 0 else "cpu"
# 2. 初始化模型
model = init_detector(config_file, checkpoint_file, device=device)
# 3. 打开视频文件
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
raise Exception("无法打开视频文件,请检查路径是否正确")
# 4. 获取视频参数
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
# 5. 初始化视频写入器
out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))
# 6. 逐帧推理并写入结果
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 执行推理(将视频帧转换为 RGB 格式,适配 MMDetection)
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
result = inference_detector(model, frame_rgb)
# 绘制检测结果(使用模型自带绘制函数)
frame_result = model.show_result(
frame,
result,
score_thr=0.5,
bbox_color=(0, 255, 0),
text_color=(0, 255, 0),
thickness=2,
font_scale=0.5
)
# 写入结果视频
out.write(frame_result)
# 实时显示结果(按 'q' 退出)
cv2.imshow("MMDetection Video Detection", frame_result)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
# 7. 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
print(f"视频检测完成,结果已保存至 {output_video_path}")
四、核心实战:自定义数据集训练(落地核心,VOC 格式)
传统目标检测模型需要大量标注数据和复杂的工程实现,而 MMDetection 可基于自定义 VOC 格式数据集快速实现模型训练,核心流程为「数据集准备与标注→配置文件修改→执行训练→模型验证→推理测试」。
步骤 1:数据集准备与标注(VOC 格式)
1. VOC 数据集目录结构
首先创建符合 VOC 格式的数据集目录,结构如下(以「猫狗分类检测」为例):
bash
custom_cat_dog_dataset/
├── Annotations/ # 标注文件目录(*.xml,每张图片对应一个 xml 文件)
├── Images/ # 图像文件目录(*.jpg / *.png,训练/验证图像放在一起)
├── ImageSets/
│ └── Main/
│ ├── train.txt # 训练集图像名称列表(无后缀,如 "cat_001")
│ ├── val.txt # 验证集图像名称列表(无后缀,如 "dog_001")
│ └── test.txt # 测试集图像名称列表(可选)
2. 图像标注(LabelImg 工具)
使用 LabelImg 工具进行图像标注,生成 VOC 格式的 *.xml 标注文件,步骤如下:
- 安装 LabelImg:
pip install labelImg -i https://pypi.tuna.tsinghua.edu.cn/simple; - 启动 LabelImg:在终端输入
labelImg,选择数据集的Images目录和Annotations目录; - 开始标注:点击「Create RectBox」绘制检测框,选择对应类别(如 "cat"、"dog"),保存后自动生成
*.xml标注文件; - 划分训练/验证集:手动创建
train.txt和val.txt,写入图像名称(无后缀),建议按 8:2 比例划分。
步骤 2:修改 MMDetection 配置文件
基于官方默认配置文件,修改为适配自定义 VOC 数据集的配置,核心修改内容包括「数据集路径→类别数与类别名称→训练参数→预训练权重」。
1. 复制默认配置文件
从 mmdet/configs/pascal_voc/ 目录下复制 faster_rcnn_r50_fpn_1x_voc0712.py 配置文件,重命名为 faster_rcnn_r50_fpn_1x_custom_cat_dog.py,放入同一目录下,避免修改官方默认配置。
2. 核心配置修改(关键步骤)
python
# 1. 数据集路径修改(指向你的自定义 VOC 数据集目录)
data_root = "custom_cat_dog_dataset/" # 自定义数据集根目录
data = dict(
train=dict(
ann_file=data_root + "ImageSets/Main/train.txt",
img_prefix=data_root + "Images/",
ann_prefix=data_root + "Annotations/",
classes=("cat", "dog"), # 自定义类别名称(与标注一致)
),
val=dict(
ann_file=data_root + "ImageSets/Main/val.txt",
img_prefix=data_root + "Images/",
ann_prefix=data_root + "Annotations/",
classes=("cat", "dog"),
),
test=dict(
ann_file=data_root + "ImageSets/Main/test.txt",
img_prefix=data_root + "Images/",
ann_prefix=data_root + "Annotations/",
classes=("cat", "dog"),
),
)
# 2. 模型头部修改(类别数与自定义类别一致,VOC 格式默认 +1 背景类)
model = dict(
roi_head=dict(
bbox_head=dict(
num_classes=2, # 自定义类别数(cat + dog = 2,无需 +1 背景类,MMDetection 自动处理)
)
)
)
# 3. 训练参数修改(适配小型数据集,避免过拟合)
train_cfg = dict(
max_epochs=30, # 训练轮数(小型数据集 30-50 即可)
val_interval=5, # 每 5 轮验证一次
)
optimizer = dict(
lr=0.001, # 学习率(比官方默认略低,避免震荡)
)
data = dict(
samples_per_gpu=4, # 每 GPU 批量大小(根据显存调整,显存不足设为 2 或 1)
workers_per_gpu=2, # 每 GPU 数据加载线程数
)
# 4. 预训练权重修改(使用 COCO 预训练权重,迁移学习)
load_from = "https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth" # 官方 COCO 预训练权重
步骤 3:执行模型训练(两种方式)
方式 1:命令行训练(推荐,简单高效)
在终端激活 mmdet_env 虚拟环境,进入 MMDetection 根目录,执行以下命令:
bash
python tools/train.py \
configs/pascal_voc/faster_rcnn_r50_fpn_1x_custom_cat_dog.py \
--work-dir work_dirs/custom_cat_dog \
--gpu-id 0 \
--seed 42
--work-dir:训练结果保存目录(包含 checkpoint、日志、配置文件);--gpu-id:指定使用的 GPU 编号;--seed:随机种子,保证训练可复现。
方式 2:Python 脚本训练(灵活,便于二次开发)
python
from mmengine.runner import Runner
from mmdet.utils import register_all_modules
from mmdet.apis import init_cfg
# 1. 注册所有 MMDetection 模块
register_all_modules()
# 2. 初始化配置
cfg = init_cfg(
config_file="configs/pascal_voc/faster_rcnn_r50_fpn_1x_custom_cat_dog.py",
work_dir="work_dirs/custom_cat_dog",
gpu_id=0,
)
# 3. 初始化 Runner 并执行训练
runner = Runner.from_cfg(cfg)
runner.train()
步骤 4:模型验证与推理测试
1. 模型验证(评估精度)
训练完成后,使用验证集评估模型精度(mAP 指标),命令行方式如下:
bash
python tools/test.py \
configs/pascal_voc/faster_rcnn_r50_fpn_1x_custom_cat_dog.py \
work_dirs/custom_cat_dog/epoch_30.pth \
--eval mAP \
--gpu-id 0
2. 自定义模型推理测试
使用训练完成的模型权重,执行推理测试,代码与快速入门部分类似,仅需修改配置文件和权重路径:
python
from mmdet.apis import init_detector, inference_detector, show_result_pyplot
# 1. 配置参数
config_file = "configs/pascal_voc/faster_rcnn_r50_fpn_1x_custom_cat_dog.py"
checkpoint_file = "work_dirs/custom_cat_dog/epoch_30.pth" # 训练完成的权重
img_path = "custom_cat_dog_dataset/Images/cat_001.jpg"
# 2. 初始化模型
model = init_detector(config_file, checkpoint_file, device="cuda:0")
# 3. 执行推理
result = inference_detector(model, img_path)
# 4. 可视化结果
show_result_pyplot(
model,
img_path,
result,
score_thr=0.5,
out_file="custom_cat_dog_inference_result.jpg"
)
print("自定义模型推理完成,结果已保存")
五、进阶优化:提升模型精度与训练效率
1. 数据增强(减少过拟合,提升泛化能力)
MMDetection 内置丰富的数据增强策略,可在配置文件中修改 train_pipeline 实现,常用增强策略包括:
python
data = dict(
train=dict(
pipeline=[
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations', with_bbox=True),
dict(type='RandomFlip', prob=0.5), # 随机水平翻转
dict(type='RandomResize', scale=(1333, 800), keep_ratio=True), # 随机缩放
dict(type='RandomCrop', crop_size=(768, 768), crop_ratio=(0.5, 1.0)), # 随机裁剪
dict(type='BrightnessTransform', brightness_range=(0.8, 1.2)), # 亮度调整
dict(type='ContrastTransform', contrast_range=(0.8, 1.2)), # 对比度调整
dict(type='Normalize', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True),
dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle'),
dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),
]
)
)
2. 模型微调与迁移学习(提升小型数据集精度)
-
优先使用 COCO 数据集预训练权重(
load_from参数),避免从头训练,大幅提升训练效率和精度; -
冻结骨干网络(如 ResNet50)前几层参数,仅训练头部网络,减少过拟合,在配置文件中添加:
pythonoptimizer = dict( paramwise_cfg=dict( custom_keys=dict( backbone=dict(lr_mult=0.1), # 骨干网络学习率为基础学习率的 0.1 倍 ) ) )
3. 学习率调度策略优化(避免训练震荡)
使用余弦退火学习率调度策略,替代默认的阶梯式学习率,在配置文件中修改:
python
param_scheduler = [
dict(
type='CosineAnnealingLR',
T_max=30,
eta_min=1e-5,
by_epoch=True,
begin=0,
end=30,
)
]
4. 模型量化与部署(提升推理速度,适配边缘设备)
训练完成的模型可通过 MMCV 提供的工具转换为 ONNX 格式,适配边缘设备部署,步骤如下:
bash
python tools/export_onnx.py \
configs/pascal_voc/faster_rcnn_r50_fpn_1x_custom_cat_dog.py \
work_dirs/custom_cat_dog/epoch_30.pth \
--output-file faster_rcnn_cat_dog.onnx \
--input-size 1333 800 \
--opset-version 11
六、常见问题与避坑指南(MMDetection 落地专属)
- 配置文件报错(KeyError / ModuleNotFoundError) :
- 解决方案:检查配置文件的继承关系和参数拼写,确保 MMCV、MMDetection 版本匹配,重新安装对应版本;
- 显存不足(CUDA out of memory) :
- 解决方案:降低
samples_per_gpu(批量大小)、减小输入图像尺寸、使用更小模型(如 R18 骨干网络)、启用半精度训练;
- 解决方案:降低
- 训练不收敛(mAP 接近 0) :
- 解决方案:检查数据集标注格式是否正确、类别数是否匹配、预训练权重是否加载成功、学习率是否过高;
- 推理结果为空(无检测框) :
- 解决方案:降低置信度阈值(
score_thr)、检查模型权重是否对应自定义数据集、图像预处理是否符合模型要求;
- 解决方案:降低置信度阈值(
- LabelImg 标注文件无法识别 :
- 解决方案:确保标注文件的类别名称与配置文件一致、图像名称与标注文件名称一致、无中文路径和特殊字符。
七、进阶扩展方向(从入门到实战落地)
- 自定义目标检测算法:基于 MMDetection 框架,实现自定义网络结构和损失函数,满足特定场景需求;
- 实例分割任务:使用 Mask R-CNN 等模型,实现目标检测与实例分割的联合任务;
- 多尺度训练与推理:提升小目标检测精度,适配远距离目标检测场景;
- 边缘设备部署:将模型转换为 TensorRT、OpenVINO 格式,部署到 Jetson Nano、Raspberry Pi 等边缘设备;
- 半监督/弱监督学习:利用少量标注数据和大量无标注数据,提升模型精度,降低标注成本。