1. YOLO初识:目标检测发展史、YOLO系列演进与核心思想

大家好,欢迎来到这门课的第一章。今天咱们聊聊YOLO——这个在目标检测领域掀起革命的名字。

先说说我自己的经历。2016年我刚入行做安防检测,那时候主流还是Faster R-CNN。跑一帧图像要几百毫秒,根本没法做实时监控。后来YOLOv1出来了,虽然精度差点,但速度直接飙到45 FPS。我当时就觉得:这路子对了。

1.1 目标检测发展史:从传统到深度学习

目标检测不是突然冒出来的。它经历了几个关键阶段:

阶段 代表方法 核心思路 我的评价
传统方法(2000s) VJ检测器、HOG+SVM、DPM 手工特征 + 滑动窗口 慢、泛化差,但思路值得学
两阶段检测(2014) R-CNN、Fast R-CNN、Faster R-CNN 候选区域 + 分类回归 精度高,但实时性不行
单阶段检测(2016) YOLO、SSD、RetinaNet 一步到位,直接回归 速度起飞,精度逐渐追上
Transformer时代(2020) DETR、YOLOS 端到端,注意力机制 新方向,但YOLO依然能打

关键转折点:2012年AlexNet在ImageNet夺冠,深度学习开始碾压手工特征。2014年R-CNN把目标检测拉入深度学习时代,但真正让检测"跑起来"的,是2016年的YOLOv1。

1.2 YOLO系列演进:从v1到v8

YOLO这八年进化得真快。我整理了一张演进图,你看看就明白了:

YOLO系列演进时间线(2016-2023) YOLOv1 2016 · 开创者 45 FPS · 网格7×7 YOLOv2 2017 · 更准更快 Darknet-19 · 锚框 YOLOv3 2018 · 多尺度 FPN · 3个尺度 YOLOv4 2020 · 集大成 CSPDarknet · Mosaic YOLOv5 2020 · 工程化 PyTorch · 易部署 YOLOv6 2022 · 工业级 美团 · 部署优化 YOLOv7 2022 · 高效 E-ELAN · 重参数 YOLOv8 2023 · 全能 Ultralytics · 多任务 💡 我的演进观察: • v1→v3:从"能跑"到"能打",多尺度检测是质变 • v4→v5:工程化巅峰,CSPDarknet + Mosaic 成了标配 • v6→v8:工业部署导向,模型结构越来越灵活 • 我建议初学者直接从YOLOv5或v8入手,生态最成熟 • 曾经我在v3上踩过坑——锚框参数没调好,小目标全漏了

1.3 YOLO核心思想:单阶段检测、网格划分、边界框回归

YOLO为什么快?说白了就一句话:把检测当成回归问题来做。

传统两阶段方法先提候选框再分类,YOLO直接一步到位。它把输入图像分成 S×S 个网格,每个网格负责检测中心点落在它里面的物体。

1.3.1 网格划分

YOLOv1用7×7网格,每个网格预测2个边界框。你想想看,一张448×448的图像,分成49个格子,每个格子管一片区域。这设计其实很暴力,但有效。

我的经验:网格大小直接影响小目标检测。我在做交通标志检测时,7×7网格根本看不清远处的限速牌。后来换成YOLOv3的多尺度检测(13×13、26×26、52×52),小目标召回率从40%直接跳到75%。

1.3.2 边界框回归

每个边界框预测5个值:(x, y, w, h, confidence)。

  • x, y:框中心相对于网格的偏移(0~1)
  • w, h:框的宽高相对于整张图的比例(0~1)
  • confidence:这个框包含物体的置信度

再加上每个网格预测 C 个类别的概率。最终输出就是 S×S×(B×5 + C) 的张量。

# YOLOv1输出张量结构示意
# 输入: 448×448×3
# 输出: 7×7×30
# 每个网格: 2个框 × 5个值 + 20个类别 = 30维
output_shape = (7, 7, 30)  # S=7, B=2, C=20

1.3.3 单阶段检测的优势

对比维度 两阶段(Faster R-CNN) 单阶段(YOLO)
检测流程 候选区域 → 分类 + 回归 一步到位
速度 7~10 FPS 45+ FPS
精度(mAP) 更高(~75%) 稍低(~63% v1)
小目标 较好 较差(v1)
部署难度 模型大、依赖多 轻量、易部署

⚠️ 注意:YOLOv1的精度确实不如两阶段方法。但你要知道,在实时检测场景下,30 FPS和7 FPS的差距是"能用"和"不能用"的区别。我曾经在边缘设备上部署过Faster R-CNN,一帧跑2秒,客户直接说"这不行"。

1.4 损失函数:YOLO怎么学?

YOLO的损失函数分三部分:

Loss = λ_coord * Loss_xywh + λ_obj * Loss_confidence + λ_noobj * Loss_noobj + Loss_class
  • 坐标损失:只计算有物体的框,用均方误差
  • 置信度损失:有物体和无物体分开算,权重不同
  • 类别损失:每个网格只预测一个类别(早期版本)

这里有个坑:正负样本极度不平衡。一张图里大部分网格都是背景,如果让背景的损失权重和前景一样,模型会学成"啥也不检测"。YOLO用 λ_noobj=0.5 压低背景权重,这个技巧后来被几乎所有单阶段检测器继承。

核心要点总结:

  • YOLO把检测当成回归问题,一步到位
  • 网格划分 + 边界框回归 + 类别预测 = 核心三件套
  • 速度是最大优势,精度通过后续版本不断追赶
  • 损失函数设计要平衡正负样本