深度学习目标检测之YOLO系列

近年来目标检测流行的算法主要分为两类:1、R-CNN系列的two-stage算法(R-CNN、Fast R-CNN、Faster R-CNN),需要先使用启发式方法selective search或者CNN网络RPN产生候选区域,然后在候选区域上进行分类和回归,准确度高但速度慢。2、YOLO,SSD这类one-stage算法,仅仅使用一个CNN网络直接预测不同目标的类别和位置,速度快但准确性要低一些。

深度学习目标检测之YOLO系列_第1张图片

 

一、You Only Look Once: Unified, Real-Time Object Detection

YOLO将物体检测当做一个回归问题来处理,使用整张图像作为CNN的输入,直接在输出层回归bbox的位置及其所属的类别。YOLO检测物体的速度很快,base YOLO运行在Titan X GPU 上能达到45 FPS,Fast YOLO在保持mAP是之前的其他实时物体检测器两倍的同时,速度可达155 FPS。YOLO对密集的小物体检测效果不好,且在物体定位时更容易出错,但在背景上预测出不存在的物体(false positive)的情况会少一些,这是因为YOLO在训练和测试时都能看到整张图像,可以很好的利用上下文的信息;YOLO比DPM、R-CNN更能学到物体的泛化特征,这使得YOLO可以从真实图像领域迁移到其他领域,如艺术等。

深度学习目标检测之YOLO系列_第2张图片

将输入图片划分成S*S个grid,如果某个物体的中心落在一个grid cell中,则这个cell就负责检测这个物体。每个cell预测B个bbox及其置信值confidence scores,这个值表示bbox中是否含有物体以及坐标有多准:\mathrm{confidence=Pr(Object)*IoU_{pred}^{truth}},如果有物体落在cell中,则第一项取1,反之取0;第二项是预测的bbox与GT box之间的IOU值。

每个bbox由5个预测值组成:x, y, w, h, confidence,坐标(x, y)表示bbox中点在cell中的相对位置。每个cell还要预测C个类别条件概率 \mathrm{Pr(Class_{i}|Object)},即在一个cell包含一个物体的前提下,它属于某个类别的概率。只为每个cell预测一组(C个)类概率,而不考虑框B的数量。

深度学习目标检测之YOLO系列_第3张图片

测试时每个cell预测的类别信息和bbox预测的置信信息相乘,可得到每个bbox的class-specific confidence score:

        \mathrm{Pr(Class_{i}|Object)*Pr(Object)*IoU_{pred}^{truth}=Pr(Class_{i})*IoU_{pred}^{truth}}

为了评估YOLO在数据集PASCAL VOC上的表现,结构参考GoogLeNet,包括24个卷积层+2个全连接层;使用简单的1*1降维卷积层+3*3卷积层代替inception模块。令S=7,B=2,C=20,最终的输出是一个7*7*(2*5+20)的tensor。

深度学习目标检测之YOLO系列_第4张图片

首先使用ImageNet 1000-class数据集预训练卷积层:前20个卷积层+average-pooling层+1个fc层,将预训练好的卷积层+4个卷积层+2个fc层(w随机初始化)用于检测,并将输入图像的分辨率由224*224提升到448*448以获取更精细的结果。将x, y, w, h的预测结果都归一化到0和1之间,激活函数使用Leaky ReLU,避免ReLU梯度消失的问题。

        \phi (x)=\left\{\begin{matrix} x & \mathrm{if}\; x>0\\ 0.1x & \mathrm{otherwise} \end{matrix}\right.

损失函数的设计是让(x, y, w, h)、confidence、class这三个方面达到很好的平衡,简单的采用sum-squared error loss作为损失函数会有一些不足:位置误差和分类误差的重要性显然不应对等;一幅图片中许多grid不包含任何物体,它们对梯度更新的贡献将远大于含有物体的少量grid,这会导致网络不稳定甚至发散。为了解决这些问题,增加位置误差的权重 \lambda _{\mathrm{coord}}=5 减少不含物体的bbox置信损失权重 \lambda _{\mathrm{noobj}}=0.5;使用bbox宽高的平方根代替宽高,使小bbox发生偏移时的损失比大bbox要大。

深度学习目标检测之YOLO系列_第5张图片

YOLO的损失函数定义如下,1_{i}^{obj}表示物体是否出现在第i个cell中,1_{ij}^{obj}表示第i个cell中第j个bbox是否负责这个物体。只有当某个grid中含有物体时才对分类错误进行惩罚;只有当某个bbox对某个GT box负责时,才会对位置误差进行惩罚(cell中与真实值的IoU最大的predictor)。

        \lambda _{\mathrm{coord}}\sum_{i=0}^{S^{2}}\sum_{j=0}^{B}1_{ij}^{obj}[(x_{i}-\hat{x}_{i})^{2}+(y_{i}-\hat{y}_{i})^{2}]\\\\+\lambda _{\mathrm{coord}}\sum_{i=0}^{S^{2}}\sum_{j=0}^{B}1_{ij}^{obj}[(\sqrt{w_{i}}-\sqrt{\hat{w}_{i}})^{2}+(\sqrt{h_{i}}-\sqrt{\hat{h}_{i}})^{2}]\\\\+\sum_{i=0}^{S^{2}}\sum_{j=0}^{B}1_{ij}^{obj}(C_{i}-\hat{C}_{i})^{2}+\lambda _{\mathrm{noobj}}\sum_{i=0}^{S^{2}}\sum_{j=0}^{B}1_{ij}^{noobj}(C_{i}-\hat{C}_{i})^{2}\\\\+\sum_{i=0}^{S^{2}}1_{i}^{obj}\sum_{c\in \mathrm{classes}}(p_{i}(c)-\hat{p}_{i}(c))^{2}

YOLO中每个grid预测多个bbox,在训练时希望每个物体由一个bbox predictor来负责预测(预测>的IoU最大)。

YOLO的缺点:

(1)YOLO对相互靠的很近的物体、很小的群体检测效果不好,这是因为一个grid中只预测了两个bbox且只属于一类。

(2)YOLO依赖于物体识别标注数据,对于非常规的形状/比例,或者同一物体出现新的不常见的长宽比时,检测效果不理想,泛化能力弱。

(3)与基于候选区域的方法相比,YOLO的定位误差大、召回率较低。

(4)YOLO采用了多个下采样层,网络学到的物体特征并不精细,会影响检测效果。

(5)YOLO损失函数中大物体和小物体的IoU误差对loss贡献值接近(虽然采用宽高的平方根方式,但没有彻底解决问题),小物体很小的IoU误差也会对网络优化造成很大的影响,从而降低了物体检测的定位准确性。

 

二、YOLO9000: Better, Faster, Stronger

YOLO9000是将YOLO改进得到YOLOv2后,使用数据集组合方法和联合训练算法得到的实时目标检测器,可以检测超过9000中不同的目标类别。YOLOv2相比YOLO的改进之处有:

深度学习目标检测之YOLO系列_第6张图片

Better

(1)Batch Normalization:批量标准化使得收敛性显著提高的同时消除了对其他形式正则化的需求。在YOLO所有卷积层上使用BN可获得超过2%的mAP提升,还可以从模型中移除dropout而不会导致过拟合。

(2)High Resolution Classifier:所有先进的检测方法都使用在ImageNet上预训练的分类器,从AlexNet开始大多数分类器对小于256*256的输入图像进行操作,YOLO以224*224的分辨率训练分类器网络,并将分辨率提高到448进行检测,这意味着网络必须同时切换到学习目标检测和调整到新的输入分辨率。对于YOLOv2首先对分类网络(自定义的darknet)在ImageNet上以448*448的分辨率进行10个epochs的微调,使得网络有时间调整filters以更好地处理高分辨率的输入,然后在检测时微调所得到的网络,这种高分辨率分类网络可使mAP增加近4%。

(3)Convolutional With Anchor Boxes:相比YOLO直接使用卷积特征提取器的fc层来预测bbox坐标,Faster R-CNN使用手动提取的先验框预测bbox,RPN只用卷积层预测anchor boxes的偏移和置信度,预测偏移而不是坐标简化了问题,并使网络更容易学习。

作者移除了YOLO中的全连接层,并使用anchor boxes预测bbox。首先去掉一个池化层使卷积层输出更高的分辨率,将网络输入缩小为416*416而不是448*448,可得到大小为奇数13*13的、有中心点的特征图,这是因为大物体倾向于占据图像的中心,所以在中心有一个单一的位置可以很好的预测目标。

使用anchor boxes会使准确性略微下降、但召回率增加:69.5mAP, recall 81% → 69.2mAP, recall 88%,召回率增加意味着模型有更多的改进空间。YOLO中每张图像只能预测7*7*2=98个bbox,使用anchor boxes后每个cell预测9个锚框共13*13*9=1521个bbox。

(4)Dimension Clusters:当锚盒与YOLO一起使用时有两个问题。首先锚盒的维度是手动挑选的先验,虽然在训练过程中网络也会学习调整至准确的bbox,但如果一开始就选择了更好的先验,就容易学到更好的预测。

在训练集bbox上运行k-means聚类,若使用欧氏距离会导致大box比小box产生更多的误差。因此作者使用与box尺寸无关的距离度量 \mathrm{d(box,centroid)=1-IoU(box, centroid)},超参数k取5作为模型复杂性和高召回率之间的折中。聚类与手动挑选的锚盒明显不同,短、宽的box更少而高、窄的bbox更多。

深度学习目标检测之YOLO系列_第7张图片

(5)Direct location prediction:YOLO使用锚盒的第二个问题是模型不稳定,尤其是在早期的迭代过程中。大部分的不稳定因素来自预测box的位置(x, y)。RPN中预测值 t_{x}t_{y} 和(x, y)中心坐标计算为:

        x=(t_{x}*w_{a})-x_{a}

        y=(t_{y}*h_{a})-y_{a}

例如当预测 t_{x}=1 时,就将box右移锚盒宽度的距离,当 t_{x}=-1 时,就左移相同的距离。这个公式是不受限制的,不论在哪个位置进行预测,任何锚盒都可以在图像任一点结束,随机初始化的模型需要训练很长时间才能足够稳定的预测合理的偏移。因此作者不预测偏移,而是按照YOLO的方法预测相对于grid cell的位置坐标,使用sigmoid函数限制预测值在0到1之间。特征图(13*13)的每个cell预测5个bbox(聚类得到),每个bbox预测5个值 t_{x},t_{y},t_{w},t_{h},t_{o},其中 t_{o} 是置信度。如果cell距离图像左上角的偏移为 (c_{x},c_{y}),且其先验bbox的宽高为 p_{w},p_{h},则预测公式为:

        b_{x}=\sigma (t_{x})+c_{x}

        b_{y}=\sigma (t_{y})+c_{y}

        b_{w}=p_{w}e^{t_{w}}

        b_{h}=p_{h}e^{t_{h}}

        \mathrm{Pr(object)*IoU(b,object)}=\sigma (t_{o})

由于限制位置预测参数更容易学习,使网络更稳定,使用维度聚类和直接预测边界框中心位置的方式比使用锚盒的方式提高近5%的mAP。

深度学习目标检测之YOLO系列_第8张图片

(6)Fine-Grained Features(细粒度特征):类似残差网络,将高分辨率特征与低分辨率特征结合,可增加1%的mAP。passthrough layer即特征重排,不涉及到参数学习,前面26*26*512的特征图使用按行和按列隔行采样的方法,可以得到4个新的特征图13*13*512,然后进行concat得到13*13*2048的特征图,将其拼接到后面的层,相当于特征融合,有利于检测小目标。

深度学习目标检测之YOLO系列_第9张图片

(7)Muti-Scale Training:由于不含fc层,YOLOv2可以训练任意尺寸的输入图片。作者在若干个迭代后会调整网络,每10个epochs随机选择新的图片尺寸,由于YOLO的降采样参数为32,所以随机的尺寸也选择32的倍数如{320, 352, ..., 608},即最小320*320,最大608*608,然后按照输入尺寸调整网络进行训练。

这种机制使得同一个网络可以更好的预测不同尺寸的图片,在小图片上运行更快,在大图片上精度更高。

深度学习目标检测之YOLO系列_第10张图片

Faster

(1)Darknet-19:YOLOv2的base net,包括19个卷积层和5个最大池化层。类似VGG多使用3*3的filter,并在池化后double通道数量;参考NIN使用全局平均池化,并把1*1的卷积核置于3*3卷积核之间,用于压缩特征。Darknet-19前向传播一次只需要55.8亿次运算(VGG16为306.9亿),在ImageNet上top-1达72.9%、top-5达91.2%的准确率。

深度学习目标检测之YOLO系列_第11张图片

(2)Training for classification

作者使用Darknet-19在标准ImageNet 1000类的分类数据集上SGD训练160个epochs,设置初始学习率0.1,幂为4的多项式速率衰减,0.0005的权重衰减和0.9的动量。训练时使用常用的数据增强方式如随机裁剪、旋转、色调、饱和度及曝光移位等。在使用224*224图片初始训练后,使用448*448的图片微调网络,初始学习率为10^-3训练10个epochs,高分辨率网络使top-1提高到76.5%,top-5提高到93.3%。

(3)Train for detection

作者去掉分类网络最后一个卷积层,并增加3个3*3*1024的卷积层,每个层后接1*1的卷积层,输出维度是检测所需数量。对于VOC数据集预测5种boxes大小,每个box包含5个坐标值和20个类别,共5*(5+20)=125个输出维度。添加passthrough layer从3*3*512的卷积层连接到倒数第二个卷积层,使模型有了细粒度特征。作者的检测模型以0.001的初试学习率训练160个epochs,其他超参数设置和数据增强方式同上,在第60和90个epoch时学习率都要除以10。

 

Stronger

作者提出了一个联合训练分类和检测数据的机制,训练时混合分类和检测数据集的图片,当网络的输入为检测图片时,使用完整的YOLOv2损失函数进行反向传播;输入为分类图片时,只计算损失函数的分类部分。

这种方法的问题在于检测数据集只有常用的目标和标签,如“狗”或“船”,而分类数据集会有更广更深的标签范围,如狗的各种品种。如果想在两个数据集上训练,需要使用一个连贯的方式来合并这些标签,并且这些标签之间不是互斥的,不适用softmax等常规分类方法。作者使用多标签模型组合不假定互斥的数据集,忽略了关于数据的所有已知的结构,例如所有COCO的类别是互斥的。

Hierarchical classification

ImageNet的标签是从WordNet中提取的,这是一个构建概念及其相互关系的语言数据库,结构是有向图而不是树。为了简化问题作者参考ImageNet构建分层树:检查ImageNet中的visual nouns,查看它们在WordNet图上到根节点的路径,即physical object。许多同义词在图上只有一条路径,所以先将所有这些路径添加到树中,然后遍历余下的concept,尽可能少的添加到树中,如果一个concept到根节点有不同的路径,选择最短的一条。

最终得到一个visual concepts的分层模型WordTree,为了使用它进行分类,预测每个节点的条件概率以得到同义词集合中每个同义词下义词的概率,例如在terrier节点预测Pr(Norfolk terrier|terrier), Pr(Yorkshire terrier|terrier), ... 一个特定节点的绝对概率,为沿着树到达根节点的路径再乘以条件概率(即该节点到根节点的所有条件概率之积),例如想知道一张图片是否是Norfolk terrier,计算:

Pr(Norfolk terrier)=Pr(Norfolk terrier|terrier)*Pr(terrier|hunting dog)*...*Pr(mammal|animal)*Pr(animal|physical object)

为了分类假定图像包含一个目标:Pr(physical object)=1。作者在使用1000类ImageNet构建的WordTree上训练Darknet-19模型,为了建立WordTree1k,添加中间层所需的节点将标签数从1000扩展到1369。训练时将真实标签向上层层传播,若图像被标记为Norfolk terrier,则它也被标记为dog和mammal等。为了计算条件概率,模型预测一个1369维的向量,并计算同concept下义词的softmax分类。

深度学习目标检测之YOLO系列_第12张图片

尽管增加了369个额外的concept,且预测了一个树结构,但准确率仅少量下降。这种分类方法在新的未知的目标类别上性能会gracefully降低,例如网络看到一只狗的图片,但不确定它是什么类型的狗,网络仍会高度自信的预测为狗,但在下义词扩展之间有低的置信度。

Joint classification and detection

作者使用WordTree组合数据集训练分类和检测联合模型。为了训练一个大规模的检测器,使用COCO检测数据集和完整ImageNet版本中的前9000个类创建组合数据集,还要能够添加ImageNet未包含的类。这个数据集相应的WordTree有9418个类别,通过下采样COCO使得ImageNet和COCO的比例仅大于4:1。作者使用YOLOv2架构在联合数据集上训练YOLO9000,只用3个prior而不是5个限制输出大小。YOLO9000使用了诸多工程Trick,虽然在算法理论上并没有明确的突破,但效果和实用性有很大的提升。

 

三、YOLOv3: An Incremental Improvement

1、Bounding Box Prediction

同YOLO9000,YOLOv3的anchor boxes也是通过聚类的方法得到的,对每个bbox预测四个坐标值 t_{x},\: t_{y},\: t_{w},\: t_{h},对于预测的cell根据图像左上角的偏移 (c_{x},\: c_{y}),以及之前得到的bbox的宽高 p_{w},p_{h},对bbox按下面的公式进行预测:

        b_{x}=\sigma (t_{x})+c_{x}

        b_{y}=\sigma (t_{y})+c_{y}

        b_{w}=p_{w}e^{t_{w}}

        b_{h}=p_{h}e^{t_{h}}

训练时采用速度很快的平方和距离误差损失,对每个bbox使用逻辑回归预测一个物体的得分,如果预测的这个bbox与真实的边框值大部分重合且比其他所有预测的要好,则这个值为1;如果成和没有达到一个阈值(0.5),则这个预测的bbox就会被忽略,也就是没有损失值。

2、Class Prediction

每个框预测分类,bbox使用多标签分类,不使用softmax分类而改用多个logistic分类器替代,分类损失采用binary cross-entropy loss。不用softmax的原因是:softmax使得每个框只有一个类别(score最大的一个),而对于Open Images这种数据集,目标可能有重叠的类别标签,因此softmax不适用于多标签分类。

3、Prediction Across Scales

YOLOv3在三个不同的尺度预测boxes,使用的特征提取模型通过FPN(feature pyramid network)得到一个3d tensor: N*N*[3*(4+1+80)],包含bbox 4个offsets、1个对象信息以及80个类的预测信息。

使用k-means聚类得到bbox的先验,选择9个簇以及3个尺度,然后将这9个簇均匀的分布在这几个尺度上。

4、Feature Extractor

YOLOv3的特征提取模型参考了YOLOv2的Darknet-19,ResNet等模型,包含很多3*3和1*1的卷积层以及shortcut结构,共有53个卷积层,因此成为Darknet-53,结构如下:

深度学习目标检测之YOLO系列_第13张图片

YOLOv2对小物体的检测不敏感,在于cell预测时导致的问题,而YOLOv3增加了多尺度预测后对小物体检测有了提高,但对中、大尺寸的物体表现欠佳。

YOLOv3尝试过但并没有提升性能的方法:

(1)对anchor box的x, y的偏移使用线性激活方式做一个对box宽高数倍的预测,结果发现没有好的表现且模型不稳定。

(2)对anchor box的x, y线性预测,而不使用逻辑回归,结果发现这样会降低模型的mAP。

(3)使用Focal loss,结果mAP有所降低。

 

 

参考资料

https://arxiv.org/pdf/1506.02640.pdf

https://arxiv.org/pdf/1612.08242.pdf

https://arxiv.org/pdf/1804.02767.pdf

https://blog.csdn.net/m0_37192554/article/details/81092514

https://www.cnblogs.com/fariver/p/7446921.html

 

你可能感兴趣的:(深度学习)