Yolo v1+2+3都是目标检测模型。
一、目标检测模型
目标检测可分为两个步骤:
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作为优化器。
转存失败重新上传取消
yolo面临的物体检测问题,是典型的类别数目不均衡的问题。模型更倾向于不含物体的格子,所以λcoord, λnobj是为了让有物体的格子在损失函数种权重更大。分别取5,0.5。
使用非极大抑制来过滤一些重复的置信度不够高的框。
在推理时,使用物体类别预测最大值p*预测框的最大值c,作为输出物体的置信度。可以过来大部分的重叠框,输出检测物体的置信度,同时考虑矩形框和类别,满足阈值的输出更加可信。
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 对之前的算法有保留,也有改进。保留的东西如下:
Yolo 的提升很大一部分在于网络的提升。从darknet19到darknet-53。还有tiny-darknet。
转存失败重新上传取消
网络骨干: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 的输出向量。
转存失败重新上传取消
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函数都是使用的二值交叉熵。