ARTICLE DETAIL

资讯详情

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

目标检测算法演进与工程选型:从R-CNN到DETR的实战指南

目标检测算法演进与工程选型:从R-CNN到DETR的实战指南 如果你刚入坑计算机视觉多半会被各种检测算法的名字砸晕R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD、RetinaNet、FCOS、DETR……随便搜一下深度学习图像检测能翻出几十个网络结构。但我的真实感受是真正难的不是记住这些名字而是搞清楚它们各自在解决什么问题、为什么会出现这些差异、以及落到自己项目里该怎么选。这篇梳理不是论文复读而是我这些年做检测项目时沉淀下来的一套问题导向的方法论。我会把图像检测拆成几个核心子问题再沿着方法演进的几条主线讲清楚每种典型方案的适用场景最后补充训练细节和工程落地经验。适合刚学完深度学习基础、准备上手检测任务的人也适合做了几个项目但总觉得原理没串起来的老手。1. 图像检测问题的本质不只是框出物体那么简单1.1 检测任务的三层拆解分类、定位、重叠与背景很多人以为检测就是在图片上画框。如果只画框那确实简单但实际项目里的检测任务可以拆成三个同时要解决的子问题第一是分类框里的东西到底是什么第二是定位物体在图像中的位置有多精确第三是同时处理多个目标、不同大小、相互遮挡、背景干扰的组合问题。第三个才是检测最麻烦的地方。分类任务只需要对整张图输出一个标签模型有全局视野就行。定位任务要回归四个坐标值但框的坐标天然存在尺度差异——一张 1000×1000 的图里一辆车可能占 300×200 像素一个行人只有 80×180一只小猫只有 30×30。分类模型的特征图在最后会压缩成单个向量检测模型却需要在不同位置、不同尺度上同时输出大量候选框还要区分哪个框里有物体和哪个框只是背景。这就引出一个很关键的点检测模型本质上在做的是稠密预测dense prediction它要对特征图上的每个位置、每个尺度的预设框都做出判断。这也是为什么同样的骨干网络检测训练比分类训练慢得多、显存开销大得多。1.2 为什么检测比分类难那么多从图像分类到目标检测的难度跃迁如果做过分类项目再转检测会有一种明显的挫败感分类模型随便一调准确率能到 90% 以上检测模型的 mAP 想上 40 都费劲。这不是你水平不行而是任务本身的复杂度不在一个量级。以 COCO 数据集为例一张图平均有 7 个目标实例目标大小跨度从十几个像素到占据半张图而且大量目标存在遮挡和截断。分类任务里一只猫被挡住一半仍然是猫检测任务里被挡住一半的猫的框和旁边另一个物体的框会发生 IoU 冲突训练时要决定这个框到底归谁负责。另外检测的评价指标也更苛刻。分类的 top-1 accuracy 只要预测的类别对就算对检测的 mAP 要求预测框和真实框的 IoU 大于阈值通常是 0.5 或 0.75才判定为正确。一个框中心点偏移十几个像素、类别对了在 IoU0.75 的严格标准下就是错的。这意味着检测模型的输出必须同时做到分类置信度高和空间位置精确这两者需要的特征粒度往往是矛盾的——分类需要语义抽象定位需要空间细节。1.3 评价指标背后的工程含义mAP、IoU、FPS 如何影响算法选型mAP 是检测任务最常用的指标但它不是单个数字而是对查准率-查全率曲线的积分。简单理解mAP 高意味着模型在宁可错杀也不漏检和宁可漏检也不错杀之间找到了更好的平衡。实际项目里线上环境对指标的要求和论文完全不同。比如工业质检场景漏检一个缺陷的代价远高于误检十个而安防场景恰好相反误报太多会让人失去耐心。这就是为什么我经常说选模型之前先定义清楚你的容错方向。IoU交并比用于衡量预测框与真实框的重合程度。IoU0.5 是早期目标检测数据集时代的宽松标准COCO 更常用的是 mAP0.5:0.95也就是把 IoU 阈值从 0.5 到 0.95 每隔 0.05 算一次再取平均。后者要苛刻得多一个小目标预测框稍微偏一点IoU 可能直接从 0.7 掉到 0.4所以 COCO mAP 排名靠前的模型在工程上往往也对应着更强的定位能力。FPS 是推理速度指标但它严重依赖硬件。同一模型在不同显卡或嵌入式设备上推理速度可以差一个数量级。做算法选型时我建议直接把目标设备上的实测 FPS作为选型标准而不是看论文里的 benchmark 数字。很多论文给的 FPS 是在 V100 上测的跟你的实际部署环境没有可比性。2. 方法演进的四条主线从 R-CNN 到 DETR2.1 两阶段与单阶段之争准确率与速度的博弈深度学习检测的开山之作是 R-CNN2014。它的思路很朴素先用选择性搜索Selective Search在图像上生成约 2000 个候选区域然后把每个候选区域裁剪缩放后送入 CNN 提取特征最后用分类器分类、用回归器修正框的位置。这个方案的问题显而易见2000 个候选区域都要过一遍 CNN一张图推理需要几十秒训练更是需要把每个候选区域的特征存到磁盘上时间成本和空间成本都极高。真正让检测走进深度学习时代的是 Faster R-CNN2016。它提出了区域提议网络Region Proposal Network, RPN把生成候选框也变成一个可训练的神经网络分支并且和检测头共享骨干特征。这样整套系统端到端可训练速度也提升到了接近实时的水平。Faster R-CNN 的结构非常有代表性骨干网络提取特征 → RPN 生成候选框 → RoI Pooling/RoI Align 把候选框对应的特征图裁剪到统一尺寸 → 分类头和回归头输出结果。这个两阶段的框架成为之后很多高精度算法的底座。单阶段方法的代表是 YOLO2016和 SSD2016家族。它们不显式生成候选区域而是直接在特征图上密集地预设一堆锚框anchor每个锚框直接预测它是否包含物体、物体类别以及相对锚框的偏移量。这个设计思路说起来简单但当年 YOLO 真正把实时检测做到了可用水平在 GPU 上能达到 45 FPS 以上而 Faster R-CNN 同期只有个位数 FPS。作为代价单阶段方法在小目标、密集场景下的检测精度一度明显落后于两阶段方法。这个准确率优先 vs 速度优先的争论直到 FPN特征金字塔网络2017出现后才得到缓解。FPN 让不同尺度的特征图都参与预测小目标检测能力大幅提升单阶段方法在 COCO 上的精度才逐渐追上来。今天的两阶段与单阶段差异已经缩小了很多但在思路上仍然有本质区别两阶段是先粗筛再精修单阶段是一次到位。前者天然更适合候选区域极少但精度要求极高的场景后者更适合目标密集、实时性要求高的场景。2.2 anchor-based 到 anchor-free正负样本分配机制的隐性变革锚框anchor是单阶段检测器里的核心设计在特征图的每个位置预置若干不同大小、不同长宽比的矩形框训练时让模型学习这个锚框离真实物体有多远、该怎么调整。这套设计在 YOLOv2、SSD、RetinaNet 中效果显著但它有两个麻烦第一锚框数量和超参数非常多。以 SSD 为例一张 300×300 的输入特征图上锚框总数可能超过 8000 个其中超过 99% 是背景。超参数包括每个位置的锚框数量、尺度、长宽比、IoU 正负样本阈值等调起来非常痛苦。第二锚框的预设分布并不一定能贴合真实数据。比如检测长条形物体如果预设的长宽比里没有 1:5 这种极端值这个物体就谁都不负责模型很难学会。虽然可以通过聚类统计训练集中的框尺寸来缓解但每换一个数据集都要重新聚类工程上很烦。于是出现了 anchor-free 方法。代表性工作是 CornerNet2018、CenterNet2019和 FCOS2019。它们的做法是直接在特征图上预测物体的某些关键点角点、中心点或者逐像素预测这个点距离物体四条边的距离。以 FCOS 为例对特征图上的每个位置如果它落在某个真实框内部就让它负责预测这个框否则它只是一个背景点。这个思路让正负样本的概念变得更自然——不再依赖锚框与真实框的 IoU 计算而是看位置是否在框内。FCOS 还引入了 centerness 分支让远离物体中心的预测点降低权重有效抑制了低质量预测框。从工程角度看anchor-free 的另一个好处是少了一套锚框参数模型部署更简单。现在的主流检测器如 YOLOX、PP-YOLOE基本都转向了 anchor-free也因此可以把解耦检测头、动态样本分配等改进叠加在一起训练流程反而更简洁。2.3 Transformer 带来的范式转换DETR 如何绕开手工设计如果 anchor-free 是减少了手工设计那 DETR2020可以说是想完全甩开这些设计。DETR 把 Transformer 引入检测将检测建模为集合预测问题模型直接输出 N 个比如 100 个预测框每个框附带类别概率再用匈牙利算法Hungarian Algorithm把预测框和真实框做最优匹配一对一地进行损失计算。DETR 的优点非常吸引人不需要锚框、不需要 NMS非极大值抑制、不需要 RPN整个流程就是一个 encoder-decoder 结构。但它的缺点也很明显训练收敛极慢在 COCO 上需要 500 轮 epoch 才能达到较好效果而且小目标检测效果差。后续的 Deformable DETR2021通过可变形注意力机制解决了收敛速度问题只采样少量关键位置而不是全局注意力训练收敛速度提升了 10 倍以上小目标检测也有明显改善。DETR 家族的意义不仅在于性能更在于提供了一个更简洁、更端到端的检测范式。它把人类设计的很多先验锚框、NMS、IoU 匹配转化为学习到的匹配。不过在实际项目里DETR 对训练资源和调参技巧的要求仍然偏高多数实时场景我还是会用单阶段的卷积方案。提示选型时可以把 DETR 看作未来方向但当前成本可控性一般的选项。如果你的团队 GPU 资源充足、项目周期不紧可以尝试否则优先考虑工程生态更成熟的 YOLO 系。2.4 各主流方法速览对比方法类别代表工作优点缺点适用场景两阶段R-CNN 系列Faster R-CNN精度高易扩展 mask/关键点分支速度相对慢精度优先、候选目标较少的场景单阶段anchor-basedYOLO 系列、SSD、RetinaNetYOLOv5/YOLOv8速度快工程生态好小目标/密集场景需额外调优实时检测、边缘设备单阶段anchor-freeFCOS、CenterNet、YOLOXYOLOX结构简单少超参数极端尺度和遮挡场景仍有限大多数新项目首选TransformerDETR 系列DETR、Deformable DETR端到端无 NMS训练成本高、小目标需优化有充足 GPU、追求简洁流程工业视觉专用Halcon 深度学习等Halcon DL标注和训练封装完善适合产线灵活性弱难以定制结构工业质检、快速落地这个表不是我随便填的。做项目选型时我一般会先问三个问题实时性要求多高目标尺寸跨度多大团队有没有时间调参这三个问题的答案基本决定了你在上表里选哪一行。比如工业视觉场景用 Halcon 这类封装好的工具反而比从零训练一个 YOLO 更稳妥因为产线更看重稳定性和可维护性而不是单点精度。3. 主干网络与检测头的搭配逻辑决定上限还是决定下限3.1 从 VGG 到 ResNet 再到 Swin感受野和下采样倍数的关键作用检测模型的骨干网络决定了它能提取到什么样的特征。早期 R-CNN 系列用的是 VGG16它堆了很多卷积层但存在两个问题一是网络深了以后梯度消失训练困难二是所有层都只输出一个尺寸的特征图下采样 16 倍丢失了小目标的空间细节。ResNet2015通过残差连接解决了梯度消失问题让 50 层甚至 101 层的网络可以稳定训练。但要注意ResNet 并不是为检测设计的它的分类头使用的全局平均池化会把空间信息压缩掉。因此检测任务在用 ResNet 时通常会截掉最后的分类层只保留中间 stage 的输出然后在这之上接检测头。真正让检测主干进入新阶段的是 FPN 和后来的 Swin Transformer2021。FPN 不是一个新的骨干网络而是一种特征融合结构它把骨干网络不同 stage 的特征图从顶层向下做上采样并横向连接让每一层都同时拥有高层语义信息和低层空间细节。Swin Transformer 则证明了基于窗口的 Transformer 骨干在检测任务上也能超过 CNN它的跨窗口自注意力W-MSA 和 SW-MSA可以在保持线性的计算复杂度的同时让不同窗口之间交换信息。这也就是你在很多模型结构图里看到的 WSA 和跨窗口自注意力设计。从工程角度我不建议一上来就追逐 Swin 这种大模型。大参数量骨干在 COCO 上确实能刷到很高的 mAP但它的推理速度、显存占用和训练成本不是每个项目都承受得起的。骨干网络的选择本质是精度与算力的预算分配预算充足且离线推理可以考虑大的 Transformer 骨干实时场景ResNet-50 或 CSPDarknet 依然是性价比非常高的选择。3.2 FPN 多尺度融合小目标检测的老大难问题小目标检测是图像检测里最经典的问题之一。什么叫小目标在 COCO 的定义里面积小于 32×32 像素的物体就算小目标。对于一张 1080P 的图32×32 的物体只占不到 0.1% 的像素它的特征在经过多次下采样后几乎消失。不同尺度的目标需要用不同分辨率的特征图来检测这就是 FPN 存在的意义。FPN 的输出通常包含 P3、P4、P5 三个尺度的特征图分别对应原图的 1/8、1/16、1/32 下采样小目标主要由 P3 负责大目标由 P5 负责。后来 YOLOv4/YOLOv5 进一步把 PANet 结构引入在 FPN 的基础上增加了一条自底向上的路径聚合让底层定位信息更容易传到高层语义特征中。相比之下如果只用单一特征图做预测小目标和大目标的效果肯定有一个会拉胯。用 FPN 时有一个容易被忽略的细节不同尺度的特征图对应的正样本分配策略也需要调整。在 Faster R-CNN 中RPN 会为每个尺度的特征图分配不同大小的锚框比如 P3 上分配较小的锚框P5 上分配较大的锚框。如果没有正确地做这个映射即使有了 FPN模型也会在小目标上表现不佳。3.3 检测头的设计分类分支与回归分支该不该共享参数检测头是模型最后的输出部分一般同时输出分类结果和边框回归结果。早期 YOLOv3 之前的设计里分类和回归共用一个全连接层或卷积层。这样做的问题在于分类任务关注的是这个区域和某个类别在语义上有多接近回归任务关注的是框的边界在空间上偏移了多少两者的特征侧重点并不相同。强行共享参数两个任务会相互干扰出现分类置信度高但框质量差、或者框质量高但分类置信度低的情况。解决方法是采用解耦检测头Decoupled Head把分类分支和回归分支分成两条独立的卷积路径各自有自己的卷积层。这个做法在 YOLOX、PP-YOLOE 里都有明确验证在差不多相同的计算量下解耦头相比耦合头能带来约 1~2 个点的 mAP 提升。损失计算的时候分类分支用交叉熵或 BCE回归分支用 IoU 类损失函数两者独立优化训练也更稳定。实操上还要注意输出通道数和激活函数的设计分类分支的通道数等于类别数使用 Sigmoid回归分支的通道数等于 4框坐标或更多带角度或旋转框不应加 Sigmoid而是直接用线性激活。很多初学者在这类小细节上会踩坑导致 loss 一上来就异常大。我自己调过很多次这种隐藏 bug 通过检查输出层的数值范围就能快速定位。4. 损失函数与训练细节同样的网络不同人训练结果差一截4.1 从 Smooth L1 到 CIoU边界框回归损失演进背后的直觉检测模型训练期间的回归损失经历了几个阶段。最初的 Faster R-CNN 用 Smooth L1 Loss也叫 Huber Loss它对小误差的梯度更平滑对离群点不那么敏感训练比较稳。但 Smooth L1 的致命弱点是它把四个坐标当做相互独立的量来优化可框的中心点、宽、高其实是强耦合的——中心点偏了后面宽高再准也没用。为了解决把框当成整体优化的问题IoU Loss 及其变体出现了。IoU Loss 直接把预测框和真实框的交并比作为优化目标但它有一个缺点当两个框没有重叠时IoU 恒为 0梯度消失模型无法学习。GIoU Loss2019通过增加一个包含两个框的最小闭包区域作为惩罚项解决了无重叠情况下的梯度问题DIoU Loss 在此基础上又加入了对中心点距离的惩罚CIoU Loss 再进一步同时考虑中心点距离和长宽比的一致性。从工程角度看最直观的体感是换成 CIoU 之后框的贴合度明显比 Smooth L1 时代好尤其是稍微有些偏移的大目标视觉效果提升很明显。我一般用这个判断逻辑如果项目里有大量高精度标注、需要精确定位比如机械臂抓取CIoU 这类 IoU 系损失是首选如果只是做目标存在性判断比如人流计数对框的精确度要求没那么高Smooth L1 也够用。损失函数不是越新就一定越好要看任务需要的定位精度粒度。4.2 正负样本分配训练时你真正在做什么检测训练中正负样本分配Label Assignment是最容易被忽略但影响最大的一个环节。对每个锚框或预测点它到底是正样本还是负样本直接决定了损失函数的输入。如果分配合理模型收敛快、精度高如果分配混乱模型会无所适从。历史上最经典的是基于 IoU 的静态分配锚框与真实框的 IoU 大于 0.5或 0.7就作为正样本小于 0.3 作为负样本介于中间的忽略。这个策略简单有效但在目标密集的场景一个真实框可能匹配到很多个锚框造成大量低质量预测框或者两个真实框靠得很近一个锚框同时与两个框的 IoU 都很高分配结果会不稳定。之后出现了基于统计的自适应分配方法比如 ATSS2020和 SimOTAYOLOX 的默认分配。ATSS 的思路是对每个真实框先在每个尺度特征图上选出若干候选点然后根据这些候选点的 IoU 均值和标准差动态计算正样本阈值。SimOTA 则把正负样本分配建模为最优传输问题每个候选样本的损失加上动态计算的正样本数量让损失之和最小。这些算法讲起来复杂但它们解决的是同一个问题正样本怎么选才能既全面又不过多。如果你是在复现别人的工程不建议轻易改动默认的分配策略尤其不要为了提升正样本数量而盲目调大阈值很容易引入大量低质量框最终 mAP 反而下降。我自己就犯过这个错以为多来点正样本总没错结果 mAP 掉了两个点。4.3 epoch、学习率、数据增强论文不写但实战很要命的细节训练策略上有几个细节是论文常不细讲、但实际做项目时非常影响结果的首先是epoch 数。检测任务的数据集通常比分类小且任务复杂所以 epoch 普遍要比分类训练多。YOLOv5 的默认设置是 300 epochDETR 在 COCO 上要训练 500 epoch。如果你的数据集只有几千张图epoch 太少模型欠拟合太多则过拟合。一个折中的做法是加入早停Early Stopping监控验证集 mAP 在连续 20~30 个 epoch 不再上升时停止训练。其次是学习率策略。检测任务常用 warmup cosine annealing。warmup 阶段前 3~5 个 epoch让学习率从很小的值线性增长到预设值避免模型一开始就把梯度方向带偏cosine annealing 让学习率在后半段平滑下降有助于收敛到更优的局部最优点。初始学习率一般基于 batch size 来定batch size 越大初始学习率可以适当提高。遇到 loss 震荡不下降时第一反应不是改网络结构而是把学习率调低一个数量级试试。数据增强对检测的影响可能比网络结构还大。Mosaic把 4 张图拼成一张、MixUp把多张图按比例叠加、随机仿射变换可以在有限数据集上显著提升鲁棒性和泛化能力。YOLOv5 之后的各种版本把数据增强策略做成了超参数组合看起来密密麻麻其实核心就是在增强多样性和不扭曲标注之间找平衡。调增强参数时先确认增强后的图像在可视化工具里标注框是否还准确我见过很多项目因为 Mosaic 裁剪后标注框错位而悄悄拉低 mAP 的情况。4.4 损失函数权重怎么调分类和回归两个分支的损失量级天然不同需要给它们设置权重。常用做法是让分类损失和回归损失的初始量级相近或者在训练初期用 warmup 让回归分支的权重慢慢加上来。还要注意 BCE 和 CIoU 的数值范围不一样一个在 0~1 之间一个在 0~2 之间如果网络输出没有做合理初始化回归损失可能会压过分类损失导致模型只学会框不会分类。实际调参时我看到 loss curve 里回归分支明显比分类分支大好几个数量级一般会先检查是不是回归目标没有做归一化。归一化这里有一个常用技巧把框的宽度和高度除以输入图像的宽高再参与损失计算可以有效避免大图上的框梯度爆炸。5. 工程落地视角轻量化网络、框架选型与部署避坑5.1 什么时候选 YOLO 系列什么时候选 Faster R-CNN 或工业工具很多刚入行的人会问到底用哪个检测模型好。我的回答是没有最好的模型只有最合适的场景。如果你的需求是实时视频流分析、边缘盒子、嵌入式设备YOLO 系列特别是 YOLOv8、YOLOv9、YOLOv10几乎是不二选择。它有庞大的社区生态模型导出到 ONNX/TensorRT 的流程非常顺各种预训练权重也很多。如果你的需求是学术研究、需要同时检测分割关键点、或者目标数量很少但每个都要非常精准Faster R-CNN 加上 mask 分支的 Mask R-CNN 用起来很顺手它在小数据上的泛化通常也更好。工业视觉场景则另说。比如产线上的外观缺陷检测、元器件焊点检测如果公司没有专门的算法团队我更推荐 Halcon 的深度学习工具。Halcon 把标注、训练、评估打包成了图形化流程底层用的也是卷积网络但它帮你处理了很多工业场景的细节比如少量缺陷样本的过拟合问题、灰度图训练、ROI 限定等。反过来Halcon 的灵活性肯定不如 PyTorch 手动搭建做不了复杂的多任务网络所以选择的关键还是看团队能力和项目周期。5.2 环境配置、编程语言与框架选择PyTorch 为主流配套工具怎么选深度学习图像检测的环境配置是所有入门者的第一道坎。编程语言方面Python 是绝对主流因为相关库、教程和社区支持最丰富如果你要用 C 做高性能部署建议先把 Python 侧的模型训练、验证流程跑通再用 C 调用 ONNX Runtime 或 TensorRT 的推理接口。框架方面PyTorch 是目前目标检测研究和使用最广的框架。PyTorch 的生态里有很多开箱即用的检测库MMDetection 就是最著名的之一它把 Faster R-CNN、RetinaNet、FCOS、DETR 等几十个算法统一封装换模型基本就是改配置文件非常方便。但我建议不要只用 MMDetection 当黑盒调参数至少要能看懂它里面 config 里每一行是干什么的不然出问题很难排查。环境配置时最常踩的坑是 CUDA、cuDNN、PyTorch 版本不匹配。我的习惯是先根据显卡驱动版本查看支持的 CUDA 版本再安装对应编译好的 PyTorch 安装包然后创建独立的 conda 虚拟环境所有项目依赖都装在这个环境里。GPU 相关环境配置排错时用nvidia-smi确认驱动用python -c import torch; print(torch.cuda.is_available())确认 PyTorch 是否用上 GPU这两个命令能解决 80% 的环境问题。5.3 模型压缩、量化与 TensorRT/NCNN 部署的实战经验训练好模型只是第一步部署环节才是工程落地的大头。常用的部署链路是 PyTorch → ONNX → TensorRTNVIDIA GPU或 NCNN移动端/嵌入式。模型压缩和量化能显著提升推理速度。剪枝是把冗余通道去掉量化是把 FP32 权重变为 FP16 或 INT8。INT8 量化在 NVIDIA GPU 上通过 TensorRT 能获得 2~4 倍的加速但精度损失需要验证。我的经验是如果原模型 mAP 有富余比如 60 以上量化到 INT8 后损失 1~2 个点通常可以接受如果原模型只有 45 左右量化后掉到 42 以下宁可用 FP16 也不要强行 INT8。TensorRT 部署还有一个容易踩的坑输入尺寸固定化。很多模型在导出时会把输入分辨率固定死导致生产环境里不同分辨率图像都要先 letterbox 到固定尺寸。这个操作本身没错但要注意 letterbox 后图像的坐标回算到原图时缩放比例和填充尺寸要一致否则检测框会整体偏移。建议在工程代码里把 letterbox 参数做成全局常量避免多处重复实现导致不一致。5.4 数据标注质量对最终效果的巨大影响这个部分写在工程落地里是因为它最容易被忽视。很多团队在意模型结构却不在意标注质量最后模型上限就被数据质量锁死了。检测模型对标注一致性非常敏感。同一类物体有的标注员把框画到物体边缘紧贴有的标注员习惯留几个像素的边距这两种风格会让模型学到一个混乱的框分布。更严重的是框的抖动会直接影响回归损失的收敛质量。我的建议是标注规范里明确框必须贴合物体的最外轮廓不允许留空隙也不允许裁剪掉任何一部分并且定期抽检交叉验证。遇到类别非常不平衡比如正常样本占 99%缺陷样本占 1%时优先考虑从已有模型做预标注再人工修正能大幅降低标注成本。6. 从零开始的学习路线我在踩坑中总结的顺序6.1 先学什么编程语言、PyTorch 基础、深度学习基础如果有人问我计算机视觉和深度学习怎么入门我会给出一条比较省时间的路径第一步是 Python 基础。不用学得很深能写循环、函数、类能处理列表和字典就够用了。第二步是 PyTorch 基础重点是理解张量、自动求导、网络模块和数据加载器这几个概念能做一个小型手写数字分类任务就算过关。第三步才是深度学习基础包括反向传播、常见网络结构CNN、ResNet、Transformer、损失函数和优化器。第四步进入检测领域先看 Faster R-CNN 和 YOLO 的原理再跑通一个开源项目的训练代码。这个顺序看起来按部就班却是效率最高的。不要一上来就死磕论文里的公式先会跑通代码再去理解原理学习曲线会平滑很多。如果你手头有嵌入式设备或特定硬件比如国产显卡还要注意框架的适配情况提前查好算子和版本支持能省去很多后面部署时的麻烦。6.2 经典论文阅读顺序与时间分配我建议的论文阅读顺序是Faster R-CNN2016理解两阶段检测框架和 RPN 机制。FPN2017理解多尺度特征融合的重要性。YOLOv3 原始论文2018理解单阶段检测的经典设计。FCOS2019理解 anchor-free 思路。DETR2020理解 Transformer 如何改变检测范式。近期综述或优秀工程报告如 YOLOX、PP-YOLOE 的技术报告。每篇论文不要花太多时间精读公式先抓四个问题它解决了什么问题核心思路是什么模型结构长什么样在 COCO 上比之前强了多少剩下的细节等做实验需要时再回头翻。如果时间充裕可以配合动手学深度学习这类中文资料一起看对理解跨窗口自注意力、损失函数这些抽象概念会有帮助。6.3 复现实验的实用建议与常见误区复现是学习检测最好的方式之一但有几个常见误区需要避开。第一个误区是从零手写检测框架。如果你只是为了学习手写一个简化版有助于理解原理但如果你想在短时间内获得可用的结果请使用 MMDetection 或 Ultralytics YOLO 这类成熟框架。它们把大量细节封装好了你可以在它们的基础上改网络结构、换损失函数效率高得多。第二个误区是盲目堆硬件。检测训练确实吃显卡但对于入门学习一张 8GB 显存的消费级显卡就足够了用 COCO 子集或 VOC 数据集训练小模型完全没问题。如果连显卡都没买也可以先用云 GPU 平台按小时租用我当年学习时很多实验都是靠云平台跑的。第三个误区是不注重可视化。检测任务比分类更容易出看着合理、实际很差的情况。训练过程中一定要把验证集的预测结果可视化出来看看框是否偏移、有没有重复框、类别是否正确。很多时候可视化发现的问题比 mAP 数值更能指导下一步调优方向。在跑通第一个检测项目之后续地就是从 70 分到 90 分的调优过程这比反复换网络架构更能提升实战水平。最后分享一个我自己长期用的小习惯每做一个检测项目我都会在项目一开始就写一个简短的评估清单把任务的容错方向、必须达到的最低 mAP、推理速度上限、硬件设备写清楚。这个清单看起来简单但它能挡住很多后期返工。图像检测这个方向虽然模型每天都在更新但核心的问题——精度、速度、数据——是不变的。把这些问题想明白再去看新论文、新模型你会发现自己很快就能判断一个算法到底适不适合自己的项目。
返回列表