Yolo v1 v2 v3的发展与细节

Yolo v1+2+3都是目标检测模型。

  1. 目标检测模型;
  2. Yolo v1
  3. Yolo v2
  4. Yolo v3
  5. 总结: 发展路线和区别;

 

 

 

 

一、目标检测模型

 

目标检测可分为两个步骤:

Step1: 检测目标位置(生成矩形框)

Step2: 对目标物体进行分类

 

物体检测主流算法主要分为one-stage和two-stage

One-stage:Yolo系列(v1->v2->v3)

Two-stage: Fast RCNN系列(RCNN->Fast RCNN->Faster RCNN)

 

One-stage的步骤一和步骤二同时执行,输入图像只经过一个网络,输出结果包含位置信息和分类;(精度与速度之间均衡)

Two-stage的步骤一和步骤二分开进行,输入图像先经过候选框生成网络,再经过分类网络。精度更高,计算量更大。

 

1.YOLO很快,因为使用回归的方法,且不用复杂的框架;

2.YOLO基于整张图像进行预测,其他滑窗式的检测框架只能基于局部图像;

3.YOLO学到的图像特征更为通用。why?Q1

 

二、YOLOv1

Yolo1的网络结构

输入:448*448的图像

输出:7*7*30的张量(7*7是指图像分为了7*7个格子)

网络结构:(若干卷积+最大池化)+ 两层全卷积, 没有使用BN,用了一层dropout。最后一层的输出使用了线性激活函数,其余都用的leaky relu。

 

一般来说,分类网络最后的全连接层一般连接于一个一维向量,向量的不同位代表不同的分类。

这里的输出是7*7*30的张量,代表什么呢?Q2

 

A2:在yolo中,如果一个物体的中心点落在了这7*7的某个格子中,则这个格子负责检测这个物体。所以相当于有47个检测人员,每个人员负责检测自己格子内的东西。30对应的是一般情况下一维输出向量的长度。

30 = (4+1)*2+20;4:[x_offset, y_offset, w, h], 1: 被检测物体的置信度;2:一个格子共回归两个矩形框;20:预测20个类别。

需要注意的是:每个格子产生2个预测框,2是参数,可以调整。一旦设置为2,则每个方格只产生2个预测框,最后选置信度最大的那个框输出。也就是每个格子产生n个预测框,但只输出置信度最大的那个框。且每个方格只能预测一个物体。当格子数为7*7的时候,则该网络最多检测49个物体。

 

Yolo v1 的Loss 函数

YOLO V1使用普通的SGD作为优化器。

uploading.4e448015.gif转存失败重新上传取消

  1. 预测框的中心点(x,y)-> MSE;
  2. 预测框的宽高(w,h) -> 也是MSE,但是对w,h取根号,避免损失函数选择调整w,h更大的框,尽量消除大小框的尺度差异。
  3. 预测框的置信度->若格子不含物体,置信度为0;含物体,置信度的值为预测框与真实框的IOU(交/并).
  4. 物体类别的概率:差的平方和。对应的类别位置值为1,其余为0;与分类网络相同。

 

yolo面临的物体检测问题,是典型的类别数目不均衡的问题。模型更倾向于不含物体的格子,所以λcoord, λnobj是为了让有物体的格子在损失函数种权重更大。分别取5,0.5。

 

使用非极大抑制来过滤一些重复的置信度不够高的框。

在推理时,使用物体类别预测最大值p*预测框的最大值c,作为输出物体的置信度。可以过来大部分的重叠框,输出检测物体的置信度,同时考虑矩形框和类别,满足阈值的输出更加可信。

YOLO v1的不足与优点:

  1. localization相比faster rcnn更高,直接对位置进行回归,不如滑窗式的检测方式准确率高。
  2. Yolo v1对背景的误检率更低。因为yolo v1在检测时是基于整个图像。对小物体检测效果欠佳。

 

三、YOLO V2

 

YOLO V2在v1上进行了一些改进。V1之后,CV领域出现了很多trick, 如BN, 多尺度训练等。

V2尝试借鉴了RCNN系列中的anchor box。

 

改进1:BN (BN的原理和应用,Q3)

在所有的卷积层后都添加了BN,去除了dropout。

 

改进2:High resolution classifier(分类网络高分辨率预训练)

V1的网络骨干部分会在imagenet上预训练,训练时输入图像分辨率为224*224.

V2中输入图像分辨率为448*448, epochs = 10,再使用检测数据集如coco进行微调。高分辨率预训练使mAP提高了。

 

改进3:Convolutional with anchor boxes(anchor box替换全连接层)

Yolo v2 借鉴RPN的先验框。(RPN对CNN特征提取器得到的Feature map来进行卷积,预测每个位置的边界框和置信度,并各个位置设置不同尺度和比例的先验框。RPN预测边界框对于先验框的offset,先验框使得模型更容易学习。

Yolov2 移除了v1最后的全卷积层,采用卷积和anchor box来预测边界框,为了检测所用的特征图分辨率更高,移除了一个pool层。在检测模型中,v2的输入是416*416,采样总步长是32, 特征图大小是13*13,维度是奇数,则特征图恰好只有一个中心位置。

 

对于v1,每个格子预测2个box, 每个box[x,y,w,h,c],c是box的置信度,包含两部分:含有物体的概率&预测框和真实框的IOU。每个格子只预测一套分类概率值,供两个box共享,意思是什么呢?V1的输出是7*7*30.7*7我们知道,是格子数。30=(4+1)*2+20.这里对应位[x,y,w,h,c]*2+20,每个box都有各自的[x,y,w,h,c],但是分类概率是一样的,在后面的20个参数里,分别是分到该类的置信度。最后格子输出的是box的置信度更大(即c更大)的预测框及分类结果。

 

对于v2,使用了anchor box,每个位置的各个anchor box都单独预测一套分类概率值。

 

改进4: Dimension Clusters

在faster RCNN和SSD中,先验框的长宽都是手动设定。 YOLOv2采用kmeans聚类对训练集中的groud truth做了聚类分析,设置更合适的长宽。因为设置先验框是为了让预测框和groud truth的IOU更高,所以聚类分析选用BOX与聚类中心box的iou值作为指标。

 

改进5:darknet-19,包含5给卷积层和5个最大池化层

Darknet-19和vgg16的模型设计原则一致,主要使用3*3卷积,2*2maxpooling,特征维度降低2倍,将特征图的channel增加2倍。最后采用global avgpooling做预测(什么是global avgpooing),并在3*3卷积之间使用1*1卷积来压缩特征图channel以降低模型计算量和减少参数。 Darknet-19每个卷积层后又BN,加快模型收敛,降低过拟合。

 

改进6: Direct location prediction

Yolov2 没有使用DLP,而是沿用v1的,预测边界框中心点对于格子左上角的偏移,为了将边界框中心约束在当前格子,使用sigmoid 处理偏移值,预测的偏移值在(0,1)之间。约束了边框框的位置预测值使得模型训练更加稳定。

 

改进7:Fine-Grained Feature

V2的输入是416*416,经过19次卷积和5次maxpooling得到13*13的特征图。26*26的特征图经过卷积后,可能损失细粒度的特征,导致小尺寸物体的检测效果不佳,因此加上passthrough 层。(什么是passthrough层?Q4)

 

passthrough层就是将26*26*1的特征图变成13*14*4的特征图,不损失细粒度特征。

 

改进8:Multi-scale training(多尺度训练)

Yolov2只有卷积层和池化层,对于输入的尺寸没有限制。整个网络的降采样倍数是32,只要输入的特征图尺寸为32即可。(如果网络中有全连接层就不行了)

Yolov2可以使用不同尺寸的输入图像进行训练。

 

作者使用的方法,在每10个epochs之后,就将图像resize(320,352,···,608)中的一种,不同输入产生的格点数不同。在引入了多尺寸训练后,迫使卷积核学习不同笔记大小尺寸的特征,当输入设置为544*544及以上时,mAP超过了其他的物体检测算法。(mAP:mean Average Precision,平均类别准确率)

 

Yolo9000: 联合分类与检测

Yolov2的以上所有改进之处,创新点都比不上这里的分类与检测联合训练。(分类与检测联合训练是什么意思?Q5)

 

由于检测的数据集标注成本比分类的数据集要高很多,不仅仅要给物体标注类别,还要标注位置和大小,因此往往检测数据集很少,数据集的类别也少,如coco 80类。而相反分类数据集很多,如ImageNet,物体种类上万。利用这一点。

 

联合训练的思路:

Yolo v2中物体矩形框生成不依赖于它的类别,二者可同时独立进行。当输入是检测数据集,标注信息有位置和类别,则最整个loss函数进行loss计算, 反向传播;当输入为分类数据集,只包含分类信息,则loss函数只计算分类的loss,其余loss为0。一般的策略是先在检测数据集上训练一定程度,再进行联合训练。

通过这种方法,联合Imagenet数据集,训练得到了yolo9000模型,可以预测9000个物体。

 

 四、YOLO v3

 

 

Yolo v3 对之前的算法有保留,也有改进。保留的东西如下:

  1. “分而治之”,从v1开始就是通过划分格子来做检测,只是划分数量不一样。
  2. 采用Leaky relu
  3. 端到端训练,一个loss函数,只关注输入端到输出端。
  4. 从v2开始,使用BN作为正则化,加速收敛和减少过拟合。BN和Leaky rely在每一层卷积层后。
  5. 多尺度训练。在速度与准确率之间做tradeoff。

 

Yolo 的提升很大一部分在于网络的提升。从darknet19到darknet-53。还有tiny-darknet。

 

uploading.4e448015.gif转存失败重新上传取消

网络骨干:Darknet-53. 由v2的darknet19进化成darknet-53,加深了网络层数,引入了resnet的跨层加和。

2*conv+1*residual+conv+2*residual+conv+8*residual+conv+8*residual+conv+4*residual+Avgpool+Conneted+Softmax

 

DBL: DarknetConv2d_BN_LeakyRelu,是v3的基本组件。

Resn: res1, res2,res8,···,表示有多少个residual层。V3的重要组件。

concact:张量拼接,将darknet中间层和后面的某一层的上采样(上采样方法?Q6 三种:线性插值/反卷积/反池化,upsampling & deconvolution)进行拼接。拼接和残差层的add是不同的。拼接会扩充张量的维度。add是直接相加,不会改变张量维度。

 

整个v3是没有池化和全连接层的。张量的尺寸变换是通过改变卷积核的步长来实现的(降低网络参数有哪些方法?Q7, 池化,使用1*1卷积核,增大步长)。

V2前向过程的张量尺寸变换是通过最大池化,v3则是利用卷积核增大步长。都是5次,降维32倍。

V3是可以跟resnet正面刚的网络,其性能都远好于v1,v2。

 

Yolo V3 的输出向量。

uploading.4e448015.gif转存失败重新上传取消

V3输出了3个尺度不同的feature map,这是它最重要的改进点之一:多尺度预测。

采用FPN(特征金字塔网络) 来对多尺度的输入图像进行物体检测。越精细的格子就能检测越小的物体。

Y1,y2,y3的输出深度都是255,预测的格子数:13*13个格子,26*26个格子,52*52个格子。

255是怎么来的呢?Q8。

255 = (4+1+80)*3;4代表[x_offset, y_offset,w,h];1代表预测框的置信度,80为分类概率。3为这3个尺度的预测框。每个尺度都有3个尺寸的预测框。

V3利用上采样来实现多尺度的预测。13*13个格子上采样之后,和26*26格子进行拼接;26*26个格子上采样之后,和52*52个格子拼接。

同时,13*13个格子有自己的预测输出,26*26, 52*52类似。

V3使用了9个Bounding box,是使用K-means聚类分析得到的,K值为9(v2使用的是5)。

V3对Bbox进行预测时,使用了logistic regression。(RPN是使用线性回归调整Bbox)

 

Logistic 回归用于对anchor包围的目标可能性进行评分,如果该anchor里含有目标物体的概率比较小,那么这个anchor我们直接不用,哪怕这个anchor的置信度超过了我们的阈值。

 

V3只会对最佳的那个prior进行操作,(这个prior就是9个先验框中的其中一个)。Logistic 回归就是在9个prior的anchor中选出包含目标物体概率最大的那个prior。

 

Yolov3的loss函数

与v1是有区别的。V1的x_offset,y_offset是使用MSE; W,H是使用其开根号的MSE; 置信度和分类概率是使用的差的平方。

V3呢,除了w,h依然采取MSE,其余的loss函数都是使用的二值交叉熵。

 

你可能感兴趣的:(机器学习,deep-learning,图像处理)