3、YOLO理论基础:目标检测任务定义、YOLO核心思想(网格划分、边界框预测)、损失函数简介
好,咱们今天来聊聊YOLO的理论基础。说实话,很多初学者一上来就急着调代码,结果连YOLO到底在干什么都没搞明白。我个人习惯是,先把底层逻辑吃透,后面调参、debug的时候心里才有底。
3.1 目标检测任务:到底在检测什么?
先说说目标检测这个任务本身。你想想看,图像分类只是告诉你是「猫」还是「狗」,但目标检测要回答两个问题:「是什么」和「在哪里」。
具体来说,一个完整的目标检测输出包含两部分:
- 类别标签:比如人、车、猫、狗,用数字0,1,2...表示
- 边界框(Bounding Box):通常用四个值表示——(x, y, w, h),分别是中心点坐标和宽高
我在项目中遇到过最坑的事,就是有人把边界框的坐标格式搞混了。有的框架用左上角+右下角,有的用中心点+宽高。YOLO用的是后者,这个后面会细说。
核心要点:目标检测 = 分类 + 定位。缺一不可。
3.2 YOLO的核心思想:把检测当成回归问题
YOLO的全称是You Only Look Once。为什么叫这个名字?因为传统方法(比如R-CNN系列)要分两步走:先提候选区域,再对每个区域做分类。YOLO直接一步到位——看一眼整张图,就能同时输出所有物体的位置和类别。
说白了,YOLO把目标检测当成一个回归问题来处理。输入一张图片,输出一个张量,这个张量里编码了所有边界框和类别概率。
3.3 网格划分:把图像切成S×S的格子
YOLO最巧妙的设计就是网格划分。它会将输入图像分成S×S个网格(比如7×7或13×13)。每个网格负责检测中心点落在该网格内的物体。
举个例子:假设一张图里有只狗,狗的中心点落在第3行第5列的网格里,那么这个网格就负责预测这只狗。
我的经验:网格大小直接影响检测精度。网格越细,小物体检测越好,但计算量也越大。YOLOv3用了3种不同尺度的网格,就是为了兼顾大小物体。
每个网格会预测B个边界框(通常B=2或3),以及C个类别概率。所以输出张量的维度是:S × S × (B × 5 + C)。这里的5指的是:x, y, w, h, confidence(置信度)。
3.4 边界框预测:如何用网格定位物体?
这里有个关键点,YOLO不是直接预测边界框的绝对坐标,而是预测相对于网格的偏移量。为什么要这样?因为直接预测绝对坐标太难收敛了,网络根本学不动。
具体来说,YOLO预测的是:
- tx, ty:边界框中心相对于网格左上角的偏移(经过sigmoid归一化到0~1之间)
- tw, th:边界框宽高相对于锚框(Anchor Box)的缩放比例
最终的真实坐标计算公式如下:
bx = σ(tx) + cx
by = σ(ty) + cy
bw = pw * exp(tw)
bh = ph * exp(th)
其中cx, cy是网格的左上角坐标,pw, ph是锚框的宽高。
避坑指南:我曾经在训练自己的数据集时,发现loss死活降不下去。查了半天,原来是锚框尺寸没根据数据集重新聚类。YOLO默认的锚框是针对COCO数据集的,换了自己的数据一定要重新算!
3.5 损失函数简介:YOLO是怎么学习的?
YOLO的损失函数由三部分组成,嗯,这里要注意,它是个多任务损失:
| 损失项 | 作用 | 权重 |
|---|---|---|
| 坐标损失 | 衡量预测框和真实框的位置差异(x, y, w, h) | λcoord = 5 |
| 置信度损失 | 衡量预测框是否包含物体的置信度 | 有物体时=1,无物体时=0.5 |
| 类别损失 | 衡量预测类别是否正确 | 1 |
坐标损失用的是均方误差(MSE),但YOLO对w和h做了开根号处理。为什么?因为同样偏差10个像素,对于大物体影响不大,但对于小物体可能就是致命的。开根号能缓解这个问题。
置信度损失分两种情况:
- 如果网格内有物体:计算预测置信度与真实IoU之间的误差
- 如果网格内没有物体:只计算置信度误差,但权重降低(0.5倍)
这样做是因为大部分网格都是背景,如果不降低权重,网络会倾向于把所有网格都预测为「无物体」。
一句话总结:YOLO的损失函数就是在告诉网络——「有物体的地方给我好好预测,没物体的地方别瞎操心」。
3.6 非极大值抑制(NMS):去掉重复的框
YOLO预测完后,同一个物体可能会被多个网格检测到,产生大量重叠的边界框。这时候就需要NMS来去重。
步骤很简单:
- 按置信度从高到低排序
- 选置信度最高的框,计算它与其他框的IoU
- 删除IoU大于阈值(通常0.5)的框
- 重复直到处理完所有框
调参建议:NMS阈值设得太低会漏检,设得太高会有大量重复框。我一般从0.5开始调,根据实际效果上下浮动0.05。
3.7 小结:YOLO到底牛在哪?
回顾一下YOLO的核心思想:
- 端到端:输入一张图,直接输出检测结果,不需要复杂的pipeline
- 速度快:因为只看一次,所以实时性极好,能跑到30FPS以上
- 全局理解:YOLO在整张图上做预测,能看到上下文信息,不像滑动窗口那样只看局部
当然,YOLO也有缺点。早期版本对小物体检测效果不好,因为每个网格只能预测两个框。后来的YOLOv3、v4、v5通过多尺度预测和更深的网络结构,逐步解决了这个问题。
下一章我们会动手搭建YOLO的网络结构,到时候你会更直观地理解这些理论是怎么落地的。
公众号:蓝海资料掘金营,微信deep3321