YOLO V1 和 V2笔记
一、YOLO V1
2015 年的 YOLO V1,直接打破了当时 Two-Stage 算法(如 R-CNN)的垄断,核心就是一句话:You Only Look Once(只看一次图,就完成检测)。它把 “分类 + 定位” 两个任务,直接转化成一个回归问题,用一个 CNN 网络端到端输出结果,速度直接冲到 45 FPS,实时检测从此有了新方案。
1. 核心思路:把图片拆成网格,每个网格负责预测目标
V1 会把输入图片(比如 448×448)分成7×7 的网格,每个网格干两件事:预测 2 个边界框(Bounding Box):每个框包含「中心坐标 (x,y)、宽高 (w,h)、置信度 (c)」—— 置信度代表 “这个框里有目标的概率 × 框和真实目标的 IoU”;预测 20 个类别概率(对应 VOC 数据集的 20 类):代表 “这个网格里的目标属于某类的概率”。
最终输出的特征图尺寸是 7×7×30—— 怎么来的?公式:S×S×(B×5 + C)
,其中 S=7(网格数)、B=2(每个网格预测 2 个框)、C=20(类别数),算下来就是 7×7×(2×5+20)=7×7×30。
2. 网络架构:简化版 GoogLeNet
V1 的网络很简洁,基于 GoogLeNet 修改,去掉了复杂的 Inception 模块,用 24 个卷积层提取特征,最后用 2 个全连接层输出 7×7×30 的结果。整个网络没有多余组件,就是为了 “快”—— 毕竟当时 Two-Stage 算法(如 Fast R-CNN)虽然精度高,但速度只有 15 FPS,V1 直接翻倍还多。
3. 损失函数:针对性解决 “不平衡” 问题
因为检测任务里 “背景区域远多于目标区域”,直接用 MSE 损失会导致 “背景的置信度误差淹没目标的位置误差”。所以 V1 的损失函数做了 3 个关键设计:位置误差加权:对目标的中心坐标 (x,y) 和宽高 (w,h) 误差乘以 λ_coord=5,让模型更关注目标位置的准确性;置信度误差区分:有目标的网格,置信度误差正常算;无目标的网格,置信度误差乘以 λ_noobj=0.5,减少背景对损失的影响;分类误差:只对 “有目标的网格” 计算类别概率误差,无目标的网格不参与。
4. V1 的优点快(45 FPS)、简单(端到端)、泛化能力强(对遮挡、小目标外的场景适配好
二、YOLO V2:针对性 “补坑”,更快更强
V2 的核心目标很明确:解决 V1 的精度问题,同时保持速度优势。作者用了 8 项改进,最终把 VOC 2007 数据集的 mAP 从 63.4% 提升到 78.6%,速度还涨到了 67 FPS。下面挑几个 “最关键的改进” 说 ——
1. 基础优化:Batch Norm + 高分辨率训练
这两个小改动,直接让精度提升了 6%,属于 “简单但有效” 的操作:
Batch Norm(批量归一化):去掉 V1 的 Dropout(防止过拟合),每个卷积层后都加 BN—— 让每一层的输入都归一化,训练时收敛更快,还能提升泛化能力,单这一项就涨了 2% mAP;高分辨率微调:V1 训练时先用 224×224 练分类,测试时突然换成 448×448,模型容易 “水土不服”。V2 在训练最后,额外用 448×448 的图微调 10 轮,让模型适应高分辨率输入,又涨了 4% mAP。
2. 核心改进 1:引入 Anchor Box,解决 “框不够用” 的问题
V1 每个网格只预测 2 个框,对重叠目标、特殊比例目标很不友好。V2 直接借鉴 Faster R-CNN 的 Anchor 思想,但做了优化:
用 K-Means 聚类选 Anchor:不是随便预设框,而是对 VOC/COCO 数据集的真实目标框做 K-Means 聚类(距离用 “1-IoU” 计算,避免受框大小影响)
3. 核心改进 2:Directed Location Prediction(直接位置预测),解决 “收敛不稳定”
如果直接预测 Anchor 的偏移量(比如 tx=1 就把框右移 Anchor 宽度),容易导致偏移过大、训练发散。V2 换了个思路:预测 “相对于网格的偏移量”,用 σ 函数把偏移量限制在 0~1 之间 —— 这样每个框只会在当前网格内微调,不会跑太远,训练更稳定。
4. 核心改进 3:融合细粒度特征,解决 “小目标检测差”
V1 的最后一层特征图感受野太大(7×7 网格对应原图 64×64 的区域),小目标的特征早被 “磨平” 了。V2 用了个巧办法:Passthrough 层融合浅层特征。
5. 终极优化:Multi-Scale Training(多尺度训练)
V2 的网络全是卷积和池化,没有全连接层 —— 这意味着 “输入图片尺寸可以随便变”!于是作者搞了个骚操作:训练时每 10 轮就随机换一次输入尺寸,从 320×320 到 608×608(步长 32,确保下采样后是整数网格)。这样模型能适应不同大小的目标,泛化能力直接拉满,最终在 608×608 输入下,mAP 冲到 78.6%,速度还能保持 20 FPS。
三、V1 到 V2:改进逻辑总结
从 V1 到 V2,改进思路特别清晰 ——哪里不行补哪里:
问题(V1) | V2 的解决方案 | 效果 |
---|---|---|
精度低、收敛难 | Batch Norm + 高分辨率微调 | mAP+6% |
框少、重叠目标检测差 | 聚类 Anchor Box | 召回率 + 7% |
位置预测不稳定 | 相对网格的偏移量预测 | 训练更稳定,定位更准 |
小目标检测差 | Passthrough 层融合浅层特征 | 小目标 mAP 提升 |
泛化能力弱 | 多尺度训练 | 适应不同大小目标 |
V1 的创新在于 “把检测当回归” 的思路,打开了 One-Stage 的大门;V2 则用工程化的精准改进,把 “速度快但精度低” 的短板补上,让 YOLO 从 “能用” 变成 “好用”。这也为后续 V3-V8 的迭代奠定了基础 —— 比如 V2 的 Anchor 聚类、多尺度训练,直到现在还是 YOLO 系列的核心逻辑。