YOLO算法系列之YOLOv1精讲

目录

YOLOv1网络结构

YOLOv1输入与输出映射

YOLOv1损失函数

坐标损失函数

置信度损失函数

类别损失函数

总结


大家好,我是羽峰,今天要和大家分享的是YOLOv1算法. 本文有文字和视频,感兴趣的话可以看视频,视频在我主页能找到,可能视频讲的更细。

YOLOv1算法是YOLO系列算法的基础,理解YOLOv1可以更好的理解YOLO系列算法。希望通过本文的讲解,能帮助你更好的理解YOLO系列算法。

YOLOv1网络结构

首先我们要理解的是yolo的网络结构,如图1所示,其实网络结构比较简单,就是简单的CNN网络,池化操作,以及全连接网络。我们主要理解输入与输出之间的映射关系,中间网络只是求取这种映射关系的一种工具。网络的输入是448*448*3的一个彩色图像,而网络的输出是7*7*30的多维向量。下面我们将详细的来解释这种映射关系,这种映射关系也是YOLOv1的根本。

YOLO算法系列之YOLOv1精讲_第1张图片

                                                                                                 图1 YOLOv1网络结构

YOLOv1输入与输出映射

YOLO的输入与输出如图2所示,左边是一张图片,中间的圆形可看作是目标物体,当图片输入到网络中,YOLOv1首要做的是将图片分成7*7的网格,从中间图像中可以看出,红色代表的是网格,蓝色代表的是目标物体的中心,然后黄色代表的是真实的物体边框。这里有个最重要的一个概念就是:当物体中心落在某个网格中心时,那么这个网格就负责预测这个物体,这是yolov1的一个基础。每个网格预先都会生成两个预测框,这样YOLOv1一共生成7*7*2=98个预测框,相比于faster rcnn 成百上千的预测框来说,YOLO的预测框明显少了很多,这是YOLO非常快速的一个原因。

    每个预测框都会对应一个30维的向量,这30维向量是2*5+20得来的,其中20是20个类别,这里之所以为20,是因为原论文所做的就是对20个物体进行分类。如果我们自己的数据集有n个类别,那么这里的20就可以改为n个类别。然后2代表的是2个边框,因为最开始每个网格会生成两个预测框,而5则代表每个边框中有五个参量,分别是边框的中心坐标(x, y),边框的宽w和高h,还有一个是框的置信度,置信度公式计算如图公式所示,置信度大的那一个预测框就会被选为该网格的预测边框。网络的输出就是7*7*30维的向量,与输入存在一个数学上的映射关系,而中间的yolo网络只是求这个映射关系的一种工具。接下来我们将重点研究一下yolo的损失函数。

YOLO算法系列之YOLOv1精讲_第2张图片

                                                                                                      图2 输入与输出的映射关系

YOLOv1损失函数

损失函数大致分为3个部分,第一个是坐标的预测,分别是边框的x, y, w, h。第二个是物体的置信度预测,第三个是物体的类别预测,损失函数与7*7*30维的向量相对应,是求取输入与输出之间映射关系的“数学表达式”。

YOLO算法系列之YOLOv1精讲_第3张图片

                                                                                                    图3 YOLOv1的损失函数

坐标损失函数

首先我们看一下坐标损失函数,如图4所示。每个参数的意义如图所示,之所以采用根号来计算物体的长和宽,是因为根号后的大物体的长宽损失与小物体的长宽损失相近,这样整个损失函数不会被大物体所操纵。若不采用根号计算,那么大物体的损失要比小物体损失大很多,那么这个损失函数会对大物体比较准确而忽略了小物体。公式前的系数是一个超参数,这是设置为5,因为物体检测过程中,我们所要检测的物体相对与背景来说要少的很多,所以加入这个超参数是为了平衡“非物体”对结果的影响。

 

YOLO算法系列之YOLOv1精讲_第4张图片

                                                                                             图4 坐标损失函数

置信度损失函数

置信度的损失函数如图5所示,每个参数的意义如图所示,这里为什么要加入“非物体”的置信度呢,是因为网络要想学习分类n个物体,那他实际要学n+1个类别,那多出的“1”是背景或者就是真实意义上的非物体,这一类是占有很大一部分比例的,所以必须要学习这一类,才能保证网络的准确性。那这里为什么要在“非物体”的置信度前边加上超参数呢?也是因为我们所检测的目标物体相对于“非物体”是很少的,如果不加入这个超参数,那么“非物体”的置信度损失就会很大,所占权重比较大,这样会导致网络只学习到了“非物体”特征,而忽略了目标物体特征。

YOLO算法系列之YOLOv1精讲_第5张图片

                                                                             图5 置信度损失函数

类别损失函数

最后则是类别损失函数,如图6所示,类别损失是一个很粗暴的两个类别做减法,这是YOLOv1不可取的一部分,当然后续就改掉了。

YOLO算法系列之YOLOv1精讲_第6张图片

                                                                                         图6 类别损失函数

总结

最后我们来做个总结,YOLO的优点就是速度快,YOLOv1缺点也很明显,

  1. 对拥挤物体检测不太好:因为拥挤物体的中心有可能都落在一个网格中心,那么这个网格可能就要预测两个物体,这是很不好的。

  2. 对小物体检测效果不好,小物体损失虽然使用的超参数或者根号进行了平衡,但小物体的损失占比还是小,网络主要学习的还是大物体特征。

  3. 对非常规的物体形状或者比例,检测效果不好

  4. 没有batch normalize.

你可能感兴趣的:(计算机视觉,YOLO,计算机视觉,深度学习,cv)