品读YOLO(一)

本节将介绍YOLO,并穿插如何自己搭建网络的知识。本文章除了有特别标注的图片外,其他图片均来自论文。

原论文URL: https://arxiv.org/pdf/1506.02640.pdf

在物体检测领域中,YOLO(You only look once)是一个有名和常用的神经网络。
原因是:
1,运行速度快,能接近实时地把物体的类别以及位置识别出来。
2,精度相对高,对于只需要知道物体类别以及位置,而不追求物体的具体形状时,是一个很适合的解决方案。

输入与输出

在介绍YOLO之前,或者说搭建网络之前,首先我们要明确我们的目标,这对我们理解YOLO的结构或者自己搭建网络有很大帮助甚至决定性作用。
目标有三个:
1,找出物体的位置。可转化为(x,y)坐标。
2,判断物体的类别。可转化为一个长度等于类别数C的数组,每个数字代表一个类别。
3,判断物体在图像中的大小。可转化为(h,w),也就是矩形的长和宽。

所以,这里我们可以初步确定输出的数据是怎样的。
输出为一个形状为2(坐标)+20(类别数)+ 2(长宽)的张量(tensor)。

然后,我们要确定输入数据。这个是按照自己的喜好来定的。
首先,我们输入的是一张图片作为输入数据。
如果按照YOLO论文的思想,为了能检测出物体的位置以及大小,作者对输入数据的图像进行了分割。把输入图像分割成7X7小块图像,然后每一小块图像对应一个物体类别。
也就是我们要对7X7张小图像进行分类操作,判定该小图像上是否存在物体,如果存在,物体是哪个类别。
这里我们可以看一下论文的标注图。

品读YOLO(一)_第1张图片

确定输入后,我们需要诱导AI往哪个方向学习。也就是要准备目标数据集。
输入数据集加上这个目标数据集合起来就是我们常说的训练数据集。
如果是分类操作,目标数据集就是标签(label)。
如果是生成图像,目标数据集就是目标图像。

在YOLO的论文里,它的目标数据集是Imagenet ,这个数据集包含了标签,所以我们只需要对神经网络进行诱导,让它输出的结果与目标数据尽可能地一致。

在检测物体时,我们不想在图片中只检测出一件物体,所以论文里面引入了box的概念以及信任指数confidence,box其实就是一个一个的方框,而confidence就是一个分数,用于确定是某一类,该物体是否落在box内以及这个box是否很好地框住物体。由于每个box对应信任指数confidence以及长宽h,w和坐标x,y。所以一个box对应的数据形状为(2+2+1)boxnum+classnum。而在YOLO的论文中,每一个小图像里面包含有2个box,每张图片包含7X7个小图像,所以我们需要把输入图像从形状(ho,wo,co)卷积成(7X7X30)。这里boxnum是2,classnum是20。
训练完毕后,我们就可以利用这里7X7X30个参数来对图像进行标注了,因为这些参数都有各自的意思。

搭建网络

这里我们可以直接看一下原论文的网络结构,我们可以注意一下输入与输出的关系。
品读YOLO(一)_第2张图片
期间如何卷积是由我们自己决定的,论文里面给出的结构是作者们试到的或者计算到的最佳结果。但是由于神经网络的计算量过于庞大,网络的前后影响很难经过人类计算明白,所以一般多尝试各种结构。这也是现在深度学习的弊病之一,网络像是黑盒子。

确定损失函数

确定好神经网络的输出后,我们需要订立一个诱导机制,或者说惩罚机制,也就是我们常说的损失函数(loss function)来对神经网络进行诱导,让它向我们所需要的效果方向努力进行学习。

损失函数可以理解为误差函数,也就是计算出神经网络所输出的结果与目标的差异。

最简单的损失函数有l1loss,也就是目标值与输出值(x-y)进行相减。但是l1loss有可能为负数,导致结果离散,所以可以对它取绝对值。

其他常用的损失函数有l2loss和交叉熵(cross-entropy)。

l2loss就是欧氏距离,我们数学课上经常遇到的两个数相减取平方(x-y)^2,这个损失函数计算容易,也能防止离散问题,所以比较受欢迎。YOLO也用到了l2loss。

在这里插入图片描述

摘自维基百科

交叉熵经常在分类问题中采用。公式是这样的。在分类问题中,研究者经常采用softmax-crossentropy。也就是softmax交叉熵。softmax是一个在概率论里面比较常用的归一化只是函数,公式是这样的,它能够把一堆数字进行归一化,让它们全部相加等于一。所以一堆数字通过softmax进行变换之后,它们会变成变成一堆像是概率的数字,例如第一类的概率是0.32…经过softmax后取交叉熵,是因为softmax的结果看上去也是一堆离散的数据,我们可以用交叉熵对输入和输出进行计算距离。在离散数学里熵是代表一堆数据的离散程度。熵越大,数据分布约均匀,也就是越混乱。所以熵越小,也就是loss越小,我们的训练效果越好。

至于我们要选择哪一种损失函数,也是可以靠我们去多尝试的。l2loss跟交叉熵的主要区别,我们可以从它们的函数性质可以看出来的,-log函数相对于x^2 函数在0,1区间里面更加陡峭,
所以交叉熵一般能比 x^2 函数更加接近0,这个大家可以试一下。
品读YOLO(一)_第3张图片品读YOLO(一)_第4张图片

引用:x^2函数来源于谷歌,log2函数来源于维基百科

扯远了。

现在回到yolo,yolo的损失函数用到了l2loss,我们可以看一下它的损失函数公式。
品读YOLO(一)_第5张图片
我们可以看到,损失函数里面全是l2loss,其中第一行为坐标的误差,第二行为box的大小的误差,第三行为第一个box所对应的类别误差,第四行为第二个box所对应的类别的误差,第五行为信任指数的误差。

挑选适配器

确定好损失函数后,其实我们就可以直接进行训练了。用反向传播方法来进行循环,就可以逐渐降低loss,但是这样的效率会比较低。所以我们一般还会使用适配器,也就是optimizer。

适配器的作用是利用梯度下降算法的特点来加速训练,这个的详细解释现在先跳过,因为我这里还没有系统学习过。
常用的适配器有SGD和ADAM。
SGD训练速度较ADAM慢,但是效果会比ADAM好一点。而ADAM的训练速度快,效果也不错,所以现在很多网络训练时都使用。

选择好适配器后,就可以开始训练啦……

YOLO总结

1,YOLO的目标是物体检测,所以它的输出包含了坐标,类别,box大小等信息。
2,从结构上来看,YOLO是一个非常标准的CNN网络。
3,从损失函数上看,YOLO的损失函数也是很直观的l2loss。

搭建网络总结

1,首先明确目标,确定输入输出是什么。
2,搭建网络,让输入与输出能有一个明显的映射关系。
3,确定惩罚机制,也就是损失函数。损失函数的种类多种多样。
4,挑选适配器。

后话

想要训练一个足够好的网络,还需要多次尝试和调超参数。如何调参也是一门技术活,下次有机会写写。还有就是如何根据想法搭建网络,下次有时间也写写。

你可能感兴趣的:(我的经验,自学AI,论文品读,人工智能,物体检测,CNN,YOLO)