ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

002、目标检测技术发展脉络与主流算法综述 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 NetworkRPN至此真正意义上“端到端”的两阶段检测器成型了。你去看 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 用 AlexNetFaster 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 文件写好注释尤其是那些让你纠结的参数用口语化标记“别动这个”“小心这个”“这个改了要重新跑”。模型可以迭代但你留下的训练日志和踩坑记录才是你最宝贵的资产。再做几年你会明白目标检测的算法更新再快真正难的是你对数据的理解对误差的分析以及你对每一个模块的敬畏之心。就像那天凌晨三点的蓝色周转箱模型没错代码没错错的是我没想到工作服和填充色会撞成背景。干这一行永远要有这种自知之明。
返回列表