YOLO v2推理过程介绍

这大概是在2017年底的时候写的,当时还研究了一下faster rcnn和ssd的推理过程。后来YOLO v3出来了,这个就放在一边没理了。现在发出来凑个篇数。

YOLO (You only look once) 是业界第一个端到端的图像目标检测方法,和Faster RCNN相比,不再需要RPN(region proposal network)来生成候选区域ROIs,因此,检测速度更快,更加可以满足实时检测的要求。YOLO第一版本算法 将一张图片均分为SxS个网格(grid),每个网格对应B个bounding box,但是,对目标概率的检测是基于每个网格进行,而不是基于每个bounding box进行,因此,碰到目标不是落在单个网格中的情况,检测准确性有所下降。YOLO v2 做了很多改进,再次确定了YOLO在图像目标检测领域的重要地位,和SSD(single shot multibox detector) 并列为端到端图像目标检测的两大流派。

YOLO 算法都已由作者基于Darknet 实现并开源 ,本文基于YOLO v2的例子程序,以yolo.cfg 为网络模型,yolo-voc.weights 为模型参数(支持80种分类),dog.jpg 为待检测图像,分析了YOLO v2算法的推理过程。这三个文件的网址是:
https://github.com/pjreddie/darknet/blob/master/cfg/yolo.cfg
https://pjreddie.com/media/files/yolo-voc.weights
https://github.com/pjreddie/darknet/blob/master/data/dog.jpg

  • YOLOv2整体网络结构

上述例子使用的网络模型在推理时候的结构如下所示。


YOLOv2整体网络结构

此网络由32层组成,分别记为layer0到layer31,如上图所示。由于网络模型要求输入的图像是固定大小,因此,待检测的原始图像首先被缩放到608x608,最终进入网络模型的数据尺寸是608x608x3,其中3表示红绿蓝三个通道。经过由卷积层和池化层组成的17个layer后(layer0至layer16),数据尺寸变成了38x38x512,这表示有512个feature map,每个feature map的大小是38x38。而layer25将此数据分别传递给上下两条路径,其中上面路径再经过由卷积层和池化层组成的8个layer后(layer17至layer24),数据尺寸变成了19x19x1024;而下面路径先经过layer26卷积层再进行layer27重排,数据尺寸变成了19x19x256。然后,上下两条路径经过layer28合并为19x19x1280的数据,再经过两个卷积层layer29和layer30,得到数据尺寸为19x19x425,表示有425个feature map,每个feature map大小是19x19。最后的layer31,则根据确定网络模型时候的假设,为输入的19x19x425数据赋予相应的物理意义,再进行整合得到最终检测结果。总之,网络模型非常简洁而且直截了当,主要通过若干卷积和池化层来提取图像特征并生成检测所需数据,最后通过结果整合层来得到最终的目标检测结果。

其中,卷积层,除了包括普通意义卷积层的功能外,还可以包括批归一化(Batch Normalize )和激活函数(activation);池化层都是普通的2x2的max pooling;重排层则是将38x38的feature map中2x2区域的数据,重排成4个19x19的feature map;合并层只做简单的数据归并;结果整合层的功能,除了在网络模型配置文件中指定的region层外,还包括分散在Darknet实现中的代码,从而组成了一个逻辑完整独立的结果整合层。卷积层和结果整合层将在后面详述。

  • 卷积层和批归一化

在Darknet的网络模型配置参数中,卷积层由卷积、批归一化(Batch Normalize)和激活函数(activation)组成,其中,批归一化又包括归一化和缩放平移两个功能,如下图所示。


卷积层

在本网络模型中,除了最后一个卷积层layer30的激活函数是线性函数外,其他卷积层的激活函数都是leaky ,即:return (x>0) ? x : 0.1x。

当机器学习通过样本数据进行有监督的学习时,学到的参数,除了和模型本身相关外,还和样本数据本身的分布有关。所以,假如样本数据的分布不停发生变化,将会使训练非常困难,这种情况就发生在神经网络中的每一个隐含层,因为,每调整一次参数,隐含层的输入数据的分布都会因为前一层网络参数的变化而变化,这被称为Internal Covariate Shift,也是BN(batch normalize)希望解决的问题。个人认为,BN尚未从理论上进行完美的解释,主要是将输入数据归一化到正态分布N(0,1),数学公式如下所示,其中,epsilon可以近似当0看待。另一方面,考虑到这样的归一化可能是错误的,在某些情况下更加不利于参数的学习,BN又加了数据的缩放平移功能,可以将数据还原恢复到归一化之前的输入(即下面公式的反函数),当然,通过训练学习得到的缩放平移参数,也可能会将数据缩放平移到更加合适的另外一种分布。在训练时,针对每个batch的所有数据进行归一化,也就是说,公式中的均值E和方差Var是基于batch数据得到,这也是BN名称中batch的来源;而在推理时,则是根据所有的训练数据进行归一化,也就是说,此时公式中用到的均值和方差,是来自所有样本数据的无偏估计。


BN公式
  • 结果整合层

结果整合层的输入数据尺寸是19x19x425,即425个feature map,每个feature map大小是19x19。这意味着,本网络模型将图片均分为19x19的网格,feature map中的每个坐标的元素对应着一个网格grid,而每个网格又被细化为5个bounding box,后一段会具体解释。

将这些feature map按下图从左到右从上到下的视角来看,每行有85个feature map,是因为每个bounding box对应着4个调整参数、属于背景的可能性、以及属于80种分类的概率可能性,即一共4+1+80=85个数值。而因为每个网格被细化为5个bounding box,所以,图中一共有5行。这就是85x5=425个feature map的物理意义。


425个featuremap的物理意义

任取feature map中的一个元素,不妨假设为图中的圆圈位置,记其坐标为该feature map的第i列第j行(zero-based),那么,对应的bounding box计算公式 如下:

    bx = (i + x0) / w;
    by = (j + x1) / h;
    bw = exp(x2) * biases[2*n]   / w;
    bh = exp(x3) * biases[2*n+1] / h;

其中,bx、by、bw和bh分别对应bounding box中心的坐标和宽高,x0、x1、x2和x3则对应着第0、1、2、3列的feature map在该坐标位置的数值;w、h是feature map的宽高,这里即19;biases数组是模型参数,其数值随网络模型的确定而确定,对应着网络模型文件中的region层的anchors参数;n取值为0到4,对应着行数,因此,上图5行中的每一行都对应着一个不同的bounding box(不同的宽高),所以,bounding box总数达到了19x19x5=1805个,因为一张图片被分成了19x19个网格,而每个网格又被细化为5个bounding box,这也使得检测准确性得到了更多的提高,当然,不可以无限制提高n的值,那会影响检测速度,这是个权衡的结果。

由于上述公式还对bounding box做了规格化处理,最后结果处于[0,1]范围,因此,第0、1列的feature map的数据要先经过LOGISTIC激活函数,将数据映射到[0,1]范围,然后才代入上述公式。而从第4列开始,表示的是这个bounding box属于背景、属于80种不同分类的可能性,那么,所有可能性累加应该是1,所以,这里的概率数据还进行了softmax处理。不过,这里的代码实现,只对80种不同分类的概率值进行softmax处理,而没有包括背景概率,背景概率只是进行了LOGISTIC处理。

最后,结合NMS(non-max suppress)算法,根据属于80个不同分类的可能性概率和bounding box的重叠情况,给出本图像中的目标位置和目标类别。

以上内容是本人业余时间兴趣之作,限于水平,差错难免,仅代表个人观点,和本人任职公司无关。

本文首发于微信公众号:那遁去的一

你可能感兴趣的:(YOLO v2推理过程介绍)