
目标检测和定位这几个字在视觉领域里被绑在一起提了快十年但真做过项目的人都有一个体会检测容易定位难。分类网络告诉你画面里有一只猫这很简单检测网络要告诉你猫在哪还给出一个矩形框这就涉及回归问题如果再进一步要求把猫的轮廓抠出来、或者在地图坐标系里给出它的绝对位置那就是完全不同的复杂度等级了。这篇东西不打算写成教科书我想从一个做了多年视觉落地的从业者视角把基于图像的目标检测与定位这条技术路线从头到尾梳理一遍——它解决了什么问题、主流方法各自在做什么取舍、小目标和三维定位为什么难、以及数据标注和工程部署里有哪些文档不会写的坑。无论你是刚准备接触目标检测的学生还是已经在跑YOLO但感觉精度上不去的工程师这篇都适合你。我会把为什么这么设计讲透也会把那些只有亲手踩过坑才能总结出来的经验放进去。1. 目标检测与定位先搞懂检测和定位到底是什么关系1.1 分类、定位、检测、分割四个层层递进的任务很多人把目标检测直接等同于画框框这个理解不能说错但会限制你做方案时的思路。视觉任务里有一套经典的递进关系图像分类判断整张图像属于什么类别输出是猫或狗这种标签。目标定位在已知图像里有某个目标的前提下找出它的位置输出通常是边界框(Bounding Box)。目标检测定位的泛化版本图像里可能同时有多个目标、多种类别你要把每一个都找出来并标上类别。可以理解为分类 定位的组合。实例分割比检测更精细不只给框还要给每个目标像素级的轮廓掩码。全景分割把图像中所有像素都归到某个语义类别或某个具体实例。从这个递进关系可以看出定位是承上启下的关键环节。分类好做因为深度卷积网络天然擅长提取语义特征定位难做因为它需要模型同时具备看到目标和说清楚目标在哪的能力。实际工程里我见过不少团队模型分类精度很高但边界框结果抖动得很厉害这就是定位能力不足的表现。1.2 定位到底在定位什么四种常见的定位粒度基于图像的定位任务按照输出粒度不同可以分成四种场景边界框级定位最常规的检测输出用左上角坐标 宽高或中心点坐标 宽高描述一个与目标紧密贴合的外接矩形。自动驾驶中的车辆检测、安防中的人体检测都属于这一类。像素级定位对目标区域内的每个像素做分类输出分割掩码。医学影像里的病灶分割、遥感图像里的建筑物提取走的是这个路线。关键点级定位输出目标的几何关键点坐标比如人脸关键点检测、人体姿态估计。这种定位对空间精度要求极高1个像素的偏差可能就导致整个姿态判断错误。三维空间定位在三维坐标系下输出目标的位置和姿态包括深度信息。这是自动驾驶感知和机器人抓取的核心需求。你发现没有定位这个词在不同项目里对应的技术方案完全不同。如果上来就套用同一套检测模型往往会在像素级或三维任务上碰壁。1.3 为什么定位比分类天然难一个量级分类网络经过卷积、池化后空间信息会逐渐被压缩最后通过全局池化丢掉位置信息只保留语义信息——这正是分类任务想要的。但定位任务恰恰要求模型保留并精细地输出空间信息这就产生了本质矛盾。打个比方分类就像你在远处辨认一个人的身份你不需要知道他站在房间的哪个角落定位就像你要走过去给他递东西你必须清楚他站在哪、身高到哪、面朝哪个方向。前者是认得出后者是指得准。这个矛盾推动了检测网络的结构设计演进如何在保留空间分辨率的同时获得足够的语义信息如何处理特征图上的位置到原图位置的映射关系如何设计损失函数让回归值精准收敛——这些都是后面所有算法必须回答的问题。2. 从锚框到稀疏查询目标检测技术路线三十年2.1 传统方法阶段滑动窗口 手工特征深度学习全面接管视觉之前目标检测的主流做法是滑动窗口在图像上以不同尺寸、不同长宽比滑动窗口把每个窗口区域送到分类器里判断是目标/不是目标再用非极大值抑制合并重复的检测框。这套方案最典型的就是HOG方向梯度直方图 SVM 做人脸检测或行人检测。它的核心瓶颈也很明显候选区域数量爆炸。一张普通图像要滑出数万个窗口而其中绝大多数都是背景计算开销大、效率极低。后来出现了Selective Search选择性搜索通过区域合并算法先筛选出可能包含目标的候选区域把送入分类器的窗口数量从数万降到两千左右这就是接下来的R-CNN的雏形。2.2 两阶段检测精度优先R-CNN 家族2014年R-CNN的提出是目标检测进入深度学习的标志。思路其实很朴素用Selective Search生成候选区域把每个候选区域裁剪出来缩放到固定尺寸再用卷积神经网络提取特征最后用SVM分类、用回归器精修边界框。R-CNN的问题也显而易见两千个候选区域要独立过一遍卷积网络训练慢、推理更慢。后续的Fast R-CNN把特征提取统一为整图一次前向引入感兴趣区域池化RoI Pooling把不同尺寸的候选区域映射到固定尺寸特征Faster R-CNN更进一步用区域提议网络RPN取代Selective Search把候选区域生成也变成了网络的一部分。这两代的关键改进本质都是把串行、离散的处理变成并行、可微的端到端流程。Faster R-CNN奠定了两阶段范式在精度上限上长期领先。代价是速度始终上不去一帧图像至少要跑两个网络模块。2.3 单阶段检测速度与精度的博弈YOLO 与 RetinaNetYOLOYou Only Look Once另辟蹊径把检测当作一次回归问题图像一次前向直接输出所有目标的边界框和类别。第一代YOLO把图像划分成S×S的网格每个网格负责预测固定数量的框逻辑简单粗暴推理速度达到实时但定位精度不如两阶段小目标检测更是灾难。后续的YOLO版本做了大量修正YOLOv2引入锚框机制和批量归一化YOLOv3用多尺度特征图分别检测不同尺寸的目标把暗黑风格的Darknet框架和FPN特征金字塔网络玩到了极致。到YOLOv5之后YOLO已经成为工业落地的事实标准——它不再是一个单纯的研究产物而是贴近工程部署的系列。单阶段网络一度受困于一个核心难题正负样本极度不平衡。图像里绝大多数锚框都是背景模型容易偏向输出无目标的预测导致训练不收敛。RetinaNet用Focal Loss解决了这个问题通过调整难易样本的损失权重让模型把注意力集中在那些像目标又不完全是的难分样本上。2.4 Anchor-Free 与 DETR重新定义如何预测位置锚框机制不是没有代价。锚框的数量、尺寸、长宽比都是超参数需要针对数据集调优训练时正负样本的匹配规则也相当繁琐。于是Anchor-Free方法出现了FCOS直接预测目标中心点到边界框四边的距离CenterNet预测目标的中心点和宽高。这类方法把检测从在预设框之上做修正变成了直接回归目标几何简化了训练流程。再到2020年DETR把目标检测彻底改造成了一个集合预测问题用Transformer的注意力机制让一组可学习的查询向量(Query)直接输出固定数量的目标集合生拉硬拽地让网络自己学会注意到每个目标位置彻底抛弃了锚框和NMS后处理。DETR的里程碑意义在于第一次让检测任务的pipeline简洁到输入图像、输出集合不再依赖一堆手工设计的组件。不过它的训练收敛慢对小目标不友好后来Deformable DETR用可变形注意力做了修正。国内团队提出的RT-DETR则在实时性上做到了跟YOLO系列掰手腕。2.5 怎么选两阶段、单阶段还是查询式工程上做选型我的经验是看三个问题精度要求、算力预算、目标尺度分布。方案代表算法精度速度适用场景两阶段Faster R-CNN、Cascade R-CNN高慢精度优先的离线分析单阶段YOLO系列、RetinaNet、FCOS中高快实时视频流、边缘部署查询式DETR、Deformable DETR、RT-DETR高中复杂场景、需端到端训练的科研项目3. 定位的核心机制边界框回归、损失函数与评价指标3.1 边界框回归到底在回归什么检测模型的定位分支看似简单——输出四个数值中心点x、中心点y、宽w、高h实际上这四个数值的定义方式直接决定了训练难度。锚框机制下模型预测的是相对锚框的偏移量中心点偏移量用归一化坐标表示宽高用对数尺度表示。为什么要归一化和对数编码因为不同尺寸的目标其绝对偏移量的数值范围差异极大——大目标偏移100个像素很正常小目标偏移5个像素就已经很大了。通过归一化和对数变换把不同尺度的回归目标压到相近的数值范围网络更容易收敛。Anchor-Free方法里CenterNet直接预测中心点坐标和宽高并用一个高斯热图来辅助中心点定位——把目标中心点做成一个二维高斯分布让网络的分类分支预测热力图回归分支预测宽高。这种方式把定位拆成了两部分中心点检测本质上是一个密度估计问题 尺寸回归一个简单回归问题。3.2 从IoU到CIoU损失函数如何影响定位精度早期检测模型用Smooth L1损失做边界框回归但它的问题是优化目标和评价指标不一致。评价一个框好不好用IoU预测框和真实框的交并比但Smooth L1并不直接优化IoU。IoU Loss的提出解决了这个不一致但它有个数学缺陷当预测框和真实框不相交时IoU为0梯度也为0模型学不到东西。GIoU引入了最小外接矩形面积作为惩罚项让不相交的情况也有梯度DIoU在GIoU基础上直接优化两个框中心点的距离CIoU再加一项长宽比惩罚让框的形状更贴近目标。实际上CLoU、SIoU、EIoU等变体也都存在核心思路都是给原始IoU加上各种几何约束先验。工程里我建议直接从CIoU开始用它在大多数场景下表现稳定。有一个很多人忽略的细节损失函数的权重。定位损失和分类损失如果权重不平衡会出现框很准但类别错或类别对但框偏的诡异情况训练时要把定位损失的权重适当调高。3.3 评价指标mAP 与定位精度的真实关系mAP是目标检测最常用的评价指标由精确率和召回率综合而来。但很多初学的人没注意到mAP的计算依赖于IoU阈值。mAP0.5IoU阈值0.5只要预测框和真实框重叠度超过50%就算检测正确这个标准对定位精度要求很宽松。mAP0.75IoU阈值0.75要求严格得多才能反映模型框得准不准。mAP[0.5:0.95]从0.5到0.95每隔0.05取一个阈值计算平均这是MS COCO的标准也是目前公认最接近真实定位水平的指标。你做一个检测项目如果只看mAP0.5很可能得到虚高的精度一旦换成mAP0.75性能立刻打回原形。所以做项目汇报时一定要同时报这两个指标尤其是当你的应用场景对定位精度要求高时比如机械臂抓取、自动驾驶车道线感知mAP0.75才有参考意义。3.4 热图、关键点与像素级定位的进阶场景除了边界框还有一种常见定位范式是关键点定位。CenterNet预测目标的中心点热图本质就是关键点定位思想人脸关键点、人体骨骼关键点检测同样用热图回归。热图回归的好处是天然保留了空间位置信息。把标注的关键点坐标渲染成高斯峰网络学习的是每个像素离关键点有多近预测时取热图最大值位置即为关键点坐标。这个范式对遮挡也更鲁棒——一个关键点即便被遮挡热图可能仍然有一个较弱的峰不至于完全丢失输出。像素级定位分割则是把哪里是目标细化到每个像素。语义分割用FCN、U-Net、DeepLab等结构实例分割用Mask R-CNN——在Faster R-CNN的检测头旁边加一个掩码分支同时输出边界框和像素掩码。如果你的应用场景需要的不只是目标在哪还要知道目标长什么样那检测和分割通常是一起做的。4. 小目标检测一个被低估的硬骨头4.1 小目标为什么难信息量不够特征是挤出来的小目标检测难不是玄学有明确的物理原因。以MS COCO数据集的定义为例面积小于32×32像素的目标即为小目标。在标准检测网络里输入图像通常被缩放并经过几次下采样一个32×32的目标在最后一层特征图上只剩2×2或更小的区域——几乎不具备任何可辨识的语义信息。这么说吧大目标像一张海报离远了也能看出内容小目标像一张名片上的细体字必须凑很近才能看清笔画。CNN每下采样一次分辨率就砍半名片的笔画直接被抹掉了。此外小目标在数据集中天然数量少、正样本稀疏模型就会偏向学会忽略它们把它当成背景噪声。4.2 提升小目标检测的常用手段解决小目标检测的思路大致可以分为三个方向多尺度特征融合FPN特征金字塔网络及其变体是目前最主流的方案。浅层特征空间分辨率高但语义弱深层特征语义强但分辨率低FPN通过自顶向下的路径和横向连接把两者融合让每一层特征都同时具备高分辨率和语义信息。YOLOv3开始就用这个思路做多尺度检测。图像超分辨率重建直接把小目标放大再做检测。近年来的趋势是把超分辨率网络作为检测的前置模块专门增强小目标区域。热词里提到的图像超分辨率重建跟小目标检测有很强的关联性——如果硬件受限不能提高输入分辨率超分是保持精度的可行路径。要注意的是通用超分模型对小目标不一定有效需要针对检测任务做联合训练。数据侧增强对小目标做复制粘贴增强——把小目标从原图中裁剪出来随机粘贴到其他图像中增加小目标的数量和多样性。这种方法在YOLOX、Scaled-YOLOv4等算法中都有应用被证明非常有效。还有一种简单粗暴的方法是切图训练把大图切成多块小图分别送入网络相当于把远处的名片拉近来看。4.3 红外小目标检测和可见光的思路完全不同有关红外小目标检测的热词让这个方向重新进入视野。红外成像中远距离目标往往只有几个像素没有纹理、没有清晰轮廓信噪比极低常规检测算法完全失效。红外小目标检测的评价标准也和可见光不同常用指标包括信杂比增益SCRG、背景抑制因子BSF、检测率与虚警率的曲线等。算法上更偏向图像滤波、局部对比度方法、低秩稀疏分解如IPI模型以及近年来基于深度学习的单帧检测。如果你的场景需要做红外小目标项目不要直接套用YOLO——它的设计假设是目标有足够的外观特征而红外小目标恰恰没有。4.4 遥感图像中的小目标问题遥感图像标注与目标检测是热词里很突出的一条线。在遥感影像里车辆、船只、飞机在地面分辨率有限的情况下常常就是几十个像素的小目标而且方向任意、背景复杂地物遮挡、阴影、相似纹理。通用检测模型在遥感数据上直接迁移效果通常不佳需要针对遥感图像的特点做方向框检测旋转边界框、多尺度训练和专门的背景挖掘。遥感图像标注本身也比普通自然图像更费人力——大面积无目标区域会严重拉低正样本比例标注时容易出现漏标、错标而漏标的小目标在训练时会直接变成假负样本干扰模型收敛。5. 数据、标注与训练策略决定精度的隐藏因素5.1 标注格式与工具选错会后悔目标检测的数据标注格式五花八门最常遇到的有三种PASCAL VOC格式XML文件每个目标用xmin ymin xmax ymax表示边界框。MS COCO格式JSON文件图像、标注、类别分别用ID关联边界框格式是[x, y, width, height]支持分割多边形。YOLO格式TXT文件每行一个目标格式为class_id center_x center_y width height并且所有坐标都归一化到0~1之间。工具方面LabelImg是老牌的选择适合边界框标注Labelme支持多边形、线段、关键点等多类标注热词里也出现了。这里有一个被低估的细节标注工具输出的格式和训练框架需要的格式之间的转换脚本最好在项目一开始就写好并测试通过。很多团队做到一半发现几个月标注的数据格式不兼容重新转换和清洗的花费远超预期。5.2 标注质量对定位精度的影响标注框边界画得粗一点点对分类任务可能没影响对定位任务却是灾难——因为回归任务是在拟合标注框的精确坐标如果标注本身抖动模型学到的就是一个模糊的映射预测框也会跟着抖。我实测过一组对比同一批图像精细标注边界紧贴目标边缘和粗糙标注边界多出5~10像素相比训练出的模型mAP0.75差距可能达到3~5个点。标注长尾目标时还有一个常见问题类别样本极度不平衡。比如鸟类目标检测数据集常见的鸟有几千张罕见的种类只有几十张模型会倾向于偷懒把罕见类别归类到常见类别或者干脆漏检。处理办法是用重采样、类别加权损失或用数据增强扩充罕见类别。5.3 训练策略中的关键细节训练检测网络有几个隐藏的经验值输入分辨率精度上不去时先把输入分辨率提高一档试试。代价是显存和时间翻倍但往往精度提升立竿见影。冻结骨干网络预训练权重迁移学习时先在冻结状态下跑几个epoch通常5~10个学习和调整的是检测头再解冻骨干微调。这个策略能避免预训练权重被大幅破坏。多尺度训练Mosaic增强把多张图拼接成一张训练图不仅增加样本多样性还让模型天然适应不同尺度。YOLOv4之后几乎成了标配。难例挖掘训练一段时间后把模型漏检和误检最严重的样本挑出来单独补充到训练集里做回炉。这个操作枯燥但效果极好工程上叫做hard examples mining。5.4 可用数据集与数据生成热词里提到鸟类目标检测的数据集这类特定领域的数据集往往很难找。通用数据集COCO、VOC、OpenImages覆盖广泛但特定类别不全领域专用数据集需要自己收集和标注。如果数据量严重不足可以考虑用合成数据——在渲染场景中生成目标图像再标注真值用于模型预训练或补充训练。合成到真实域之间的差异是一个坑通常需要域适应技巧或混合训练。6. 模型落地从训练到可用的最后一公里6.1 轻量化模型与算力适配训练好一个模型只是开始真正的问题是把它跑起来。热词里的macs仅5MB的目标检测模型指向的就是轻量化趋势——在移动端、嵌入式设备上运行检测模型体积和计算量是硬约束。YOLOv5n、YOLOv8n、NanoDet、EfficientDet-Lite等都是轻量化代表体积在几MB到十几MB之间适合边缘部署。选轻量化模型时不要只看参数量或模型体积要关注实际的计算量FLOPs和推理延迟ms。模型体积小但计算量大在CPU上照样跑不动。最好的方式是在目标硬件上实测一遍跑你的真实视频流或图像集记录花费的时间和每帧占用内存。6.2 模型导出与推理部署格式转换的坑训练框架PyTorch、TensorFlow或Darknet的模型不能直接用于生产。通常要把模型导出为ONNX格式再转为TensorRTNVIDIA GPU加速、OpenVINOIntel CPU/VPU或CoreMLApple芯片。这个过程最常遇到的坑包括算子不兼容如某些自研模块或部分注意力机制导出失败需要改写为标准算子。动态尺寸问题生产环境需要检测任意尺寸图像但很多部署引擎对固定尺寸做了深度优化动态尺寸会带来额外开销。NMS后处理不同部署方式的NMS实现不一样输出结果的排序和去重逻辑可能和训练框架有细微差异导致同一个模型在部署后mAP轻微下降这个问题极其隐蔽容易被忽视。我个人的建议是项目一开始就要确定部署目标和推理引擎然后再选择训练框架和模型结构。否则训练完发现无法导出或算子不兼容回头的成本很高。6.3 真实项目里的踩坑记录最后分享几个我做目标检测类项目时踩过的实际教训第一类别不均衡会严重干扰定位。我做过一个场景数据里90%是人10%是其他物体。模型对人的分类精度很高但对小类别物体的框始终不准。后来用Focal Loss 类别重采样给稀少类别更高的损失权重问题才缓解。第二漏标就是给模型下毒。一次项目里模型在一个固定区域频繁误检出一个不存在的目标。排查了很久发现是因为训练集里有一部分图像漏标了那个位置的物体——模型学到了那个位置经常有东西但不知道它是什么。重标数据后误检立刻消失。第三视频流里的定位抖动比单帧精度更头疼。单帧检测mAP很高但视频连续播放时目标框一跳一跳的体验很差。处理思路有三种调低分类置信度阈值但保持NMS严格度、对目标中心点做时序平滑滤波、用跟踪算法ByteTrack、DeepSORT把检测结果串起来。很多视觉项目最后拼的不是单帧精度而是时序稳定性。第四标注和测试集要分开。听起来是废话但我见过团队把标注好的数据不做划分就全部送进训练集最终模型精度虚高上生产被真实数据打爆。标准化操作是随机划分训练/验证/测试集确保测试集和训练集没有来自同一视频或同一场景的帧否则指标的参考价值就大打折扣。6.4 三维目标检测与多模态定位的下一个阶段关于三维目标检测和多模态目标检测这两个方向简单说几句。三维目标检测要在三维空间输出目标的长宽高、中心点坐标和朝向角。输入可以是点云、双目图像、单目图像或多传感器融合。纯图像做三维检测极具挑战——单目图像天然缺少深度信息要从像素和几何先验中恢复尺度常被调侃是戴着深度近视镜猜距离。点云方案精度高但成本高多模态融合相机雷达是自动驾驶的主流趋势。多模态目标检测则引入了文本、语音、红外等跨模态输入。比如视觉-语言导航根据一句走到红色椅子旁的指令模型要同时做目标检测和自然语言理解把文本描述映射到图像区域。热词里提到的a图像ai图像虽然指向不明但生成式AI与检测结合的方向确实在升温——用大模型生成训练数据、用语言描述做开放词汇检测如Grounding DINO这类方法正在快速改变检测任务的玩法。说到三维定位有一个和日常应用绑得很紧的热词是定位权限和手机定位这属于基于信号和传感器的定位技术和图像定位是不同的技术栈。图像领域做三维定位最常用的是PnPPerspective-n-Point问题已知目标在图像中的二维像素点和目标的三维模型点对应关系求解相机到目标的位置姿态。这在AR增强现实和视觉抓取中都有应用核心是相机标定要准——相机内参稍微偏一点远端目标的定位误差会被放大好几倍这个坑做机器人抓取时几乎必踩。7. 聊到最后从图像到坐标永远不要低估闭环验证虽然标题是概述但我还是想在最后唠叨一句真正重要的东西。无论你选哪条技术路线、用哪个框架、调哪种损失函数目标检测和定位的落地永远绕不开一件事闭环验证。模型在测试集上分数高不是终点把模型接上真实摄像头、跑在目标设备上、观察它在天气变化、光照变化、遮挡和运动模糊下的表现并回到数据和标注层面做迭代这才是视觉项目真正要完成的循环。个人经验是无论是什么算法的项目都建议在前期预留20%左右的精力做数据质检和评测流程搭建。很多团队把标注当体力活把评测当成最后跑一下指标结果等到项目后期才发现数据有系统性偏差——比如所有标注框都比目标大了一圈、某个类别的样本全部来自同一场景。这些问题在早期靠少量可视化抽查就能发现拖到后期改起来成本成倍上升。这篇文章从任务定义、技术路线、定位机制、小目标难题、数据与训练、部署落地几个角度把基于图像的目标检测与定位梳理了一遍。里面提到的每一条经验几乎都是我被实际项目教育过之后才真正理解的。希望你在做自己的项目时少踩一点我踩过的坑。