学习目标知道yolo网络架构,理解其输入输出知道yolo模型的训练样本构建的方法理解yolo模型的损失函数知道yoloV2模型的改进方法知道yoloV3的多尺度检测方法知道yoloV3模型的网络结构及网络输出了解yoloV3模型先验框设计的方法知道yoloV3模型为什么适用于多标签的目标分类了解yoloV4模型 YOLO系列算法是一类典型的onestage目标检测算法,其利用anchorbox将分类与目标定位的回归问题结合起来,从而做到了高效、灵活和泛化性能好,所以在工业界也十分受欢迎,接下来我们介绍YOLO系列算法。1。yolo算法 Yolo算法采用一个单独的CNN模型实现endtoend的目标检测,核心思想就是利用整张图作为网络的输入,直接在输出层回归boundingbox(边界框)的位置及其所属的类别,整个系统如下图所示: 首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标。相比RCNN算法,其是一个统一的框架,其速度更快。1。1Yolo算法思想 在介绍Yolo算法之前,我们回忆下RCNN模型,RCNN模型提出了候选区(RegionProposals)的方法,先从图片中搜索出一些可能存在对象的候选区(SelectiveSearch),大概2000个左右,然后对每个候选区进行对象识别,但处理速度较慢。 Yolo意思是YouOnlyLookOnce,它并没有真正的去掉候选区域,而是创造性的将候选区和目标分类合二为一,看一眼图片就能知道有哪些对象以及它们的位置。 Yolo模型采用预定义预测区域的方法来完成目标检测,具体而言是将原始图像划分为7x749个网格(grid),每个网格允许预测出2个边框(boundingbox,包含某个对象的矩形框),总共49x298个boundingbox。我们将其理解为98个预测区,很粗略地覆盖了图片的整个区域,就在这98个预测区中进行目标检测。 只要得到这98个区域的目标分类和回归结果,再进行NMS就可以得到最终的目标检测结果。那具体要怎样实现呢?1。2Yolo的网络结构 YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接,从网络结构上看,与前面介绍的CNN分类网络没有本质的区别,最大的差异是输出层用线性函数做激活函数,因为需要预测boundingbox的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO的整个结构就是输入图片经过神经网络的变换得到一个输出的张量,如下图所示: 网络结构比较简单,重点是我们要理解网络输入与输出之间的关系。1。2。1网络输入 网络的输入是原始图像,唯一的要求是缩放到448x448的大小。主要是因为Yolo的网络中,卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入,所以Yolo的输入图像的大小固定为448x448。1。2。2网络输出 网络的输出就是一个7x7x30的张量(tensor)。那这个输出结果我们要怎么理解那?1。7X7网格 根据YOLO的设计,输入图像被划分为7x7的网格(grid),输出张量中的7x7就对应着输入图像的7x7网格。或者我们把7x7x30的张量看作7x749个30维的向量,也就是输入图像中的每个网格对应输出一个30维的向量。如下图所示,比如输入图像左上角的网格对应到输出张量中左上角的向量。 2。30维向量 30维的向量包含:2个bbox的位置和置信度以及该网格属于20个类别的概率 2个boundingbox的位置每个boundingbox需要4个数值来表示其位置,(Centerx,Centery,width,height),即(boundingbox的中心点的x坐标,y坐标,boundingbox的宽度,高度),2个boundingbox共需要8个数值来表示其位置。2个boundingbox的置信度boundingbox的置信度该boundingbox内存在对象的概率该boundingbox与该对象实际boundingbox的IOU,用公式表示就是: Pr(Object)是boundingbox内存在对象的概率20个对象分类的概率 Yolo支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该网格位置存在任一种对象的概率。1。3Yolo模型的训练 在进行模型训练时,我们需要构造训练样本和设计损失函数,才能利用梯度下降对网络进行训练。1。3。1训练样本的构建 将一幅图片输入到yolo模型中,对应的输出是一个7x7x30张量,构建标签label时对于原图像中的每一个网格grid都需要构建一个30维的向量。对照下图我们来构建目标向量: 20个对象分类的概率 对于输入图像中的每个对象,先找到其中心点。比如上图中自行车,其中心点在黄色圆点位置,中心点落在黄色网格内,所以这个黄色网格对应的30维向量中,自行车的概率是1,其它对象的概率是0。所有其它48个网格的30维向量中,该自行车的概率都是0。这就是所谓的中心点所在的网格对预测该对象负责。狗和汽车的分类概率也是同样的方法填写2个boundingbox的位置 训练样本的bbox位置应该填写对象真实的位置bbox,但一个对象对应了2个boundingbox,该填哪一个呢?需要根据网络输出的bbox与对象实际bbox的IOU来选择,所以要在训练过程中动态决定到底填哪一个bbox。2个boundingbox的置信度 预测置信度的公式为: IOU{pred}{truth}利用网络输出的2个boundingbox与对象真实boundingbox计算出来。然后看这2个boundingbox的IOU,哪个比较大,就由哪个boundingbox来负责预测该对象是否存在,即该boundingbox的Pr(Object)1,同时对象真实boundingbox的位置也就填入该boundingbox。另一个不负责预测的boundingbox的Pr(Object)0。 上图中自行车所在的grid对应的结果如下图所示: 1。3。2损失函数 损失就是网络实际输出值与样本标签值之间的偏差: yolo给出的损失函数: 注:其中1{i}{obj}表示目标是否出现在网格单元i中,1{ij}{obj}表示单元格i中的第j个边界框预测器负责该预测,YOLO设置lambda{coord}5来调高位置误差的权重,lambda{noobj}0。5即调低不存在对象的boundingbox的置信度误差的权重。1。3。3模型训练 Yolo先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCALVOC数据集上进行对象识别和定位的训练。 Yolo的最后一层采用线性激活函数,其它层都是LeakyReLU。训练中采用了dropout和数据增强(dataaugmentation)来防止过拟合。1。4模型预测 将图片resize成448x448的大小,送入到yolo网络中,输出一个7x7x30的张量(tensor)来表示图片中所有网格包含的对象(概率)以及该对象可能的2个位置(boundingbox)和可信程度(置信度)。在采用NMS(Nonmaximalsuppression,非极大值抑制)算法选出最有可能是目标的结果。1。5yolo总结 优点速度非常快,处理速度可以达到45fps,其快速版本(网络较小)甚至可以达到155fps。训练和预测可以端到端的进行,非常简便。 缺点准确率会打折扣对于小目标和靠的很近的目标检测效果并不好2。yoloV2 YOLOv2相对v1版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,称之为YOLO9000。下面我们看下yoloV2的都做了哪些改进?2。1预测更准确(better) 2。1。1batchnormalization 批标准化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果,从而能够获得更好的收敛速度和收敛效果。在yoloV2中卷积后全部加入BatchNormalization,网络会提升2的mAP。2。1。2使用高分辨率图像微调分类模型 YOLOv1使用ImageNet的图像分类样本采用224x224作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的448x448的图像作为输入。但这样切换对模型性能有一定影响。 YOLOV2在采用224x224图像进行分类模型预训练后,再采用448x448的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应448x448的分辨率。然后再使用448x448的检测样本进行训练,缓解了分辨率突然切换造成的影响。 使用该技巧后网络的mAP提升了约4。2。1。3采用AnchorBoxes YOLO1并没有采用先验框,并且每个grid只预测两个boundingbox,整个图像98个。YOLO2如果每个grid采用5个先验框,总共有13x13x5845个先验框。通过引入anchorboxes,使得预测的box数量更多(13x13xn)。2。2。4聚类提取anchor尺度 Fasterrcnn选择的anchor比例都是手动指定的,但是不一定完全适合数据集。YOLO2尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。YOLO2的做法是对训练集中标注的边框进行聚类分析,以寻找尽可能匹配样本的边框尺寸。 YoloV2选择了聚类的五种尺寸最为anchorbox。2。1。5边框位置的预测 Yolov2中将边框的结果约束在特定的网格中: 其中, bx,by,bw,bh是预测边框的中心和宽高。Pr(object)IOU(b,object)是预测边框的置信度,YOLO1是直接预测置信度的值,这里对预测参数to进行变换后作为置信度的值。cx,cy是当前网格左上角到图像左上角的距离,要先将网格大小归一化,即令一个网格的宽1,高1。pw,ph是先验框的宽和高。是sigmoid函数。tx,ty,tw,th,to是要学习的参数,分别用于预测边框的中心和宽高,以及置信度。 如下图所示: 由于函数将tx,ty约束在(0,1)范围内,预测边框的蓝色中心点被约束在蓝色背景的网格内。约束边框位置使得模型更容易学习,且预测更为稳定。 假设网络预测值为: anchor框为: 则目标在特征图中的位置: 在原图像中的位置: 2。1。6细粒度特征融合 图像中对象会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中,较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。 YOLO2引入一种称为passthrough层的方法在特征图中保留一些细节信息。具体来说,就是在最后一个pooling之前,特征图的大小是26x26x512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。 具体的拆分方法如下所示: 2。1。7多尺度训练 YOLO2中没有全连接层,可以输入任何尺寸的图像。因为整个网络下采样倍数是32,采用了{320,352,。。。,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,。。。19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测。 2。2速度更快(Faster) yoloV2提出了Darknet19(有19个卷积层和5个MaxPooling层)网络结构作为特征提取网络。DarkNet19比VGG16小一些,精度不弱于VGG16,但浮点运算量减少到约,以保证更快的运算速度。 yoloV2的网络中只有卷积pooling,从416x416x3变换到13x13x5x25。增加了batchnormalization,增加了一个passthrough层,去掉了全连接层,以及采用了5个先验框,网络的输出如下图所示: 2。3识别对象更多 VOC数据集可以检测20种对象,但实际上对象的种类非常多,只是缺少相应的用于对象检测的训练样本。YOLO2尝试利用ImageNet非常大量的分类样本,联合COCO的对象检测数据集一起训练,使得YOLO2即使没有学过很多对象的检测样本,也能检测出这些对象。3。yoloV3 yoloV3以V1,V2为基础进行的改进,主要有:利用多尺度特征进行目标检测;先验框更丰富;调整了网络结构;对象分类使用logistic代替了softmax,更适用于多标签分类任务。3。1算法简介 YOLOv3是YOLO(YouOnlyLookOnce)系列目标检测算法中的第三版,相比之前的算法,尤其是针对小目标,精度有显著提升。 yoloV3的流程如下图所示,对于每一幅输入图像,YOLOv3会预测三个不同尺度的输出,目的是检测出不同大小的目标。 3。2多尺度检测 通常一幅图像包含各种不同的物体,并且有大有小。比较理想的是一次就可以将所有大小的物体同时检测出来。因此,网络必须具备能够看到不同大小的物体的能力。因为网络越深,特征图就会越小,所以网络越深小的物体也就越难检测出来。 在实际的featuremap中,随着网络深度的加深,浅层的featuremap中主要包含低级的信息(物体边缘,颜色,初级位置信息等),深层的featuremap中包含高等信息(例如物体的语义信息:狗,猫,汽车等等)。因此在不同级别的featuremap对应不同的scale,所以我们可以在不同级别的特征图中进行目标检测。如下图展示了多种scale变换的经典方法。 (a)这种方法首先建立图像金字塔,不同尺度的金字塔图像被输入到对应的网络当中,用于不同scale物体的检测。但这样做的结果就是每个级别的金字塔都需要进行一次处理,速度很慢。 (b)检测只在最后一层featuremap阶段进行,这个结构无法检测不同大小的物体 对不同深度的featuremap分别进行目标检测。SSD中采用的便是这样的结构。这样小的物体会在浅层的featuremap中被检测出来,而大的物体会在深层的featuremap被检测出来,从而达到对应不同scale的物体的目的,缺点是每一个featuremap获得的信息仅来源于之前的层,之后的层的特征信息无法获取并加以利用。 (d)与很接近,但不同的是,当前层的featuremap会对未来层的featuremap进行上采样,并加以利用。因为有了这样一个结构,当前的featuremap就可以获得未来层的信息,这样的话低阶特征与高阶特征就有机融合起来了,提升检测精度。在YOLOv3中,就是采用这种方式来实现目标多尺度的变换的。3。3网络模型结构 在基本的图像特征提取方面,YOLO3采用了Darknet53的网络结构(含有53个卷积层),它借鉴了残差网络ResNet的做法,在层之间设置了shortcut,来解决深层网络梯度的问题,shortcut如下图所示:包含两个卷积层和一个shortcutconnections。 yoloV3的模型结构如下所示:整个v3结构里面,没有池化层和全连接层,网络的下采样是通过设置卷积的stride为2来达到的,每当通过这个卷积层之后图像的尺寸就会减小到一半。 下面我们看下网络结构:基本组件:蓝色方框内部分 1、CBL:Yolov3网络结构中的最小组件,由ConvBnLeakyrelu激活函数三者组成。2、Resunit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。3、ResX:由一个CBL和X个残差组件构成,是Yolov3中的大组件。每个Res模块前面的CBL都起到下采样的作用,因此经过5次Res模块后,得到的特征图是608304152763819大小。其他基础操作: 1、Concat:张量拼接,会扩充两个张量的维度,例如2626256和2626512两个张量拼接,结果是2626768。 2、Add:张量相加,张量直接相加,不会扩充维度,例如104104128和104104128相加,结果还是104104128。Backbone中卷积层的数量: 每个ResX中包含12X个卷积层,因此整个主干网络Backbone中一共包含1(121)(122)(128)(128)(124)52,再加上一个FC全连接层,即可以组成一个Darknet53分类网络。不过在目标检测Yolov3中,去掉FC层,仍然把Yolov3的主干网络叫做Darknet53结构。3。4先验框 yoloV3采用Kmeans聚类得到先验框的尺寸,为每种尺度设定3种先验框,总共聚类出9种尺寸的先验框。 在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。在最小的(13x13)特征图上(有最大的感受野)应用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。中等的(26x26)特征图上(中等感受野)应用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。较大的(52x52)特征图上(较小的感受野)应用,其中较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。 直观上感受9种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框式groundtruth,红框是对象中心点所在的网格。 3。5logistic回归 预测对象类别时不使用softmax,而是被替换为一个1x1的卷积层logistic激活函数的结构。使用softmax层的时候其实已经假设每个输出仅对应某一个单个的class,但是在某些class存在重叠情况(例如woman和person)的数据集中,使用softmax就不能使网络对数据进行很好的预测。 3。6yoloV3模型的输入与输出 YoloV3的输入输出形式如下图所示: 输入4164163的图像,通过darknet网络得到三种不同尺度的预测结果,每个尺度都对应N个通道,包含着预测的信息; 每个网格每个尺寸的anchors的预测结果。 YOLOv3共有131332626352523个预测。每个预测对应85维,分别是4(坐标值)、1(置信度分数)、80(coco类别概率)。4。yoloV4〔了解〕 YOLO之父在2020年初宣布退出CV界,YOLOv4的作者并不是YOLO系列的原作者。YOLOV4是YOLO系列一个重大的更新,其在COCO数据集上的平均精度(AP)和帧率精度(FPS)分别提高了10和12,并得到了JosephRedmon的官方认可,被认为是当前最强的实时对象检测模型之一。 yoloV4总结了大部分检测技巧,然后经过筛选,排列组合,挨个实验(ablationstudy)哪些方法有效,总体来说,Yolov4并没有创造新的改进,而是使用了大量的目标检测的技巧。在这里我们主要给大家看下它的网络架构: Yolov4的结构图和Yolov3是相似的,不过使用各种新的算法思想对各个子结构都进行了改进。先整理下Yolov4的结构组件基本组件:CBM:Yolov4网络结构中的最小组件,由ConvBnMish激活函数三者组成。CBL:由ConvBnLeakyrelu激活函数三者组成。Resunit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。CSPX:由三个卷积层和X个Resunint模块Concate组成。SPP:采用11,55,99,1313的最大池化的方式,进行多尺度融合。其他基础操作:Concat:张量拼接,维度会扩充,和Yolov3中的解释一样,对应于cfg文件中的route操作。Add:张量相加,不会扩充维度,对应于cfg文件中的shortcut操作。Backbone中卷积层的数量:每个CSPX中包含32X个卷积层,因此整个主干网络Backbone中一共包含2(321)2(322)2(328)2(328)2(324)172。 注意: 网络的输入大小不是固定的,在yoloV3中输入默认是416416,在yoloV4中默认是608608,在实际项目中也可以根据需要修改,比如320320,一般是32的倍数。输入图像的大小和最后的三个特征图的大小也是对应的,比如416416的输入,最后的三个特征图大小是1313,2626,5252,如果是608608,最后的三个特征图大小则是1919,3838,7676。