资讯动态

2019目标检测技术回顾:从两阶段到Anchor-Free的深度学习实战指南

发布时间:2026/10/17 7:25:02 来源:尧图企业网站定制
1. 目标检测回顾一份2019年的深度学习技术地图目标检测这个方向每隔两三年就会经历一次“范式转移”。2019年正好卡在一个很有意思的节点上——两阶段检测器的主导地位还在但单阶段检测器已经开始在工业界大规模落地而Anchor-Free的苗头也已经冒出来了。我重新翻了一遍当年那篇综述性质的回顾文章结合自己这几年在多个检测项目里踩过的坑把当时的技术格局、核心方法、实操细节和常见问题重新梳理一遍。这篇文章适合两类人看一类是刚入门目标检测、想搞清楚“为什么会有这么多不同架构”的新手另一类是在实际项目里调过模型、但对整体技术脉络缺乏系统认知的从业者。我会尽量把每个关键设计背后的“为什么”讲清楚而不是只罗列一堆网络结构。目标检测要解决的问题很朴素一张图里有什么物体、它们在哪里。但就这么一个朴素的问题从传统方法到深度学习时代走了将近二十年。2019年前后这个领域已经形成了比较清晰的技术分层骨干网络负责特征提取颈部网络负责特征融合检测头负责分类和回归。这个三段式结构后来几乎成了所有检测器的标准范式。理解了这个框架再看各种具体方法就不会被纷繁复杂的名字搞晕。2. 整体技术格局与方案选型逻辑2.1 两阶段与单阶段的核心分歧2019年讨论目标检测绕不开的第一个话题就是两阶段和单阶段的路线之争。两阶段检测器的代表是Faster R-CNN系列它的思路很直观先让区域提议网络RPN粗筛出一批可能包含物体的候选框再对这些候选框做精细的分类和坐标回归。单阶段检测器的代表是SSD和YOLO系列它跳过了候选框生成这一步直接在特征图上预测类别和位置。这两种路线的差异本质上是在精度和速度之间做权衡。两阶段方法因为多了一道“精筛”工序对小物体和密集场景的处理更从容但推理速度天然吃亏。单阶段方法一步到位速度快但在早期版本里对小物体和重叠物体的检测效果确实差一些。我当年在一个工业质检项目里做过对比测试同样的骨干网络下两阶段方法在召回率上能高出三到五个百分点但推理耗时几乎是单阶段的两倍。这个差距在服务器端可能无所谓但到了边缘设备上就是能不能用的区别。选型的时候不要只看论文里的mAP数字。论文里的评测集往往是通用场景而你的实际业务场景可能有大量小目标、密集遮挡或者极端长宽比。我的经验是先用单阶段方法跑一个baseline如果召回率不达标再考虑换两阶段或者加更强的特征融合。2.2 Anchor机制的设计哲学Anchor是2019年检测器里最核心也最容易被忽视的设计。简单说Anchor就是预先在特征图上铺好的一堆参考框网络不直接预测物体的绝对坐标而是预测相对于这些参考框的偏移量。这个设计的好处是把回归问题变成了残差学习问题网络只需要学习“往哪个方向调、调多少”而不是从零开始预测坐标。但Anchor也带来了麻烦。你需要根据数据集的目标尺寸分布来设计Anchor的尺度和长宽比设计得不好召回率直接崩。我见过太多项目直接照搬COCO的Anchor配置结果在自己的数据集上效果很差。正确的做法是先对训练集做一次聚类分析看看目标尺寸到底集中在什么范围。K-Means聚类是当年最常用的方法把每个标注框的宽高当作二维点聚成五到九类每类的中心就是一组Anchor的尺度。2.3 特征金字塔的崛起2019年另一个重要趋势是特征金字塔网络FPN的普及。在此之前大多数检测器只在骨干网络的最后一层特征图上做预测。问题是深层特征语义强但分辨率低小物体在上面几乎看不见浅层特征分辨率高但语义弱容易把背景误判成物体。FPN的做法是把深层特征上采样后和浅层特征融合在多个尺度上分别做预测。这个思路后来被几乎所有检测器采纳包括单阶段方法。我自己的体会是FPN对小物体的提升是立竿见影的在某个遥感图像项目里加了FPN之后小目标的召回率从不到百分之五十提升到了百分之七十以上。但FPN也不是没有代价它增加了计算量和显存占用在边缘设备上部署时需要做通道裁剪或者层数精简。3. 核心方法拆解与关键细节3.1 Faster R-CNN两阶段方法的集大成者Faster R-CNN在2019年依然是很多项目的首选baseline。它的核心创新是用RPN替代了传统的选择性搜索把候选框生成也纳入了神经网络。RPN本身是一个全卷积网络在特征图的每个位置上预测多个Anchor的前景背景分数和坐标偏移。实操中有几个关键细节值得注意。第一是正负样本的划分阈值通常用IoU大于0.7作为正样本小于0.3作为负样本中间的全部忽略。这个阈值不是随便定的太高会导致正样本太少、训练不稳定太低会引入大量低质量正样本、降低定位精度。第二是RPN的损失函数分类用交叉熵回归用Smooth L1两者通过一个平衡系数加权。这个系数一般设成10让回归损失在总损失里占主导因为坐标回归的难度更大。第三是ROI Align这是Mask R-CNN里提出的改进用来替代ROI Pooling。ROI Pooling在量化坐标时会有两次取整导致特征图和原图之间的空间对应关系出现偏差。ROI Align用双线性插值避免了取整对小物体的检测精度提升明显。我在一个细胞检测项目里对比过换成ROI Align之后小细胞的定位误差平均降低了将近两个像素。3.2 SSD与YOLO单阶段方法的两种思路SSD和YOLO虽然都属于单阶段但设计哲学差别很大。SSD是在多个尺度的特征图上分别预测浅层特征图负责小物体深层负责大物体。它的Anchor设计比较复杂每个特征图上的Anchor尺度和长宽比都不一样。YOLO早期版本则是把图像划分成网格每个网格负责预测中心落在其中的物体思路更接近分类问题。YOLOv3在2019年是一个重要的版本它引入了多尺度预测和残差结构精度上已经接近两阶段方法。我实测下来YOLOv3在通用场景下的mAP和Faster R-CNN差距已经缩小到两三个百分点以内但推理速度快了三倍以上。不过YOLOv3对小物体的检测仍然偏弱因为它的最小特征图下采样倍率是32倍再往上只有8倍和16倍对于小于16像素的物体基本无能为力。如果你的场景里小物体很多单阶段方法需要特别注意特征图的分辨率。一个实用的技巧是在浅层特征图上额外加一个检测头把下采样倍率降到4倍但这样会显著增加计算量需要根据硬件条件权衡。3.3 RetinaNet与Focal Loss解决类别不平衡单阶段方法精度不如两阶段一个核心原因是正负样本极度不平衡。一张图里可能只有几个物体但Anchor有成千上万个绝大多数都是背景。这些背景样本的损失虽然单个很小但数量巨大累加起来会淹没正样本的梯度。两阶段方法通过RPN先筛掉大部分背景所以这个问题不严重。RetinaNet的贡献是用Focal Loss来解决这个问题。Focal Loss在标准交叉熵前面乘了一个调制因子对于容易分类的样本这个因子会压低它的损失权重。这样一来网络会把注意力集中在那些难分类的样本上。这个设计思路后来被广泛借鉴包括很多分割和关键点检测任务。我在实际项目里试过Focal Loss的gamma参数设成2、alpha设成0.25是比较通用的配置。但这不是绝对的如果你的数据集正负样本比例特别极端可以适当调大gamma。另外要注意Focal Loss对学习率比较敏感用太大的学习率容易发散建议比标准交叉熵的学习率调小一个数量级。3.4 Anchor-Free的早期探索2019年Anchor-Free方法还没有成为主流但已经有一些值得关注的尝试。CornerNet用关键点检测的思路来做目标检测预测物体的左上角和右下角两个角点再通过嵌入向量把属于同一个物体的角点配对。CenterNet则更进一步直接预测物体的中心点然后用中心点处的特征回归宽高。Anchor-Free的好处是省去了Anchor设计这个繁琐的环节网络结构更简洁超参数更少。但当时的Anchor-Free方法在精度上还打不过精心调参的Anchor-Based方法主要问题在于角点或者中心点的定位精度不够以及多个物体中心点重合时的处理比较棘手。不过这个方向后来被证明是很有潜力的2020年之后的很多检测器都转向了Anchor-Free。4. 实操流程与核心环节实现4.1 数据准备与标注规范目标检测项目的第一步永远是数据。2019年主流的标注格式是PASCAL VOC和COCO两种。VOC格式用XML文件存储每个物体一个bndbox标签包含xmin、ymin、xmax、ymax四个坐标。COCO格式用JSON存储结构更复杂但信息更丰富支持实例分割和关键点。标注质量直接决定模型上限。我踩过最大的坑是标注框的松紧不一致。有的标注员习惯把框画得紧贴物体边缘有的习惯留一点余量。这种不一致会让网络在回归坐标时产生困惑最终表现为定位精度上不去。解决办法是制定明确的标注规范比如“框的边缘距离物体可见边缘不超过两个像素”并且在标注完成后做一轮交叉检查。另一个常见问题是漏标和误标。漏标会让网络把物体当成背景降低召回率误标会让网络学到错误的特征。我的做法是用训练好的模型对训练集做一次推理把高置信度的预测和原始标注做对比差异大的样本挑出来人工复核。这个流程虽然费时间但能发现很多隐藏的标注问题。4.2 骨干网络选型与预训练权重2019年可选的骨干网络已经很多了。ResNet-50和ResNet-101是当时最通用的选择VGG-16因为参数量大、推理慢已经开始被淘汰。MobileNet和ShuffleNet系列主打轻量化适合移动端部署。Darknet-53是YOLOv3的默认骨干在精度和速度之间平衡得不错。选骨干网络的时候不要只看ImageNet分类精度。分类任务和检测任务对特征的要求不一样分类更关注全局语义检测还需要精确的空间信息。有些在分类上表现很好的网络迁移到检测上反而不如一些更简单的结构。我的经验是ResNet-50加FPN是一个很稳的baseline如果精度不够再考虑换更大的骨干或者加更强的数据增强。预训练权重几乎是一定要用的。从零开始训练检测模型收敛慢而且容易过拟合。用ImageNet预训练的权重初始化骨干网络可以让网络在一开始就具备基本的特征提取能力。但要注意预训练权重和你的输入分辨率要匹配。如果预训练用的是224×224而你的检测输入是800×800批归一化层的统计量会有偏差最好在前几个epoch用较小的学习率做一下warm-up。4.3 训练策略与超参数配置训练检测模型有几个关键超参数需要仔细调。学习率是最重要的太大容易发散太小收敛慢。常用的策略是warm-up加余弦退火或者阶梯下降。warm-up阶段用很小的学习率跑几百个iteration让网络先适应数据分布然后再升到初始学习率。初始学习率一般设在0.01到0.02之间batch size大的话可以适当调大。批归一化在检测任务里要特别小心。因为检测的batch size通常比较小一般只有2到8批归一化的统计量会很不稳定。解决办法是用同步批归一化在多卡训练时跨卡计算均值和方差。如果只有单卡可以考虑用Group Normalization替代它对batch size不敏感。数据增强是提升检测精度的免费午餐。常用的增强包括随机翻转、随机裁剪、颜色抖动、马赛克增强等。马赛克增强是YOLOv4里提出的把四张图拼成一张让网络在一张图里看到更多样的上下文。我实测下来马赛克增强对小物体检测的提升特别明显因为它增加了小物体出现的频率。4.4 推理与后处理推理阶段最核心的环节是非极大值抑制NMS。网络会输出大量重叠的预测框NMS的作用是保留置信度最高的框抑制掉和它IoU超过阈值的其他框。NMS的阈值一般设在0.5左右阈值太低会误删相邻物体太高会保留太多重复框。标准NMS有一个问题当两个物体靠得很近时置信度低的那个会被误删。Soft-NMS的解决办法是不直接删除而是根据IoU降低它的置信度。这个改进在密集场景下效果很好但会增加计算量。我在一个人群计数项目里用过Soft-NMS召回率提升了将近五个百分点但推理速度慢了百分之十五左右。另一个后处理技巧是多尺度测试。把输入图像缩放到不同尺寸分别推理再把结果融合。这个方法能提升一到两个百分点的mAP但推理时间成倍增加。如果对延迟不敏感可以考虑用如果是实时系统基本不用考虑。5. 常见问题与排查技巧实录5.1 损失不下降或震荡训练检测模型时损失不下降或者剧烈震荡是最常见的问题。原因可能有很多我按排查优先级列一下。第一看学习率是不是太大这是最常见的原因。把学习率调小一个数量级再试如果损失开始下降说明就是学习率的问题。第二看数据标注有没有问题用可视化工具把标注框画到图上肉眼检查一遍。第三看Anchor配置是否合理如果Anchor的尺度和目标尺寸严重不匹配正样本会非常少损失自然降不下去。还有一个容易被忽视的原因是批归一化层的动量参数。默认的0.1在batch size很小时会导致统计量更新过快训练不稳定。可以试着调到0.01或者更低。另外如果用了预训练权重检查一下批归一化层是不是被冻结了有时候冻结太久也会导致收敛困难。5.2 小物体检测效果差小物体检测是目标检测里的老大难问题。2019年的时候主要的解决思路有这么几个。提高特征图分辨率是最直接的把输入尺寸调大或者用空洞卷积来保持分辨率。特征金字塔是标配让浅层特征也参与预测。Anchor设计要针对小物体调整增加小尺度的Anchor。数据增强方面可以专门对小物体做复制粘贴增强增加它们在训练集里的出现频率。我在一个航拍图像项目里做过系统对比发现输入分辨率的影响最大。把输入从600×600提升到1200×1200小物体召回率直接翻了一倍。但代价是显存占用增加了四倍推理速度降到了原来的四分之一。所以实际项目里需要在精度和效率之间找一个平衡点。5.3 误检和漏检的排查思路误检和漏检是检测任务的两大痛点。排查的时候先把错误样本按类型分类。误检通常是因为背景被误判成了物体可能的原因包括训练集里背景样本不够丰富、正负样本划分阈值不合理、NMS阈值太高。漏检通常是因为物体特征不明显或者被遮挡可能的原因包括Anchor尺度不匹配、正样本太少、特征融合不充分。我的做法是把误检和漏检的样本单独拿出来做可视化分析。看看误检的框都出现在什么位置是不是集中在某些特定背景上看看漏检的物体有什么共同特点是不是尺寸特别小或者遮挡特别严重。这种分析往往能发现一些系统性的问题比盲目调参有效得多。5.4 常见问题速查表问题现象可能原因排查方法解决思路损失震荡不收敛学习率过大、批归一化不稳定调小学习率、检查批归一化动量加warm-up、用同步批归一化或Group Normalization小物体召回率低特征图分辨率不足、Anchor不匹配可视化小物体在特征图上的响应提高输入分辨率、加FPN、调整Anchor尺度密集场景误检多NMS阈值过高、正负样本划分不合理统计误检框的IoU分布降低NMS阈值、用Soft-NMS、调整正负样本阈值训练集精度高但测试集差过拟合、数据分布不一致对比训练集和测试集的标注分布加数据增强、加正则化、检查数据采集流程推理速度慢骨干网络太大、输入分辨率过高用profiler分析各层耗时换轻量骨干、降低输入分辨率、剪枝量化这张表里的排查顺序是有讲究的。先看损失损失不正常后面的都不用谈损失正常了再看小物体小物体往往是业务的核心然后看误检漏检这是精度调优的主战场最后看速度速度不达标再好的精度也用不上。6. 从2019年回看技术演进2019年这个时间点之所以值得回顾是因为它正好处在几个技术转折的交汇处。Anchor-Based方法已经非常成熟但Anchor-Free的种子已经埋下两阶段和单阶段的精度差距在缩小但速度差距依然明显骨干网络的设计开始从手工设计转向神经架构搜索虽然当时还没成为主流。从实操角度看2019年的技术栈已经足够支撑大多数工业级应用。Faster R-CNN加FPN加ResNet-50的组合在精度上能满足大部分场景的需求YOLOv3在速度上有明显优势适合实时系统。Anchor-Free方法虽然当时还不够成熟但它代表的方向后来被证明是正确的。我在实际项目里最大的体会是没有万能的检测器只有适合场景的检测器。通用评测集上的排名只能作为参考真正决定效果的是数据质量、Anchor设计、后处理策略这些细节。一个精心调参的YOLOv3在很多场景下能打败一个随便调的Faster R-CNN。所以与其追新不如把手头的模型吃透把数据做干净把后处理调到位。最后分享一个小技巧如果你在多个检测器之间犹豫不决可以先用小分辨率、小批量快速跑一轮对比实验看哪个模型在你的数据上收敛最快、验证集损失最低。这个初筛能帮你省下大量调参时间把精力集中在最有潜力的那个模型上。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑