前言
之前打算分析caffe源码的,但是由于工作较忙就耽误了。但是希望今后还是能坚持写博客,对知识进行总结梳理,锻炼自己的表达能力。
最近一段时间在研究yolo算法,发现这个算法非常的优美,并且作者更新到了第三版。通过对该算法的学习,可以学习到如何进行算法的优化与实现。但是正如吴恩达在深度学习课程里面所说的,yolo的论文非常的难读,作者写文章的时候着重在写模型的测试部分,而对于模型的训练讲解的非常的少。这让一开始阅读yolo的论文时,有种不知所以然的感觉。还好yolo的作者提供的源代码,使得不懂的地方可以通过阅读来进行加强理解。在这里非常佩服yolo的作者,不仅科研能力强,工程能力也非常的棒,居然自己用C语言撸了一个深度学习框架,佩服。是我学习的榜样!!
好了,废话不多说了,开始我们的正题吧。
算法原理
对于一个新的深度学习算法,我经常从输入输出着手。我们来看一下YOLO的输入出是什么?
首先yolo的输入是一张448x448大小的图片,然后经过网络之后输出为30个值。那么这30个值是什么呢?我们来进行一一的分析。- 前面20个为物体的类别数。为什么是20呢?因为在论文中yolo是要检测20种物体,然后进行one-hot编码,所以维度就是20;
- 第21-22个为两个confidence。这个词我们有点陌生。中文叫做置性度,也就是物体框里面包含物体的可能性。
- 第23-30个为两组x,y,w,h值,即物体框的中心坐标及宽高,共8个值。
知道了网络的输出数据,我们就可以知道训练数据的标签长怎么样了。训练数据的标签必定也有:类别数、confidence和(xywh)组成。那图片的标签具体是怎么打的呢?我们接着分析。
- 首先yolo将一张图片分成SxS大小,在论文中为7x7,如下图所示
在上面的图中,第一个网络由于没有我们要识别的物体,所以标签的类别数、confidence和xywh都为0,接着第二个网格也是如此。。。直到红色框的网格处,我们发现有一只狗,这是标签为狗的类别数,confidence为1,xywh为包含狗的物体框的中心坐标和宽高。那红色框的上面那个框的标签数据是什么呢?它也包含了狗啊。在yolo中只用物体框中心点所在的网格进行预测,因此红色框周围的网格的标签数据也全都是0。
经过这样计算,我们可以得到,一张图片最终的标签数为[20(类别)+2(confidence)+8(xywh)]xSxS- 待续。。。。。