3、深度学习基础回顾:卷积神经网络(CNN)核心概念、锚框(Anchor Box)机制、非极大值抑制(NMS)、交并比(IoU)计算原理
做目标检测,光会调API可不行。你得把底层的几个核心概念吃透。今天咱们就聊聊CNN、锚框、NMS和IoU。这些是YOLO的骨架,理解了它们,后面调参、改模型才有底气。
本章核心脉络:CNN负责“看”和“提取特征”,锚框负责“猜位置”,IoU负责“算重叠”,NMS负责“去冗余”。四者串联,才构成一个完整的目标检测推理链路。
3.1 卷积神经网络(CNN)—— 特征提取的“眼睛”
CNN说白了就是一套自动找特征的过滤器。我刚开始接触时,总觉得它很玄乎。后来在项目里调试一个车牌识别模型,才真正体会到——卷积核就是特征探测器。
一个典型的CNN包含这几层:
- 卷积层:用滑动窗口(卷积核)扫描图像,提取边缘、纹理等低级特征,再组合成高级语义。
- 激活层(ReLU):去掉负值,增加非线性。没有它,网络再深也只是线性变换。
- 池化层:下采样,缩小特征图尺寸,同时保留主要信息。我习惯用最大池化,效果稳定。
- 全连接层:把特征图拉平,做最终分类或回归。
在YOLO里,CNN负责把输入图片变成一堆特征图。这些特征图里藏着物体的位置、类别和置信度信息。嗯,这里要注意——YOLO用的是全卷积网络,没有全连接层,这样能处理任意尺寸的输入。
我的经验:别把CNN想得太复杂。你可以把它理解成一个“特征压缩器”——输入一张图,输出一组有意义的数字。我在做工业缺陷检测时,发现浅层特征关注纹理,深层特征关注形状。理解这个,对调优很有帮助。
3.2 锚框(Anchor Box)—— 预设的“形状模板”
锚框是什么?说白了就是一组预设的矩形框。它们代表了你希望检测到的物体可能出现的形状和大小。
YOLO v3用了9个锚框,分3个尺度。每个尺度3个框。为什么是9个?因为COCO数据集里的物体形状大致能聚成9类。我曾在项目中自己聚类过锚框,效果确实比默认的好——锚框越贴合你的数据集,模型收敛越快。
| 特征图尺度 | 感受野 | 锚框尺寸(宽×高) | 适合检测 |
|---|---|---|---|
| 13×13 | 大 | (116×90), (156×198), (373×326) | 大物体(如汽车、行人) |
| 26×26 | 中 | (30×61), (62×45), (59×119) | 中等物体(如瓶子、书) |
| 52×52 | 小 | (10×13), (16×30), (33×23) | 小物体(如鸟、手机) |
每个锚框会预测4个偏移量(tx, ty, tw, th)和1个物体置信度,再加上类别概率。最终解码成真实的边界框。
避坑指南:我曾经在训练一个无人机视角的检测模型时,直接用YOLO默认锚框,结果小目标召回率极低。后来用K-means对训练集标注框重新聚类,换了锚框,mAP直接涨了5个点。所以——锚框一定要跟你的数据走。
3.3 交并比(IoU)—— 衡量“框得准不准”
IoU就是两个框的交集面积除以并集面积。值越大,说明两个框越重合。
公式很简单:
IoU = (A ∩ B) / (A ∪ B)
取值范围0到1。0表示完全不重叠,1表示完全重合。在YOLO里,IoU有三个关键用途:
- 训练时:判断锚框是否匹配真实目标(通常IoU > 0.5就算正样本)。
- 评估时:计算mAP,判断预测框是否算正确检测。
- 后处理时:NMS用它来去重。
你想想看,如果IoU阈值设得太低(比如0.3),很多不准确的框也会被算成正确;设得太高(比如0.9),又可能漏掉一些接近的检测。我一般习惯在验证集上调一下这个阈值,找到最佳平衡点。
代码小贴士:计算IoU时,注意坐标格式。YOLO用的是中心点+宽高,但计算IoU需要左上角和右下角坐标。记得转换,否则算出来全是错的。我踩过这个坑。
3.4 非极大值抑制(NMS)—— 去掉“重复框”
模型预测时,同一个物体周围会冒出很多框。NMS就是把这些冗余框干掉,只保留最好的那个。
流程很简单:
- 把所有预测框按置信度从高到低排序。
- 选置信度最高的框,保留它。
- 计算它跟其他所有框的IoU。
- 如果IoU大于阈值(比如0.5),就把那些框删掉。
- 重复步骤2-4,直到没有框剩下。
为什么会这样?因为同一个物体上,高置信度的框通常更准。低置信度的框跟它重叠太多,说明是重复检测,直接扔掉。
避坑指南:NMS阈值不是万能的。设得太小(比如0.3),密集场景下容易漏检;设得太大(比如0.7),又可能留下太多重复框。我建议根据你的场景调——稀疏场景用0.5,密集场景用0.3-0.4。另外,YOLO v5之后用了加权NMS,效果更好,可以试试。
3.5 知识体系总览
下面这张图把四个核心概念的关系串起来了。你看一遍,应该能理解它们在YOLO里的协作方式。
从图上你能看到:输入图像经过CNN提取特征,生成多尺度特征图。锚框提供形状先验,跟特征图一起解码出预测框。然后IoU上场,衡量预测框跟真实框的重叠程度。最后NMS出手,去掉重复框,输出最终结果。
这四个概念环环相扣。我在实际项目中,经常需要来回调它们——改锚框尺寸、调NMS阈值、换IoU计算方式。每次改动,效果都立竿见影。所以,别觉得它们是理论,它们是调优的武器。
一句话总结:CNN负责“看”,锚框负责“猜”,IoU负责“量”,NMS负责“选”。四者配合,YOLO才能又快又准地找到目标。