犀牛鸟 2026 研究笔记 estelledc.github.io

第 10 章 · mmdetection——学术研究的瑞士军刀

开场:研究者的实验台

如果 Ultralytics 是一辆开箱即用的量产车,mmdetection 就是一个装备齐全的汽车实验室——它不会帮你一键完成所有事,但它提供了你做任何实验所需要的所有零件、工具和测试设备。

mmdetection 是 OpenMMLab(商汤开源生态)推出的目标检测工具箱,约 32,800 个 GitHub star。它的核心价值不在于某一个模型跑得多快或多准,而在于它提供了一个标准化的平台,让你可以公平地比较几十种检测方法、快速复现论文结果、在同一套基础设施上做消融实验。


mmdetection 的定位

和 Ultralytics 的区别

Ultralytics:
  - 专注 YOLO 系列
  - "一行代码搞定"的使用体验
  - 工业部署优先
  - 用户画像:工程师、产品开发者

mmdetection:
  - 支持 50+ 种检测方法
  - 模块化、可组合的架构
  - 学术研究优先
  - 用户画像:研究者、论文作者

一个关键差异:Ultralytics 的代码优先考虑”好用”,mmdetection 的代码优先考虑”可扩展”。mmdetection 大量使用 Registry(注册机制)、Config(配置系统)、Hook(钩子系统)等设计模式,让你可以像搭积木一样组合不同的 backbone、neck、head、loss 函数。这在做研究时非常方便,但对初学者来说学习曲线更陡。

支持的检测方法

mmdetection 支持的方法覆盖了目标检测的所有主要范式:

两阶段检测器:
  Faster R-CNN, Cascade R-CNN, Mask R-CNN, HTC, ...

单阶段检测器:
  SSD, RetinaNet, FCOS, ATSS, ...

YOLO 系列:
  YOLOv3, YOLOX, ...

Transformer 检测器:
  DETR, Deformable DETR, DINO, Conditional DETR, ...

密集预测:
  CenterNet, CornerNet, ...

其他:
  PointRend, QueryInst, Sparse R-CNN, ...

mmdetection 的架构设计

Registry 注册机制

mmdetection 最核心的设计是 Registry——一个全局的”零件目录”。每种类型的组件(backbone、neck、head、loss 等)都有自己的注册表,你可以通过字符串名字引用任何已注册的组件。

# 注册一个新的 backbone
from mmdet.registry import MODELS

@MODELS.register_module()
class MyNewBackbone(nn.Module):
    def __init__(self, depth, width):
        super().__init__()
        # ... 你的实现 ...

    def forward(self, x):
        # ... 你的实现 ...
        return features

注册后,你可以在配置文件中用字符串引用它:

# 配置文件中
model = dict(
    backbone=dict(
        type='MyNewBackbone',   # ← 字符串引用
        depth=50,
        width=64,
    ),
    # ...
)

Config 配置系统

mmdetection 的配置系统支持继承——你可以从一个基础配置开始,只修改你关心的部分。

# configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py
_base_ = [
    '../_base_/models/faster-rcnn_r50_fpn.py',    # 模型配置
    '../_base_/datasets/coco_detection.py',         # 数据配置
    '../_base_/schedules/schedule_1x.py',           # 训练计划
    '../_base_/default_runtime.py',                 # 运行时配置
]

# 只需要修改你想改的部分
model = dict(
    backbone=dict(
        depth=101,  # 把 ResNet-50 改成 ResNet-101
    ),
)

这种继承机制让实验变得非常高效——做消融实验时,你只需要改动一两行配置,就能替换模型的某个组件。

模块化流水线

mmdetection 的检测器由标准化的模块组成,每个模块的接口是统一的:

# 一个典型的两阶段检测器的组装
model = dict(
    type='FasterRCNN',
    backbone=dict(type='ResNet', depth=50),
    neck=dict(type='FPN', in_channels=[256, 512, 1024, 2048], out_channels=256),
    rpn_head=dict(type='RPNHead', ...),
    roi_head=dict(
        type='StandardRoIHead',
        bbox_head=dict(type='Shared2FCBBoxHead', ...),
    ),
    train_cfg=dict(...),
    test_cfg=dict(...),
)

# 换 backbone?只改一行:
backbone=dict(type='Swin', depths=[2, 2, 6, 2])

# 换 neck?只改一行:
neck=dict(type='BiFPN', in_channels=[96, 192, 384, 768])

# 换 loss?只改一行:
loss_cls=dict(type='FocalLoss', gamma=2.0, alpha=0.25)

mmdetection 中的关键检测器

Faster R-CNN:两阶段检测的标杆

Faster R-CNN 是两阶段检测器的代表。虽然在速度上不如 YOLO,但它的设计思路对理解检测方法的演进很有价值。

Faster R-CNN 的两阶段:

阶段 1: Region Proposal Network (RPN)
  - 在特征图的每个位置提出若干"候选区域"
  - 只回答"这里有没有目标"(不分类)
  - 输出 ~2000 个候选框

阶段 2: RoI Head
  - 对每个候选框提取特征(RoI Pooling)
  - 精细分类 + 框回归
  - 输出最终检测结果

两阶段的优势:RoI Head 对每个候选区域单独处理,特征更精细,对小目标和遮挡目标更友好。劣势:比单阶段慢(需要处理 ~2000 个候选框)。

RetinaNet:Focal Loss 的起源

RetinaNet 虽然精度不是最高的,但它引入的 Focal Loss 影响了整个检测领域:

# Focal Loss: 解决正负样本不平衡
# 在密集预测中,绝大多数位置是背景(负样本),少数是目标(正样本)
# 标准 CE Loss 会被大量"容易的负样本"主导

def focal_loss(pred, target, gamma=2.0, alpha=0.25):
    ce = F.binary_cross_entropy_with_logits(pred, target, reduction='none')
    p = pred.sigmoid()
    p_t = p * target + (1 - p) * (1 - target)
    # 关键:对"容易"的样本(p_t 接近 1)降低权重
    focal_weight = (1 - p_t) ** gamma
    loss = alpha * focal_weight * ce
    return loss.mean()

Focal Loss 的思想——”让模型更关注困难样本”——在 YOLO 系列(VariFocal Loss)、DETR 系列、甚至 YOLO-Master 的 MoE 训练中都有体现。

DINO:DETR 系列的集大成者

DINO 在 mmdetection 中的实现是犀牛鸟参赛者值得研究的参考:

# DINO 的配置(简化版)
model = dict(
    type='DINO',
    backbone=dict(type='ResNet', depth=50),
    encoder=dict(
        type='DeformableDetrTransformerEncoder',
        num_layers=6,
        layer_cfg=dict(
            self_attn_cfg=dict(num_levels=4, num_points=4),  # Deformable Attention
            ffn_cfg=dict(feedforward_channels=2048),
        ),
    ),
    decoder=dict(
        type='DINOTransformerDecoder',
        num_layers=6,
        layer_cfg=dict(
            self_attn_cfg=dict(num_heads=8),
            cross_attn_cfg=dict(num_levels=4, num_points=4),
        ),
    ),
    dn_cfg=dict(             # Denoising Training: DINO 的训练加速技巧
        label_noise_scale=0.5,
        box_noise_scale=1.0,
        group_dns=5,
    ),
)

mmdetection 与 YOLO-Master 的关系

直接关系

YOLO-Master 的主要工程基座是 Ultralytics,不是 mmdetection。但 mmdetection 在犀牛鸟赛道中的价值体现在:

一、基线对比:mmdetection 提供了大量标准化的检测器实现和预训练权重。你可以用 mmdetection 快速跑出 Faster R-CNN、DINO 等模型在同一数据集上的结果,作为 YOLO-Master 的对比基线。

二、方法借鉴:mmdetection 中实现了很多 YOLO-Master 可以借鉴的技术——如 DINO 的 Denoising Training、ATSS 的自适应分配、Cascade R-CNN 的多阶段精修。

三、学术论文复现:如果你在犀牛鸟的研究部分需要引用和对比其他检测方法,mmdetection 是最方便的实验平台。

间接影响

mmdetection 对检测领域的另一个重要贡献是标准化了训练和评估流程——学习率调度、数据增强策略、mAP 计算方式等。很多 YOLO 系列的训练策略(如 EMA、warmup、cosine LR)最初都是在 mmdetection 的 benchmark 中验证的。


和 Ultralytics 的技术对比

维度 Ultralytics mmdetection
核心模型 YOLO 系列 50+ 种检测器
使用门槛 低(CLI/一行代码) 高(需理解配置系统)
代码风格 直接、简洁 模块化、抽象
训练速度 快(优化过的数据流) 中等
部署支持 内置(10+ 格式) 需要 mmdeploy
适用场景 工业部署、快速原型 学术研究、方法对比
社区规模 58.5K star 32.8K star
学习成本 1-2 天上手 1-2 周理解体系

mmdetection 的使用示例

训练

# 安装
pip install mmdet mmengine mmcv

# 训练 Faster R-CNN
python tools/train.py configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py

# 训练 DINO
python tools/train.py configs/dino/dino-4scale_r50_8xb2-12e_coco.py

测试

# 在 COCO val 上评估
python tools/test.py configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py \
    checkpoints/faster_rcnn_r50_fpn_1x_coco.pth

在 Python 中使用

from mmdet.apis import init_detector, inference_detector

# 加载模型
config_file = 'configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py'
checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco.pth'
model = init_detector(config_file, checkpoint_file, device='cuda:0')

# 推理
result = inference_detector(model, 'test.jpg')

OpenMMLab 生态

mmdetection 是 OpenMMLab 生态的一部分。了解这个生态有助于理解 mmdetection 的设计哲学:

OpenMMLab 生态:
  mmengine      ── 通用训练引擎(所有 mm 系列的基础)
  mmcv          ── 计算机视觉基础库(CUDA 算子、图像处理)
  mmdetection   ── 目标检测
  mmsegmentation ── 语义分割
  mmpose        ── 姿态估计
  mmaction2     ── 动作识别
  mmocr         ── OCR
  mmdeploy      ── 模型部署
  ...

这些库共享同一套基础设施(Registry、Config、Hook、Runner),学会了 mmdetection 的使用方式,其他 mm 系列库也能快速上手。


对犀牛鸟参赛者的实用建议

什么时候用 mmdetection

用 mmdetection 的场景:
  1. 需要和非 YOLO 模型做公平对比(如 DINO、Faster R-CNN)
  2. 想快速尝试某个论文中的技术(如 Focal Loss、ATSS、Denoising Training)
  3. 需要在论文/报告中引用标准化的 baseline 结果

不用 mmdetection 的场景:
  1. YOLO-Master 的核心开发(直接在 Ultralytics 上改)
  2. 部署和推理优化(Ultralytics 的导出更方便)
  3. 快速跑通一个 demo(Ultralytics 更简单)

从 mmdetection 借鉴技术的路径

Step 1: 在 mmdetection 中找到你感兴趣的技术
        比如 DINO 的 Denoising Training

Step 2: 阅读它的配置文件和核心代码
        configs/dino/ + mmdet/models/detectors/dino.py

Step 3: 理解核心原理后,在 Ultralytics/YOLO-Master 框架中重新实现
        不要直接复制代码——两个框架的接口不同

Step 4: 在 COCO 上验证你的实现和 mmdetection 的原版效果一致

初学者常见误区

误区一:”mmdetection 太复杂了,不值得学”

→ 正确理解:mmdetection 的学习曲线确实比 Ultralytics 陡,但它的 Registry + Config 设计模式在整个深度学习工程中非常通用。理解这套设计,对你以后做任何框架开发(不限于检测)都有帮助。对于犀牛鸟参赛者,不需要精通 mmdetection 的每个细节——只要能用它跑 baseline 和读懂核心模块的代码就够了。

误区二:”mmdetection 的模型比 Ultralytics 更准”

→ 正确理解:在同一个模型(如 YOLOv3)上,两个框架的精度差异很小(< 0.5 mAP),主要来自训练策略的微小差异(学习率调度、数据增强细节等)。mmdetection 的优势不在于”更准”,而在于”方法更多”和”实验更标准化”。

误区三:”应该用 mmdetection 来训练 YOLO-Master”

→ 正确理解:YOLO-Master 的代码是基于 Ultralytics 构建的。虽然 mmdetection 也支持 YOLO 系列,但把 YOLO-Master 移植到 mmdetection 上工作量巨大且没有必要。正确的做法是:核心开发在 Ultralytics 上做,需要对比非 YOLO 模型时才用 mmdetection。


读完本章你能做什么

读完这一章,你应该能够:


导读目录:README.md 上一章:第 9 章 · RT-DETR 下一章:第 11 章 · YOLO-Master