0 前言
在前面一段时间一直在研究Faster R-CNN,对YOLO系列没有太深入了解,由于现在需要将检测网络用于工程应用,所以决心重新去深入理解YOLO系列算法。
1 正文
1.1 网络输入
上图就是Yolo V1的网路结构图,看起来很简单,原图片---卷积----全连接---输出,首先Yolo V1的输入是固定的448×448,这是因为在检测网络中全连接层是固定的,那么倒推回去输入图片也就是固定的了,在faster RCNN中为了解决不同尺度的ROI对全连接层的影响,用到了roi pooling层。
1.2 网络的输出
网络输出是一个7×7×30固定的张量,那么这为什么这样?往下慢慢看就可以发现这就是整个检测网络的重要思想。
(1)为什么输出的是7×7?
图 1
依据原论文中的设计,将原图片用7×7的网格去划分,如上图所示,这7×7的网格经过卷积神经网络之后,输出为7×7的一个张量,那么输出7*7张量的每个像素通道信息就代表原图片中的每个网格的特征,包含有此网格含有目标的类别,位置坐标和置信度。但是,需要注意,并不仅仅包含这个网格的信息,还包含此网格的周边信息,比如用3×3的卷积层在图片上滑动就可以使周边信息包含进来。
(2)为什么输出的通道数是30?
在faster rcnn中,RPN网络分为两路,一路是预测是背景和前景,一路是预测目标的位置坐标。在预测背景时用特征图经过1×1×18卷积层,则输出的特征图就是通道为18,这个18就是预测的9个框是否包含有目标,在预测位置时使特征图经过一个1×1×36的卷积层,则输出的通道就是为36,这36就代表预测的9个框的位置信息。我们通常用通道数去包含我们所要的预测信息,在Yolo V1中输出通道为30同样也是为了预测我们想要的信息。具体来看原图片的每个网格对应输出张量的一个像素点的30维向量中包含哪些信息。
图 2
如图2所示,每个像素点的30个通道分为3大段,我们先总体了解这3大段的含义是什么。
第一大段
原论文中Yolo是检测20类目标,所以第一大段用来预测此像素点对应于原图片的网格20类对象的概率,不过这里用的是条件概率:。意思其实很明确,就是此网格在含有目标的条件下是类别C1,C2........C20的概率分别是多少,所以此段共有20个值,需要注意,此网格的2个预测框他们预测的类别共用这段概率。
第二大段
此段分为两截,他们代表的是2个预测框的置信度,如何求标签的置信度:
意思就是:置信度=此网格含有目标的概率×预测框与真实框之间的交并比,Pr(Object)表达是预测此网格含不含目标,IOU是预测框和真实框之间的接近程度。可以看到置信度有2个,这是因为每个网格作者用两个预测框去预测,每个预测框都有自己的置信度。所以此段有2个值。总的来说,置信度表达了是否含有预测对象以及预测框和与真实框之间的差距。注意Pr(Object)和P(Ci/Object)的区别。
第三大段
此段也分为两截,他们代表2个预测框,我们知道每个预测框都有2个坐标,4个值(中心点x,中心点y, 宽, 高)去确定,那么两个预测框就是有8个值。
从前面三段可知,30 = 第一段20 + 第二段2 + 第三段8
(3) 细节
上面只大体说整个算法的流程,下面详细看一下其中的需要注意的地方。
第一, 一张图片划分为7×7个网格,再论文中,一个网格只能负责一个检测的目标。从(2)中第一大段也可以知道,第一大段只负责预测这个网格是某个目标的概率,所以一张图片上7×7=49个网格,最多预测49个目标。
第二, 一张图片的预测框的数量是7×7×2=98个bounding box,在第二大段中我们也说了,一个网格只产生2个预测框。需要注意的是这98个bounding box在训练初期是胡乱预测的,那么胡乱预测的框如何接近真实的框呢?在第二大段我们说一个网格有2个置信度,置信度计算有IOU,那么这2个预测框bounding box与真实框的IOU哪个大,我们就留下哪个预测框,随着训练的进行,预测框会越来越接近真实框。
第三,一个目标只能由一个网格(grid)去预测,不是多个网格都抢着去预测一个目标。也就是说:图片中的每个目标的预测仅仅归属到一个网格上,那么在图片中的一个目标可能占据许多个网格,例如图1中的狗,狗这个目标我们给哪个网格去预测呢?那就是计算出狗的标签真实框的中心位置,中心位置在哪个网格上,则该网格输出的向量中该对象的第一大段对应的标签类别就是1,所有其他的网格对该目标的预测类别概率就是为0。如图3,以狗子为例子,首先20类标签,要看狗的真实标签框的中心位置是在哪个网格上,那么这个网格就把狗的那类标为1,其余类是0。再看置信度和边框坐标的标签,置信度标签是在训练过程中,生成的2个预测框与真实框之间谁的IOU比较大,例如图3中可知预测框1与真实框的置信度是IOU1,另一个标签框2的置信度就是IOU2,标签框1和标签框2的坐标都是狗子的真实框坐标, 后面再算损失函数的时候会把较小的IOU2置信度和边框乘上0.
图 3
第四,最后一层输出的某个像素点30个通道的预测值如图4所示。
图 4
(4)损失函数
YOLO V1 公式解读:
第一行公式,边框中心点误差,是调节位置误差,置信度误差和对象分类误差之间在整个损失函数中所占据的比重,在YOLO代码中,设置是5,则在边框内无对象的置信度误差的权重。表示第个网格中第个边界框含有目标,意味预测边界框与真实框的IOU较大的那个才会将误差计入总误差中。和是预测框和真实框的中心坐标值。
第二行公式,边框宽度和高度误差。解释和第一行公式一样,就是将边框中心点换成了高度和宽度。
第三行公式,同样也只是负责将预测框与真实框的IOU最大的那个预测框的置信度才计入总误差中。是预测框的置信度,是真实框的置信度。
第四行公式,降低了预测框内不存在对象的置信度误差在总误差中的份量。是第i个网格的第j个预测框不存在对象,也就是预测框与真实框的IOU较小的那个预测框。
第五行公式,是网格i内存在目标才会计入到总的误差内。和分别是真实框的类别标签和预测该网格的类别。
(4) 预测过程
训练好的YOLO网络,输入一张图片,将输出一个 7*7*30 的张量(tensor)来表示图片中所有网格包含的对象(概率)以及该对象可能的2个位置(bounding box)和可信程度(置信度)。为了从中提取出最有可能的那些对象和位置,YOLO用NMS(Non-maximal suppression,非极大值抑制)算法。
(5) 优缺点
YOLO以速度见长,处理速度可以达到45fps,其快速版本(网络较小)甚至可以达到155fps。这得益于其识别和定位合二为一的网络设计,而且这种统一的设计也使得训练和预测可以端到端的进行,非常简便。不足之处是小对象检测效果不太好(尤其是一些聚集在一起的小对象),对边框的预测准确度不是很高,总体预测精度略低于Fast RCNN。主要是因为网格设置比较稀疏,而且每个网格只预测两个边框。
下面还会写YOLO V2 与 YOLO V3