YOLO v1 详解

YOLO v1 是一种快速的one-stage目标检测算法,无需RPN网络,能实现端到端训练。通过直接回归Bounding Box并预测类别,YOLO v1提供实时检测速度,尤其适用于视频应用。网络结构包括卷积、池化和全连接层,输入固定尺寸,输出7x7x30张量,每个网格预测2个BoundingBox和概率。训练时,通过IOU动态选择负责预测的对象,并使用特定损失函数优化。

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

You Only Look Once: Unified, Real-Time Object Detection

论文链接


  YOLO v1 是典型的 one-stage 的算法。相对于 Faster R-CNN,YOLO v1 不需要分别训练各个部分的网络,可以实现 end-to-end 的训练。YOLO v1 有着更高的检测速度,可以用于视频的检测。

图 1

图 1:Bounding Box 回归和最终类别的关系。

  人类只用看一眼图片就能大体了解到在各个方位有哪些感兴趣的物体。而对比 Faster R-CNN,我们实际上看了 2 眼图片。那么有没有一种方法能让我们只看 1 眼,并且快速定位物体呢?YOLO v1 就是这样。YOLO v1 的核心思想是直接对 Bounding Box 进行回归然后进行类别的预测。 换句话说 Bounding Box 的回归和最终物体的类别是有很大的关系的。例如图一,我们只用看第一幅图,就能想到猫的耳朵和屁股的大致位置。

  对于 Faster R-CNN,第一步我们要生成大量的 anchor,用于 RPN 网络判断 objectness 和边框的微调。那么既然最后会调整 anchor 的边界框,我们就没有必要生成那么多的 anchor,只生成大致的区域就行。类比 YOLO v1,我们在一开始生成少量的预测区域(在 YOLO v1 中没有 anchor)后直接对预测区域进行微调,并给出其对应的物体类别,就可以得到最终的输出结果。这样的方法,要比 Faster R-CNN 速度快很多。


一、网络详解


图 2

图 2:详细的网络结构


(一)网络结构


图 3

图 3:YOLO v1 的网络大体结构

  去掉生成 region proposals 这个步骤以后,YOLO v1的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。单看网络结构的话,和普通的 CNN 对象分类网络几乎没有本质的区别,最大的差异是最后输出层用线性函数做激活函数,因为需要预测 bounding box 的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO 的整个结构就是输入图片经过神经网络的变换得到一个输出的张量,如图 3 所示。

  因为只是一些常规的神经网络结构,所以,理解 YOLO v1 的设计的时候,重要的是理解输入和输出的映射关系。


(二)输入


  对于输入,我们将常见网络输入的 224 x 224 的大小放大 2 倍,采用固定的尺度 448 x 448。


(三)输出


网络的输出为 7 x 7 x 30 的张量,那么这 7 x 7 x 30 的输出代表什么含义呢?我们分别来看一看。


1. 7 x 7 部分

图 4

图 4:YOLO v1 的步骤

  对于 YOLO v1,当图片输入网络时我们先要将输入图片平均分成 S x S 个大小相同的网格(见上图)。然后对每个网格生成 B 个 Bounding Box,这个生成的 Bounding Box 就是我们最终要输出的 Bounding Box。所以生成的总 Bounding Box 的个数为 S × S × B S \times S \times B S×S×B

  需要理解的是,这个 Bounding Box 并不是 Faster R-CNN 中的 anchor。Faster RCNN 等一些算法采用每个 grid 中手工设置 n 个 Anchor(先验框,预先设置好位置的 bounding box)的设计,每个 Anchor 有不同的大小和宽高比。YOLO 的 bounding box 看起来很像一个 grid 中 2 个 Anchor,但它们不是。YOLO 并没有预先设置 2 个 bounding box 的大小和形状,也没有对每个 bounding box 分别输出一个对象的预测。它的意思仅仅是对一个对象预测出 2 个 bounding box,在训练只选择预测得相对比较准的那个。

  这里的 bounding box,有点像不完全算监督算法,而是像进化算法。如果是监督算法,我们需要事先根据样本就能给出一个正确的 bounding box 作为回归的目标。但 YOLO 的 2 个 bounding box 事先并不知道会在什么位置,只有经过前向计算,网络会输出 2 个 bounding box,这两个 bounding box 与样本中对象实际的 bounding box 计算 IOU。这时才能确定,IOU 值大的那个 bounding box,作为负责预测该对象的 bounding box。

  训练开始阶段,网络预测的 bounding box 可能都是乱来的,但总是选择 IOU 相对好一些的那个,随着训练的进行,每个 bounding box 会逐渐擅长对某些情况的预测(可能是对象大小、宽高比、不同类型的对象等)。所以,这是一种进化或者非监督学习的思想。

  这里作者使用的 S = 7、B = 2。输出张量中的 7 x 7 个值就对应着输入图像的 7 x 7 网格。或者我们把 7 x 7 x 30 的张量看作 7 x 7 = 49 个 30 维的向量,也就是输入图像中的每个网格对应输出一个 30 维的向量(见下图)

图 5

图 5:对于原始图像中的每个网格都对应最终结果的一行输出。


2. 30 通道部分

图 6

图 6:30 个通道的含义

30 个通道包含了如下 3 个部分:

(1)20 个对象分类的概率

  因为 YOLO 支持识别 20 种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有 20 个值表示该网格位置存在任一种对象的概率。可以记为 P ( C 1 ∣ O b j e c t ) , . . . , P ( C i ∣ O b j e c t ) , . . . , P ( C 20 ∣ O b j e c t ) P(C_1|Object),...,P(C_i|Object),...,P(C_{20}|Object) P(C1Object),...,P(CiObject),...,P(C20Object) 。之所以写成条件概率,意思是如果该网格存在一个对象 Object,那么它是 C i C_i Ci 类别的概率为 P ( C i ∣ O b j e c t ) P(C_i|Object) P(Ci

### YOLO V1 源码解析与实现细节 #### 1. 数据预处理 在YOLO V1中,输入图像被调整到固定大小(通常是448×448),并应用一些简单的数据增强技术来提高模型泛化能力。这些操作包括随机裁剪、颜色抖动等[^1]。 #### 2. 网络结构设计 YOLO V1采用了一种类似于GoogLeNet的卷积神经网络架构,该网络由多个卷积层和池化层组成,最后接两个全连接层。具体来说: - 输入尺寸为\(448 \times 448\) 的RGB图片; - 经过一系列 \(7\times7\), stride=2 和 \(3\times3\), maxpooling layers; - 使用了若干个 \(1\times1\) 卷积减少通道数以及 \(3\times3\) 卷积提取特征; - 输出维度为 \(S\times S\times (B*5+C)\),其中\(S=7,B=2,C=20\)分别表示网格数量、边界框预测数目及类别种类数。 ```python import torch.nn as nn class YOLONet(nn.Module): def __init__(self, num_classes=20): super(YOLONet, self).__init__() # 定义基础卷积层 self.conv_layers = nn.Sequential( nn.Conv2d(3, 64, kernel_size=7, stride=2), nn.LeakyReLU(), ... ) def forward(self, x): out = self.conv_layers(x) return out.view(out.size()[0], -1) model = YOLONet() print(model) ``` #### 3. Loss Function 设计 为了训练这个多任务学习框架下的分类器兼回归器,损失函数综合考虑了以下几个方面: - **坐标误差**:对于每个负责预测物体位置的cell中的每一个box,计算中心点偏差平方和宽度高度log尺度差值。 - **置信度得分**:衡量所预测bbox内是否有object存在及其IOU情况。 - **类别概率分布差异**:当某个grid cell确实含有目标对象时,则需最小化真实标签向量y与预测p之间的交叉熵距离。 \[ L_{coord}=\lambda _{coord}\sum _{{i}=0}^{S^{2}}\sum _{j=0}^{B}(1^{obj}_{ij})[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2]\] \[L_{noobj}=\lambda _{noobj}\sum _{i=0}^{S^2}\sum _{j=0}^{B}(1^{noobj}_{ij})(C_i-\hat C_i)^2\] \[L_{class}=\sum _{i=0}^{S^2}1^{obj}_i\sum _{c\in classes}(p_i(c)-\hat p_i(c))^2\] 最终总Loss定义如下: \[loss=(L_{coord}+L_{conf}+L_{class})\]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值