去年年底我帮几个师弟师妹改毕业设计开题报告,发现了一个共性问题:大家一上来就奔着 YOLO 去,问为什么选它,回答基本是“因为大家都在用”。但问到 YOLO 和 Faster R-CNN 的本质区别是什么,mAP 和 AP50 的差异在哪里,小目标检测为什么是老大难,大多数人是懵的。目标检测入门最缺的不是代码,而是一张完整的地图——这个领域有哪些流派,每篇经典论文解决了什么问题,算法之间到底是怎么对比的。这篇文章就是那张地图,也是我这个系列笔记的序章,会长期更新。
适合谁看?两类人。第一类是刚接触目标检测的学生,比如正在做本科毕设、研究生开题,需要快速建立知识框架;第二类是工作中要选型的工程师,比如需要给公司项目挑一个能跑在嵌入式设备上的检测模型,看完你至少知道该往哪个方向查论文、跑实验。文章不涉及具体代码,只讲清楚概念、论文脉络和评价方式,这些反而是后面看懂代码、调参的基础。
1. 目标检测任务的核心定义与类别划分
1.1 目标检测到底解决什么问题
目标检测本质上是一个复合任务:给定一张图像,模型要同时回答两个问题——图像里有什么物体(分类),这些物体分别在哪里(定位)。分类好理解,就是判断物体是猫还是狗、是汽车还是行人。定位则需要输出一个尽可能紧贴物体的矩形框,也就是边界框(Bounding Box),通常用四个坐标值表示,比如中心点坐标加宽高,或者左上角和右下角坐标。
这么说可能有点抽象,拿人脸识别来对比。人脸识别是人脸检测加特征提取加比对的全流程,其中第一步人脸检测就是典型的目标检测任务。再比如自动驾驶中的车辆、行人、红绿灯识别,安防监控中的异常行为发现,工业质检中的产品缺陷定位,这些场景的第一环都是目标检测。你可以把目标检测理解为计算机视觉的“地基”任务之一,很多更复杂的任务,比如实例分割、姿态估计、多目标跟踪,都要先依赖检测结果才能继续做。
目标检测的难点在哪里?我自己的体会是三个字:多、变、杂。“多”是指图像中可能同时出现大量不同类别的物体,模型需要一一找出并区分;“变”是指物体本身存在姿态、角度、光照、遮挡、形变等多种变化,比如同一只猫,趴着和跳起来的视觉差异有时比猫和狗还大;“杂”是指背景干扰严重,物体可能和背景颜色相近,或者目标太小、太密集。这些因素叠加起来,让目标检测比纯分类任务难了一个量级。
1.2 两阶段与一阶段:两条路线的本质区别
目标检测算法发展至今,最经典、也最常被提及的划分方式是按“是否显式提取候选区域”分为两阶段(Two-stage)和一阶段(One-stage)。
两阶段方法的代表是 R-CNN 家族,包括 R-CNN、Fast R-CNN、Faster R-CNN 以及后续的 Cascade R-CNN。这类方法的第一阶段是生成一组可能包含物体的候选区域(Region Proposal),第二阶段再对每个候选区域做精细的分类和回归。你可以把它类比成“先划重点,再精读”:第一步先根据颜色、纹理、边缘等底层特征,把图中大概可能是物体的区域圈出来,第二步才对每个圈出来的区域用深度网络仔细判断里面是什么、框怎么调准。好处是精度高,因为每个候选区域都被单独“审视”过;坏处是速度慢,两阶段的计算开销天然比一阶段大。
一阶段方法的代表是 YOLO 系列和 SSD 系列。这类方法跳过了候选区域提取,直接在整张图上密集采样大量预设框,一次性输出每个框的类别概率和位置修正。类比来说就是“扫一眼全图,直接下判断”。由于没有了候选区域这一步,一阶段方法的速度优势非常明显,但早期的一阶段方法(比如第一代 YOLO)精度偏低,主要问题在于正负样本极度不均衡——一张图上可能采样了几万个预设框,真正包含物体的只有几十个,模型很容易被 overwhelming 的负样本带偏。后来 RetinaNet 提出的 Focal Loss 专门解决这个问题,才让一阶段方法的精度追平甚至超过了同期两阶段方法。
这里要说一个容易混淆的点。现在很多人听到 YOLO、SSD,会以为一阶段是“新”方法,两阶段是“老”方法。其实两阶段方法也在持续发展,比如近几年基于 Transformer 的两阶段方法在精度上仍然有优势,对比两个路线的核心价值不在新旧,而在于它们对“精度和速度如何取舍”这个根本问题给出了不同的答案。
1.3 Anchor-based 与 Anchor-free:预设框策略的两种解题思路
除了两阶段和一阶段,还有一个切入点也相当重要:Anchor 用不用、怎么用。这也是很多入门教程一笔带过但面试和选型又经常问起的地方。
Anchor 可以理解为一组事先定义好的、不同尺寸和长宽比的矩形框。Anchor-based 方法,比如 Faster R-CNN、SSD、YOLOv2/v3,会在这组预设框的基础上做回归修正。预设框的设计相当于给模型提供了“先验知识”,但缺点也很明显:需要精心设计 Anchor 的尺寸、数量和长宽比,而且 Anchor 是数据相关的,在自动驾驶的行人数据集上调好的 Anchor,换个俯视视角的工业质检数据集可能就不太行。
Anchor-free 方法则不再依赖预设框,而是直接预测物体的关键点或者中心点,再回归其到边界框四条边的距离。代表工作是 CornerNet、CenterNet 和 FCOS。这类方法的优势在于简化了超参数设计,训练时不需要处理 Anchor 匹配的逻辑,泛化能力也更好一些。我第一次用 FCOS 的时候最直观的感受是:训练过程干净了很多,不用再纠结 Anchor scale 和 ratio 设置合不合理。
不过话说回来,Anchor-free 并不天然碾压 Anchor-based。Anchor-based 在密集小目标场景下仍然有它的优势,比如 YOLOv3 的多尺度 Anchor 设计至今仍有启发意义。现在很多新模型其实是混合路线,比如 YOLOv8 就同时用到了 Anchor-free 的 head 和一些类似 Anchor 的匹配策略。初学者没必要把这个问题当成“二选一”,更重要的是理解预设框机制,因为它是理解匹配策略、NMS、mAP 计算的基础。
1.4 按任务难度和场景拆解:小目标、开放词汇与三维目标检测
如果按应用场景和任务难度再细分,目标检测还有几个值得单列的方向,这些也是近期研究的热点。
第一是小目标检测。小目标的定义通常是尺寸小于 32×32 像素,或者占整张图像面积的比例很小。小目标难检测的核心原因是特征太少——在深层特征图上,小目标可能只对应几个像素点,信息被背景淹没。热词里有多条和小目标相关,这个方向现阶段的主要思路包括:特征金字塔(如 FPN)、超分辨率、基于 Transformer 的全局注意力,以及专门针对小目标的数据增强策略。做卫星图像分析、无人机巡检、监控摄像头远距离识别的话,小目标检测是绕不开的课题。
第二是开放词汇目标检测(Open-vocabulary Detection)。传统检测模型只能检测训练时见过的固定类别,比如模型在 COCO 上训练,就只能识别 80 个类别,新类别需要重新标注数据再训练。开放词汇检测的思路是借助大规模图文预训练模型(比如 CLIP),让检测器能够识别训练集中没出现过的、自然语言描述的任意物体。这项技术是纯算法层面的突破,应用价值非常大——以后你想检测一个自定义物体,可能不再需要专门采集几千张图做标注。
第三是三维目标检测。二维检测输出的是图像上的矩形框,三维检测则要输出物体在世界坐标系中的位置、大小和朝向,通常用 3D Bounding Box 表示,比如中心点坐标、长宽高和偏航角。输入可以是单目图像、双目图像,也可以是 LiDAR 点云,后者是目前自动驾驶感知的主流方案。三维目标检测的挑战在于深度估计误差、点云稀疏性、遮挡截断等问题,评价指标也复杂一些,比如 BEV(鸟瞰图)下的 AP 计算。
先把这个类别框架搭建好,接下来才能理解各个算法的坐标位置。下面进入论文梳理环节。
2. 必读论文与里程碑工作:按时间线精读
2.1 奠基期:从传统方法到深度学习的临界点
在深度学习大规模应用之前,目标检测的主流路线是基于手工特征加分类器。最经典的代表是 Viola-Jones 人脸检测器,以及 DPM(Deformable Parts Model,可变部件模型)。VJ 检测器用 Haar-like 特征加 AdaBoost 分类器,在 2001 年就能实现实时人脸检测,当时的思路非常有开创性,只是只能做人脸这种结构相对固定的对象。DPM 则把物体看成多个部件的组合,比如人体就是头、躯干、四肢的组合,对形变有一定鲁棒性,在 PASCAL VOC 数据集上统治了很多年。
这些早期工作了解一下背景就好,不推荐精读。真正划时代的是 2012 年 AlexNet 在 ImageNet 分类任务上的突破,以及 2013 年 Ross Girshick 将深度特征引入检测的萌芽。这里需要精读的第一篇论文是 2014 年的 R-CNN(Rich feature hierarchies for accurate object detection and semantic segmentation)。
R-CNN 的思路朴素但有效:先用选择性搜索在图像上提取约两千个候选区域,然后把每个候选区域缩放成固定尺寸,用 AlexNet 提取特征,最后用 SVM 分类器加边界框回归器输出结果。它的精度在当时远超传统方法,在 VOC 2012 上把 mAP 从 35.1% 提升到了 53.3%,但缺点也非常致命——每个候选区域都要单独过一遍网络,一张图要跑两千多次前向,速度慢到无法实用。
读 R-CNN 这篇论文的核心收获不是复现它,而是理解一个范式转移:检测任务被拆成了“提候选区域 + CNN 分类 + 框回归”三个可解耦的模块。这个拆解方式直接影响了后面所有的两阶段检测器。
2.2 两阶段繁荣期:Fast R-CNN 与 Faster R-CNN 的两次提速
R-CNN 太慢,问题出在“重复计算”。同一张图的两千个候选区域,有很大一部分是重叠的,却要各自过一遍完整网络。Fast R-CNN(2015)的核心改进是:把整张图一次性过 CNN,得到整张特征图,然后通过 ROI Pooling 层,把每个候选区域在特征图上对应的区域池化成固定尺寸,再送入全连接层做分类和回归。这样一来,卷积计算只做一次,速度比 R-CNN 提升了约 25 倍。同时,Fast R-CNN 把分类和回归放在同一个网络里联合训练,不再需要 SVM。
看 Fast R-CNN 的时候要重点理解 ROI Pooling 是怎么工作的。简单说,就是根据候选区域在原始图像上的坐标,映射到特征图上的对应区域,再把这个区域的尺寸划分为固定数量的网格,每个网格做一次最大池化。这个操作保证了不管候选区域原始尺寸多大,最后都能得到固定大小的特征,可以接全连接层。
Faster R-CNN(2015)是这个系列的集大成者。它的最大贡献是提出了 RPN(Region Proposal Network,区域提议网络),直接把候选区域提取做进了网络里,和 Fast R-CNN 的检测网络共享卷积特征。RPN 在特征图的每个位置预设若干 Anchor,输出这些 Anchor 是“前景还是背景”的分数以及粗略的位置修正,然后把这些提案交给后面的 ROI Pooling 做精细分类。从此,两阶段检测实现了端到端训练,速度和精度又上了一个台阶。直到今天,Faster R-CNN 的结构仍然是很多复杂检测系统的基础骨架。
读这两篇论文时,建议重点看 Faster R-CNN 中 Anchor 的匹配规则——正样本怎么定义、负样本怎么采、回归目标怎么归一化。这些逻辑是日后理解 YOLO、SSD、RetinaNet 等所有 Anchor-based 算法的钥匙。
2.3 一阶段狂飙期:YOLO 与 SSD 的路径分化
YOLO(You Only Look Once,2016)第一次真正实现了“看一眼就能检测”。它把检测当作一个回归问题:将图像分成 S×S 的网格,每个网格负责预测中心点落在该网格内的物体,输出 B 个边界框的坐标、置信度以及 C 个类别的概率。YOLOv1 的速度非常夸张,在 GPU 上可以跑到 45 FPS,快版本甚至能到 155 FPS,奠定了“实时检测”这个方向。
YOLOv1 的问题也很明显:每个网格只能预测固定数量的物体,对密集小目标几乎无效;网格划分太粗导致定位精度差;同一个网格内不同物体重叠的时候就容易漏检。但它的历史意义在于证明了检测可以不需要单独的候选区域阶段,整个网络非常简洁,后向传播路径短,速度上限高。
SSD(Single Shot MultiBox Detector,2016)走的是一条更贴近工程实践的路线。它吸收了 Faster R-CNN 的 Anchor 思想,在特征图上的每个位置铺设多种长宽比的预设框,同时在不同尺度的特征图上做预测——浅层特征图负责小目标,深层特征图负责大目标。这个多尺度预测的机制,让 SSD 在小目标上的表现明显好于同期的 YOLOv1,而且速度也很快。
YOLO 和 SSD 在当时的定位很有意思:YOLO 追求极致速度,SSD 则在速度和精度之间找平衡。读这两篇论文时,建议对比它们处理“正负样本不均衡”和“多尺度目标”两种问题的手段。YOLOv1 的做法其实是回避了 Anchor 这个概念,靠网格和物体中心点的强先验来简化问题;SSD 则继承了 Anchor 的密集采样逻辑,用大量预设框来覆盖目标“可能的长宽比和位置”,然后用难负样本挖掘(Hard Negative Mining)筛掉大多数简单负样本。
2.4 精度与速度的融合:FPN、RetinaNet 与 Focal Loss
前面提到一阶段方法精度上不去,核心瓶颈是极端的前景背景类别不平衡。这个问题在 2017 年被 RetinaNet 基本解决,解决工具就是 Focal Loss。
Focal Loss 的出发点很简单:标准交叉熵里,大量简单的负样本(背景框)贡献了绝大部分损失,这些损失虽然单个很小,但数量巨大,总梯度会被它们主导,导致模型不关注少数真正的正样本。Focal Loss 在交叉熵前乘上一个调制因子 (1-p_t)^γ,其中 p_t 是模型对该样本的置信度。如果一个样本已经被分得很对(p_t 很大),调制因子就很小,损失被压低;如果一个样本分错了(p_t 小),调制因子接近 1,损失保持原样。这样模型的训练重点就自然集中到了难样本上。
RetinaNet 的另一个贡献是引入了 FPN(Feature Pyramid Network,特征金字塔网络)。FPN 解决的问题是多尺度变化。深度网络里不同层级的特征语义不同:浅层特征分辨率高、细节多,适合检测小目标;深层特征语义强、感受野大,适合检测大目标。FPN 通过自顶向下的路径和横向连接,把深层的语义信息向前融合,让每一层特征都既保留细节又有语义。FPN 的提出者同时也是 Faster R-CNN 的作者何恺明团队,所以你会在大量后来的模型里看到 FPN 的影子,可以说它是这些年来最具实际影响力的结构设计之一。
RetinaNet 结合起来其实就是:FPN 做多尺度特征融合 + 两个子网络分别做分类和回归 + Focal Loss 解决样本不均衡。它的精度在当时超过了很多两阶段方法,同时保持了单阶段的速度,正式宣告一阶段方法在精度上也能“站起来”。读到这里,你已经掌握了目标检测经典时期的核心技术词汇:候选区域、Anchor、ROI Pooling、特征金字塔、Focal Loss。
2.5 Transformer 时代:DETR 到 RT-DETR 的效率优化
2020 年,Facebook AI(现在的 Meta AI)提出了 DETR(Detection Transformer),把目标检测重新定义为一个集合预测(Set Prediction)问题。DETR 的做法是:拿 CNN 提取特征,展平成序列,送入 Transformer 的 Encoder-Decoder,输出一组固定大小的预测,然后通过匈牙利算法(Hungarian Algorithm)做预测与真实框的匹配,匹配上的直接算损失,不需要 Anchor、不需要 NMS。
这个思路非常优雅,但 DETR 有一个实际训练的痛点:收敛极慢,训练 500 个 epoch 才能达到比较好的效果,因为注意力机制需要大量数据才能学习到“物体查询”究竟该关注图像的哪个位置。后续工作如 Deformable DETR 通过可变形注意力降低计算复杂度,只在参考点周围的稀疏位置上计算注意力,大幅加速收敛;DINO、DN-DETR 则从去噪训练、查询匹配策略等角度进一步优化。到了 RT-DETR(2023),百度团队在 DETR 结构中引入高效的混合编码器和不确定性最小化查询选择,让基于 Transformer 的检测器第一次真正跑进了实时范畴,在速度和精度上都比同期的 YOLO 系列有竞争力。
这里要打破一个常见误解:Transformer 检测器一定慢。早期确实慢,但经过 Deformable DETR、RT-DETR 等工作的迭代适配,效率问题已经基本解决。RT-DETR 的混合编码器会通过尺度内交互和跨尺度融合来处理多尺度特征,同时在解码器里引入 IoU-aware 查询选择,比传统 DETR 的“拿分类分数选查询”更合理,因为高分类分数不等于高定位精度。
读 Transformer 时代的论文,重点不再只是具体结构,而是“如何绕开 Anchor 和 NMS 的工程复杂度,用集合匹配统一训练目标”。这个思路对做研究的人很有启发,对纯工程落地的工程师来说,则可以重点关注 RT-DETR 这类兼顾精度与速度的成熟模型。
2.6 开放词汇与多模态微调:检测任务的边界扩展
传统检测的类别集合是封闭的,训练数据有多少类,模型就只能检测多少类。开放词汇检测要突破这个限制,让模型从语言描述中泛化识别新类别。
这条线有两个代表性思路。第一种是“从分类到检测”的迁移:用 CLIP 这类图文预训练模型提取文本和图像的语义向量,把检测头中的分类器替换成动态生成的文本嵌入,使模型在没有对应训练样本的情况下,也能通过文本描述来推理检测目标。第二种是“引入区域-文本对齐”:模型先通过区域提议找出候选框,再用对比学习让候选框对应的视觉特征和文本特征对齐。代表工作有 OWL-ViT、GLIP、Grounding DINO 等。
和多模态微调目标检测相关的方向也在这里汇聚。传统多模态(比如 RGB 图像加红外图像)做检测时,通常直接把多通道数据堆叠输入模型;现在的主流做法则是用预训练的跨模态模型作为 backbone,在特定下游数据上做层级化微调,让模型学习到“哪种模态在什么场景下更可靠”。火灾检测、自动驾驶夜间感知这类依赖多源数据的应用比较适合这类思路。
这个方向对初学者来说可能偏前沿,可以直接找 Grounding DINO 的开源代码跑一跑 demo,感受一下“用一句话检测图中任意物体”是什么体验。理解了这种能力边界,你才能对检测任务的可能性空间有正确的预期。
3. 算法对比:评价指标、数据集与选型建议
3.1 评价指标详解:从 IoU 到 mAP 的完整链路
不同算法之间的对比,必须建立在统一的评价指标之上。目标检测最核心的指标是 mAP(mean Average Precision),这里拆开讲清楚。
先讲 IoU(Intersection over Union,交并比)。IoU 衡量预测框和真实框的重合程度,计算方式是交集面积除以并集面积,取值在 0 到 1 之间,越大表示预测框越准。一张图里,模型输出的预测框不计其数,绝大多数都是重复和误检,判断“这个预测框算不算检对了”就靠 IoU 阈值。拿 COCO 的标准来说,IoU 阈值通常取 0.5、0.75 和范围 0.5 到 0.95 的均值。
再看 Precision(精确率)和 Recall(召回率)。精确率是“检出来的目标里有多少是真正正确的”,召回率是“所有真目标里有多少被成功找出来了”。这两个指标呈反比关系——阈值放宽,检得多,召回率高但误检也增多,精确率下降;阈值收紧,检得少但更准,精确率高而召回率下降。mAP 的本质就是求不同置信度阈值下 Precision-Recall 曲线下方的面积,综合衡量模型在不同严格程度下的综合表现。
举一个具体的计算例子帮你建立直觉。假设当前测试集一共有 5 个真实目标,模型输出了 7 个预测框,每个预测框都有一个置信度分数。把预测框按置信度从高到低排序,从最高分开始逐个计算累计的精确率和召回率,每计算一个点就画到 PR 曲线上。最后对曲线做积分,得到 AP。所有类别都算一遍 AP,取平均就是 mAP。
现在你在论文里看到的 COCO mAP 通常特指 AP@[0.5:0.95],也就是从 IoU=0.5 到 IoU=0.95,每隔 0.05 取一次阈值,算 10 个 AP 再取平均。这个指标对框的定位精度要求非常苛刻,也解释了为什么有些模型在 VOC 数据集上 mAP 很高,到 COCO 上却表现平平——VOC 用的主要是 AP50,只要求 IoU 超过 0.5 就算对,而 COCO 的严格加权综合指标反映的是更全面的能力。
3.2 主流公开数据集盘点:VOC、COCO 与其他垂直数据集
讲完指标讲数据集。没有数据集,算法对比就无从谈起。目标检测领域最经典的数据集有两个:PASCAL VOC 和 Microsoft COCO。
PASCAL VOC(Visual Object Classes)诞生于 2005 到 2012 年,类别只有 20 类,包括人、动物、交通工具、室内物品等,图片规模在万级。它是早期检测算法刷分的主战场,R-CNN、Fast R-CNN 时代的论文大多以 VOC 作为主要评测基准。VOC 的数据量在今天看已经不算大,但作为快速验证模型思路的工具仍然很好用——训练时间短,迭代快,特别适合跑通流程。
COCO(Common Objects in Context)是目前学术界公认度最高的检测基准,包含 80 个类别,训练集约 11.8 万张图片。相比 VOC,COCO 的图片场景更复杂,目标尺度也更丰富,包含大量小目标和密集目标。现在绝大部分新算法的论文都会报 COCO 的 AP、AP50、AP75 以及按目标尺度分的 AP-S、AP-M、AP-L。COCO 就是检测界的“高考”,题目更难,区分度更好。
除了这两个通用数据集,垂直场景往往需要自己建数据集。热词里提到的“鸟类目标检测的数据集”、“yolo 泥石流 滑坡 目标检测数据集”都是垂直场景的需求。这类数据集一般没有现成的公共版本,通常需要从研究机构公开的原始影像、无人机采集数据或者网络公开图片中自行整理。建数据集有几个要点:一是类别定义要一致,比如“树木”到底是指整体树冠还是单棵树的轮廓,定义模糊会直接导致标注不一致;二是要尽量覆盖光照、角度、遮挡的多样性;三要严格划分训练集、验证集和测试集,避免同源图片分散在不同集合里导致评估虚高。
3.3 经典模型在 COCO 上的量化对比
下面用 COCO 验证集上的数据,给主流模型一个横向参照。注意数据来自模型原论文和公开 benchmark,因为不同论文的实现细节(比如训练 epoch、数据增强策略)有差异,这里的数值是一个相对位置参考,实际复现时会有几个点的浮动。
| 模型 | 发布时间 | 类型 | 输入尺寸 | COCO AP (0.5:0.95) | FPS(V100 级别) |
|---|---|---|---|---|---|
| Faster R-CNN | 2015 | 两阶段 Anchor-based | 1000×600 | 约 21.9 | 约 7 |
| SSD512 | 2016 | 一阶段 Anchor-based | 512×512 | 约 28.8 | 约 22 |
| YOLOv3 | 2018 | 一阶段 Anchor-based | 416×416 | 约 31.0 | 约 35 |
| RetinaNet | 2017 | 一阶段 Anchor-based | 800×1333 | 约 39.1 | 约 11 |
| FCOS | 2019 | 一阶段 Anchor-free | 800×1333 | 约 38.7 | 约 14 |
| DETR | 2020 | Transformer | 800×1333 | 约 42.0 | 约 9 |
| YOLOv8-X | 2023 | 一阶段 Anchor-free | 640×640 | 约 53.9 | 约 57 |
| RT-DETR-X | 2023 | Transformer | 640×640 | 约 54.8 | 约 74 |
这个表直观地反映出几个趋势。同一时期,两阶段方法的 AP 一直领先一阶段一到两个点,但速度差了几倍;2017 年之后 Focal Loss 和 FPN 让一阶段方法在精度上追了上来;2023 年左右的模型相比 2015 年,在输入分辨率小幅提升的前提下,AP 从 21.9 涨到 54 以上,翻了接近一倍多。Transformer 路线在引入混合编码器后,速度也不再是劣势。技术迭代的速度确实非常快。
如果说看表的结论,那就是:追求精度上限,看两阶段或大模型变体(如 Cascade R-CNN、DINO);追求实时和部署,看 YOLO 系和 RT-DETR;追求训练调试友好度,Anchor-free 的模型(FCOS、YOLOv8)会省不少心。
3.4 如何根据场景选择算法:一张实用决策表
算法没有绝对的好坏,只有合不合适。这里给出一张按应用场景的选型建议表,是我实际工作中比较常用的判断逻辑。
| 应用场景 | 推荐算法方向 | 选择理由 |
|---|---|---|
| 学术研究、需要刷高精度 | Cascade R-CNN、DINO(Deformable DETR 系列) | 精度上限高,模块可替换性强,适合做实验对比 |
| 边缘设备、移动端实时检测 | YOLOv8n/s、NanoDet、轻量化 SSD | 参数量小,INT8 量化后延迟低,模型体积小 |
| 通用服务端实时检测(GPU) | RT-DETR、YOLOv8m/l | 速度和精度平衡好,部署生态成熟 |
| 俯视视角、小目标密集场景(无人机、卫星图) | 带 FPN 的高分辨率模型,如 VisDrone 上微调过的 YOLOv8 | 小目标需要浅层特征保留细节,FPN 和多尺度训练比较关键 |
| 自定义物体、类别随时扩展 | Grounding DINO、OWL-ViT | 开放词汇模型,可以用文本描述直接检测未见类别 |
| 三维空间定位(自动驾驶、机器人抓取) | PointPillars、CenterPoint、BEVFormer | 直接面向点云或 BEV 视角,输出 3D 框 |
有一点必须提醒:算法选型不能只看基准数据,一定要在你自己的数据上用相同训练策略做小规模对比。COCO 上 AP 高的模型,在你的低光照工业场景下未必好用,因为数据分布差异会直接影响最终效果。我一般会选两三个候选模型,用同样的训练轮数和数据增强先跑一版初赛,谁在验证集上表现好就用谁,这样可以避免“迷信大模型”或者“信仰某个框架”。
4. 当前值得关注的扩展方向与工程化落地
4.1 小目标检测的难点与主流攻关思路
小目标检测是热词里反复出现的痛点。如果你做过无人机俯拍的地面目标检测,或者用监控摄像头识别远距离的人脸,就会明白小目标为什么难搞。首先,小目标在深层特征图上像素占比极少,经过多次下采样后可能只剩下几个像素,CNN 的感受野和特征粒度很难兼顾;其次,小目标框的 IoU 对像素误差非常敏感,预测框差几个像素,IoU 可能就从 0.7 掉到 0.3,导致回归训练时梯度不稳定。
主流攻关思路大致分四路。一是特征层面,FPN 及其变体通过多尺度融合保留浅层高分辨率信息,比如 BiFPN(EfficientDet 里用)增加了自顶向下和自底向上的双向融合,信息流动更充分。二是数据层面,切图策略和拼接增强是常用手段,把大图切成若干有重叠的小块,分别送入模型检测,最后合并结果,代价是推理时间成倍增加。三是损失函数层面,一些工作针对小目标设计特殊的回归损失,比如 Normalized Wasserstein Distance(NWD)用分布距离替代 IoU,对小目标的偏移更宽容,训练更稳定。四是超分辨率路线,先用生成模型把小目标放大再做检测,但实时性通常不理想。
工程上最见效的组合往往是“高分辨率输入 + 切图 + 多尺度训练 + 在自有数据上微调”。参数没那么多玄学,小目标对输入分辨率非常敏感,先把输入从 640 提到 1280,很多问题能缓解一半以上。代价是显存和延迟上升,如何取舍要结合硬件决定。
4.2 轻量化模型与边缘部署:不止是“更小”
热词里的“macs仅5mb的目标检测模型”很有意思,指一类计算量极低、模型体积很小的高效检测模型。这类模型的价值在于边缘设备、嵌入式设备、浏览器里跑实时检测的场景。代表包括 NanoDet、YOLOv5n/YOLOv8n、MobileNet-SSD 等,核心设计思路不只是“把网络变窄变浅”,而是重新设计了高效模块。
这里要普及一个概念:FLOPs(浮点运算次数)和 MACs(乘加运算次数)。一个乘加操作计为一次 MACs,约等于两次 FLOPs,所以论文里说“MACs only 5MB”的时候,往往指的是模型的计算量指标,而不是内存占用。工程选型时这两个指标都要盯着:模型文件大小影响加载速度和存储,MACs 影响吞吐量,而真正决定延迟的还有内存带宽、算子融合程度和推理框架的优化质量。
轻量化模型的另一个关键技巧是量化。FP32 模型转 INT8 后,体积缩小约四倍,推理速度提升明显,但精度会有一定损失。我的经验是,先训练一个精度较高的模型,再用代表性数据进行校准和量化,然后通过少量微调来补偿量化损失。这比直接训练一个小模型再量化效果要好不少。
4.3 三维目标检测、不确定学习与多模态微调的前沿交叉
三维目标检测是热词里技术门槛最高的方向之一,也是自动驾驶、机器人领域的热门需求。和二维检测相比,三维检测需要模型理解物体在真实空间中的尺度、朝向和位置。输入方面,LiDAR 点云是最常见的;纯视觉的三维检测(比如 BEVFormer、DETR3D)则直接处理多相机图像,优势在于成本低,但深度估计难度大。
这个方向的评价指标也比二维复杂:通常按距离分段计算 AP,比如汽车在 0-40 米、40-80 米、80 米以上分别统计;还要关注 BEV 视角下的中心点定位误差和朝向角误差,因为这些指标直接影响下游规划控制。
目标检测中的不确定学习则是一个相对小众但越来越受关注的方向。传统检测模型输出的是确定性的框和类别,但实际场景里存在很多歧义:遮挡严重的物体、模糊的运动对象、超出训练分布的异形物体,模型应该学会“承认自己不确定”。具体实现流派有贝叶斯神经网络、深度集成、证据深度学习等,常见做法是在检测头输出一个不确定性分数,用这个分数来过滤低质量预测或在决策时做风险控制,比如辅助驾驶里的安全告警。
多模态微调目标检测则是把视觉之外的模态纳入检测流程。红外加可见光的双光检测,可以在夜间和强逆光下互补;深度图加 RGB 的检测,可以直接利用几何信息帮助物体分割。这个方向框架上并不复杂,本质是“多模态预训练模型 + 下游检测头 + 领域数据微调”。因为数据采集成本高,多模态检测的公开数据集一直比纯视觉少,做一个能用的多模态模型,前期数据工程所占的工作量往往比模型设计更大。
4.4 目标检测本科毕业设计的选题与落地建议
热词里有“目标检测本科毕业设计”,这个定位我再熟悉不过。我的建议是选题不要贪大,以“能复现、能说明白、有机会改进”为原则。三个方向特别适合本科毕设:第一,特定场景的检测应用,比如交通标志识别、工地安全帽检测,数据可以从公开数据集或自行采集入手,重心放在数据处理和模型微调上;第二,轻量化模型在边缘设备上的部署,比如把 YOLOv8n 部署到树莓派或 Jetson Nano,这种题目把工程链路打通,出成果快;第三,特定难点的对比实验,比如在同一数据集上对比 Anchor-based 和 Anchor-free 方法在不同目标尺度上的差异,这类题目“研究性”更强,也方便写论文。
毕设常见的坑有三个。一是数据质量失控,标注不规范,类别不均衡,导致模型怎么训都上不去,最后觉得是自己的问题。其实大部分情况是数据和标注的问题,而不是模型问题。二是环境配置消耗太多时间,CUDA、PyTorch、mmdetection 版本不匹配是常态,建议一开始就固定版本组合,用 Docker 或者 conda 环境隔离,省得后面反复折腾。三是把“调参炼丹”当作全部,忽略了实验记录和对比分析。写毕业论文的时候你会发现,老师想看的不只是“我做出来了”,而是“我为什么这么做、做了什么实验来证明这样做合理”。所以从第一天开始,就要养成记录每次实验的模型配置、数据版本、验证集指标的习惯。
5. 学习路线规划与实操复盘建议
5.1 三个月入门目标检测的时间分配方案
目标检测的知识量不小,但用三个月入门是够用的。前提是方向和顺序正确。我建议按“基础概念 → 核心论文精读 → 代码复现 → 动手训练 → 衍生任务探索”五步走。
第一个月主攻基础。前两周把本文提到的概念挨个搞清楚:mAP 怎么算、NMS 的原理、Anchor 的匹配逻辑、各类损失函数在优化什么。后两周开始精读 Faster R-CNN 和 YOLOv3 的原文,不看代码,只看网络结构图和损失函数部分,配合公开的讲解资料一起看。这段时间不要碰训练,因为模型原理没理解就去调参,只会照猫画虎。
第二个月进入工程环节。选一个成熟的代码库,比如 mmdetection、ultralytics YOLO,先跑通训练和测试流程。建议选 YOLOv8 起步,因为文档最全、API 最友好。然后找一个小数据集(PASCAL VOC 就很合适),把训练流程完整跑三遍:第一遍用默认配置跑通,第二遍尝试改 backbone、训练轮数和学习率,第三遍加数据增强和迁移学习,观察这些改动对 mAP 的影响。这个月结束的时候,你应该能独立解释“为什么改了某个参数,评价指标出现了什么变化”。
第三个月往深度走。选择一个你感兴趣的细分方向深入研究,比如小目标检测、开放词汇检测或轻量化部署。读这个方向最新的 5 到 10 篇论文,选其中一两篇复现关键模块,尝试在已有代码里做一个小改进。这个阶段的目标不是出重大创新成果,而是完整经历一次“读论文 → 形成想法 → 实验验证 → 分析结果”的科研循环。这套经验比任何单一算法知识都值钱。
5.2 建立自己的实验记录习惯
目标检测实验变量非常多,模型结构、输入尺寸、优化器、学习率、数据增强、训练轮数、随机种子、预训练权重,每一个变量都可能让最终结果差几个点。如果实验记录不完整,复现不了自己的结果,这种挫败感我经历得太多了。
我自己实验记录会包含几项固定信息:实验编号、日期、代码 commit 号或配置文件名、数据集版本和切分方式、模型结构改动点、训练超参数、训练时长、GPU 型号和显存占用、验证集各项指标(mAP、AP50、AP75、AP-S、AP-M、AP-L 全记),以及备注栏。备注栏写实验结果和预期的差异、可能的原因假设、下一步想试的方向。三个月后再回看这些记录,它们就是你最宝贵的分析材料,能帮你快速定位问题。
工具方面,不需要很复杂。最简单的方案是每个实验建一个文本文件记录,配合 W&B 或 TensorBoard 记录指标曲线。有精力的话可以再写一个简单的训练脚本包装层,自动生成实验编号并把配置文件和日志归档。这里的关键不是工具多先进,而是“每次实验都有据可查”这个习惯本身。
5.3 避坑指南:初学者最常犯的错误
最后集中说几个我在带新人时反复看见的坑,希望能帮你少走弯路。
第一个坑是过早追求 SOTA。一上来就直接拿最复杂的模型,用最大分辨率去训练,结果显存爆掉,环境配置搞了好几天,信心先没了。正确做法是先在小数据集、低分辨率、小模型链条上跑通全流程,确认每个环节都理解到位了,再逐步升级配置。
第二个坑是忽视数据质量。模型训练效果不好,90% 的原因可以先怀疑数据。类别标注错、框歪、类别不均衡、训练集和测试集分布不一致,这些问题会迅速摧毁模型性能。遇到模型收敛后指标低,先可视化一批预测结果,看看是哪些图片错了、怎么错的,很多时候问题一眼就能看出来。
第三个坑是只刷指标不分析原因。做实验的目的不是把数值推得越高越好,而是搞清楚不同模块和超参数对结果的影响。比如你换了一个更强的主干网络,mAP 涨了两个点,要搞清楚是因为模型容量提升了,还是因为训练更平稳了,还是因为对某些类别特别有效。这种“为什么”层面的理解,才是你以后独立解决问题的底子。
第四个坑是忽略部署环境约束。很多人在服务器上跑模型,完全不考虑真实落地时的硬件条件。到了部署阶段才发现模型太大、速度太慢、算子不支持。正确的做法是选型之前先明确部署目标:什么设备、什么推理框架、多少毫秒的延迟预算、多少内存限制。这些约束会直接决定你选择哪条技术路线。
这是系列笔记的第一篇,主要把概念、论文和对比框架理清楚。后面我会按分支继续写,比如 YOLO 家族的完整演进、mmdetection 的代码导读、小目标检测的实战案例。如果你在看完这篇之后有自己的想法或者踩了坑,欢迎在评论区交流,我会把这个系列持续更新下去。