YOLOv1_学习笔记

论文标题: 《You Only Look Once: Unified, Real-Time Object Detection》
论文地址:https://arxiv.org/pdf/1506.02640.pdf
推荐git: https://github.com/leviome/yolo_1_pytorch
这个repo删掉了很多繁杂的部分,只保留最基本的yolo训练和预测结构。有利于快速上手,以及后期自定义添加插件。
参考链接


模型

v1是yolo系列的开山之作,以简洁的网络结构,简单的复现过程(作者给出详细教程)而受到CVer们的追捧。YOLOv1是单阶段目标检测方法,不需要像Faster RCNN这种两阶段目标检测方法一样,需要生成先验框。Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测。
具体来说,YOLO将全图划分为S × S 的格子, 每个格子负责对落入其中的目标进行检测,一次性预测所有格子所含目标的边界框、置信度、以及所有类别概率向量。
yolo_v1奠定了yolo系列算法“分而治之”的基调,在yolo_v1上,输入图片被划分为7X7的网格,如下图所示:
在这里插入图片描述

论文思想

  1. 将一幅图像分成SxS个网格,如果某个object的中心落在这个网格中,则这个网络就负责预测这个object
  2. 每个网格要预测B个bounding box,每个bounding box,除了要预测位置之外,还要附带预测一个confidence值。每个网格还要预测c个类别的分数

网格单元(Grid Cell)

YOLO将目标检测问题作为回归问题。会将输入图像分成S × S 的网格(cell),如果一个物体的中心点落入到一个cell中,那么该cell就要负责预测该物体,一个格子只能预测一个物体,会生成两个预测框。

对于每个网格单元cell:

  • YOLOv1会预测两个边界框
  • 每个边界框包含5个元素:( x , y , w , h ) 和 边界框的置信度得分(box confidence score)
  • 只负责预测一个目标
  • 预测 C个条件概率类别(conditional class probabilities)

在这里插入图片描述
为了评估PASCAL VOC,YOLO V1使用 7×7 的网格(S×S),每个单元格回归2个边界框 和 20个条件类别概率。条件类别概率 (conditional class probability) 是检测到的目标属于特定类别的概率(每个单元对每个类别有一个概率)。

最终的预测特征由边框的位置、边框的置信度得分以及类别概率组成,这三者的含义如下:

  • 边框位置:对每一个边框需要预测其中心坐标及宽、高这4个量, 两个边框共计8个预测值
    边界框宽度w和高度h用图像宽度和高度归一化。因此 x x x , y y y , w w w , h h h 都在0和1之间。 x x x y y y 是相应单元格的偏移量。
  • 置信度得分(box confidence score) c :框包含一个目标的可能性(objectness)以及边界框的准确程度。类似于Faster RCNN 中是前景还是背景。由于有两个边框,因此会存在两个置信度预测值。
  • 类别概率:由于PASCAL VOC数据集一共有20个物体类别,因此这里预测的是边框属于哪一个类别。

一个cell预测的两个边界框共用一个类别预测, 在训练时会选取与标签IoU更大的一个边框负责回归该真实物体框,在测试时会选取置信度更高的一个边框,另一个会被舍弃,因此整张图最多检测出49个物体。

在这里很容易被误导:每个网格单元的视野有限而且很可能只有局部特征,这样就很难理解yolo为何能检测比grid_cell大很多的物体。其实,yolo的做法并不是把每个单独的网格作为输入feed到模型,在inference的过程中,网格只是物体中心点位置的划分之用,并不是对图片进行切片,不会让网格脱离整体的关系。

如果网格中有目标,Pr(object) = 1,confidence 就等于 IoU;如果网格中没有目标,则 Pr(object) = 0,confidence 也为 0。
注意:在 YOLO v1 中是没有 Anchor 这个概念的。所以网络预测的值直接就是坐标信息。在测试的时候,预测的类别分数乘上 confidence 值就可视为最终的目标类别预测概率。

可以通过yolo_v1的structure来进一步理解,相比faster r-cnn那种two-stage复杂的网络结构而言,yolo_v1的网络结构显得亲民得多。基本思想是这样:预测框的位置、大小和物体分类都通过CNN暴力predict出来。

在这里插入图片描述

YOLO输入图像的尺寸为 448 448 448 × × × 448 448 448,经过24个卷积层,2个全连接的层(FC),最后在reshape操作,输出的特征图大小为 7 7 7 × × × 7 7 7 × × × 30 30 30
YOLO主要是建立一个CNN网络生成预测 7 7 7 × × × 7 7 7 × × × 1024 1024 1024 的张量
然后使用两个全连接层执行线性回归,以进行 7 7 7 × × × 7 7 7 × × × 2 2 2 边界框预测(7*7每个grid2个边界框)。将具有高置信度得分(大于0.25)的结果作为最终预测。
3 3 3 × × × 3 3 3 的卷积后通常会接一个通道数更低 1 1 1 × × × 1 1 1 的卷积,这种方式既降低了计算量,同时也提升了模型的非线性能力。
除了最后一层使用了线性激活函数外,其余层的激活函数为 Leaky ReLU ;
在训练中使用了 Dropout 与数据增强的方法来防止过拟合。
对于最后一个卷积层,它输出一个形状为 (7, 7, 1024) 的张量。 然后张量展开。使用2个全连接的层作为一种线性回归的形式,它输出 个参数,然后重新塑形为 (7, 7, 30) 。

在这里插入图片描述

上面是结构图yolo_v1结构图,通过结构图可以轻易知道前向传播的计算过程,是很便于读者理解的。v1的输出是一个 7 7 7 x x x 7 7 7 x x x 30 30 30的张量,7x7表示把输入图片划分位7x7的网格,每一个小单元的另一个维度等于30。代表能预测2个框的5个参数(x,y,w,h,score)和20个种类。

可以看出输出张量的深度影响yolo_v1能检测目标的种类。v1的输出深度只有30,意味着每个单元格只能预测两个框(而且只认识20类物体),这对于密集型目标检测和小物体检测都不能很好适用


预处理阶段

置信度过滤,非极大值抑制
对预测框筛选过滤,把重复的预测框只保留一个,最终保留预测的结果(包含把低置信度的框过滤掉,重复的框去掉,这个过程叫做nms,非极大值抑制)
注意
每个预测框的类别概率有一个概率排序,从大到小。从最大的开始,后边的全部与之做IOU值比较,若小于某个阈值就直接置0,以此类推。图中应该是<符号
在这里插入图片描述
在这里插入图片描述

训练阶段(反向传播)

深度学习和监督学习的训练是通过梯度下降和反向传播迭代的去微调神经元中的权重来使得损失函数最小化的过程,目标检测是一个典型的监督学习的过程。

YOLO使用预测值和GT之间的误差平方的求和(MSE)来计算损失。
1.损失函数
localization loss -> 坐标损失(预测边界框与GT之间的误差)
classification loss -> 分类损失
confidence loss -> 置信度损失(框里有无目标, objectness of the box)
在这里插入图片描述

2.为什么宽和高都要进行开根号处理呢?
以下图为例,假设绿色为真实目标边界框,蓝色为预测的目标边界框。假设小物体和大物体预测的偏移是一样的,则对于小目标而言预测结果比较差,而对于大目标而言预测结果还算比较好。所以要提升小目标的损失。如果不取根号,损失函数往往更倾向于调整尺寸比较大的预测框。例如,20个像素点的偏差,对于800×600的预测框几乎没有影响,此时的 IoU 数值还是很大,但是对于80×60的预测框影响就很大。开根号是为了尽可能的消除大尺寸框与小尺寸框之间的差异。
在这里插入图片描述
3.如何解决目标检测正负样本数目不均衡问题?

在这里插入图片描述


训练

正如前面所说的,yolo是端到端训练,对于预测框的位置、size、种类、置信度(score)等信息的预测都通过一个损失函数来训练。

在这里插入图片描述
S2表示网格数,在这里是7x7。B表示每个单元格预测框的个数,这里是2。
第一行就总方误差( sum-squared error)来当作位置预测的损失函数,第二行用根号总方误差来当作宽度和高度的损失函数。第三行和第四行对置信度confidence也用SSE作为损失函数。第五行用SSE作类别概率的损失函数。最后将几个损失函数加到一起,当作yolo v1的损失函数。

第一行就总方误差( sum-squared error)来当作位置预测的损失函数
第二行用根号总方误差来当作宽度和高度的损失函数
第三行和第四行对置信度confidence也用SSE作为损失函数
第五行用SSE作类别概率的损失函数 最后将几个损失函数加到一起,当作yolo v1的损失函数

YOLO V1每个网格单元能够预测多个边界框。为了计算true positive的损失,只希望其中一个框负责该目标,为此选择与GT具有最高IOU的那个框

YOLO正样本选择

  • 当一个真实物体的中心点落在了某个cell内时,该cell就负责检测该物体
  • 具体做法是将与该真实物体有最大IoU的边框设为正样本, 这个区域的类别真值为该真实物体的类别,该边框的置信度真值为1。

YOLO负样本选择

  1. 除了上述被赋予正样本的边框,其余边框都为负样本。负样本没有类别损失与边框位置损失,只有置信度损失,其真值为0。

YOLO使用预测值和GT之间的误差平方的求和(MSE)来计算损失。 损失函数包括

  • localization loss -> 坐标损失(预测边界框与GT之间的误差)
  • classification loss -> 分类损失
  • confidence loss -> 置信度损失(框里有无目标, objectness of the box)

I i j o b j I_{ij}^{obj} Iijobj 取值为0和1,即单元格内是否有目标。
λ c o o r d λ_{coord} λcoord= 5​
λ n o o b j λ_{noobj} λnoobj = 0.5
从上面公式也可以看得出来,yolo_v1就是选用最简单的SSE作为损失函数(PS:还没交叉熵复杂)。
在这里插入图片描述
坐标损失

坐标损失也分为两部分,坐标中心误差和位置宽高的误差, I i j o b j I_{ij}^{obj} Iijobj 表示第i个网格中的第j个预测框是否负责obj这个物体的预测,只有当某个预测框对某个物体负责的时候,才会对box的coordinate error进行惩罚,而对哪个物体负责就看其预测值和GT box的IoU是不是在那个网格的所有box中最大。

我们可以看到,对于中心点的损失直接用了均方误差,但是对于宽高为什么用了平方根呢?这里是这样的,我们先来看下图:
在这里插入图片描述
上图中,蓝色为bounding box,红色框为真实标注,如果W和h没有平方根的话,那么bounding box跟两个真实标注的位置loss是相同的。但是从面积看来B框是A框的25倍,C框是B框的81/25倍。B框跟A框的大小偏差更大,所以不应该有相同的loss。

如果W和h加上平方根,那么B对A的位置loss约为3.06,B对C的位置loss约为1.17,B对A的位置loss的值更大,这更加符合我们的实际判断。所以,算法对位置损失中的宽高损失加上了平方根。
而公式中的 λ c o o r d λ_{coord} λcoord为位置损失的权重系数,在pascal VOC训练中取5。
置信度损失

置信度也分成了两部分,一部分是包含物体时置信度的损失,一个是不包含物体时置信度的值。

其中前一项表示有无人工标记的物体落入网格内,如果有,则为1,否则为0.第二项代表预测框bounding box和真实标记的box之间的IoU。值越大则box越接近真实位置。

confidence是针对预测框bounding box的,由于每个网格有两个bounding box,所以每个网格会有两个confidence与之相对应。

从损失函数上看,当网格i中的第j个预测框包含物体的时候,用上面的置信度损失,而不包含物体的时候,用下面的损失函数。对没有物体的预测框的置信度损失,赋予小的loss weight, 记为在pascal VOC训练中 λ n o o b j λ_{noobj} λnoobj 0.5。有有物体的预测框的置信度损失和类别的loss的loss weight正常取1。

类别损失

类别损失这里也用了均方误差。其中 I i j o b j I_{ij}^{obj} Iijobj 表示有无物体的中心点落到网格i中,如果网格中包含有物体object的中心的话,那么就负责预测该object的概率。

YOLOv1的缺点
由于YOLOV1的框架设计,该网络存在以下缺点:

  • 每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果较差。
  • 原始图片只划分为7x7的网格,当两个物体靠的很近时,效果比较差。
  • 最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。
  • 对于图片中比较小的物体,效果比较差。这其实是所有目标检测算法的通病。

总结

v1对于整个yolo系列的价值,即v2/v3还保留的特性,可以总结为3点:

  1. leaky ReLU,相比普通ReLU,leaky并不会让负数直接为0,而是乘以一个很小的系数(恒定),保留负数输出,但衰减负数输出;公式如下:

    y = { x , x > 0 0.1 x , o t h e r w i s e y=\begin{cases} x, & x>0\\ 0.1x, & otherwise \end{cases} y={x,0.1x,x>0otherwise

  2. 分而治之,用网格来划分图片区域,每块区域独立检测目标;

  3. 端到端训练。损失函数的反向传播可以贯穿整个网络,这也是one-stage检测算法的优势。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值