YOLO_v1目标检测算法深入理解

目录

一、YOLO算法的引入

二、算法的初步思考

二、简单的网络结构

三、数据集的处理

四、LOSS函数的形成

1、类别部分

2、存在物体的置信度部分

3、不存在物体的置信度部分

4、宽高的部分

5、LOSS公式中的几个lambda参数

五、预测

六、总结


论文地址:https://arxiv.org/abs/1506.02640

一、YOLO算法的引入

        目标检测算法融入于日常生活中,R-CNN系列算法是two-stage类型的算法,也就是将1)候选区;2)分类器、回归器;相互结合达到目标检测的目的,但是Faster R-CNN将候选区的选取融入到了Fast R-CNN神经网络中,但是实质上起还是有生成候选区这个步骤的。

        但是本次介绍的YOLO(you look only once)算法,输入one-stage类型的算法,没有将生成候选区域,融入到其中,而且其网络结构更为简单,而该算法需要着重理解的地方就是,训练样本的lables如何生成,网络的预测结果如何处理,如何建立损失函数,该内容将成为本文的重点解析方向。

二、算法的初步思考

        设想,给定一张图片,这个图片里面有物体,那么如果我以一个像素为中心然后框出一个矩形窗,并认为这个矩形框里面存在一个物体,那么对于一个训练集的标出的物体的图片,我们也可以算出一个框出物体的中心像素点在哪里,那么我就可以构建一个超级巨大的深度神经网络输出的结果是一个图片像素大小乘上一个矩形框的参数个数(4个:x、y、w、h),显然太过于暴力了,那么YOLO想到了一个好方法,那就是将原来的图像划分区域,如果一个真实物体的矩形框中心,落入到一个区域内,是不是就可以认为这个物体的中心就在这个区域内呢,这样的话,原先图像像素大小级别的输出维度,降到了一个区块个数的输出维度,同时也可以达到窗口回归的效果。

图一:YOLO的网格化思想

        YOLO的做法是将一个图像分割成均等SxS大小的网格区域,为什么要这么做呢,比较容易想到,CNN网路可以通过padding进行尺寸不变的卷积操作,然后进行将采样,将feature maps进行缩小,所以经过一系列的CONV和POOLING层可以将原先的图片处理为大小为SxS大小的feature map 而此时feature map上的一个像素点的信息不就包含原先那个区域的信息吗(涉及到感受野的知识),该想法并不是论文中体体现的想法,为了能够理解论文中的做法,我做了一点小小的过度,那么如果我想要包含全局的信息该怎么做呢,论文中将CNN之后连接了全连接层,然后最后输出的格式是长度为1470的一维向量。但是论文中为了好理解说成7x7x30,做损失的时候总是需要平铺成一维的,这个很好理解。(论文中将S设置为7,至于30的含义,将在下面讲解)。

二、简单的网络结构

图二:YOLO网络结构
图三:output结构
图四:output中一个网格向量的结构

三、数据集的处理

        通过阅读YOLOv1的代码,可以知道其训练集Label的具体形式。首先数据集的Label也是一个立方体形式。下面就来详细讲解一下训练及Label的处理方式,这对理解YOLO算法有着至关重要的作用,因为大部分都是,结构好理解,里面的内容全部不知道,这样很难真正的理解深度学习算法。

  • 将图像resize成448x448大小
  • 一个网格的后面的维度的向量长度为25(0:是否存在物体,1~5:物体的GT,6~25:物体的种类)
  • 将Ground Truth(图片中物体的真实位置)的形式由(x1, y1, x2, y2)转化为(center_x, center_y, w, h)
  • 将Ground Truth(之后简写为GT)的w、h转化成为对于图像的比例,也就是除以图像的边长 
  • 将GT的center_x、center_y转化为在图像中的相对位置
  • 如果该网格(也就是说GT的中心落在的网格)中存在物体,相应维度标记为1,不是的标记为0
  • 将GT的位置信息(center_x, center_y, w, h)存入到相应的位置
  • 将GT中物体的类别形成one-hot形式向量,存入到相应的位置

四、LOSS函数的形成

图五:论文中的loss函数
图六:Label与Predict

        根据图五,可以看到向量被分成了四个部分,所以Loss函数也将有五个部分组成,分别是,类别部分、存在物体的置信度部分、不存在物体的置信度部分、宽高的部分以及中心坐标点的部分。下面给将每个部分进行详细的讲解。

1、类别部分

        对于类别,由于是one-hot形式,所以softmax就可以,但是文中用的是均方损失函数来计算的。

2、存在物体的置信度部分

  • 1_{i}^{obj}表示网格 i 中存在对象
  • 1_{ij}^{obj}表示网格i的第j个框中存在对象(论文中设置了2个框,也就是说j的取值为1~2)
  • 1_{ij}^{noobj}标识网格i的第j个框中不存在对象

        关于置信度这里的计算文中用了一个非常巧妙地设计,就是计算预测值预测的框和GT的IoU值来作为Label置信度,以此作为预测置信度需要学习的目标,而不是用1。

3、不存在物体的置信度部分

        由于要降低不存在物体的执行都,所以需要讲题致为0,也就是让noobject_mask*predict_scales越小越好,其中noobject_mask表示Label中不是物体的网格部分,该处的值是0.

4、宽高的部分

        这部分也是将Label中的w、h开方与预测值做均方损失即可。

5、LOSS公式中的几个lambda参数

        这些参数是为了平衡各个部分之间的权重,通过实验得来的。

五、预测

        将已将图片推入到训练好的YOLOv1模型中,得到输出,我们需要选择出每一个网格中置信度最高的那个预测框来作为候选的框,然后每个网格都可以得到一个,最后将这些框都取出来,通过NMS算法得到最后的物体位置以及类别。

六、总结

        以上就是完整的YOLO算法的原理过程,其中要注意几点,输出的块其实是一个一维向量,只不过是为了形象的理解才说是一个立方体的,要了解数据集的标签是如何生成的,然后,注意置信度的的标签在数据集中是没有的,这个是通过预测的结果和GT的IoU值来设定的(相当于用预测的A部分和Label生成数据C,让C来做预测的B部分的标签),其他的就是比较常规的部分了。希望对大家有所帮助。

发布了351 篇原创文章 · 获赞 174 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/Triple_WDF/article/details/104394498