1. YOLO前世今生:从R-CNN到YOLOv8的发展历程
目标检测,说白了就是让计算机在图像里找到物体,还得告诉我是啥、在哪儿。这事儿看着简单,做起来可不容易。我入行那会儿,这还是个让人头疼的难题。
咱们这一章,就把目标检测这条技术线捋一遍。重点聊聊YOLO是怎么杀出来的,它凭什么能成为工业界的首选。
1.1 目标检测的核心思想
先搞清楚一个问题:目标检测到底在解决什么?
两个任务:分类和定位。分类是“这是猫还是狗”,定位是“它在哪”。输出就是一个边界框(Bounding Box)加一个类别标签。
你想想看,一张图里可能有多个物体,大小不一,位置随机。传统方法怎么做?滑动窗口,穷举所有位置和尺度。效率低得吓人。
直到深度学习入场,才真正改变了游戏规则。
核心转变:从“手工特征+分类器”到“端到端特征学习+回归”。CNN自动提取特征,同时预测类别和位置。
1.2 两阶段检测器:R-CNN系列
R-CNN(Region-based CNN)是开山之作。2014年,Ross Girshick他们搞出来的。
思路很直接:先用选择性搜索(Selective Search)生成约2000个候选区域,然后对每个区域做CNN分类。准确率确实高,但速度嘛……一张图要几十秒。
我记得第一次跑R-CNN,等结果等到怀疑人生。后来优化到Fast R-CNN,才把候选区域的特征提取合并成一次,速度提升了不少。
再到Faster R-CNN,干脆把候选区域生成也交给网络自己学——RPN(Region Proposal Network)诞生了。这才真正实现了端到端训练。
| 模型 | 核心改进 | 速度(FPS) | 我的评价 |
|---|---|---|---|
| R-CNN | 候选区域+CNN分类 | ~0.02 | 奠基之作,慢得感人 |
| Fast R-CNN | 共享卷积+RoI Pooling | ~0.5 | 终于能用了 |
| Faster R-CNN | RPN网络 | ~7 | 两阶段标杆 |
两阶段检测器的优点是精度高,缺点是速度上不去。为什么?因为“先提候选,再分类”这个流程,天然就慢。
1.3 一阶段检测器:YOLO的诞生
2015年,Joseph Redmon搞出了YOLO(You Only Look Once)。名字就很霸气——只看一次。
核心思想:把检测当成一个回归问题。一张图进去,直接输出边界框和类别概率。没有候选区域,没有二次分类。
怎么做到的?把图像划分成S×S的网格,每个网格负责预测固定数量的边界框。就这么简单粗暴。
YOLO v1的代价:速度快(45 FPS),但精度不如Faster R-CNN。对小目标和密集物体,表现很差。我当时试过用它检测人群,效果确实不太行。
YOLO v2/v3陆续做了大量改进:批量归一化、锚框(Anchor Boxes)、多尺度预测、Darknet骨干网络。到v3的时候,速度和精度已经能跟两阶段方法掰手腕了。
YOLO v4和v5把工程优化做到了极致。数据增强、CSP结构、Mish激活函数、CIoU损失……各种trick堆上去,性能直接拉满。
YOLO v6/v7/v8则是各大厂和学术团队持续迭代的结果。尤其是Ultralytics的YOLOv8,把训练、部署、导出都封装得极其友好。
1.4 YOLO系列的优势
YOLO能火,不是没道理的。我总结了几点:
- 速度快:一阶段设计,天生适合实时场景。YOLOv8-Tiny在边缘设备上都能跑100+ FPS。
- 全局理解:整张图一次过,不像两阶段方法只看局部候选区。背景误检率低。
- 泛化能力强:我在项目里试过,YOLO在自然图像和工业图像上的迁移效果都不错。
- 工程生态好:从训练到部署,工具链极其完善。ONNX、TensorRT、OpenVINO全支持。
避坑提醒:我曾经在一个小目标检测项目里直接用YOLOv5默认配置,结果召回率惨不忍睹。后来加了Mosaic数据增强和多尺度训练,才把AP提上去。YOLO对小目标不友好,这是它的固有短板。
1.5 适用场景
YOLO最适合什么场景?一句话:对实时性要求高,对精度要求不是极致苛刻的场景。
| 场景 | 推荐模型 | 说明 |
|---|---|---|
| 安防监控 | YOLOv8-M/L | 人、车、物实时检测 |
| 自动驾驶 | YOLOv8-L/X | 行人、车辆、交通标志 |
| 工业质检 | YOLOv8-N/S | 缺陷检测,边缘部署 |
| 无人机巡检 | YOLOv8-N/Tiny | 轻量级,低功耗 |
| 体育分析 | YOLOv8-M | 运动员、球类跟踪 |
嗯,这里要注意:如果你的场景是“卫星图像里找小目标”或者“医学影像中检测微小病灶”,YOLO可能不是最优选。这时候两阶段方法或者专门的小目标检测模型会更合适。
我个人习惯是:先拿YOLOv8跑个基线,看看瓶颈在哪。如果速度不够,换小模型;如果精度不够,加trick或者换两阶段。这个思路在大多数项目里都管用。
我的建议:新手入门目标检测,直接从YOLOv8开始。文档全、社区活跃、踩坑成本低。等你把YOLO玩透了,再回头看Faster R-CNN和DETR,理解会更深刻。