☰
2019目标检测技术回顾:从两阶段到Anchor-Free的深度学习实战指南
2026/10/12 18:33:33 网站建设 项目流程

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。所以与其追新,不如把手头的模型吃透,把数据做干净,把后处理调到位。

最后分享一个小技巧:如果你在多个检测器之间犹豫不决,可以先用小分辨率、小批量快速跑一轮对比实验,看哪个模型在你的数据上收敛最快、验证集损失最低。这个初筛能帮你省下大量调参时间,把精力集中在最有潜力的那个模型上。

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

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

立即咨询