资讯详情

目标检测入门:从IoU、NMS到Anchor与mAP核心概念全解析

📅 2026/10/15 13:33:18 | 华诺云谱 👁 阅读
目标检测入门:从IoU、NMS到Anchor与mAP核心概念全解析
1. 这一篇章在学什么跟到第二十八篇总算开始摸到目标检测的门了说句实话学到第二十八篇的时候我对CS231n这门课的节奏已经有了点感觉。前面的笔记基本围绕图像分类这条主线从线性分类器、Softmax、反向传播一路走下来再到卷积网络的各种架构变体、训练技巧和迁移学习每一步都算是按部就班。但第二十八篇不一样它把我从“给一张图打一个标签”这个舒适区里拽了出来推到了一个更接近真实应用的问题上目标检测。如果你之前没有接触过这个概念我用一句话给你讲明白图像分类是回答“这张图里有什么”目标检测是回答“这张图里有什么、它在哪里、有几个”输出的是若干组“类别 坐标框”。这一步看起来只是多了一个定位任务但整个思路、网络结构、评价方式、调参逻辑全都得换一套。这篇笔记我反复看了好几遍也把关键内容整理成了自己能复现的完整流程。说实话课程到了这个阶段代码和数学开始真正咬合在一起。如果你也想彻底搞懂目标检测这条线建议你重点抓住四个关键词IoU、NMS、Anchor、mAP。这四个概念是这个领域的“通用语言”后面不管读代码、看论文、调模型翻来覆去用的都是这些东西。我会先把第二十八篇笔记里的核心思路拆开讲透再补上我自己跑实验时用到的环境、参数和踩坑记录最后给你一份可以直接拿去参考的避坑清单。这篇笔记适合两类人一类是刚学完CNN基础、准备进入检测方向的同学另一类是已经跑过目标检测代码但对损失函数、评估指标和网络设计逻辑有点“只可意会不可言传”感觉的朋友。2. 核心思路拆解为什么目标检测不是“更好用的分类”2.1 分类与检测的本质差异我最早犯过的一个认知错误是把目标检测理解成“分类 切图”先找几个候选区域然后每个区域跑一遍分类不就成了检测吗这个思路逻辑上没错早期也确实是这么干的但它有一个致命问题找不到“到底该切哪块”。一张图里物体大小不一、位置分散、数量不定如果靠滑动窗口计算量直接爆炸如果靠外部算法提候选框又容易漏检、错检。所以目标检测真正的难点不在分类而在“如何高效地找出物体在哪”。课程里从这个问题出发引入了两个关键思路把定位问题建模成回归问题让网络直接输出框的坐标值。在空间上划分密集预设位置让网络判断每个位置附近是否存在目标。这两条思路后来分别长成了目标检测的两大流派两阶段检测器和单阶段检测器。第二十八篇笔记的核心就是帮你把这两大流派放到同一张图谱里去理解而不是让你单纯背几个网络结构。2.2 两阶段与单阶段两条截然不同的技术路线两阶段检测器典型代表是R-CNN系列。它的基本逻辑是先用区域提议网络或者选择性搜索方法找出可能含物体的候选框这一步叫“提候选区域”然后再对每个候选区域做分类和边框精修这一步叫“精修尺寸”。整个过程分两步走精度高但速度慢因为候选区域数量多每个都要过一遍分支网络。单阶段检测器典型代表是YOLO和SSD。它的基本逻辑是把整张图划分成网格每个网格直接预测“这里有没有目标、目标是什么类、框长什么样”不单独设计候选区域提取阶段。整个过程一步到位速度快但早期版本精度不如两阶段方法。三十讲的课程把这两条路线放在一起讲是有深意的。它们不是简单的快慢对立而是在“是谁来做定位”这件事上给出了完全不同的答案两阶段方法用专门模块做定位单阶段方法把定位融入主干网络的分支里。你把这句话记住后面读各种论文时会发现很多改进无非是在回答“定位到底该多专、多快、多准”。2.3 贯穿全程的四个核心概念第二十八篇笔记的一大半内容其实都在反复使用四个基础概念。我建议你在正式看模型结构之前先花一点时间把这四个概念吃透否则后面看损失函数、评估曲线都会觉得像在看天书。第一个是IoU全称交并比用来衡量两个框的重合程度。计算公式很简单两个框相交区域的面积除以并集区域的面积。IoU等于1说明完全重合等于0说明完全不相交。检测里经常用IoU来判断一个预测框是否“匹配上了”真实框比如IoU大于0.5就算命中。第二个是NMS全称非极大值抑制。它是用来解决“同一个物体被多个框围绕”的问题的。模型推理时经常会对一个目标输出很多个置信度相近的框NMS的做法是先按置信度排序取最高分框然后把所有与它IoU超过某个阈值的框删掉再对剩余框重复这个过程最后留下的就是稀疏、干净的检测结果。第三个是Anchor中文翻译成锚框或先验框。它是一组预先设定好尺寸和比例的参考框网络不直接回归绝对坐标而是回归“相对这个锚框的偏移量”。这个设计极大降低了回归难度但也带来了新的调参问题锚框的数量、比例、尺度都要按数据集定制。第四个是mAP平均精度均值是目标检测最常用的评估指标。它的计算核心是在不同置信度阈值下画出Precision-Recall曲线计算曲线下的面积再对所有类别求平均。mAP越高说明模型在“准”和“全”之间平衡得越好。这四个概念我后面会在实操部分反复用到如果你看到哪句话觉得卡住了回来对照这一小节基本就能接上。3. 核心细节解析与实操要点那些视频里反复强调的重点3.1 边框回归的数学含义网络到底在回归什么很多人第一次看检测损失函数时会有个疑惑那四个坐标值到底是什么坐标是绝对坐标还是相对坐标课程里比较强调的一点是早期目标检测网络并不直接回归绝对坐标尤其是在基于Anchor的方法里网络输出的通常是一组“相对偏移量”。假设锚框的中心坐标是$(x_a, y_a)$宽高是$w_a, h_a$目标的真实框中心是$(x, y)$宽高是$w, h$那么网络要学习的回归目标就长这样$$ t_x \frac{x - x_a}{w_a}, \quad t_y \frac{y - y_a}{h_a} $$ $$ t_w \log\frac{w}{w_a}, \quad t_h \log\frac{h}{h_a} $$为什么要用这样的形式因为绝对坐标的数值范围波动太大不同尺寸的物体都直接回归像素值网络很难收敛。而除以锚框的宽高之后$t_x$和$t_y$变成了一个相对位移量纲被统一了训练就稳定得多。同理宽高用对数形式是为了把“比例变化”变成“差值变化”这样小目标和大目标在损失里受到的权重不会差太多。这个细节如果只是看视频很容易忽略但亲自写损失函数时会是个大坑。我见过有人直接用绝对坐标做回归损失结果小目标全丢后期反复调学习率也没救回来。所以看第二十八篇笔记时重点关注一下“回归目标是怎么构造的”这句话它比背一遍损失函数公式更有用。3.2 NMS阈值怎么选0.5和0.3带来的结果完全不一样NMS虽然是一个非常朴素的算法但它的阈值选择直接影响最终可视化效果。我自己的习惯是分两种情况如果任务是“密集场景检测”比如行人检测、车辆检测物体本来就靠得近NMS阈值可以适当调高一点比如0.6到0.7避免把相邻真实目标的框误删掉。如果任务是“稀疏场景检测”比如工业缺陷检测物体数量少但背景干扰多NMS阈值可以调低一些比如0.3到0.4宁可少框也不要输出一堆重叠框。课程里有一张NMS的示意图特别直观一堆重叠框在经过NMS之后最终只留下置信度最高的一个。你如果只看图会觉得“这不是很简单吗”但实际跑到数据上阈值怎么定、置信度排序是否合理都会影响最终效果。我建议你把NMS阈值当成一个超参数来对待在自己的验证集上多试几个值而不是永远用默认的0.5。3.3 Anchor设计的“人味”和“机器味”Anchor这个设计我一直觉得它是最能体现“工程经验”的部分。它不是一个纯粹的数学结论而是从统计观察里来的。怎么理解呢比如一个数据集里大部分物体的宽高比可能集中在0.5到2.0之间尺寸集中在几十到几百像素。如果你按这个分布预设Anchor网络一开始就有了一批“不太离谱”的起始框回归任务自然就简单了。反过来如果你随便设Anchor预设框和真实框的初始IoU普遍很低网络训练会非常吃力甚至不收敛。所以在第二十八篇笔记里强烈建议你在动手训练之前先统计一下自己数据集的框分布每张图有多少物体物体宽高分布集中在什么范围宽高比大概是多少。拿这些统计结果去设计Anchor参数而不是照搬别人数据集上的配置这一点算是“看了无数遍论文才真正明白”的教训。3.4 损失函数里容易踩的坑正负样本不平衡目标检测的损失函数和分类任务很不一样它天然面临一个“正负样本不平衡”的问题。什么意思一张图里有大量锚框但真正和目标匹配上的锚框只有很少一部分大部分都是背景框。如果让所有框都平等参与损失计算模型会被背景框带偏学到“什么都别输出损失也很低”的懒惰解。我在第二十八篇笔记里学到的处理方式核心是控制正负样本比例。一种常见做法是在训练时对负样本做随机采样让正负样本比例保持在1比3左右另一种做法是在损失函数里给正样本和负样本分配不同的权重。这个问题直到今天仍然活跃在各大检测论文里由此可见它的重要性。顺便提一句判断一个锚框是正还是负用的就是前面说的IoU锚框和某个真实框的IoU大于正样本阈值就算正样本小于负样本阈值就算负样本中间区域在R-CNN系列里通常会被忽略。4. 实操记录把目标检测流程完整跑通一次4.1 环境准备与数据集处理因为我是在课程第七期的环境里做实验所以环境方面没有太折腾。如果你是自己搭环境推荐按这个组合来Python 3.8PyTorch 1.10到2.0之间CUDA 11.3及以上至少一张显存6GB以上的显卡数据集方面我建议新手不要一上来就上大规模数据集先准备一个类别少的微型数据集甚至自己标注几十张小图都行。目的不是为了刷精度而是为了把流程跑通。流程跑通了后面换大数据集只是时间和参数的事。我这次用的数据集是一个模拟项目X的检测集一共只有两个类别都是日常物品。我先把数据整理成标准格式每张图片对应一个同名文本文档里面是“类别 中心x 中心y 宽度 高度”坐标值做了归一化处理全部在0到1之间。这里有一点要提醒你不同框架对标注文件格式的要求不同。如果用的是某个开源检测框架一定要先看你选的那个框架自己带的数据组织方式再决定怎么整理标注。我就曾经因为标注格式里多写了一个类别编号而报错排查了半小时。4.2 训练参数的参考配置训练时我参考了课程里推荐的配置再根据自己的数据集调整了几个关键参数。直接贴出来给你参考参数名建议值备注输入图片尺寸640x640小数据集用512也行看你显存训练轮数150到200小数据集收敛很快别贪多初始学习率0.01配合每20轮衰减0.1优化器SGD带动量0.9Batch Size8到16显存不够就降到4类别数按自己数据集设我这里设的是2NMS置信度阈值0.05推理时先用低阈值多保留框NMS IoU阈值0.5微调阶段可以试试0.45这里有一个细节我特别想强调初始学习率0.01在检测任务里不是万能的。如果你的损失在训练早期直接发散先把学习率降10倍试试通常马上就会稳定下来。我之前以为学习率越大收敛越快结果在检测任务里吃了大亏训练了50轮损失还在天上飘最后降学习率重新训才正常。4.3 训练过程的观察重点训练开始之后不要只盯着一两个数值看我建议你重点看三个地方第一是总损失曲线的下降形态。正常来说检测损失应该在前面几十轮快速下降后面进入平台期偶尔有小抖动但不至于飙升。如果损失下降很慢梯度可能被负样本淹没了检查一下正负样本采样策略。第二是类别损失的下降情况。类别损失降不下去排查顺序是正样本是否太少、锚框是否完全没有和真实框匹配上、类别是否写错。第三是回归损失的走势。回归损失下降平缓是一个正常现象因为坐标回归本身比分类要难学。如果回归损失完全不下降很可能是锚框设计太不合理初始IoU全部过低模型压根找不到学习方向。训练完成之后我会在验证集上算一次mAP。第一次跑通mAP只要不是0就已经算成功了。我这次的模拟项目X两个类别最终mAP在0.6左右属于能用的状态但离部署还有距离。4.4 推理可视化一张图看出模型好坏训练完模型之后光看指标是不直观的一定要把检测结果画出来看。我的习惯是写一个几行的推理脚本把图片输入模型经过坐标解码和NMS之后再把框和置信度画到原图上。这一步虽然简单但对于判断模型好坏特别有用。比如一个框置信度很高但位置完全偏了那你基本可以断定回归头出了问题如果两个同类物体紧挨着NMS却只留下了一个说明NMS阈值设得太低如果你在大片背景里看到很多假框说明正负样本损失权重可能没配好。课程里第二十八篇笔记也专门讲到这个部分我觉得它想表达的核心意思是检测模型不是训练完看个loss就叫完事你应该反复在图上做定性观察发现问题、反推原因、再回到训练配置里去修正。5. 常见问题与排查技巧实录这部分的学习笔记里藏着的避坑指南5.1 高频问题速查现象可能原因排查与解决办法损失完全不动学习率过小或模型没进入数据流先把学习率调回0.01打印每批次的输入输出形状确认数据没问题损失直接发散到NaN学习率过大或输入标签格式异常降低学习率10倍检查标注坐标是否越界mAP很低接近0锚框设计与数据集不匹配统计数据集中目标的宽高分布重新设置锚框推理结果全是重复框NMS阈值过高或置信度阈值过低调低NMS的IoU阈值提高置信度阈值再过滤一次小目标全部漏检下采样倍数过大特征图分辨率不足使用更高输入分辨率或在网络结构里加入浅层特征融合类间严重混淆标注数据类别边界不清检查标注样本增加误分样本的权重这张表是我把第二十八篇笔记的问答汇总和我自己翻车经历合在一起整理的。你如果遇到类似问题按表格顺序排查大概率能少走很多冤枉路。5.2 我印象最深的两个翻车现场第一个翻车现场是“训练正常但推理时根本画不出框”。我排查了一晚上最后发现是坐标解码时忘记把预测值映射回原图尺寸结果所有框都缩在了画面左上角的几十个像素范围里。这个问题看起来低级但真的特别容易发生尤其是你从分类任务转到检测任务的第一周完全意识不到输出坐标还要做反向变换。第二个翻车现场是“mAP一直上不去”。我试了很多调参最后发现问题出在数据集本身我有一小部分框标注得偏大把背景也算进去了导致正样本定义失效模型学到的框整体偏大。重新修正标注之后mAP直接涨了10个点。所以说到底检测任务里数据质量的影响经常比模型结构还大。5.3 调参心得与实操建议说几句掏心窝的话。目标检测这部分的课程内容和前面分类部分的节奏很不一样知识密度大、概念多、公式杂如果你只是看视频不做实践大概率一周之后就只剩个模糊印象了。我自己的方法是每看完一小节就停下来给自己提三个问题——“这一节解决了什么问题”“它在这个领域里属于哪个流派”“如果让我自己实现我会卡在哪里”。然后带着问题去跑代码、改参数效果比一遍遍刷视频好得多。具体到第二十八篇笔记我给你的建议是把“定位”当成一个独立问题去理解不要总是用分类的思路去套。分类看重的是全局特征检测看重的是局部定位能力和多尺度处理能力这两者的思维模型完全不同。一旦你转过了这个弯后面再看更复杂的网络结构会轻松很多。最后分享一个我一直在用的小习惯每次跑完一个目标检测实验我都会把当时的配置和图像可视化结果截图留档同时顺手记录一句“这次实验与上次相比改了什么、影响是什么”。等时间久了你会整理出一份属于自己的调参经验库这份东西比网上看来的任何教程都值钱。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑