YOLO(You Only Look Once)是目标检测领域下的一种著名算法。
一、理解YOLO
正如YOLO的名字一样,“你只需看一次”,YOLO就可以实时告诉你画面中所有目标的位置和类别。想要理解这种识别的优势,我们先来讨论YOLO之外的目标检测的算法。
TOOL 1:滑动窗口
把画面分为许多格子,一个一个仔细检查过去。这种方法速度慢、效率低,相信不用解释大家也能理解。
TOOL 2:两阶段检测(如R-CNN系列)
第一阶段:找出可能包含目标的区域;
第二阶段:对这些区域进行分类
这种方法精度高,但依旧速度慢、效率低,无法实时处理
我们可以发现,YOLO前的算法总是无法快速识别、实时处理,而YOLO很好的解决了这些问题。
TOOL 3:YOLO
YOLO革命性地将目标检测转化为回归问题。
YOLO首先将输入的图片划分为一个网格,对于每个网格单元,YOLO会预测:
1.边界框(Bounding Box):
(x——目标中心点的x坐标,y——目标中心点的y坐标,w——目标的宽度,h——目标的高度)
2.置信度(Confidence):模型有多确定这个框里有目标
3.类别概率(Class Probability):如果框里有目标,那么它是什么类别
二、YOLO工作原理
整体流程
假设我们要检测一张图片中的猫狗
1.输入处理
①将图片缩放到固定尺寸(如640*640)
②输入到卷积神经网络(CNN)
注:卷积神经网络(CNN)是一种深度学习模型,设计灵感来源于生物的视觉系统,详细解释
2.特征提取
CNN提取图片的特征(轮廓、颜色、纹理等)
3.网格划分与预测
①将特征图划分为网格(如13*13)
②每个网格预测:是否有目标、目标的边界(边界框)、目标的类别(猫、狗等)
4.后处理(NMS)
由于同一个目标可能被多个网格检测到,YOLO使用NMS(非极大值抑制)来去除重复的检测框,只保留最精准的结果
注:NMS非极大值抑制详细解释
边界框预测
YOLO预测的边界框包含四个值:
x,y:目标中心点相对于网格单元的坐标(0~1)
w,h:目标宽度和高度相对于整个图片的比例(0~1)
For Example:如果图片是640*640像素的,一个网格预测(x,y,w,h)=(0.5,0.3,0.2,0.15),那么目标中心在(640*0.5,640*0.3)=(320,192),目标宽640*0.2=128像素,高640*0.15=96像素
置信度计算
置信度=P(目标存在)*IOU(预测框与真实框的重叠度),置信度越高说明检测越可靠。
类别预测
对于每个网格,YOLO会预测所有类别的概率:最终类别=置信度*最大类别概率
YOLO的损失函数
YOLO通过最小化损失函数来训练模型
损失函数包含:
1.坐标损失:预测的边界框位置与真实位置的误差
2.置信度损失:有目标的网格预测置信度应该接近1,无目标的网格预测置信度应该接近0
3.类别损失:预测的类别概率与真实类别的误差
三、YOLO详细计算原理
1 前向传播计算
1.1 输入处理
假设输入图片尺寸为416*416*3(宽*高*RGB通道),图片经过卷积神经网络逐层提取特征:
输入:416×416×3
↓ Conv + BN + LeakyReLU
↓ 多次下采样(stride=2)
↓ ...
输出特征图:13×13×1024
卷积操作:输出 = 卷积(输入,权重) + 偏置
批量归一化:BN(x) = γ * (x - μ) / √(σ² + ε) + β
激活函数:LeakyReLU(x) = max(0.1x, x)
1.2 网格预测计算
以YOLOv3为例,使用13*13网格,每个网格预测3个锚框,每个锚框预测:
边界框:4个值(x,y,w,h)
置信度:1个值(confidence)
类别概率:c个值(c为类别数),如COCO数据集c=80
每个网格的输出维度:
输出 = 3 × (4 + 1 + 80) = 3 × 85 = 255
整个特征图的输出:
输出张量形状:13 × 13 × 255
1.3 边界框坐标计算
YOLO预测的是相对坐标,需要转换为绝对坐标
预测值:
tx, ty, tw, th:网络直接输出的原始值
坐标转换公式(YOLOv3):
bx = σ(tx) + cx # x坐标
by = σ(ty) + cy # y坐标
bw = pw × e^(tw) # 宽度
bh = ph × e^(th) # 高度
σ(x) = 1 / (1 + e^(-x)):Sigmoid函数,将值限制在(0,1)
cx, cy:当前网格单元左上角的坐标(如网格(5,3)对应cx=5, cy=3)
pw, ph:锚框的宽度和高度(预定义的先验框尺寸)
bx, by:目标中心点相对于网格的坐标(0-1之间)
bw, bh:目标宽度和高度相对于锚框的比例
转换为图片绝对坐标:
绝对x = (bx + cx) × (图片宽度 / 网格数)
绝对y = (by + cy) × (图片高度 / 网格数)
绝对宽度 = bw × pw × (图片宽度 / 网格数)
绝对高度 = bh × ph × (图片高度 / 网格数)
1.4 置信度计算
置信度表示“这个框里有目标,且预测准确”的置信程度:
confidence = P(目标存在) × IOU(预测框, 真实框)
在推理时,网络直接输出置信度值(经过Sigmoid激活):
confidence = σ(tconf)
其中 tconf 是网络输出的原始值
1.5 类别概率计算
对于每个类别,网络输出一个logit值,然后通过Softmax转换为概率:
类别logits: [t1, t2, ..., tC] # C个类别的原始输出
类别概率: P(class_i) = e^(ti) / Σ(e^(tj)) # Softmax
最终类别得分:
类别得分 = confidence × P(class_i)
选择得分最高的类别作为预测结果
*1.6 Softmax和Sigmoid
在YOLOv1中,Softmax用于单标签分类的类别概率计算,特点是输出为K维概率分布(K为类别数),每个元素在0~1之间且所有元素之和必为1,单个类别的梯度会受所有类别输出的影响;
Sigmoid用于置信度的计算,特点是输出的每个元素独立且在0~1之间,没有求和约束,每个类别的梯度独立运算,不受其他类别影响,不易因类别数过多而导致梯度稀释(YOLOv3及以后,Sigmoid取代Softmax,用于多标签分类的类别概率计算)
2 损失函数计算(YOLOv1)
YOLO的损失函数由5个部分组成,以YOLOv1的损失函数为例
2.1 损失函数公式
L = λcoord × Lcoord + Lconf_obj + λnoobj × Lconf_noobj + Lclass
λcoord = 5:坐标损失权重(因为坐标预测很重要)
λnoobj = 0.5:无目标置信度损失权重(降低背景的权重)
2.2 坐标损失(Lcoord)
Lcoord = Σ[1(obj) × ((x - x̂)² + (y - ŷ)² + (√w - √ŵ)² + (√h - √ĥ)²)]
1(obj):指示函数,如果网格有目标则为1,否则为0
x, y, w, h:真实边界框坐标
x̂, ŷ, ŵ, ĥ:预测边界框坐标
对w和h取平方根:为了让损失函数对不同尺寸目标的误差惩罚更均衡(大目标的w,h数值大,直接计算绝对误差时,小目标的相对误差容易被忽略,取平方根后大目标尺寸被“压缩”,小目标尺寸被“放大”,更符合人眼对误差的敏感度,如小目标差1个像素影响大,大目标差一个像素影响小)
2.3 有目标置信度损失(Lconf_obj)
Lconf_obj = Σ[1(obj) × (C - Ĉ)²]
C:真实置信度
Ĉ:预测置信度(Sigmoid后的值)
2.4 无目标置信度损失(Lconf_noobj)
Lconf_noobj = Σ[1(noobj) × (C - Ĉ)²]
1(noobj):指示函数,如果网格无目标则为1
C = 0:无目标时真实置信度为0
2.5 类别损失(Lclass)
Lclass = Σ[1(obj) × Σ(p(c) - p̂(c))²]
p(c):真实类别概率(one-hot编码,正确类别为1,其他为0)
p̂(c):预测类别概率(Softmax后的值)
举个栗子:假设三个类别——猫,狗,鸟
- 真实类别:猫(one-hot: [1, 0, 0])
- 预测概率:[0.7, 0.2, 0.1]
计算:Lclass = (1-0.7)² + (0-0.2)² + (0-0.1)² = 0.09 + 0.04 + 0.01 = 0.14
2.6 总损失计算
假设一个13*13的网格,其中:
- 有目标的网格:10个
- 无目标的网格:159个
简化计算(假设每个有目标网络的损失相等)
Lcoord = 10 × 0.001453 = 0.01453
Lconf_obj = 10 × 0.0225 = 0.225
Lconf_noobj = 159 × 0.01 = 1.59
Lclass = 10 × 0.14 = 1.4
总损失:
L = 5 × 0.01453 + 0.225 + 0.5 × 1.59 + 1.4
= 0.07265 + 0.225 + 0.795 + 1.4
= 2.49265
3.反向传播计算(YOLOv1)
训练时,通过反向传播更新网络参数
3.1 梯度计算
对于损失函数 L ,我们需要计算每个参数的梯度(本质是损失函数对模型参数的偏导数):
∂L/∂w = ∂L/∂y × ∂y/∂w
上式运用链式法则:
损失函数L对模型参数w的梯度 = 损失函数L对模型输出y的梯度 × 模型输出y对模型参数w的梯度
3.2 坐标损失(Lcoord)的梯度
仅对正样本(1(obj)=1)计算
∂Lcoord/∂x̂ = 2 (x̂ - x)
∂Lcoord/∂ŷ = 2 (ŷ - y)
∂Lcoord/∂ŵ = (√ŵ - √w) / √ŵ
∂Lcoord/∂ĥ = (√ĥ - √h) / √ĥ
3.3 置信度损失(Lconf_obj / Lconf_noobj)的梯度
正样本
∂Lconf_obj/∂Ĉ = 2 (Ĉ - C)
负样本(真实置信度 C = 0)
∂Lconf_noobj/∂Ĉ = 2 (Ĉ - C)
3.4 类别损失(Lclass)的梯度
∂Lclass/∂p̂(c) = 2 (p̂(c) - p(c))
3.5 卷积层参数(权重w,偏置b)的梯度
全连接层:前向运算为 y=w⋅x+b (x 是输入,y 是输出),梯度为
∂L/∂w = ∂L/∂y · xT
∂L/∂b = ∂L/∂y
卷积层:前向运算为 y=x∗w+b (*为卷积计算),梯度为
∂L/∂w = xT ∗ δ (δ = ∂L/∂y 是上层传递的梯度 )
∂L/∂b = ΣΣδ (在空间维度和批量维度上求和)
3.6 参数更新
使用梯度下降更新参数:
w_new = w_old - α × ∂L/∂w
其中 α 是学习率(如0.001)
四、YOLO版本演进(YOLOv1~YOLO12)
>> YOLOv1(2016)
核心架构:24 层卷积 + 2 层全连接,将图像划分为 S×S 网格,每个网格预测 B 个边界框 + 类别概率
损失函数:采用 MSE 损失,直接回归坐标、置信度和类别概率,无锚框(Anchor-Free)
核心局限:
- 小目标、密集目标检测效果差(每个网格仅一个框负责检测)
- 坐标回归对尺度敏感(仅用√w/√h 优化,未考虑 IoU)
- 全连接层导致泛化能力弱,对输入尺寸限制严格(448*448)
>> YOLOv2(2017)
核心改进:
- 引入锚框(Anchor),放弃全连接层,用卷积层预测锚框偏移量,支持多尺度训练
- 添加 Passthrough 层,融合浅层高分辨率特征,提升小目标检测能力
- 损失函数优化:用交叉熵损失替代 MSE 计算置信度和类别损失,坐标回归用相对偏移(x/y 相对于网格左上角)
- 工程优化:采用 Darknet-19 骨干网络(19 层卷积),比 v1 的 24 层卷积更快;加入批量归一化(BN),提升训练稳定性
>> YOLOv3(2018)
核心改进:
- 多尺度检测:输出 3 个不同尺度特征图(13×13、26×26、52×52),分别对应大、中、小目标
- 骨干网络升级:Darknet-53(53 层卷积),引入残差连接(Residual),解决深层网络梯度消失问题
- 用 Sigmoid 替代 Softmax,支持多标签分类,v1/v2 仅支持单标签
- 每个尺度预设 3 个锚框(共 9 个),置信度损失仍用交叉熵,坐标损失隐含 IoU 优化
>> YOLOv4(2020)
核心改进:
- 骨干网络增强:CSPDarknet-53,引入 CSP(Cross Stage Partial)结构,减少计算量同时保留特征信息
- 颈部(Neck)优化:添加 SPP(Spatial Pyramid Pooling)层,增强对不同尺度目标的适应性;用 PANet 替代 v3 的 FPN,提升特征融合效率
- 训练策略:Mosaic 数据增强(4 张图拼接)、标签平滑、CIoU 损失(替代传统 IoU,优化坐标回归)
- 激活函数:用 Mish 激活替代 Leaky ReLU,提升梯度流动
>> YOLOv5(2020)
核心改进:
- 架构模块化:将网络拆分为 Input、Backbone、Neck、Head,支持灵活调整
- 骨干网络:CSPDarknet-53 的轻量化变体(如 C3 模块替代 CSP 模块),提供 n/s/m/l/x5 个尺度模型(从轻量化到高精度)
- 训练与推理优化:自适应锚框计算(自动匹配数据集)、自适应图片缩放(减少黑边)、Warmup+Cosine LR 调度器,推理速度极快
- 损失函数:CIoU/GIoU/DIoU 可选,类别损失用交叉熵,置信度损失支持 Focal Loss(解决正负样本不平衡)
侧重工程落地,轻量化优化更彻底,推理速度优于v4
>> YOLOv6(2022)
核心改进:
- 骨干网络:EfficientRep,用 RepVGG 的重参数化技术,训练时多分支提升精度,推理时融合为单分支提速
- 颈部:Rep-PAN,延续 PANet 结构,加入重参数化卷积,平衡速度与特征融合效果
- 头结构:Decoupled Head(解耦分类和回归头),分别优化类别和坐标预测,提升精度
- 损失:SIoU 损失(进一步优化坐标回归的方向一致性),分类损失用 Varifocal Loss
速度大幅提升,工业级部署优化更极致
>> YOLOv7(2022)
核心改进:
- 骨干网络:ELAN(Enhanced Efficient Layer Aggregation),通过堆叠不同尺度卷积,提升特征提取能力
- 头结构:E-ELAN 和 MP-ELAN 模块,增强特征融合和多尺度适应能力;支持耦合 / 解耦头切换
- 训练策略:Mosaic-9(9 张图拼接)、ReMix 数据增强,动态标签分配(Task-Aligned Assigner)
- 损失:CIoU/DIoU/SIoU 可选,分类损失用 Focal Loss,支持自蒸馏训练(提升小模型精度)
更侧重高精度,学术性能优于v6
>> YOLOv8(2023)
核心改进:
- 架构统一:支持检测、分割、姿态估计、实例分割等多任务,共享骨干和颈部
- 骨干网络:C2f 模块(替代 v5 的 C3),增强特征提取和梯度流动,兼顾速度与精度
- 头结构:Decoupled Head+Anchor-Free(可选 Anchor-Based),默认用 Anchor-Free 减少锚框调参成本
- 训练与工具链:Ultralytics 框架支持自动训练、可视化、部署,支持 TensorRT/ONNX 等多格式导出,损失用 CIoU+Focal Loss
>> YOLOv9(2024)
核心改进:
- 提出可编程梯度信息(PGI),自适应建模特征梯度信息
- 设计 GELAN 结构,优化网络宽度与深度,提升训练稳定性
- 改进路径聚合方式,充分利用多尺度特征
- 新增新型损失函数与正则化,强化小目标检测效果
>> YOLOv10(2024)
核心改进:
- 取消 NMS 后处理,通过一致性双重分配策略实现单目标唯一预测
- 分类头采用深度可分离卷积,参数量减少约 60%
- 引入空间 - 通道解耦下采样机制,减少计算冗余
- 骨干网络加入深度可分离大核卷积,提升感受野
>> YOLOv11(2025)
核心改进:
- 骨干采用 C3K2 模块 + C2PSA 空间注意力模块,增强特征提取
- 用深度可分离卷积优化分类分支,提升效率
- 引入可编程梯度信息(PGI)和任务对齐标签分配
- 参数量优化,v11m 较 v8m 参数减少 22% 且 mAP 更高
>> YOLOv12(2025)
核心改进:
- 首次摒弃 CNN,采用纯 Vision Transformer 作为主干
- 设计区域注意力模块(A²),计算量减少 41%
- 提出 R - ELAN 结构,解决注意力模型梯度消失与训练不稳定问题
- 集成 FlashAttention 技术,提升 GPU 显存利用效率
五、结语
其实使用YOLO完全没有门槛,因为你即使不懂YOLO的框架结构和算法,也能照着教程训练和使用YOLO模型。但是当你真正实打实地开始训练YOLO、使用YOLO时,你会不停地产生各种疑问,我认为使用YOLO的同时去尝试理解YOLO的结构和算法,能够更好的帮助我们处理模型训练中遇到的各种问题。
学习本身就是一个知行合一的过程,学习YOLO不能只是纸上谈兵,也不能只是照猫画虎。自己尝试着训练一个YOLO模型,会更好地帮你理解本篇文章的内容
5634

被折叠的 条评论
为什么被折叠?



