做目标检测项目这几年,身边不少朋友问过我同一个问题:RCNN 和 YOLO 到底该学哪个?说实话,这俩不是竞争关系,而是两条完全不同的技术路线。RCNN 系列走的是"先找候选区域再分类"的两阶段路线,YOLO 走的是"一次回归出所有目标"的单阶段路线。如果你刚接触目标检测,或者准备在真实项目里选型,我建议你把这两个系列的核心逻辑吃透,而不是停留在"哪个精度高、哪个速度快"的表面对比上。
这篇内容我会从两套方案的底层设计逻辑讲起,结合我用 mmdetection 训练 Faster RCNN、用 ultralytics 跑 YOLOv8/v11 的实操经验,把候选区域机制、Anchor 设计、损失函数、训练技巧、小目标检测这些高频踩坑点一次说清楚。无论你是做毕业设计、工业质检、遥感影像,还是想搞清楚 YOLO 第几代了这种基础问题,这篇都能给你一套完整的参考框架。
1. 两阶段与单阶段的路线之争:先搞懂 RCNN 为什么慢,才知道 YOLO 为什么快
1.1 Selective Search:RCNN 系列的第一块基石
2014 年 RCNN 刚出来的时候,业界还在用滑动窗口加手工特征的老办法做检测。RCNN 的核心创新在于:不再傻乎乎地遍历整张图,而是先用 Selective Search 算法从图像里挑出大约 2000 个"可能是目标"的候选区域,然后对每个候选区域做卷积分类。
Selective Search 的原理说白了就是区域合并。它先通过图像分割把图片切成很多小区域,然后根据颜色、纹理、尺寸、形状的相似度,不断把相似的小区域合并成更大的区域块。这个过程是自底向上的,跟拼积木有点像——先拼出小零件,再拼成大部件。每个合并后的区域就是一个候选框。
RCNN 的步骤我拆开讲一下:
- 输入一张图片,用 Selective Search 生成约 2000 个候选区域
- 把每个候选区域缩放到固定尺寸(论文里是 227x227)
- 每个候选区域单独送入 CNN 提取特征
- 每个特征向量送入 SVM 分类器判断类别
- 对判断为目标区域的候选框做 bounding box regression 修正位置
这 5 个步骤里,第 3 步是致命的性能瓶颈——2000 个候选区域要分别过一遍 CNN,而且候选区域之间还有大量重叠,同一块像素被反复计算了几十次。我第一次跑 RCNN 的时候,一张图推理时间接近 50 秒,这还是在 GPU 上。所以当时 RCNN 虽然精度惊艳,但离工程落地差得很远。
1.2 Fast RCNN 的 ROI Pooling 解决了什么
Fast RCNN 在 2015 年做了两个关键改进。第一,整张图只过一次 CNN,得到完整的特征图,然后再从特征图上对应位置抠出每个候选区域的特征——这就是 ROI Pooling 的本质。第二,把 SVM 换成了 softmax 分类器,同时把分类损失和回归损失合并到一个网络里做端到端训练。
ROI Pooling 这个操作值得展开说。因为 Selective Search 生成的候选框坐标是在原始图像上的,而特征图相对于原始图像有缩放比例(比如原始图 800x600,经过 VGG16 的 5 次池化后特征图是 50x37,缩放比例就是 1/16)。所以要把候选框坐标除以 16 映射到特征图上,然后把这个区域划分成固定大小的网格(比如 7x7),对每个网格做最大池化,不管原始候选框多大,最后都能输出一个固定尺寸的特征向量。
我之前自己实现 ROI Pooling 的时候踩过一个精度坑:坐标映射直接取整会导致定位偏差,尤其对小目标影响明显。后来换成保留浮点数坐标,用双线性插值的 ROI Align(Mask RCNN 提出的改进),小目标的检测精度明显提升。这块如果你们项目里对小目标要求高,建议直接用 ROI Align。
Fast RCNN 的训练速度比 RCNN 快了一个量级,但推理时候选区域还是靠 Selective Search 单独生成。Selective Search 本身是 CPU 上的算法,一张图要花 2 到 3 秒,这成了新的瓶颈。
1.3 Faster RCNN 把候选区域也交给网络:RPN 的完整拆解
Faster RCNN 在 2016 年迈出了最后一步——把 Selective Search 踢掉,引入 Region Proposal Network(RPN)让网络自己生成候选区域。RPN 和检测网络共享特征图,真正实现了端到端训练和推理,这也标志着两阶段方法彻底成型。
RPN 的工作方式是在特征图每个位置放置 K 个 Anchor(默认 K=9,3 种尺度乘以 3 种长宽比)。Anchor 是预先定义好的参考框,本质上是一组先验的"目标可能存在的形状"。RPN 要做的事是:
- 对每个 Anchor,输出它是否包含目标(二分类)
- 对每个 Anchor,输出 4 个回归参数,用于微调 Anchor 的位置和尺寸
拿一张 800x600 的图举例,特征图是 50x37,那就有 50x37x9 = 16650 个 Anchor。训练 RPN 时,计算每个 Anchor 与真实目标框的 IoU,大于 0.7 的作为正样本,小于 0.3 的作为负样本,其余的忽略不计。筛选出的 Anchor 经过回归修正后,再按得分排序,用 NMS(非极大值抑制)去重,最终得到大约 2000 个 Proposal 送入检测网络。
Faster RCNN 结构上就是"RPN + Fast RCNN"的串联。RPN 负责快速粗筛,检测器负责精分类和细定位。这种两阶段配合的理念在工程上非常实用——先粗后精,每一级处理的事情更简单,精度自然容易做高。COCO 数据集上 Faster RCNN 的精度长期在两阶段方法里属于标杆,直到后来被 Cascade RCNN 等改进型超越。
2. YOLO 系列的底层设计哲学:把检测当成回归问题,告别候选区域
2.1 YOLOv1 到 YOLOv3:网格划分与多尺度是怎么一步步长出来的
YOLOv1 在 2016 年提出,和 Faster RCNN 几乎是同一时期,但思路完全相反。YOLOv1 把目标检测当成一个单纯的回归问题:输入一张图,直接输出所有目标框的坐标和类别概率。它的做法是把图片分成 SxS 的网格(论文里是 7x7),每个网格负责预测 B 个框(论文里 B=2),每个框预测中心坐标 x、y、宽高 w、h 和置信度分数,再加上该网格预测 C 个类别的概率。一张图跑一次 CNN,输出就是一个 SxSx(B*5+C) 的张量。
YOLOv1 的速度确实快,在 GPU 上能跑到 45 FPS,但缺点也很明显:每个网格只能预测 2 个框,而且只负责预测中心点落在该网格里的目标,所以对密集小目标几乎无能为力。还有一个硬伤:对同一网格里两个中心点接近但大小差异很大的目标,或者成群出现的小鸟、小物体,YOLOv1 基本会漏检。
YOLOv2 引入了 Anchor 机制和批归一化,把多尺度训练也加了进去。最值得一提的是它的 Dimension Clusters——用 K-Means 聚类训练集标注框,得到更适合数据分布的 Anchor 尺寸,这比 Faster RCNN 手动设定 Anchor 尺度要科学得多。YOLOv2 还做了 passthrough 层,把浅层特征拼接进来,算是对小目标的一次补救尝试。
YOLOv3 是一个真正的转折点。它引入了类似 FPN(特征金字塔网络)的多尺度检测结构,输出 3 个尺度的检测结果:大尺寸特征图负责检测小目标,小尺寸特征图负责检测大目标。YOLOv3 的骨干网络 Darknet-53 用残差结构堆了 53 层卷积,同时在多标签分类上把 softmax 换成了独立逻辑回归。这一代 YOLO 在精度上已经可以和 Faster RCNN 掰手腕了,速度又远快于两阶段方法,"工程首选"的江湖地位就是从这一代开始的。
我在实际项目里用的比较多的是 YOLOv3 的改进思路——在 3 个尺度之外再加一个更大的下采样特征层,用于提升大目标的召回率。这个改动在遥感图像检测大面积目标时比较有效。
2.2 Anchor Free 的转向:YOLOv8 和 YOLOv11 比以前的版本强在哪
YOLOv4 和 YOLOv5 在工程化上做了大量优化,把 CSPDarknet、Mish 激活函数、数据增强的 Mosaic、自适应 Anchor 计算等技巧集成在一起。YOLOv5 因为代码结构清晰、文档完善,成了很多人入门目标检测的第一个框架。但要注意,YOLOv5 的官方定义里是包含 Anchor 的,一直到 YOLOv8 才正式转向 Anchor Free。
YOLOv8 的架构变化主要体现在:
- 骨干网络换成了 C2f 结构,在整个特征提取过程中保留了更丰富的梯度流信息
- 检测头改成 Anchor Free 的解耦头结构,分类分支和回归分支分离
- 回归分支使用 Distribution Focal Loss(DFL)和 CIoU 损失
- 支持旋转目标检测、姿态估计、实例分割等扩展任务
Anchor Free 的核心思想是:不再预设一组固定尺寸的 Anchor,而是让每个位置直接预测某个属性(比如目标的距离、角点)来确定边界框。YOLOv8 的做法是在每个特征图位置直接回归目标框中心点到四条边的距离。这样做的好处是:少了 Anchor 超参数调节,训练配置更简单;对形状变化大的目标,比如长条形物体,Anchor Free 的适应能力也更强。
YOLOv11 是 ultralytics 团队在 2024 年推出的新版本(顺便回答热搜里那个"YOLO 第几代了"的问题——截止目前官方主线已经到 YOLOv11,社区里还有各种改进版,YOLOv10 也是存在的,但注意 YOLOv9 和 YOLOv10 不完全是同一波人做的,路线有分歧)。YOLOv11 的改进点主要集中在 CSPNet 结构的进一步优化和检测头里注意力机制的引入,官方给的 COCO 测试结果是在同等速度下比 YOLOv8 有精度提升。从工程角度看,YOLOv8 和 YOLOv11 的 API 基本一致,部署迁移成本很低,这也是 ultralytics 生态的一大优势。
3. 两套方案的硬核对比:精度、速度、损失函数、训练成本和适用边界
3.1 COCO 精度与推理速度的真实差距
我直接给一组基于 COCO val2017 的参考数据(用相同的硬件环境 T4 GPU、相同输入尺寸 640 时大致水平),方便你建立直观感受:
| 模型 | 参数量 | mAP@0.5:0.95 | 推理速度(ms/张) | 是否依赖预训练 |
|---|---|---|---|---|
| Faster R-CNN (ResNet50-FPN) | 41.5M | 37.4 | 约 85~120 | 是,强烈依赖 COCO 预训练 |
| YOLOv5s | 7.2M | 37.4 | 约 6~8 | 是,但依赖程度较低 |
| YOLOv8s | 11.2M | 44.9 | 约 8~10 | 是 |
| YOLOv11s | 9.4M | 47.0 | 约 8~12 | 是 |
这组数据说明几件事。第一,在相近精度下,YOLO 的速度优势是碾压性的,差一个数量级。第二,YOLOv8s 的参数比 Faster RCNN 小很多,但精度反而高,说明单阶段方法在结构设计上的进步已经很大。第三,Faster RCNN 的推理时间受 Proposal 数量影响,一旦 NMS 阈值调得比较松,速度会进一步下降。
有人说"两阶段精度天花板更高",这个说法在 COCO 这种标准数据集上已经不太成立了。现在的实际情况是:YOLO 系列在同等速度下的精度表现更好,而两阶段方法在极端复杂场景(比如密集小目标、目标重叠严重)下仍然有结构上的优势,因为 RPN 相当于多做了一次注意力筛选。
3.2 损失函数的差异:Faster RCNN 的分段组合 vs YOLO 的统一回归
Faster RCNN 的损失是分段式组合的。RPN 部分的损失函数是 smooth L1 回归损失加交叉熵分类损失,检测头部分的损失也类似,但分类目标变成多类别 softmax。我在 mmdetection 里看 Faster RCNN 的配置文件时,通常要同时调 RPN 和 RoI Head 两套损失权重,训练时也是分开监督的。
YOLO 系列的损失函数设计走的是另一条路。以 YOLOv8 为例,它的损失由三部分构成:
- Box Loss:使用 CIoU 或 DFL 计算预测框和真实框的几何差异
- Cls Loss:使用二值交叉熵计算分类差异
- DFL Loss:对目标框边缘分布进行建模,帮助更精确地回归
YOLO 的损失设计有几个值得注意的细节。正负样本的分配策略对最终效果影响很大,YOLOv8 采用的是 TaskAligned Assigner,它同时考虑分类得分和回归 IoU 的一致性来决定正样本。这也是 YOLO 系列从 Anchor Based 时代就积累下来的经验——让分类质量高的位置去负责回归任务。
实际训练中我遇到过最典型的问题是:类别不平衡导致 loss 曲线看起来收敛很快,但小类别一个都检测不出来。解决办法是给样本少的类别提高 loss 权重,或者用 Focal Loss 替代普通交叉熵。YOLOv8 的官方实现里对 loss 做了自动平衡,但如果你做的是自己的数据集,类别严重不平衡的情况还是要手动调。
3.3 到底该怎么选型:不是越新的模型就越好
选型要看你的实际约束条件,我根据项目经验给你几个判断维度:
- 如果你的项目在边缘设备或嵌入式设备上跑,比如 Jetson Nano、树莓派,优先选 YOLOv5s、YOLOv8n 这种轻量版本,量化和 TensorRT 加速方案也更成熟
- 如果你的检测目标非常小(低于 16x16 像素),或者场景里目标重叠密集,Faster RCNN 加多尺度训练往往是更稳的选择
- 如果你需要快速迭代,比如今天采集了一批新数据明天就要出效果,YOLOv8 的端到端训练流程比 mmdetection 要快很多,ultralytics 的 API 设计对初学者很友好
- 如果要做科研对比实验,Faster RCNN 和它的各种变体仍然是很多论文的 baseline,理解它有不可替代的学术价值
我自己的经验是:项目落地默认从 YOLOv8 或 YOLOv11 起步,遇到小目标检测或密集场景解决不了时,再切到 Faster RCNN 系做对比实验。
4. 训练自己的数据集:标注、环境配置、训练命令和评估指标
4.1 数据标注与格式转换:LabelImg 到 YOLO 格式、CVAT 到 COCO 格式
目标检测项目里最耗时、最影响结果的就是数据标注。我用过的标注工具有 LabelImg、CVAT、X-AnyLabeling 这几款,简单对比一下:
| 工具 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
| LabelImg | 本地小批量标注 | 安装简单,支持 Pascal VOC 和 YOLO 格式 | 功能单一,无自动追踪 |
| CVAT | 团队协作、大规模标注 | 支持自动标注、跟踪、多用户协作 | 部署稍复杂,依赖 Docker |
| X-AnyLabeling | 本地中等规模标注 | 集成 SAM 模型,可半自动标注 | 对硬件有一定要求 |
标注完成后最麻烦的是格式转换。YOLO 格式要求每个标注框一行,格式为:类别ID 中心点x 中心点y 框宽 框高,所有坐标都要归一化到 0~1。比如一张 1920x1080 的图,一个框的左上角是 (480, 270)、右下角是 (960, 810),转换成 YOLO 格式就是:
class_id 0.375 0.5 0.25 0.5COCO 格式则是 JSON 文件,有 images、annotations、categories 三个数组,annotations 里的 bbox 字段是 [x, y, width, height] 列表,注意这里的坐标是像素值不是归一化值。
我写过一个格式转换脚本,核心逻辑就是:
- 解析 VOC XML 得到框的左上角和右下角坐标
- 把坐标换算成 YOLO 所需的中心点加宽高格式
- 除以图像尺寸做归一化
- 按图像 ID 汇总输出为 txt 文件或 COCO JSON
这些转换脚本网上很多现成的,但有一点必须提醒你:转换后一定要随机抽图可视化检查标注框位置,我遇到过坐标顺手除以宽、高度导致所有框歪掉的低级错误,肉眼检查一遍能省后面很多麻烦。
4.2 环境配置实战:Linux 下的 CUDA 版本坑和 AMD 显卡的现状
环境配置这块,我结合几个实际踩过的坑展开说。
如果你用 NVIDIA 显卡,最稳的组合是 Ubuntu 20.04/22.04 + CUDA 11.8 + PyTorch 2.x。装依赖时有个顺序问题容易踩坑:一定要先装 PyTorch,再装其他包,否则 pip 会自动装一个 CPU 版本的 torch,白白浪费显卡。验证一下:
python -c "import torch; print(torch.cuda.is_available())"输出 True 才算装成功。
用 mmdetection 训练 Faster RCNN 时,环境更复杂一些。我的建议是直接用官方 Docker 镜像:
docker pull open-mmlab/mmdetection:v2.25.3或者用 conda 一步步装 PyTorch、MMCV、MMDetection。mmdetection 的版本和 mmcv 版本是强绑定的,这个坑非常容易踩,网上搜"mmdetection 安装报错"几乎一半是版本对不上。我自己后来积累的经验是:mmdetection 2.x 用 mmcv-full,mmdetection 3.x 用 mmcv,版本号要严格按照官方文档匹配表。
AMD 显卡跑 YOLO 的问题,搜热词里出现了,我可以说说现状。AMD 的 ROCm 在 PyTorch 上的支持这两年进步很大,但距离 NVIDIA 的无痛体验还是有差距。我用 RX 7900 XTX 跑 YOLOv8 训练亲测过:ROCm 5.7 以上版本能跑通,但有些算子仍然只支持 CUDA,ultralytics 的部分功能会不兼容。如果你是新买硬件做目标检测,现阶段我还是建议优先 NVIDIA 卡,省下折腾环境的时间。
4.3 一键训练脚本与超参数选择:epoch、batch size、学习率怎么配合
用一个最简单的方式开始训练你自己的数据,假设用的是 ultralytics 的 YOLOv8:
yolo train data=custom.yaml model=yolov8s.pt epochs=100 imgsz=640 batch=16custom.yaml 里要写清楚数据集的路径和类别列表:
path: /home/user/dataset train: images/train val: images/val nc: 3 names: ['cat', 'dog', 'bird']batch size 的选择取决于显存。我的经验是:8GB 显存用 batch=16 + imgsz=640,如果显存不够,优先减小 imgsz 而不是减小 batch,因为 imgsz 对精度的影响比 batch 更明显。学习率一般不动,直接用 ultralytics 的默认值 0.01,配合余弦退火就够了。
有个技巧我经常用:先用自己的数据跑 30 个 epoch,同时打开plots=True观察 loss 曲线和 PR 曲线,如果 30 个 epoch 内 loss 还在明显下降,就加大到 100 甚至 300 个 epoch。如果 loss 早早平台期,检查是不是学习率设置问题或数据量问题。
训练 Faster RCNN 用 mmdetection 的命令类似:
python tools/train.py configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.pymmdetection 的训练逻辑和 YOLO 很不一样,它默认的 schedule 是按 epoch 数设计的(1x 表示 12 个 epoch),COCO 预训练权重默认下载。如果你用自己的数据训练,需要把配置文件里的 num_classes 改成你自己的类别数,同时注意 dataset_type 和 data_root 要改成你自己的路径。mmdetection 还提供了--auto-scale-lr参数,可以自动根据 batch size 缩放学习率,这个比较实用。
4.4 模型评估:mAP、FPS、红外小目标检测里那些评价参数
普通目标检测最核心的指标就是 mAP。mAP@0.5 指的是 IoU 阈值取 0.5 时的平均精度,mAP@0.5:0.95 是在 IoU 从 0.5 到 0.95(步长 0.05)的一系列阈值下的平均精度。后者对定位要求更严格,也是 COCO 竞赛的主指标。Faster RCNN 在自建数据集上通常 mAP@0.5 能到 90% 以上,但 mAP@0.5:0.95 可能只有 60%,这是正常的,不用太焦虑。
红外小目标检测在评价指标上有独特的地方。常规检测指标在小目标场景下会出现问题——因为目标太小(可能只有几个像素),IoU 稍微算偏一点 mAP 就会大幅波动。红外小目标检测一般会额外关注:
- PD(检测概率):真实目标被成功检测的比例,越高越好
- FA(虚警率):每帧平均误报数量,越低越好
- SCR(信杂比增益):检测前后目标与背景对比度的提升幅度
- 最小可检测目标尺寸
如果你的课题正好在红外小目标领域,建议不要单独看 mAP,要综合 PD 和 FA 一起评估,很多论文里会画 ROC 曲线来反映 PD 与 FA 的权衡关系。
另一个容易被忽略的指标是模型的 FLOPs 和参数量,热词里提到"macs仅5mb的目标检测模型",这个 "macs" 其实指的就是乘加运算次数。FLOPs 和 MACs 常被混用,但 MACs 严格说是乘加操作数,FLOPs 是浮点运算数,一个乘加算两次浮点运算。做端侧部署时,FLOPs 和模型大小直接决定能不能跑起来。
5. 实战踩坑记录:loss 不收敛、小目标漏检和部署格式转换
5.1 从 loss 曲线反推问题:分类收敛但回归不收敛怎么办
训练中 loss 能反映很多问题。普通量级 loss 曲线持续震荡不下降,大概率是学习率太大;loss 直接变成 NaN,先检查标注数据里有没有 NaN 值或不合法坐标(比如框的宽度为负数),这两个都是低级错误但很常见。
我遇到过的典型案例是:分类 loss 正常下降,但 box loss 一直下不去。排查下来发现是标注框质量参差不齐——数据集是几个人分头标注的,有些人把目标框留白包得很大,有些人只框住目标的紧密轮廓。同一类目标框的宽高比方差过大,Anchor Free 模型的回归分支就很难收敛。解决思路是:统一标注规范,重新清洗不合格的标注框。判断标注一致性可以统计一下所有 GT 框的宽高分布,如果出现明显异常分布,大概率是标注标准不一致。
还有一个常见问题是:迁移学习时预训练权重和自定义数据集类别数不一致,导致最后全连接层维度不匹配而报错。在 mmdetection 和 ultralytics 里都有自动跳过不匹配层的方式,但要注意如果你是做二分类,而预训练模型是 COCO 80 类,转出来的模型可能需要微调后才能使用,不能直接把顶层换成自己的分类器就认为万事大吉。
5.2 小目标检测为何难:IoU 的数学陷阱和 Tiling 策略
小目标检测难在哪,用 IOU 的数学特性就能解释清楚。假设一个目标的真实框面积是 20x20 像素(也就是 400 像素),模型预测框是 22x22 像素(484 像素)。两者虽然只差了 2 个像素,但 IoU 计算出来可能只有 0.6 左右,达不到正样本匹配的阈值。也就是说,预测哪怕差一点点,IoU 就可能断崖式下跌,导致 mAP 拉不上去。
针对小目标检测,我试过几种有效的方法:
- 多尺度训练与测试。训练时随机在 480~960 之间缩放输入尺寸,让模型见过大目标也见过小目标
- Tiling 切图推理。把大图切成若干 640x640 或 1024x1024 的重叠块分别推理,再把结果合并回原图坐标系。切图时重叠率最好在 10%~20%,防止目标正好在切分线上被截断
- 提高输入分辨率。在显存允许范围内尽量用更大 imgsz,比如从 640 提到 1280,对小目标的提升是最直接的,代价是训练速度变慢和显存暴涨
- 专门的 SAHI 库做切片推理,自动处理切分和结果融合
我在做航拍图像检测时,用小图直接训练 mAP@0.5:0.95 只有 31,切图加高分辨率之后提升到 47,效果非常直观。但注意切图推理时推理时间也会翻倍,需要和实际部署算力做好权衡。
5.3 模型导出:ONNX、TensorRT 和边缘设备部署的那些坑
训练完模型后,部署是最容易踩坑的环节。以 YOLOv8 为例,导出 ONNX 很简单:
yolo export model=best.pt format=onnx opset=12但导出成功并不代表部署顺利。我遇到过的典型坑有:
- 导出的 ONNX 模型用 onnxruntime 推理结果和 PyTorch 不一样。大概率是预处理参数不一致,比如 YOLO 训练时用的是 RGB 还是 BGR、归一化时除以 255 的方式、letterbox 填充的灰度值(默认是 114)是否一致
- TensorRT 导出时某些算子不支持。如果遇到报错,把 opset 降到 11 或 12,关闭动态 shape 配置,先固定输入尺寸导出
- 边缘设备上跑 FP16 精度模型时精度下降明显,尤其对小目标检测来说,FP16 的梯度精度损失可能造成漏检
我常用的部署流程是:PyTorch 模型 → ONNX → TensorRT INT8 量化。INT8 在 YOLOv8s 上能把推理速度提升到 C++ TensorRT 后 2~3 毫秒级别。但量化需要校准数据集,校准集的分布和实际场景差异过大时,量化后的精度会崩,这是我最常提醒团队的坑。
5.4 YOLO 多目标跟踪指标怎么算:MOT 评价里的那些术语
目标跟踪和检测是两回事,但 YOLO 经常配合跟踪一起用。MOT(多目标跟踪)的指标和检测不同,热词里有人问"YOLO 多目标跟踪的指标怎么得到",这里简单梳理一下。
MOT 任务的核心指标包括:
- MOTA(多目标跟踪准确率):综合漏检、误检、ID Switch 三大误差计算出来的综合分数,范围是负无穷到 100
- IDF1(身份 F1 分数):衡量跟踪轨迹和真实轨迹的匹配程度
- HOTA(高阶跟踪准确率):同时考虑检测和关联质量的新指标,近年来越来越常用
- MT / ML / PT:大部分时间被跟踪上的目标比例 / 大部分时间丢失的目标比例 / 部分跟踪上的目标比例
计算这些指标需要用官方工具,比如 py-motmetrics 或 TrackEval。流程是:用 YOLO 加 ByteTrack 或其他跟踪算法生成带 ID 的跟踪结果,保存为 MOT Challenge 格式的 txt 文件,再用官方评测代码跑指标。
我做跟踪项目时发现一个细节:很多人在测试集上 run 出来的 MOTA 和论文差很多,排查下来是跟踪器和检测器的匹配阈值设置不一致导致的。如果你在复现别人的跟踪效果,先确认两个关键参数:置信度阈值和 IoU 匹配阈值。前者决定检出的目标数,后者决定帧间目标关联的松紧,这两个值联调,指标浮动会很大。
6. 多模态与开放词汇检测:目标检测现在进化到什么程度了
如果你对目标检测的认知还停留在"检测固定类别"上,那可能需要更新一下知识。这两年最火的方向是多模态目标检测和开放词汇目标检测。
多模态目标检测的核心思路是:把文本描述和图像特征融合起来,让模型能根据一句自然语言指令去定位目标。比如你说"找出图中所有红色的交通工具",模型不仅要理解"交通工具"这个概念,还要理解"红色"这个属性,然后把对应目标框出来。代表模型有 Grounding DINO、GLIP 等,它们把文本编码器(类似 CLIP 的文本分支)和图像编码器交叉融合,实现文本引导的检测。
开放词汇检测更进一步,目标是让模型能检测训练时从未见过的类别。这个能力的本质是:把检测任务从"分类到固定类别"变成"匹配语义空间",模型学到的是视觉和语义的对应关系,而不是死记硬背的类别标签。2023 年出现的 Grounding DINO 结合了 DINO 和 GLIP 的思路,在零样本检测上表现惊艳,可以直接用文本 prompt 检测 80 类之外的类别。
从工程角度看,多模态检测最大的价值是省掉了标注成本——不用为每个新类别专门标注数据,写一句文本描述就能检测。这对那些类别经常变化的项目的价值非常大。在 ultralytics 生态里目前也有 YOLO-World 这种开放词汇检测模型的集成,部署方式跟 YOLOv8 类似,能够做到"输入文本,输出检测框"。这类模型虽然速度和专用检测模型比还有差距,但已经能落地了。
做科研选题的话,多模态微调目标检测是个明确的热点方向。思路通常是拿一个预训练好的视觉语言模型,在自己的领域数据上做微调,把领域的语义空间对齐到检测器的特征空间上。这类工作对计算资源的要求不低,但方向和落地场景都很清晰。
7. 给刚入门的人一条最短路径:从 YOLOv8 起步,再回头理解 Faster RCNN
如果你完全是零基础想入门目标检测,我建议的路径是这样的:
第一步,先用 ultralytics 跑通 YOLOv8 的官方 demo。准备好 COCO 或者是自己标注的一小批数据,改用自己数据训练一遍,把训练、验证、导出的全流程走通。这一步的作用是建立对目标检测的感性认识:输入是什么、输出是什么、哪些环节是通用的。
第二步,认真读一遍 YOLOv8 的模型结构图和 loss 函数定义。不要求全部看懂,但至少要知道 C2f、SPPF、Detect 头各自负责什么,知道 Anchor Free 的检测头是怎么输出框的。这一步是从"能跑"到"看懂"的关键。
第三步,回到 Faster RCNN,用 mmdetection 训练一次,和 YOLOv8 做对比实验。这一步的意义在于理解两阶段方法的独有价值——RPN 和 ROI Head 的分工配合,这在处理复杂场景时非常重要。很多人只学 YOLO 不看 Faster RCNN,遇到密集小目标问题就无从下手,是很可惜的。
热点"macs仅5mb的目标检测模型"我想多说一句。这种极轻量目标检测模型通常是用 NAS(神经架构搜索)搜出来的紧凑结构,或者对主干网络做极致的深度压缩。如果你的项目对模型大小有硬性要求,可以关注 lightweight YOLO 系列的变体,比如 YOLOv8n 量化为 INT8 后模型大小大约在 4~6MB,FPS 很高,推理端完全够轻。在工业场景里,这类模型往往比堆精度的大模型更实用。
回顾一下全篇的核心观点:RCNN 系列胜在"先粗筛再精修"的结构设计,特别适合密集目标和小目标场景;YOLO 系列胜在端到端回归的高速度,特别适合工程落地和实时任务;两个系列背后的共性——特征金字塔、Anchor 设计、IoU 匹配、NMS 后处理——才是目标检测真正要掌握的基本功。这些基本功吃透了,不管以后出来 YOLOv12 还是更先进的检测架构,你都能很快上手。