1. 从R-CNN到DETR:目标检测这十年到底在解决什么问题
目标检测这个方向,说到底是让计算机回答两个问题:“画面里有什么”和“这些东西分别在哪个位置”。听起来简单,但做起来极其麻烦。你既要知道类别,又要画框框住每一个目标,而且同一张图里可能有几十个大小不一、相互遮挡的物体,有些小到你肉眼都得凑近了才看得清。这个任务的难点从来不是“识别”本身,而是“在哪里识别”以及“怎么把框框得准”。
从2014年R-CNN出现,到如今DETR、DINO这些基于Transformer的方案成为主流研究方向,目标检测领域其实经历了两次大的范式转变:第一次是从传统手工特征走向深度学习,第二次是从“锚点+候选区域”的间接范式走向“端到端”的直接范式。
这篇博文就以时间为线索,把R-CNN家族、YOLO系列、DETR和DINO这几条技术路线彻底讲透。我会把每条路线解决的核心问题、关键设计、优缺点一五一十地拆开,再结合自己训练模型时踩过的坑,给出实操层面的参考建议。适合正在学习目标检测的入门者,也适合想系统梳理技术脉络的研究生和工程师。
2. 两阶段检测器:R-CNN家族如何撑起精度天花板
2.1 R-CNN的开创性:把CNN引入目标检测的第一人
2014年,Ross Girshick提出R-CNN(Region-based CNN),这一步直接把目标检测拉进了深度学习时代。此前的检测方法大多依赖手工设计的特征(如HOG、SIFT),加上滑动窗口暴力搜索,计算量大不说,准确率还上不去。
R-CNN的思路其实非常朴素且有效:先用选择性搜索(Selective Search)从图片里挑出大约2000个可能包含物体的候选区域,然后把每个候选区域缩放到固定尺寸,分别送入CNN提取特征,最后用SVM分类器判断类别,再用回归器微调边界框。
这套思路在实践中效果显著,但问题也很明显:2000个候选区域各自过一遍CNN,耗时太长,单张图片推理需要几十秒,训练更是要几天几夜。这种“暴力但有效”的风格,奠定了两阶段检测器的基本范式:先粗选候选,再精修分类。
如果你去翻当年的论文,会发现R-CNN有很多在今天看来很“土”的细节:候选区域是CPU上的选择性搜索算的,特征要存到磁盘上再读出来训练SVM,边界框回归用的还是岭回归。但正是这些细节,让后续的系列工作有了明确的优化方向:速度太慢,那就共享计算;特征重复提取,那就改进网络结构。
2.2 Fast R-CNN与Faster R-CNN:每一步都在消除重复计算
Fast R-CNN解决的最大痛点是重复卷积。它不再把每个候选区域单独送进CNN,而是先把整张图过一遍卷积层,得到特征图,再通过ROI Pooling把候选区域映射到特征图上,一次性完成特征提取。这样一张图只需要一次卷积计算,训练速度比R-CNN提升了约9倍。
Faster R-CNN则在Fast R-CNN的基础上,用Region Proposal Network(RPN)替代了选择性搜索。RPN是一个轻量级卷积网络,在特征图上滑动预测“哪里可能有物体”,同时输出框的粗定位。这一步的意义不仅是提速,更重要的是整个检测流程终于可以端到端地训练了——候选区域生成、特征提取、分类回归全部在一个框架内联合优化。
我当年第一次跑Faster R-CNN的时候,感受最深的是anchor这个概念。RPN会在特征图的每个位置生成多个不同尺度和长宽比的锚点框,比如[0.5, 1, 2]三种长宽比、[8, 16, 32]三种尺度,组合起来就是9个anchor。这9个anchor相当于先验知识,告诉网络“物体可能长这样”。anchor的设计直接决定了检测器对不同形状物体的适应能力,这也是为什么后来很多工作都在研究自适应anchor或直接去掉anchor。
Faster R-CNN把两阶段检测器推向了成熟,mAP在VOC数据集上达到了73.2%,在COCO上也有不错的成绩。即使到今天,Mask R-CNN(在Faster R-CNN基础上加了一个分割分支)依然被广泛用于实例分割任务,很多工业项目里仍然可以见到它的身影。
2.3 两阶段路线的核心优劣势
两阶段检测器的最大优势是精度高。候选区域模块相当于一个“粗筛”,先框出一些疑似目标,再让分类器在更精确的区域上做判断——这种“两遍确认”机制特别适合对准确率要求极高的应用场景,比如医学影像分析、工业质检。此外,两阶段框架天然支持多任务扩展,Mask R-CNN加个掩码分支就能做分割,非常灵活。
但它的缺点也明显:结构复杂、组件多、训练难调。你要同时调RPN、ROI Head、anchor参数、NMS阈值,任何一个环节出问题都会影响最终效果。推理速度也偏慢,即使Faster R-CNN已经大幅提速,在实时检测场景下依然难以和YOLO系列抗衡。
3. 单阶段检测器:YOLO的“一眼看穿”哲学
3.1 YOLOv1:把检测当作回归问题
2016年,Joseph Redmon提出YOLO(You Only Look Once),彻底打破了“候选区域+分类”的范式。YOLO的做法是:把输入图片划分成S×S的网格,每个网格负责预测固定数量的边界框和类别概率,所有预测一次性完成。
这个设计在当时是非常大胆的。网格的存在相当于把“在哪里找物体”这个问题直接变成了“每个格子负责检测中心点落入其中的物体”,简化了目标检测任务本身。由于不再有候选区域模块,YOLOv1的推理速度可以达到45 FPS,远超同期的两阶段检测器。
但YOLOv1的问题也很突出:对重叠物体和小物体检测效果差。网格是固定大小的,如果一个格子同时包含两个小物体,它就很难同时预测好两个框。另外,由于每个网格只能预测一个类别,遇到密集场景就抓瞎。我至今记得第一次用YOLOv1检测一群人密集站立的照片时,框与框之间互相挤兑,漏检严重。
3.2 YOLOv2到YOLOv5:一路迭代的工程智慧
YOLOv2(YOLO9000)引入了一批实用的改进:批量归一化、高分辨率分类器、带anchor的卷积预测、多尺度训练、维度聚类。尤其是维度聚类这一步——不再手工设定anchor的尺寸,而是通过K-means在训练集上统计出最适合的初始框大小,这是一个非常务实的工程做法。我自己做自定义数据集时,也习惯先跑一遍K-means聚类看数据分布,很多时候得到的anchor尺寸和默认值差很多,改完之后mAP直接涨了2-3个点。
YOLOv3引入了特征金字塔网络(FPN)的思想,在不同尺度的特征图上分别做检测,小物体检测能力大幅提升。YOLOv3的损失函数也做了改进,使用二元交叉熵替代softmax,允许一个物体同时被预测为多个类别,这在Open Images这类多标签数据集上很实用。
YOLOv4和YOLOv5则更像是工程优化的集大成者。CSPDarknet骨干网络、Mish激活函数、Mosaic数据增强、CIoU损失函数,这些技巧单独看都不算颠覆性创新,但组合起来效果惊人。YOLOv5虽然不是官方版本,但因为出色的工程化细节——简单的训练流程、丰富的数据增强、方便的模型导出,反而成了工业界使用最广泛的检测模型之一。
3.3 YOLOv8及之后:从检测走向全任务框架
到YOLOv8出现时,Ultralytics已经不只是在做一个检测器了,而是把目标检测、实例分割、姿态估计、旋转框检测全部整合进了一个框架。C2f模块替代了C3模块,解耦头(Decoupled Head)将分类和回归分支分开,Anchor-Free的检测头成为标配,这些改动让YOLOv8在精度和速度上全面超越了前代。
我一直觉得YOLO系列最大的贡献不只是指标,而是让目标检测真正走入了工程实践。一键安装、命令行训练、导出ONNX/TensorRT、支持各种硬件平台,这些能力让很多不专门研究算法的工程师也能很快用上目标检测技术。AMD显卡跑YOLO的话题在社区里一直很热,本质也是因为YOLO的生态和部署工具链已经相当完善,大家才会关心不同硬件上的兼容性。
YOLO的损失函数也值得一提。从YOLOv1的简单的平方误差损失,到YOLOv5的GIoU、YOLOv8的DFL+CIoU组合,损失函数的设计目标始终围绕两个核心:让框回归得更准(IoU类损失)和让分类更可靠(focal loss处理正负样本不平衡)。如果你打算在自己的数据集上改loss,建议从这两个方向入手,比盲目调学习率见效快得多。
3.4 单阶段路线的优劣与适用场景
单阶段检测器的核心卖点就是速度和简洁。一次前向传播就能出结果,训练也不需要管理RPN等中间模块,整个pipeline干净利落。但代价是精度上通常略逊于精心调优的两阶段检测器,特别是在小目标和密集场景下,缺少“候选区域粗筛”这一步会让模型更难聚焦到难样本上。
我的经验是:如果项目要求实时性能(比如视频流处理、嵌入式设备),优先考虑YOLO系列;如果项目对精度要求极高且有足够的算力,可以尝试两阶段方案或直接考虑DETR系。
4. Transformer进场:DETR如何颠覆检测范式
4.1 DETR:把检测变成集合预测
2020年,Facebook AI研究院提出DETR(Detection Transformer),把Transformer架构引入目标检测,彻底抛弃了anchor、候选区域、NMS(非极大值抑制)这些此前被认为是检测“标配”的组件。
DETR的核心创新有两个。
第一个是object queries。你可以把它理解为一系列“可学习的问句”:这是人吗?这是车吗?这是狗吗?这些问句是Transformer解码器的输入,每个query最终输出一组预测(类别+边界框),而query的数量就是模型最多能检测的物体数量。这样一来,检测问题被转化成了集合预测问题——模型直接输出一个无序的集合,不再需要后处理来去重。
第二个是匈牙利匹配损失(Hungarian Matching Loss)。训练时,预测结果和真实标注并不是一一对应的,匈牙利算法负责找出预测框和真实框之间的最优配对方式,然后计算分类损失和边界框损失。这个设计使得DETR的训练可以完全端到端,不需要复杂的标签分配策略。
4.2 DETR的优势与槽点
DETR最大的优势是范式简洁。整个模型就是CNN骨干网络提取特征 + Transformer编码器建模全局关系 + Transformer解码器输出预测,没有anchor的尺度和长宽比需要预设,没有NMS后处理,训练和推理流程都大幅简化。
但DETR的缺点也同样突出:收敛慢。论文里说要训练500个epoch才能达到好效果,而YOLOv5通常几十个epoch就能收敛到可用水平。原因是Transformer的自注意力机制在训练初期需要大量时间去学习“哪些区域是物体”,如果不加任何辅助手段,DETR的收敛速度让人非常痛苦。另外,DETR在小物体检测上表现不佳,因为Transformer编码器的注意力是全局的,缺乏对局部细节的精细化感知。我当时跑了COCO数据集上的DETR训练,前200个epoch的mAP几乎看不到什么起色,一度怀疑是自己代码写错了。
4.3 Deformable DETR:工程与学术的巧妙折中
Deformable DETR是DETR之后最重要的改进工作之一,由商汤和香港中文大学的研究者提出。核心思路是只在稀疏的关键采样点上计算注意力,而不是在整张特征图上做全局注意力。具体来说,每个query只关注预设数量的采样点(比如4个),而且这些采样点的位置是可学习的偏移量决定的。这和可变形卷积(Deformable Convolution)的思想一脉相承。
这个改动让Deformable DETR的收敛速度比DETR快了10倍,在COCO上的精度也显著提升。更妙的是,它使用多尺度特征图,直接将FPN的层次化信息融入了Transformer解码器,小目标检测能力也得到大幅改善。
从实用的角度讲,如果你今天要选一个DETR系模型用在项目上,Deformable DETR是一个比原生DETR更靠谱的起点。
4.4 DINO:把DETR推到SOTA的高地
DINO(DETR with Improved deNoising anchOr boxes)可以理解为DETR家族的集大成者,它的名字也故意和“DINO”这个恐龙IP双关,让人印象深刻。DINO把DETR系的关键改进集于一身:对比去噪训练(contrastive denoising)、混合query选择(hybrid query selection)、look forward twice box refinement。
对比去噪训练的核心是为模型提供“加了噪声的GT框”,让模型学会把带噪声的框修复回GT框,这相当于给训练过程加了一个容易学习的辅助任务,加速收敛。混合query选择则结合了内容query和anchor query两种方式,让模型的候选框更高质量。Look forward twice是在每一层解码器都做预测并参与loss计算,使梯度信号在多层间双向传播得更充分。
效果上,DINO在COCO val上以63.3 AP的成绩刷新了当时的SOTA记录,同时推理速度和收敛速度也都优于Deformable DETR。更值得关注的是DINO在开放词汇检测路线上的延伸——Grounding DINO,把视觉检测和文本描述结合起来,实现了“用语言指挥检测器”的效果。这个方向在未来的人机交互应用上有很大想象空间。
4.5 Transformer路线与CNN路线的本质区别
简单总结这两条路线,CNN系(YOLO、Faster R-CNN)是“由局部到全局”的逐步感知:先在局部区域提取特征,再通过区域合并或特征金字塔获得全局认知。Transformer系是“全局直接建模”:不管目标在图像哪个位置,注意力机制都能在计算中直接关联到它。这就让Transformer系在处理遮挡、重叠、复杂关系场景时天然更有优势。
但“全局注意力”也意味着更高的计算复杂度。DETR在COCO这种高分辨率大图上训练时,显存占用非常夸张,Deformable DETR稀疏采样实际上是一种精度和资源之间的折中。所以说,Transformer系不是“神”,它更像一种新的解决问题的思路,需要在特定场景下才能发挥最大价值。
5. 三条技术路线的横向对比与选型建议
5.1 核心指标对比
| 维度 | R-CNN家族(两阶段) | YOLO系列(单阶段) | DETR/DINO(Transformer系) |
|---|---|---|---|
| 核心范式 | 候选区域 + 分类回归 | 单次前向回归 | 集合预测 + 端到端训练 |
| 典型代表 | Faster R-CNN, Mask R-CNN | YOLOv5, YOLOv8 | DETR, Deformable DETR, DINO |
| 推理速度 | 中慢,依赖候选区域数 | 快,适合实时场景 | 中,取决于解码器层数 |
| 精度上限 | 高,尤其是小目标 | 中高,持续提升 | 极高(DINO可达SOTA) |
| 训练复杂度 | 组件多,需分步调优 | 简洁,易上手 | 端到端但收敛慢需技巧 |
| 后处理依赖 | NMS必须 | NMS通常需要 | 无需NMS |
| 适用场景 | 医学影像/工业质检/高精度需求 | 视频监控/嵌入式/实时系统 | 复杂场景/学术研究/开放词汇 |
5.2 工业落地怎么选
我给的建议非常直接:
- 刚接触目标检测、需要快速出结果:直接用YOLOv8,配Ultralytics的开源工具,数据集标注好、写几行配置就能训练,导出ONNX或TensorRT就能部署,社区资料丰富,遇到问题基本都能搜到答案。
- 追求极致精度、不要求实时:试试DINO或其变体,如果你有足够的训练时间(几百个epoch)和显存(至少24GB),DINO会在COCO量级的数据集上给你惊喜。
- 做研究、发论文:建议在DETR系上找改进点,因为Transformer系目前仍有大量值得探索的方向,比如更高效的注意力机制、多模态融合、小目标专项优化等。CNN系的改进空间已经挖掘得比较深了,除非你有很独特的工程场景。
5.3 一个值得关注的趋势:小目标检测与多模态
小目标检测一直是目标检测的痛点,学术界和工业界投入了大量精力。传统上,FPN和图像金字塔是提升小目标检测的主力手段,但效果有限。在DETR系里,多尺度可变形注意力的引入让小目标检测有了新的解法,但仍有很大提升空间。另外,如果你做红外小目标检测,还需要额外考虑评价指标的问题,因为常规的mAP并不能完全反映红外小目标检测的性能,通常还要关注信噪比提升、检测概率等指标。
多模态目标检测也正在成为热点,比如将文本描述与视觉信息结合进行开放词汇检测(Grounding DINO)、将毫米波雷达与摄像头融合进行三维目标检测。这类方向不再局限于图像本身,而是把检测放到更大的信息融合框架里去思考。
6. 实操心得:训练自己的检测模型时最容易踩的5个坑
6.1 标注质量决定性能上限
很多初学者以为模型效果不好是网络结构的问题,其实绝大部分情况是标注数据出了问题。我在自己的项目里反复验证过一件事:把标注框的贴合度提高(用0.1像素级别调整边界),比换更强的骨干网络带来的mAP提升更明显。所以,如果你的模型在小物体、密集场景下表现不佳,先别急着改网络,重新审视一遍标注框是否紧贴目标边界、是否标注遗漏、类别是否混淆。
6.2 数据增强要克制
YOLO系列自带的Mosaic、MixUp等增强手段非常强大,但并非越多越好。我在一个小规模数据集上做过对比实验,过度增强会导致模型在训练集上欠拟合,反而拉低验证集精度。正确的做法是:先关闭增强训一个baseline,再逐步加入增强并观察验证集表现,找到最优配置。
6.3 学习率与batch size的匹配
Transformer系模型对学习率特别敏感。DETR默认使用10^-4级别的学习率,配合AdamW优化器;YOLO系默认使用SGD或AdamW,配合余弦退火调度器。如果你把DETR的学习率调到YOLO的默认值(比如0.01),大概率直接发散。换模型前一定要先确认论文里推荐的超参数组合,再在自己的数据上微调。
6.4 显存不够不代表不能训
Deformable DETR和DINO都是显存大户,如果你的显卡只有8GB显存,可以尝试:用梯度累积模拟更大的batch size、用混合精度训练(AMP)、缩小输入分辨率、减少解码器层数,或者先用小骨干网络(如ResNet-50)跑通流程,再换大模型。
6.5 训练日志必须盯紧
我强烈建议每个训练任务都记录三条曲线:训练loss、验证mAP、学习率。不要只看最终结果,过程曲线能告诉你很多信息——loss下降变缓但mAP还在涨,说明模型还在学习;mAP一直不动但loss降了,可能是标签分配或损失权重出了问题;learning rate跳变后mAP波动剧烈,说明学习率设置得偏大。
7. 最后分享一点个人的判断
目标检测发展到现在,已经不再是一个单纯的算法问题,而是和工程部署、数据工程、场景理解深度绑定的系统工程。R-CNN教会我们“先粗后精”,YOLO教会我们“直接回归”,DETR教会我们“集合预测”,DINO教会我们“如何让Transformer收敛得又快又准”——每一条路线都代表了一种不同的思考方式。
我对自己的工作是两条腿走路:工业项目优先上YOLO系,因为稳定、好部署、团队学习成本低;研究课题则押注Transformer系,因为在多模态、开放词汇、复杂关系建模这些前沿方向上,DETR系的潜力远未释放完。
如果你也想系统学习目标检测,我的建议是先动手跑一个YOLOv8的训练流程,建立起从数据到模型的完整认知,再回头看Faster R-CNN的论文理解两阶段的设计动机,最后去啃DETR和DINO的代码搞清楚端到端到底是怎么运作的。这条路走下来,你对整个领域的技术脉络就有自己的判断力了。