002、目标检测技术发展脉络与主流算法综述
2026/9/18 21:30:17 网站建设 项目流程

002、目标检测技术发展脉络与主流算法综述

半夜两点,客户现场的设备又报错了。我盯着屏幕上那个漏检的货箱,明明人眼一眼就能看到的蓝色周转箱,YOLOv5 模型就是当成背景放过去了。当时我还以为是光照变化导致的,结果把日志拉出来,发现模型前向推理没问题,是预处理里letterbox的填充颜色写死了,偏偏那天换了新工装,深蓝色工作服和填充色撞了,模型把人和箱子一起糊了。调了一天,最后把填充色改成动态均值才算完。这个事让我琢磨了很久——目标检测这件事,我们总以为算法足够强,其实从数据到预处理到骨干网络到后处理,每一环都可能把人卡死。所以这一篇,我不打算给你列一张漂亮的时间线,我想从实际开发里我最常被问到的几个“为什么”出发,把目标检测的技术脉络和主流算法捋一遍,也顺便把这些算法各自坑在哪里,说人话讲清楚。

为什么会有这么多检测算法?因为目标检测天生是个矛盾体。你要知道“什么东西在哪儿”,既要有分类的语义判别力,又要有定位的回归精度。早期的传统方法根本不敢想端到端,都是靠手工特征硬凑。我第一次接触目标检测是在一个工业项目里用 Halcon 的模板匹配,那时哪有深度学习,全靠灰度梯度。后来转到 OpenCV 的 HOG + SVM 做行人检测,跑起来那个慢呐,但原理特别纯粹:先把图像切成小格子,每个格子统计梯度方向直方图,拼成一个又长又稀疏的向量,然后丢给 SVM 分类。你问为什么那时候不用卷积?因为算力不够,也因为没有大规模标注数据。HOG 特征本质上就是在描述局部物体的边缘方向分布,对刚性物体还行,一遇到姿态变化就废了。还有个经典的 Viola-Jones 人脸检测,用 Haar 特征加 AdaBoost 级联,当时在嵌入式摄像头里跑得飞起,但那个是专门针对人脸这种结构高度固定的目标设计的,换个猫脸狗脸就崩。所以传统检测算法最大的天花板不是特征不好,而是特征表达是人工设计的,你不能指望手工特征把千变万化的语义信息都刻画进去。

转折点是 2012 年 AlexNet 在 ImageNet 上大杀四方,但真正把深度学习引入目标检测的是 2014 年的 R-CNN。R-CNN 的思路现在看很粗暴:先用选择性搜索(Selective Search)生成两千个候选区域,然后每个候选区域缩放到固定尺寸,喂给 CNN 提取特征,最后接 SVM 分类和边界框回归。这玩意儿在当时效果惊人,但跑一次测试要几十秒,为什么?因为两千个区域要分别过一遍 CNN,重复计算太多了。我当时在实验室跑这个,真是一边等结果一边怀疑人生。而且 R-CNN 还要求每个候选区域必须缩放到固定大小,直接导致目标形变扭曲,检测精度受损。后来出现 SPP-Net,它解决了重复计算的问题,把整图先过一遍卷积,然后在特征图上做空间金字塔池化,这样就不需要每个候选区域单独过骨干网络了。但真正让深度检测框架走上正轨的是 Fast R-CNN,它在 SPP-Net 的基础上改成 RoI 池化,把分类和回归都放进同一个网络里训练,速度比 R-CNN 快了几十倍,而且训练是端到端的(虽然候选区域生成还是单独的模块)。这就引出了两阶段检测器最核心的设计哲学:先粗筛候选,再精修分类和位置。这个“粗到细”的思路在精度上一直占优势,后来的 Faster R-CNN 干脆把候选区域生成这一步也变成了一个神经网络分支,也就是 Region Proposal Network(RPN),至此真正意义上“端到端”的两阶段检测器成型了。你去看 Faster R-CNN 的结构,骨干网络提特征,RPN 生成候选框,RoI Pooling 把候选框对应的特征抠出来,最后两个分支做分类和回归。每一部分都可以单独调优,也都有各自的坑。比如 RPN 的 anchor 参数,九种框,比例和尺度怎么设?如果你做的场景是细长物体,默认的 anchor 就废了,得重新聚类。还有 RoI Pooling 两次量化会导致轻微的框偏移,后面才出了 RoI Align 用双线性插值解决。我在做医疗影像检测的时候,病灶很小,用 Faster R-CNN 若不加 RoI Align,那定位偏差肉眼可见。但话说回来,两阶段模型到现在依然是很多高精度榜单的首选,因为它的“审查式”结构天然适合对误检要求极高的场景。

与此同时,单阶段检测器一直走的是“直接回归”的路线。YOLO 系列横空出世的时候,把目标检测当做一个回归问题来做——把图像划分成 S×S 网格,每个网格负责预测固定数量的边界框和类别概率。这个思想简单粗暴,速度飞快,但早期的 YOLO 对密集小目标非常不友好,因为网格太粗,一个网格只能预测两个框,目标一多就打架。后来 YOLOv2 引入了 anchor 和批量归一化,v3 引入了多尺度特征图金字塔,v4 加了 CSPDarknet 和 Mosaic 数据增强,v5 虽然作者争议很大但工程易用性确实好,还有 v7、v8 等各个版本。单阶段模型最大的特点就是“一步到位”,没有候选区域提纯的过程,所以速度快,但是早期精度一直被两阶段压制。为什么?因为正负样本极度不平衡——图像里大部分区域是背景,如果每个位置都预测一堆框,负样本太多了,模型容易被背景带偏。于是后来有了 Focal Loss,也就是 RetinaNet 的核心贡献。Focal Loss 通过降低易分类样本的损失权重,让模型注意力集中在困难样本上。这是单阶段检测器精度追平两阶段的转折点。你想想,如果没有 Focal Loss,单阶段模型就算结构再强,训练时也被铺天盖地的简单负样本淹没。我自己的经验是,用 RetinaNet 做长尾分布的小目标时,Focal Loss 的两个超参数 α 和 γ 非常敏感,跑实验的时候一定记录好哪一组参数对应的模型,不要像我当年那样改了一个 γ 忘了保存配置,结果复现不出来,被导师批了一顿。

再看另一条线:anchor-free 流派。老觉得 anchor 大法好的人,多半没被 anchor 的超参调优折磨过。anchor-free 思想是直接预测物体的关键点或者中心点,比如 CornerNet 预测左上角和右下角角点,再通过 embedding 匹配组成框;CenterNet 预测中心点以及宽高。这里的逻辑其实更贴近人类认知:我看到一个物体,先看到中心,再大概感知它有多大。anchor-free 省去了聚类 anchors 的步骤,网络结构更简洁,而且在小目标和形变目标上往往效果更好。但也别神话它,我实际跑 CenterNet 时发现,它对中心点的标注偏差非常敏感,如果数据标注时打点不在真实中心,模型学起来很痛苦。还有极端的长条形目标,比如把一支笔横过来,CenterNet 的中心点依旧能定位,但宽高回归的精度不如 anchor-based 稳。所以后来很多模型干脆 hybrid 着来,既有 anchor-based 的分支又有 anchor-free 的分支,或者把两者统一到同一个框架里。

再后来,Transformer 从 NLP 杀进视觉领域,DETR 用一种全新的范式重写检测——把它当成集合预测问题。DETR 先把图像用 CNN 提特征,展平成序列,加上位置编码,喂给 Transformer 的 encoder-decoder,输出固定数量的预测集合,然后用匈牙利算法做二分图匹配,把预测框和真实框一一配对,计算损失。这个思路很优雅,完全摈弃了 anchor、NMS 这些手工设计的组件。我第一次看 DETR 论文的时候非常兴奋,因为它让我看到“检测”可以这么简洁。但 DETR 有个著名的痛点:训练收敛极慢,需要几百个 epoch 才能达到好的效果,而且小目标检测能力弱。原因在于 Transformer 的全局注意力在计算所有像素对的相关性时,对小目标的细节捕捉不够,且二分匹配的空间位置建模不如尺寸先验来得直接。后面 Deformable DETR 引入可变形注意力,只关注每个查询点附近的少量关键位置,收敛速度和精度都上来了。RT-DETR 又在实时性上做了优化,用混合编码器提取多尺度特征,避免了 DETR 类模型计算量过大的问题。我现在做实时项目会优先考虑 RT-DETR,因为它在 GPU 上的推理速度不输 YOLO,而且没有 NMS 这个后处理麻烦。但要注意,RT-DETR 对输入分辨率比较敏感,部署到边缘端时,分辨率太低精度掉得厉害,最好先用 TensorRT 量化一下再实测。

再聊聊主干网络,这个是检测器的地基。早期 R-CNN 用 AlexNet,Faster R-CNN 标配 VGG16,后来 ResNet 出来之后成了标配,因为梯度消失被解决了。ResNet 的残差连接让网络可以做到一百多层还稳定训练。再往后有 ResNeXt,用分组卷积增加基数,DenseNet 用密集连接缓解梯度问题,但这些在检测任务上往往是拿来当 backbones 用。真正让检测工程化起飞的是 CSPNet 和 Darknet 系列,YOLOv4 用 CSPDarknet53 把计算量和内存访问降了下来。然后是 EfficientNet 的神经架构搜索,用复合缩放统一调整深度、宽度和分辨率,我在一个遥感项目里换过 EfficientNet-B0 做骨干,精度不错,但内存占用比 ResNet50 大不少,在 Jetson 上得掂量掂量。现在视觉 Transformer 作为骨干也很多,比如 Swin Transformer,用窗口自注意力把复杂度从平方降为线性,配合层级特征,很适合做检测。我自己的使用体会是,Swin Transformer 做骨干确实精度高,但你得准备好足够的显存和调参时间,小数据集上很容易过拟合,数据增强得跟上。如果你在线实时检测,我建议还是用 CSP 类或者轻量级骨干,毕竟延迟是硬指标。

后处理这块,NMS 是传统检测的标配。它的作用是在一堆重叠的预测框里挑出置信度最高的,同时抑制掉同类的重叠框。听起来简单,但 NMS 的阈值很难设。设高了,误检多;设低了,漏检多。我遇到过一个真实场景:两个货箱并排靠得很近,NMS 阈值设在 0.5,结果一个框把另一个框抑制掉了,查了好久才发现是阈值的问题。后来有人提出 Soft-NMS,不是直接删除重叠框,而是按重叠程度衰减其置信度,这样相邻的物体不容易被误杀。还有 DIoU-NMS,把 IoU 距离和中心点距离结合起来,对遮挡场景更友好。不过现在越来越多的检测器在训练时就加了 NMS 的可微替代,或者像 DETR 系列直接不用 NMS,省心不少。但如果你还在用 YOLO 家族,NMS 那里我建议你输出了检测结果之后,画一张“原始输出框 vs NMS 后框”的对比图看看,很多时候问题不在网络而在后处理。

数据增强和训练技巧也得提一嘴,因为论文里的算法到实际代码里,性能差距往往来自训练策略。Mosaic 数据增强把四张图拼一起训练,让模型学会检测小目标和重叠目标,YOLOv4 以后基本上都是标配。还有 Copy-Paste,把目标对象复制粘贴到别的位置,增加样本多样性。这些东西不是算法核心,但影响非常大。我踩过最大的坑是训练时用了 MixUp,结果目标特征被混合得太厉害,检测小物体时边界全糊了。后来我只能根据场景关闭某些增强项,或者动态调整概率。另外,EMA(指数移动平均)对稳定模型权重很有用,但训练结束别忘加载 EMA 权重,否则你验证的模型和训练日志里的损失对不上号。

回看目标检测这十年的发展,从手工特征到深度学习端到端,从两阶段到单阶段再到 Transformer,其实都是围绕着“多尺度”、“正负样本”、“定位精度”、“推理速度”这四个问题在打转。没有哪个算法是银弹。传统方法虽然精度不行,但可解释性强,资源占用极小,在一些简单固定场景里依然能打;两阶段检测器精度上限高,适合离线分析或者高精度需求;单阶段检测器在速度与精度之间平衡得最好,是目前工业部署的主流;Transformer 检测器正在追赶,尤其在无 NMS 和全局建模上更有潜力。做工程的人,切忌拿着锤子看什么都是钉子。我之前有个同事非要在树莓派上跑 DETR,天天调参不睡觉,最后我帮他用 NCNN 跑了 MobileNet-SSD,帧率上去了,精度也够用,项目顺利验收。所以选型要看你的硬件、时延、目标尺寸、类别数量、遮挡情况,甚至气候光照——对,光照,前面说的填充色就是光照和背景色的锅。

结尾想跟你说点掏心窝的话。学目标检测,别只盯着最新模型刷榜,也别一上来就搞什么 200 个 epoch 的大模型训练。先拿一个经典模型跑通整个流程:数据标注、训练、验证、可视化、调参、部署。这个过程比你看一百篇论文都有用。你在 debug 的时候可能遇到一堆怪事:loss 不降、精度恒为 0、mAP 负(不是,mAP 不会负,但你会觉得人生是负的)。这时候先用最简单的配置跑通,再一点点加复杂度。我就是这么过来的,当年调 Faster R-CNN 的时候,连续三周的实验记录写满了两个笔记本,上面全是曲线缩略图和超参数改动。后来才发现大部分问题都出在 anchor 尺寸和图像缩放上。所以建议你从现在起,每次实验都留好 config 文件,写好注释,尤其是那些让你纠结的参数,用口语化标记“别动这个”“小心这个”“这个改了要重新跑”。模型可以迭代,但你留下的训练日志和踩坑记录才是你最宝贵的资产。再做几年你会明白,目标检测的算法更新再快,真正难的是你对数据的理解,对误差的分析,以及你对每一个模块的敬畏之心。就像那天凌晨三点的蓝色周转箱,模型没错,代码没错,错的是我没想到工作服和填充色会撞成背景。干这一行,永远要有这种自知之明。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询