YOLO系列基础回顾:YOLOv5/v8/v9核心架构对比
做小目标检测这几年,我最大的感受就是:选对基线模型,项目就成功了一半。YOLOv5、v8、v9这三个版本,我每个都在实际项目中踩过坑、调过参。今天咱们就掰开揉碎,看看它们到底差在哪。
一、YOLOv5:经典中的经典
YOLOv5虽然名字里带个「5」,但它其实是Ultralytics在2020年推出的作品。说实话,它把YOLO系列带到了一个全新的高度。
核心架构
- Backbone:CSPDarknet53 + Focus层。Focus层说白了就是把图像切块再拼接,减少计算量。我刚开始用的时候总觉得这操作有点多余,后来在嵌入式设备上跑才发现——真香。
- Neck:PANet + FPN。特征金字塔加路径聚合,这个组合让不同尺度的特征都能被充分利用。
- Head:三个检测头,分别负责大、中、小目标。
小目标检测的关键点:YOLOv5的检测头是耦合的(分类和回归共享参数)。我在做交通标志检测时发现,这种设计对小目标不太友好——分类和回归任务其实需要不同的特征表达。
损失函数
YOLOv5用的是CIoU Loss。嗯,这里要注意:CIoU考虑了重叠面积、中心点距离和宽高比,比早期的IoU Loss收敛快不少。但我在项目中遇到过一个问题——当目标特别小(比如10x10像素以下)时,CIoU的宽高比惩罚项反而会拖慢收敛。
数据增强
Mosaic增强是YOLOv5的一大亮点。四张图拼成一张,小目标出现的频率直接翻倍。我个人习惯在训练初期用Mosaic,后期关掉——因为拼图会让目标位置分布不均匀,后期反而影响精度。
二、YOLOv8:全面升级
YOLOv8是Ultralytics在2023年初发布的。说实话,刚看到论文时我第一反应是:「这不就是v5换了个壳吗?」但真正用下来才发现,改动都在刀刃上。
架构变化
- Backbone:C2f模块替代了C3。C2f其实就是把C3的残差连接改成了更密集的跨层连接。你想想看,梯度流更顺畅了,深层网络训练起来自然更稳。
- Neck:还是PANet+FPN,但特征融合方式做了优化。
- Head:解耦头!这是我最喜欢的改动。分类和回归分支彻底分开,各自用独立的卷积层。我在做遥感图像检测时对比过,解耦头对小目标的AP提升了大约3-5个点。
我的建议:如果你在YOLOv5上已经调得不错了,想进一步提升小目标精度,直接换YOLOv8的解耦头是最省力的方案。不需要动太多代码,效果立竿见影。
Anchor-Free
YOLOv8彻底抛弃了Anchor。为什么?因为Anchor的尺寸是固定的,小目标的尺寸变化又特别大,你很难预设一组完美的Anchor。Anchor-Free让模型自己去学目标的位置和尺寸,灵活性高了很多。
我曾经在一个工业缺陷检测项目里试过,目标尺寸从5x5到50x50不等。用YOLOv5时,我花了整整两天调Anchor,效果还是不理想。换成YOLOv8的Anchor-Free方案,直接省掉了这步,精度还更高。
损失函数
YOLOv8用了DFL(Distribution Focal Loss) + CIoU的组合。DFL把边界框回归从「预测一个值」变成了「预测一个分布」。说白了,就是让模型知道「目标大概在这个位置,但不确定度是多少」。这对小目标特别有用——因为小目标的信息本来就少,模型需要学会「模糊的正确」。
三、YOLOv9:可逆编程的尝试
YOLOv9是2024年初的新作。说实话,刚看到PGI(Programmable Gradient Information)这个概念时,我愣了半天。但用下来发现,它解决了一个很实际的问题——信息丢失。
核心创新
- PGI(可编程梯度信息):简单理解,就是给网络加了一条「信息高速公路」。深层网络在传递信息时,小目标的细节很容易丢失。PGI通过可逆连接,让梯度能直接流回浅层,保证了小目标特征的完整性。
- GELAN(广义高效层聚合网络):这是对CSPNet的进一步扩展。GELAN可以灵活组合不同的计算模块,有点像乐高积木——你想用卷积就用卷积,想用Transformer就用Transformer。
避坑指南:我曾经在YOLOv9上踩过一个坑——PGI虽然能保留信息,但显存占用比v8高了约20%。如果你的GPU显存只有8G,建议先用v8,或者把v9的batch size调小一点。
小目标检测表现
从我的实测来看,YOLOv9在极小目标(<10像素)上的召回率确实比v8高。原因很简单:PGI让浅层的细节信息能完整传递到检测头。但要注意,这种提升在中等目标上并不明显——说白了,PGI就是为小目标量身定做的。
四、三版对比总结
| 维度 | YOLOv5 | YOLOv8 | YOLOv9 |
|---|---|---|---|
| Backbone | CSPDarknet53 | C2f | GELAN |
| Head | 耦合头 | 解耦头 | 解耦头 |
| Anchor | Anchor-Based | Anchor-Free | Anchor-Free |
| 损失函数 | CIoU | DFL + CIoU | DFL + CIoU |
| 小目标友好度 | ★★☆☆☆ | ★★★★☆ | ★★★★★ |
| 显存占用 | 低 | 中 | 高 |
| 推理速度 | 快 | 中 | 中 |
五、我的选择建议
如果你问我做小目标检测该选哪个,我会这么回答:
- 追求速度:YOLOv5。在边缘设备上,v5的推理速度还是最快的。我有个项目需要在树莓派上跑,最后选的就是v5n。
- 平衡方案:YOLOv8。解耦头+Anchor-Free的组合,对小目标已经很友好了。大部分场景下,v8都是最稳妥的选择。
- 极致精度:YOLOv9。如果你的目标特别小(比如无人机航拍图像里的行人),而且GPU显存够用,v9的PGI能帮你多提几个点。
最后说一句:模型选型只是第一步。真正决定小目标检测效果的,还是数据增强、训练策略和调参。下一章我会详细讲怎么给YOLO做数据增强,让模型「看见」更多小目标。