目标检测之YOLO, YOLOv2, YOLOv3详解

刚刚接触目标检测时,对CRNN系列,YOLO和SDD这几大算法有一个粗略的理解,目标检测算法RCNN, Fast RCNN, Faster RCNN, YOLO和SSD ,而目前又因为想要用YOLO算法做文字检测,所以在此对YOLO系列做一个详细的讲述。

YOLO

论文:You Only Look Once: Unified, Real-Time Object Detection

YOLO算法是将目标检测看做一个回归问题,对于给定的图片,经过一个神经网络的计算之后就能够同时输出图片中物体的所在位置和物体的类别,如图1所示,是一个端到端的学习算法。

图1:YOLO算法

YOLO算法是将输入图片划分成S x S的网格(grid cell),每一个网格负责检测中心点落在此网格中的物体。对每一个网格:

  • 它需要预测B个边界框(bounding boxes)和这些边界框的置信值(confidence score)
  • 它只能检测到一类物体,不需要考虑边界框的数量
  • 它需要检测C个类条件概率(conditional class probability)P\left ( class_{i}|Object \right )

运行YOLO在PASCAL VOC数据集上,论文中设定S=7,B=2,C=20,那么预测值将编码成一个S x S x ( B * 5 + C) = 30大小的张量。

图2: 模型

每个边界框中包含五个元素,x, y, w, h和confience。其中(x,y, w, h)坐标点确定边界框的位置和形状,(x,y)是边界框的中心点,w和h是边界框的宽和高,x, y, w, h的取值在[0,1]区间,(x,y)是相对于网格左上坐标的偏移,w,h是相对于整个图片的宽和高的比例。confidence score反映一个边界框包含一个物体的可能性大小Pr(Object)和这个边界框的准确度(IOU)。如果网格中不存在物体时,Pr(Object) = 0, 如果存在物体,那么Pr(Object) = 1。假设边界框的准确度等于预测框与真实值之间的IOU值,所以置信度应该等于Pr\left ( Object \right ) * IOU_{pred}^{truth}.

YOLO使用卷积层提取特征,使用全连接层预测输出值。网络架构借鉴GoogleNet,包括24层卷积层和2个全连接层,如图3所示,最后一个全连接层用于预测类别概率和边界框坐标值,其激活函数使用线性激活函数,其他层的激活函数采用Leaky ReLU激活函数:max(0, 0.1x)。训练时,先使用图3中的前20个卷积层加上一个平均池化层和一个全连接层在ImageNet 1000-class数据集上进行预训练,随后在这20个卷积层后面加上随机初始化的4个卷积层和2个全连接层用于检测。由于检测通常需要高质量的图片,所以将输入图片的大小由224 x 224增加成448 x 448。

图3:网络架构

对于此网络的最后输出,其shape为 [batch_size, 7 x 7 x 30]。对于每一个网格,输出一个长度为1*30的向量,前20个元素为20个类别的预测值P\left ( class_{i}|Object \right ),随后两个元素是此网格预测的两个边界框的置信度,最后的八个元素为两个边界框的坐标点值。class-specific confidence score =  conditional class probability * box confidence score,class-specific confidence score表示的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏

每一个网格预测多个边界框,但是我们仅仅只需要其中的一个边界框来圈示物体,所以就选择与真实边界框IOU值最高的值为最优解。YOLO使用平方和误差error-square error作为损失函数,损失函数包含三部分:类别预测,坐标预测和置信度预测,总的损失函数如下所示:

YOLOv2

论文:YOLO9000: Better, Faster, Stronger

YOLO算法的最大特性就是快,但是也伴随着识别物体位置精确性差和召回率低等缺点,所以为了提高YOLO的识别准确度,YOLO v2吸取百家之长,如图4所示,YOLO向YOLO v2 的进化之路,路漫漫兮,下面一一进行介绍。

图4:YOLO ---> YOLO v2

 Batch Normalization: BN在模型收敛方面有显著地提升,同时也能够消除一些其他形式的正则化需求,在YOLO每个卷积层后面添加BN层,mAP提升2%。除此之外,BN也有助于正则化模型,使用BN就能够去除避免模型过拟合的dropout步骤。

High Resolution Classifier: YOLO算法在训练阶段,先在ImageNet数据集上对卷积层参数进行预训练(分类网络),预训练时的图片输入是224*224,为了满足检测对高质量图片的要求,检测训练时(检测网络)将输入图片增加到448*448大小,这意味着网络检测学习的同时,还需要对输入图片进行尺寸调整的学习。对YOLOv2,作者提出预训练之后,在ImageNet数据集上,用448*448大小的图片对分类网络进行微调,大约10个epoches,其目的是让网络先学习一下高分辨率的图片,之后再应用到检测网络中,这个举措使得mAP提升大概4%.

Convolutional With Anchor Boxes: 从YOLO算法中剔除全连接层,改用anchor boxes预测bbox。首先需要将448*448大小的输入图片收缩为416*416的大小,因为在YOLO v2版本中,使用的网络的总步长是32(如图7所示,v2版本新架构),那么最终得到的特征图为13*13,是奇数,这样能够保证特征图中恰好有一个中心点的位置。使用anchor boxes之后,虽然mAP有所下降,但是recall却是从81%提升到88%。

Dimension Cluster: 当在YOLO算法中使用anchor boxes时,出现两个问题,第一个问题是box dimensions是需要手动选择的。对网络来说,如果能够选择合适的anchor尺寸,网络更加容易学习并且预测出更好的结果,在论文中作者使用k-means算法在训练集上的边界框中自动选择合适的box dimensions。如果使用标准的k-means算法(使用欧氏距离作为衡量标准),因为盒子的大小不同,会导致大盒子将会比小盒子产生更多的错误,因此希望度量标准是与盒子尺寸大小无关的,所以对于距离度量标准,则定义为:d\left ( box,centroid \right ) = 1 - IOU \left ( box, centroid \right )

选择不同的k值进行k-mean选择,k值与AVG IoU的关系如下图左子图所示,在模型的复杂度和recall的权衡下,选择k=5,得到五个anchor boxes,这五个盒子与手选的盒子有很大的不同,它们更高,更窄。

图5:anchor boxes dimension

Direct location prediction: 当使用anchor boxes时,出现第二个问题,模型不稳定,尤其在早期迭代的时候。大多数模型不稳定来自于对盒子坐标(x,y)的预测。为了作者延续使用了原始YOLO中预测位置相对于当前网格的偏移量,并使用一个sigmoid激活函数将偏移量限制在(0,1)中。在输出特征图中,每一个网格输出5个bbox,对每一个bbox,有五个参数值\left ( t_{x},t_{y},t_{w},t_{h},t_{o} \right )。假如一个网格相对于图像左上角的偏移量为\left ( c_{x},c_{y} \right ),并且一个bbox的宽和高分别是p_{w}p_{h},那么相应的预测值计算公式如下,图示如:

 同时使用Dimension clusters和direct location prediction比使用anchor boxes的版本mAP提高了5%。

图6:Direct location prediction

Fine-Grained Features: YOLO v2是在13*13特征图上进行目标检测,对于一些大的目标是足够的,但是对于小物体的检测还需要细粒度的特征,为此YOLO v2添加一个passthrough layer,将浅层的特征和深层的特征,两个不同尺寸的特征通过stack adjacent feature方法连接起来,将26*26*512的特征图和13*13*2048的特征图连接起来,再在扩展的特征图上进行目标检测,这个方法提高模型1%的mAP

Multi-Scale training:原始YOLO的网络架构中存在全连接层,使得输入图像尺寸大小固定为448*448,YOLO v2版本添加anchor 之后输入图像大小改为416*416,而且v2版本仅仅使用卷积和池化操作,对输入图像的尺寸没有要求,为了使得v2版本更加健壮,在训练时,每10个batches,网络随机选择新的图片尺寸大小,取值范围为[320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 680], 最小尺寸为320*320,最大尺寸为608*608. 这种策略使得v2版本可以在不同尺寸的图片作为输入时预测效果也很好。

网络架构:v2版本使用一个新的分类模型作为base net,被称为Darknet-19,有19层卷积层和5个最大池化层。类似于VGG网络架构,使用3*3的过滤器,每一个池化层之后通道数加倍,在3*3卷积层之间使用1*1卷积层为了压缩特征表示,如图7所示。

图:7:Darknet-19

YOLOv3

论文:YOLOv3: An Incremental Improvement

在v3版本中,作者又提出新的网络架构Darknet-53提取特征,新的架构借鉴了v2版本的Darknet-19和ResNet网络,如图8所示,可以看出整个网络没有池化层,是在五个卷积上定义步长为2来下采样,总步长为32。

图8:Darknet-53

YOLO v3是在3个不同尺寸的特征图上进行预测的,如果输入图像大小为416*416,那么特征图大小分别为13*13, 26*26, 52*52。在一个特征图上的每一个网格预测3个box,每个盒子需要(x, y, w, h, confidence)五个基本参数,并对每个类别输出一个概率,设特征图大小为N,对于COCO数据集,则每一个特征图需要预测 N*N*[3 *(4+1+80)] = N*N*255,,所以每一个特征图的通道数为255。上述的Darknet-53网络是最base net,v2版本中,为了细粒度检测,添加了passthrough layer,在v3中,因为有3种特征图,base net只能输出一种尺寸的特征图,为了得到另外两种尺寸的特征图,对前两层的特征图进行上采样,之后将上采样后的特征图和之前的特征图进行连接,具体结构如图9所示,图来自来自https://github.com/wizyoung/YOLOv3_TensorFlow。 

图 9:YOLO v3 结构图

类别预测方面使用由单标签预测变成多目标预测,将softmax分类由二分类进行替代,类别预测使用binary cross-entroy loss。这是因为有些标签是重复的,比如Woman和Person标签,使用softmax就是假设一个物体只属于一类。使用二分类,对于多类别的物体,就能够输出多类别,而不仅仅是一类。

 v3版本是对前两个版本的改进,有所改进,还有所保留,在v3版本中,仍使用v2版本中的多尺寸训练(multi-scale training), BN, 坐标预测方式等一些基本的操作。

现在YOLO经过三个版本的改进,在速度和准确率的达到一个很好的均衡,在保证正确率的情况下,速度也是一骑绝尘,在和SDD同准确率的情况下,速度大概是SDD的3倍,见图10YOLO和其他算法的比较,作者也是个傲娇的人。

图10:YOLOv3 和其它算法的比较

 

展开阅读全文

没有更多推荐了,返回首页