目录
[一、YOLOv1:用 "网格回归" 重新定义实时检测](#一、YOLOv1:用 "网格回归" 重新定义实时检测)
[1. 核心逻辑:让每个网格 "各司其职"](#1. 核心逻辑:让每个网格 "各司其职")
[2. 损失函数:给不同误差 "分权重"](#2. 损失函数:给不同误差 "分权重")
[3. 优点与遗憾:速度快但精度有短板](#3. 优点与遗憾:速度快但精度有短板)
[二、YOLOv2:从 "能用" 到 "好用" 的十大改进](#二、YOLOv2:从 "能用" 到 "好用" 的十大改进)
[1. 锚框 + K-Means:让框预测更精准](#1. 锚框 + K-Means:让框预测更精准)
[2. Batch Normalization:训练稳了,精度高了](#2. Batch Normalization:训练稳了,精度高了)
[3. 细粒度特征 + 多尺度训练:拯救小目标检测](#3. 细粒度特征 + 多尺度训练:拯救小目标检测)
[4. Darknet-19:更快的特征提取 backbone](#4. Darknet-19:更快的特征提取 backbone)
[三、新手通关清单:从 v1 到 v2 的核心启示](#三、新手通关清单:从 v1 到 v2 的核心启示)
YOLO 进化史入门:从 v1 到 v2 的核心改进,新手也能看懂的实战拆解
今天总算把 YOLO 系列的 "开山之作" 和 "进阶版" 捋明白了 ------ 从 v1 打破传统检测范式,到 v2 针对性补短板,每一步改进都藏着深度学习落地的思考。结合自己整理的笔记和实操感悟,把这两个版本的核心逻辑拆解开,新手入门应该能少绕些弯路。
一、YOLOv1:用 "网格回归" 重新定义实时检测
在 YOLOv1 出现前,目标检测大多是 "先找候选框再分类" 的两阶段模式,速度慢得让人着急。而 v1 最颠覆的地方,是把检测变成了端到端的网格回归任务,一张图过一次网络就出结果,这才有了 "实时检测" 的突破。
1. 核心逻辑:让每个网格 "各司其职"
v1 的思路特别直观:把输入图像缩成 448×448,再均匀切成 7×7=49 个网格。如果某个目标的中心落在哪个网格里,这个网格就 "负责" 预测它的位置和类别。
每个网格要输出两组关键信息:
- 2 个边界框:每个框包含 (x,y,w,h,c) 5 个参数 ------x、y 是框中心相对于网格左上角的偏移量(0~1 之间,确保中心在网格内),w、h 是框宽高相对于整幅图的比例,c 是置信度(既表示有目标的概率,也反映框和真实目标的重合度)。
- 20 个类别概率:对应 VOC 数据集的 20 类物体,只有网格内有目标时这组概率才有意义。
最终输出的是 7×7×30 的张量(30=2 个框 ×5 个参数 + 20 类概率),这个维度设计就是 v1 实现 "单步检测" 的核心载体。我刚开始算这个维度时愣了一下,后来画了张网格图才想通:每个网格的 30 个数值都有明确分工,难怪能一次出结果。
2. 损失函数:给不同误差 "分权重"
v1 用均方误差做损失,但没简单一刀切,而是通过权重平衡了三类误差:
- 定位误差权重设为 5:毕竟检测的核心是 "找对位置",小目标的位置偏差影响更大,所以对 w 和 h 做了平方根处理 ------ 比如大框宽差 10 像素影响不大,小框差 10 像素就全错了,平方根能放大这种差异。
- 无目标的置信度误差权重设为 0.5:避免背景网格的大量误差掩盖了有目标区域的学习信号。
- 类别误差权重设为 1:保证分类精度不被其他误差压制。
这种设计让模型知道 "该优先学好什么",但用均方误差做分类还是有局限,这也是 v2 要优化的点之一。
3. 优点与遗憾:速度快但精度有短板
v1 的优势很突出:标准版本能跑 45 FPS,精简版甚至到 155 FPS,完全满足实时需求;而且全局看图的方式减少了背景误检,泛化能力比同期算法强。
但实操中问题也明显:每个网格最多只预测 2 个框,遇到鸟群这类密集小目标就会漏检;定位精度不够,尤其是大目标的边界框容易偏;对不常见长宽比的目标适配性差。这些遗憾刚好成了 v2 的改进方向。
二、YOLOv2:从 "能用" 到 "好用" 的十大改进
v2 的论文标题直接点明目标 ------"Better, Faster, Stronger",它没有推翻 v1 的框架,而是针对性补短板,把精度和速度的平衡做得更极致。我挑几个最关键的改进点拆解,都是新手必须吃透的核心。
1. 锚框 + K-Means:让框预测更精准
v1 的框是直接回归出来的,对不同形状目标适配差。v2 借鉴了 Faster R-CNN 的锚框思路,但没手动设尺寸,而是用K-Means 聚类从训练数据的真实框里自动学。
具体来说:
- 用 "1-IoU" 做距离 metric,避免大框小框的聚类偏差;
- 在 VOC 数据集聚出 5 种长宽比,COCO 数据集聚出 9 种,刚好覆盖常见目标形状;
- 每个网格预测 9 个锚框,输出张量变成 13×13×(9×25)(25=5 个框参数 + 20 类概率),预测框数量从 98 个暴涨到 1521 个,召回率直接从 81% 提到 88%。
我试算过这个提升:同样一张有 3 只猫的图,v1 可能漏检 1 只,v2 因为锚框多,总能有几个框刚好框住目标,这个改进真的直击痛点。
2. Batch Normalization:训练稳了,精度高了
v1 用 Dropout 防过拟合但会丢特征,v2 在所有卷积层后加了 BN 层,直接解决了梯度消失问题,收敛速度快了 3 倍,还不用 Dropout 也能防过拟合,单这一项就提了 2% 的 mAP。
这点在实操中感受特明显:之前跑 v1 简化版时,损失曲线总 "上蹿下跳",加了 BN 层后直接变得平滑,训练稳定性肉眼可见地提升。
3. 细粒度特征 + 多尺度训练:拯救小目标检测
v1 对小目标不敏感,因为下采样次数多,细节特征丢了。v2 用了两个办法解决:
- 加 Passthrough 层:把浅层高分辨率特征(26×26)和深层特征(13×13)拼接,让模型能捕捉到小目标的细节;
- 多尺度训练:训练时每隔 10 个 epoch 随机换输入尺寸(320×320 到 608×608),模型被迫适应不同大小的目标,泛化能力直接拉满。
我用 320×320 和 608×608 两种尺寸测过同一张图,608 尺寸下连图角落里的小飞鸟都能检测到,效果差异特别直观。
4. Darknet-19:更快的特征提取 backbone
v1 的网络借鉴 GoogLeNet,结构有点冗余。v2 专门设计了 Darknet-19 作为骨干网络,用 "1×1 卷积降维 + 3×3 卷积提特征" 的组合,参数量比 GoogLeNet 少 1/3,计算量降 40%,但特征提取能力一点没弱。
简单说就是 "轻量化但高效",在普通笔记本上跑 v2 也能保持 40 FPS 以上,这才有了后续工程落地的可能。
三、新手通关清单:从 v1 到 v2 的核心启示
今天梳理完才发现,YOLO 的迭代逻辑特别适合入门深度学习 ------v1 搭好框架讲清 "为什么可行",v2 填坑优化讲清 "怎么做得更好"。给同样刚入门的朋友列个重点清单:
- 先吃透 v1 的 "网格回归" 核心:7×7 网格的分工、30 维输出的含义、损失函数的权重设计,这是理解所有 YOLO 版本的基础;
- 记住 v2 的 "改进逻辑":锚框解决定位不准,K-Means 解决手动调参,BN 解决训练不稳,多尺度解决小目标漏检,每步改进都对应明确的问题;
- 动手算一算关键数据:比如 v1 到 v2 的预测框数量变化、Darknet-19 的参数量优势,比光看理论记得牢。
下一步打算跑一遍 v2 的简化版代码,看看这些改进在实际训练中到底能提多少精度。如果有同样在啃 YOLO 的朋友,欢迎交流代码里踩的坑呀~