YOLO模型——思想、原理以及为什么使用网格、边界框

本文从YOLO思想本质出发,详细介绍其原理。先对比滑动窗口、R - CNN,阐述YOLO思路,包括划分网格、生成边界框等。接着介绍其详细流程、神经网络结构与损失函数。最后总结其优点如速度快、背景误检率低,缺点如精度低、小物体检测效果差等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 前言

\qquad 提起YOLO模型,我想大部分和我一样的初学者不理解使用网格与边界框的原因。并且很多文章也只是讲清楚了流程但没讲清楚思想。本文从YOLO的思想本质为起点,详细介绍YOLO模型的原理。

2. YOLO的思路

2.1 从滑动窗口开始

\qquad 图像检测领域的滑动窗口是一种利用图像分类来实现目标检测的方法,它的思路是在图像上按照不同的大小和比例滑动窗口,然后把每个窗口内的图像片段送入一个预训练的分类器,判断是否存在目标物体。这个方法虽然简单直观,但是也有两个主要的缺陷:

  1. 窗口的尺寸和形状不够灵活,难以适应多样的目标

  2. 计算的开销很大,需要对大量的窗口进行分类,而且对窗口的大小和步长的选择比较敏感

2.2 改进

\qquad 下述内容不代表模型作者是如此想的,但有助于理解。看不懂这部分也没关系,可以接着往下看再重新回顾。下面的内容更多是在讨论YOLO使用网格、边界框的原因。个人认为理解YOLO为什么使用网格、为什么使用边界框比理解YOLO的流程、使用YOLO更加重要

2.2.1 R-CNN

\qquad 假如用神经网络直接预测出所有物体的位置,或者说所有物体候选区,再判断每一个候选区的类别,这样不仅能解决窗口尺寸的问题,同时计算量减少了(相对于滑动窗口来说)。也就是将图像检测分为两步:
\qquad \qquad 1. 产生候选区。
\qquad \qquad 2. 对每个候选区分类。
\qquad 最终把图像检测转换为了一个分类问题,这种方法被称为R-CNN,属于两阶段模型

2.2.2 YOLO

\qquad 滑动窗口方法中,窗口在滑动时,因为步长和窗口大小等原因可能会出现窗口产生的区域/图像块重叠的情况,也有窗口产生的区域之间有缝隙的情况,那么我们可以不用滑动窗口,直接将图片分成 S × S S\times S S×S个区域(网格),再用神经网络来判断每个网格的分类,这样就避免了网格之间的重叠和缝隙的问题。
在这里插入图片描述

\qquad *需要注意的是:在滑动窗口方法中,窗口滑动后产生的区域只负责判断一个类别。分成S×S个网格之后仍是如此。

\qquad 将图片分成 S × S S\times S S×S个网格以及知道了每个网格的分类后,就差物体标识框的大小与位置了。这个时候再想想滑动窗口怎么做的?滑动窗口是窗口滑动产生了区域(你也可以当成网格,暂且不必纠结概念区别),而现在是先有了网格,那就用神经网络在网格中生成一些窗口呗!每个网格的窗口(边界框)数量为B个(如果每个网格生成的边界框数量不同就会很乱,不如生成数量相等的,之后再判断去除)。而且正因为网格已经分好了,每个网格生成的窗口可以随意了!在这里插入图片描述

\qquad 滑动窗口每次滑动时,窗口大小是不能变化的。相对位置也是固定的:因为窗口产生的区域与窗口大小相同,窗口的中心位置就等于产生的区域中心位置。但是上述说的网格划分好了之后,每个网格之间生成的窗口互不干扰。就像图中(示例图!)的红色框和蓝色框大小可以不同,位置也可以随意。

\qquad 那怎么知道一个边界框在哪个网格中呢?那就看边界框中心在哪个网格。正因为这点,边界框愿意多大就多大,愿意多小就多小,反正只要边界框中心在网格中,这个边界框就还是这个网格的。

\qquad 从窗口滑动产生区域,变成了先划分区域,再从区域生成窗口。

\qquad 总的来说,上述做法的步骤就是
\qquad \qquad 1. 分成 S × S S\times S S×S个网格
\qquad \qquad 2. 生成 S ×

### YOLO模型工作原理详解 #### 1. 单阶段检测器的概念 YOLO系列模型属于单阶段目标检测器,这类方法不需要候选框生成过程就能直接预测物体类别及其位置。这种设计使得YOLO能够实现实时处理视频流中的每一帧图像并给出其中所含对象的位置边界框以及对应的标签[^3]。 #### 2. 统一框架下的多任务学习 YOLO采用了一个统一的卷积神经网络来完成分类和定位两个子任务。具体来说,在训练过程中,该网络会接收整张图片作为输入,并输出一系列固定大小的空间网格;对于每个网格单元格而言,则需预测多个边框坐标(相对于原图的比例)、置信度得分(表示存在某个类别的概率)及条件类别分布向量。 #### 3. 特征提取与下采样操作 为了有效地捕捉不同尺度上的视觉模式,YOLO通过堆叠若干层标准CNN组件——比如卷积层、池化层等——逐步缩小空间维度的同时增加通道数,从而构建起深层特征金字塔结构。这一机制不仅有助于增强感受野范围内的语义表达能力,而且可以减少计算成本以适应实际应用场景的需求[^1]。 #### 4. 锚点框机制的应用 尽管原始版本中并未引入锚定概念,但从YOLO v2开始便借鉴Faster R-CNN的做法设置了预定义形状集合作为基础模板供回归调整使用。这些先验假设通常依据聚类分析得到的数据集统计特性而设定,进而改善了小尺寸实例的表现效果并简化了损失函数形式[^2]。 ```python import torch.nn as nn class YOLO(nn.Module): def __init__(self, num_classes=80): super(YOLO, self).__init__() # 定义骨干网路部分 self.backbone = ... # 添加额外层用于最终输出 self.head = ... def forward(self, x): features = self.backbone(x) output = self.head(features) return output ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值