1. YOLO前世今生:目标检测发展史与核心思想
大家好,我是你们这门课的主讲。今天咱们聊聊YOLO——这个在嵌入式视觉圈里几乎无人不知的名字。
说实话,我第一次接触YOLO是在2016年。那时候我还在做传统的目标检测,用HOG+SVM跑行人检测,一帧图像要处理几百毫秒。后来看到YOLOv1的,第一反应是:这玩意儿靠谱吗?结果一跑,嗯,真香。
1.1 目标检测的“史前时代”
在YOLO出现之前,目标检测走过了两条技术路线。我简单梳理一下,你心里就有谱了。
| 阶段 | 代表方法 | 核心思路 | 我遇到的坑 |
|---|---|---|---|
| 传统方法 | HOG+SVM、DPM | 手工特征 + 滑动窗口 | 速度慢,泛化差 |
| 两阶段检测 | R-CNN、Fast R-CNN、Faster R-CNN | 先提候选框,再分类回归 | 精度高,但实时性不够 |
| 单阶段检测 | YOLO、SSD | 一步到位,直接回归 | 速度起飞,精度后来追上 |
传统方法我就不多说了,现在基本没人用了。两阶段检测里,Faster R-CNN在2015年是个里程碑——它用RPN网络替代了Selective Search,真正实现了端到端训练。但问题也很明显:在GPU上跑也就5-10 FPS,放到嵌入式设备上?想都别想。
关键转折点:2016年,Joseph Redmon提出了YOLOv1。它的口号是“You Only Look Once”——只看一次,就能知道图像里有什么、在哪里。这个思路彻底改变了目标检测的游戏规则。
1.2 YOLO核心思想:为什么“只看一次”就够了?
YOLO的核心思想,说白了就是把目标检测当成一个回归问题来处理。
你想想看,传统方法是怎么做的?先提取候选区域,再对每个区域做分类。这就像你找东西,先圈出几个可能的位置,再一个个仔细看。YOLO呢?它直接把整张图喂进网络,一次前向传播,同时输出所有目标的类别和位置。
具体来说,YOLO做了三件事:
- 划分网格:把输入图像分成S×S的网格。每个网格负责检测中心点落在它里面的目标。
- 预测张量:每个网格输出B个边界框(每个框包含x, y, w, h, confidence)和C个类别概率。
- 非极大抑制:用NMS去掉重复的检测框,保留最靠谱的那个。
我在做嵌入式移植时,最深的体会是:YOLO的“单次推理”特性太适合硬件加速了。你不需要复杂的后处理流水线,一个模型推理完,直接拿结果就行。
我的经验:YOLO的网格大小直接影响检测精度和速度的平衡。在嵌入式设备上,我通常把S设为7或13,B设为2。再大,算力就扛不住了。
1.3 YOLOv1到YOLOv8:八年进化史
从2016到2024,YOLO家族经历了八代更迭。我挑几个关键版本说说,你感受一下这个演进脉络。
我重点说说几个版本的实际体验:
- YOLOv1:45 FPS,但定位不准,小目标基本漏检。我在一个交通标志项目里试过,路牌稍微远一点就检测不到。
- YOLOv3:这是我最喜欢的版本之一。多尺度预测让小目标检测好了很多。我在安防项目里用v3跑人车检测,效果比v1强了不止一个档次。
- YOLOv5:工程化做得最好。PyTorch生态,导出ONNX、TensorRT都很方便。我现在做嵌入式部署,首选就是v5。
- YOLOv8:2023年Ultralytics推出的全能框架。支持检测、分割、姿态估计、分类。但说实话,在嵌入式设备上,我目前还是用v5更多——v8的模型太大了。
避坑指南:我曾经在一个项目中直接拿YOLOv8替换v5,结果在Jetson Nano上推理速度从30 FPS掉到了12 FPS。后来发现v8的模型参数量是v5的2倍多。所以选版本一定要看你的硬件平台。
1.4 为什么YOLO适合嵌入式实时检测?
这个问题我经常被问到。其实原因很简单:
- 单次推理:不需要候选框提取、特征重计算等复杂流水线,一次前向传播搞定所有。
- 端到端训练:损失函数直接优化检测精度,不需要分阶段训练。
- 模型轻量化:YOLO的骨干网络(如CSPDarknet)设计时就考虑了计算效率。
- 硬件友好:卷积操作占主导,非常适合GPU/NPU加速。
我在RK3588上部署YOLOv5s,用NPU推理可以达到60 FPS以上。这个性能在安防、工业检测、自动驾驶等场景里完全够用。
我的建议:如果你是第一次在嵌入式设备上跑YOLO,先从YOLOv5s或YOLOv5n开始。这两个模型在精度和速度之间取得了很好的平衡。等跑通了,再尝试v8或者自己魔改。
1.5 本章小结
好了,这一章我们聊了YOLO的前世今生。从传统方法到两阶段检测,再到YOLO的“只看一次”思想,最后到v1到v8的演进脉络。你心里应该有个大致的框架了。