导航:首页 > 源码编译 > yolo算法各个版本的改进

yolo算法各个版本的改进

发布时间:2023-08-10 19:00:52

1. yolov5和随机蕨算法的区别

区别如下:
随机化算法,是这样一种算法,在算法中使用了随机函数,且随机函数的返回值直接或者间接的影响了算法的执行流程或执行结果。就是将算法的某一步或某几步置于运气的控制之下,即该算法在运行的过程中的某一步或某几步涉及一个随机决策,或者说其中的一个决策依赖于某种随机事件。
Yolov5图像识别技术简介YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使其速度与精度都得到了极大的性能提升。主要的改进思路如下所示:输入端:在模型训练阶段,提出了一些改进思路,主要包括Mosaic数据增强、自适应锚框计算、自适应图片缩放;基准网络:融合其它检测算法中的一些新思路,主要包括:Focus结构与CSP结构。

2. YOLOv3详解

     YOLO是“You Only Look Once”的简称,它虽然不是最精确的算法,但在精确度和速度之间选择的折中,效果也是相当不错。YOLOv3借鉴了YOLOv1和YOLOv2,虽然没有太多的创新点,但在保持YOLO家族速度的优势的同时,提升了检测精度,尤其对于小物体的检测能力。YOLOv3算法使用一个单独神经网络作用在图像上,将图像划分多个区域并且预测边界框和每个区域的概率。

     YOLOv3仅使用卷积层,使其成为一个全卷积网唯做络(指旦衡FCN)。文章中,作者提出一个新的特征提取网络,Darknet-53。正如其名,它包含53个卷积层,每个后面跟随着batch normalization层和leaky ReLU层。没有池化层,使用步幅为2的卷积层替代池化层进行特征图的降采样过程,这样可以有效阻止由于池化层导致的低层级特征的损失。Darknet-53网络如下图左边所示。

     输入是 。输出是带有识别类的边界框列表,每个边界框由 六个参数表示。如果 表示80个类别,那么每个边界框由85个数字表示。
     在YOLO中,预测过程使用一个 卷积,所以输入是一个特征图。由于使用 卷积,因此预测图正好是特征图大小( 卷积只是用于改变通道数)。在YOLOv3中,此预测图是每个cell预测固定数量的边界框。
     如上图所示,预测图的深度为75,假设预测图深度为 , 表示每个cell可以预测的边界框数量。这些 个边界框可以指定检测到一个物体。每个边界框有 个特征,分别描述中心点坐标和宽高(四个)和物体分数(一个)以及 个类置信度(上图中 )。YOLOv3每个cell预测三个边界框。
     如果对象的中心(GT框中心)落在该cell感受野范围内,我们希望预测图的每个单元格都能通过其中一个边界框预测对象。其中只迟雀有一个边界框负责检测物体,首先我们需要确定此边界框属于哪个cell。
     为了实现上面的想法,我们将原始图像分割为最后预测图维度大小的网格。如下图所示,输入图像维度为 ,步幅为32(最后的预测图降采样32倍),最后预测图维度为 ,所以我们将原始图像划分为 的网格。

     直接预测框的宽高会导致训练时不稳定的梯度问题,因此,现在的很多目标检测方法使用log空间转换或者简单的偏移(offset)到称为锚框的预定义默认边界框。然后将这些变换应用到锚框以获得预测,YOLOv3具有三个锚框,可以预测每个单元格三个边界框。
     锚框是边界框的先验,是使用k均值聚类在COCO数据集上计算的。我们将预测框的宽度和高度,以表示距聚类质心的偏移量。
     以下公式描述了如何转换网络输出以获得边界框预测:

这里 分别是我们预测的中心坐标、宽度和高度。 是网络的输出。 是网格从顶左部的坐标。 是锚框的维度(见下图)。

     通过sigmoid函数进行中心坐标预测,强制将值限制在0和1之间。YOLO不是预测边界框中心的绝对坐标,它预测的是偏移量:相对于预测对象的网格单元的左上角;通过特征图cell归一化维度。
     例如,考虑上面狗的图像。如果预测中心坐标是 ,意味着中心在 (因为红色框左上角坐标是 )。但是如果预测的坐标大于1,例如 ,意味着中心在 ,现在中心在红色框右边,但是我们只能使用红色框对对象预测负责,所以我们添加一个sidmoid函数强制限制在0和1之间。

     通过对输出应用对数空间转换,然后与锚框相乘,可以预测边界框的尺寸(如上面的计算公式)。

     物体分数表示一个边界框包含一个物体的概率,对于红色框和其周围的框几乎都为1,但边角的框可能几乎都为0。物体分数也通过一个sigmoid函数,表示概率值。
     类置信度表示检测到的物体属于一个具体类的概率值,以前的YOLO版本使用softmax将类分数转化为类概率。在YOLOv3中作者决定使用sigmoid函数取代,原因是softmax假设类之间都是互斥的,例如属于“Person”就不能表示属于“Woman”,然而很多情况是这个物体既是“Person”也是“Woman”。

     为了识别更多的物体,尤其小物体,YOLOv3使用三个不同尺度进行预测(不仅仅只使用 )。三个不同尺度步幅分别是32、16和8。这意味着,输入 图像,检测尺度分别为 、 和 (如下图或者更详细如图2所示)。
     YOLOv3为每种下采样尺度设定3个先验框,总共聚类9个不同尺寸先验框。在COCO数据集上9个先验框分别是: 。下表是9个先验框分配情况:

     我们的网络生成10647个锚框,而图像中只有一个狗,怎么将10647个框减少为1个呢?首先,我们通过物体分数过滤一些锚框,例如低于阈值(假设0.5)的锚框直接舍去;然后,使用NMS(非极大值抑制)解决多个锚框检测一个物体的问题(例如红色框的3个锚框检测一个框或者连续的cell检测相同的物体,产生冗余),NMS用于去除多个检测框。
     具体使用以下步骤:抛弃分数低的框(意味着框对于检测一个类信心不大);当多个框重合度高且都检测同一个物体时只选择一个框(NMS)。
     为了更方便理解,我们选用上面的汽车图像。首先,我们使用阈值进行过滤一部分锚框。模型有 个数,每个盒子由85个数字描述。将 分割为下面的形状:box_confidence: 表示 个cell,每个cell5个框,每个框有物体的置信度概率;boxes: 表示每个cell5个框,每个框的表示;box_class_probs: 表示每个cell5个框,每个框80个类检测概率。
     即使通过类分数阈值过滤一部分锚框,还剩下很多重合的框。第二个过程叫NMS,里面有个IoU,如下图所示。

     下图给出更加详细的输入输出情况:

文章原文: https://medium.com/analytics-vidhya/yolo-v3-theory-explained-33100f6d193
论文原文: https://pjreddie.com/media/files/papers/YOLOv3.pdf
YOLOv3深入理解: https://www.jianshu.com/p/d13ae1055302
keras实现YOLOv3博客: https://blog.csdn.net/weixin_44791964/article/details/103276106
What new in YOLOv3?: https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b

3. YOLO(一) 算法的原理及演变

第一次接触到yolo这个算法是通过吴恩达的教学视频了解到的,当时其实也算是第一次接触到目标检测算法。这里我们主要介绍下YOLO(You Only Look Once)。现在已经进化到了V3版本了。它不同于Faster RCNN这个分支走的两部策略先进行前景识别在进行目标检测,它是直接一步到位进行目标检测。因此在识别的速度物掘上优于Faster RCNN(5 FPS), 而 YOLO_v1基础版在Titan X GPU上可以达到45帧/s; 快速版可以达到150帧/s。但是在准确率上YOLO是稍差与Faster RCNN这个在之后会详细介绍。顺便提下如果想了解Faster RCNN原理可以参考 Faster-RCNN的原理及演变 。

我们知道YOLO其实就是 You Only Look Once, 意思是只需要看一眼就知道位置及对象,个人觉得蛮形象的。他不需要Faster RCNN的RPN结构,他其实选取anchor是预订了候选框,将图片划分为7x7的网格,每个网格允许有2个不同的bounding box. 这样一开始我们就有7x7x2个候选框(bounding box), 大致粗略覆盖了图像的整个区域。他的思想就是Faster RCNN在第一阶段就算有了回归框,在第二阶段还是需要进行精调,那还不如就先生成大致回归框就ok了。

下面我们就来好好介绍一下这个模型。

一、模型结构

其实将这个模型简单话为:

那30又是如何形成的通道大小的呢?

a. 2个bounding box的位置(8个通道)
每个bounding box需要4个数值来表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心点的x坐标,y坐标,bounding box的宽度,高度),2个bounding box共需要弯蚂亮8个数值来表示其位置。

b. 2个bounding box 置信度(2个通道)

c. 20分类概率(20个通道)
下面我们来说一下剩下20维度的分类通道。每一个通道代表一个类别的分类概率。因为YOLO支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该网格位置存在任一种对象的概率。 但是我们一组图片只能预测49个对象,可以理解为一个grid2个achor只能有一个预测准的对象(即计算IOU比例最大的那个anchor),所以7x7个对象

图中将自行车的位置放在bounding box1,但实际上是在训练过程中等网络输出以后,比较两个bounding box与自行车实际位置的IOU,自行车的位置(实际bounding box)放置在IOU比较大的那个bounding box(图中假设是bounding box1),且该bounding box的置信度设为1

二、 损失函数

总的来说,就是用网络输出与样本标签的各项内容的误差平埋宽方和作为一个样本的整体误差。
损失函数中的几个项是与输出的30维向量中的内容相对应的。

三、 YOLO v1 缺陷

注意:

细节:
YOLO的最后一层采用线性激活函数,其它层都是Leaky ReLU。训练中采用了drop out和数据增强(data augmentation)来防止过拟合。更多细节请参考原论文

在67 FPS,YOLOv2在PASCAL VOC 2007上获得76.8%的mAP。在40 FPS时,YOLOv2获得78.6%mAP,这比使用ResNet和SSD 更快的R-CNN更好。凭借如此优异的成绩,YOLOv2于2017年CVPR发布并获得超过1000次引用。YOLO有两个缺点:一个缺点在于定位不准确,另一个缺点在于和基于region proposal的方法相比召回率较低。因此YOLOv2主要是要在这两方面做提升。另外YOLOv2并不是通过加深或加宽网络达到效果提升,反而是简化了网络。

下面主要从两点来介绍下YOLO v2的提升之处。分别是Better以及Faster.

1、Darknet-19
在YOLO v1中,作者采用的训练网络是基于GooleNet,这里作者将GooleNet和VGG16做了简单的对比,GooleNet在计算复杂度上要优于VGG16(8.25 billion operation VS 30.69 billion operation),但是前者在ImageNet上的top-5准确率要稍低于后者(88% VS 90%)。而在YOLO v2中,作者采用了新的分类模型作为基础网络,那就是Darknet-19。Table6是最后的网络结构:Darknet-19只需要5.58 billion operation。这个网络包含19个卷积层和5个max pooling层,而在YOLO v1中采用的GooleNet,包含24个卷积层和2个全连接层,因此Darknet-19整体上卷积卷积操作比YOLO v1中用的GoogleNet要少,这是计算量减少的关键。最后用average pooling层代替全连接层进行预测。这个网络在ImageNet上取得了top-5的91.2%的准确率。

2、Training for Classification
这里的2和3部分在前面有提到,就是训练处理的小trick。这里的training for classification都是在ImageNet上进行预训练,主要分两步:1、从头开始训练Darknet-19,数据集是ImageNet,训练160个epoch,输入图像的大小是224 224,初始学习率为0.1。另外在训练的时候采用了标准的数据增加方式比如随机裁剪,旋转以及色度,亮度的调整等。2、再fine-tuning 网络,这时候采用448 448的输入,参数的除了epoch和learning rate改变外,其他都没变,这里learning rate改为0.001,并训练10个epoch。结果表明fine-tuning后的top-1准确率为76.5%,top-5准确率为93.3%,而如果按照原来的训练方式,Darknet-19的top-1准确率是72.9%,top-5准确率为91.2%。因此可以看出第1,2两步分别从网络结构和训练方式两方面入手提高了主网络的分类准确率。

3、Training for Detection
在前面第2步之后,就开始把网络移植到detection,并开始基于检测的数据再进行fine-tuning。首先把最后一个卷积层去掉,然后添加3个3 3的卷积层,每个卷积层有1024个filter,而且每个后面都连接一个1 1的卷积层,1 1卷积的filter个数根据需要检测的类来定。比如对于VOC数据,由于每个grid cell我们需要预测5个box,每个box有5个坐标值和20个类别值,所以每个grid cell有125个filter(与YOLOv1不同,在YOLOv1中每个grid cell有30个filter,还记得那个7 7 30的矩阵吗,而且在YOLOv1中,类别概率是由grid cell来预测的,也就是说一个grid cell对应的两个box的类别概率是一样的,但是在YOLOv2中,类别概率是属于box的,每个box对应一个类别概率,而不是由grid cell决定,因此这边每个box对应25个预测值(5个坐标加20个类别值),而在YOLOv1中一个grid cell的两个box的20个类别值是一样的)。另外作者还提到将最后一个3 3*512的卷积层和倒数第二个卷积层相连。最后作者在检测数据集上fine tune这个预训练模型160个epoch,学习率采用0.001,并且在第60和90epoch的时候将学习率除以10,weight decay采用0.0005。

这里yolo v3相对于yolo v2有三点:1. 利用多尺度特征进行对象检测 2. 调整基础网络结构

4. 【目标检测算法解读】yolo系列算法二

https://blog.csdn.net/Gentleman_Qin/article/details/84349144

|声明:遵循CC 4.0 BY-SA版权协议

    建立在YOLOv1的基础上,经过Joseph Redmon等的改进,YOLOv2和YOLO9000算法在2017年CVPR上被提出,并获得最佳论文提名,重点解决YOLOv1召回率和定位精度方面的误差。在提出时,YOLOv2在多种监测数据集中都要快过其他检测系统,并可以在速度与精确度上进行权衡。

    YOLOv2采用Darknet-19作为特征提取网络,增加了批量标准化(Batch Normalization)的预处理,并使用224×224和448×448两阶段训练ImageNet,得到预训练模型后fine-tuning。

    相比于YOLOv1是利用FC层直接预测Bounding Box的坐标,YOLOv2借鉴了FSR-CNN的思想,引入Anchor机制,利用K-Means聚类的方式在训练集中聚类计算出更好的Anchor模板,在卷积层使用Anchor Boxes操作,增加Region Proposal的预测,同时采用较强约束的定位方法,大大提高算法召回率。同时结合图像细粒度特征,将浅层特征与深层特征相连,有助于对小尺寸目标的检测。 

    下图所示是YOLOv2采取的各项改进带了的检测性能上的提升:

    YOLO9000 的主要检测网络也是YOLO v2,同时使用WordTree来混合来自不同的资源的训练数据,并使用联合优化技术同时在ImageNet和COCO数据集上进行训练,目的是利用数量较大的分类数据集来帮助训练检测模型,因此,YOLO 9000的网络结构允许实时地检测超过9000种物体分类,进一步缩小了检测数据集与分类数据集之间的大小代沟。

    下面将具体分析YOLOv2的各个创新点:

BN概述:

    对数据进行预处理(统一格式、均衡化、去噪等)能够大大提高训练速度,提升训练效果。BN正是基于这个假设的实践,对每一层输入的数据进行加工。

    BN是2015年Google研究员在论文《Batch Normalization: Accelerating Deep Network Training by Recing Internal Covariate Shift》一文中提出的,同时也将BN应用到了2014年的GoogLeNet上,也就是Inception-v2。

    BN层简单讲就是对网络的每一层的输入都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会更快。YOLOv1算法(采用的是GoogleNet网络提取特征)是没有BN层的,而在YOLOv2中作者为每个卷积层都添加了BN层。

    使用BN对网络进行优化,让网络提高了收敛性,同时还消除了对其他形式的正则化(regularization)的依赖,因此使用BN后可以从模型中去掉Dropout,而不会产生过拟合。

BN优点:

神经网络每层输入的分布总是发生变化,加入BN,通过标准化上层输出,均衡输入数据分布,加快训练速度,因此可以设置较大的学习率(Learning Rate)和衰减(Decay);

通过标准化输入,降低激活函数(Activation Function)在特定输入区间达到饱和状态的概率,避免梯度弥散(Gradient Vanishing)问题;

输入标准化对应样本正则化,BN在一定程度上可以替代 Dropout解决过拟合问题。

BN算法:

    在卷积或池化之后,激活函数之前,对每个数据输出进行标准化,方式如下图所示:

    公式很简单,前三行是 Batch内数据归一化(假设一个Batch中有每个数据),同一Batch内数据近似代表了整体训练数据。第四行引入了附加参数 γ 和 β,此二者的取值算法可以参考BN论文,在此不再赘述。

    fine-tuning:用已经训练好的模型,加上自己的数据集,来训练新的模型。即使用别人的模型的前几层,来提取浅层特征,而非完全重新训练模型,从而提高效率。一般新训练模型准确率都会从很低的值开始慢慢上升,但是fine-tuning能够让我们在比较少的迭代次数之后得到一个比较好的效果。

    YOLO模型分为两部分,分类模型和检测模型,前者使用在ImageNet上预训练好的模型,后者在检测数据集上fine-tuning。

    YOLOv1在预训练时采用的是224*224的输入(在ImageNet数据集上进行),然后在检测的时候采用448*448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。

    YOLOv2则将预训练分成两步:先用224*224的输入在ImageNet数据集训练分类网络,大概160个epoch(将所有训练数据循环跑160次)后将输入调整到448*448,再训练10个epoch(这两步都是在ImageNet数据集上操作)。然后利用预训练得到的模型在检测数据集上fine-tuning。这样训练得到的模型,在检测时用448*448的图像作为输入可以顺利检测。

    YOLOv1将输入图像分成7*7的网格,每个网格预测2个Bounding Box,因此一共有98个Box,同时YOLOv1包含有全连接层,从而能直接预测Bounding Boxes的坐标值,但也导致丢失较多的空间信息,定位不准。

    YOLOv2首先将YOLOv1网络的FC层和最后一个Pooling层去掉,使得最后的卷积层可以有更高分辨率的特征,然后缩减网络,用416*416大小的输入代替原来的448*448,使得网络输出的特征图有奇数大小的宽和高,进而使得每个特征图在划分单元格(Cell)的时候只有一个中心单元格(Center Cell)。

    为什么希望只有一个中心单元格呢?由于图片中的物体都倾向于出现在图片的中心位置,特别是比较大的物体,所以有一个单元格单独位于物体中心的位置用于预测这些物体。

    YOLOv2通过引入Anchor Boxes,通过预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。YOLOv2的卷积层采用32这个值来下采样图片,所以通过选择416*416用作输入尺寸最终能输出一个13*13的特征图。若采用FSRCNN中的方式,每个Cell可预测出9个Anchor Box,共13*13*9=1521个(YOLOv2确定Anchor Boxes的方法见是维度聚类,每个Cell选择5个Anchor Box)。

    在FSRCNN中,以一个51*39大小的特征图为例,其可以看做一个尺度为51*39的图像,对于该图像的每一个位置,考虑9个可能的候选窗口:3种面积3种比例。这些候选窗口称为Anchor Boxes。下图示出的是51*39个Anchor Box中心,以及9种Anchor Box示例。

YOLOv1和YOLOv2特征图数据结构:

YOLOv1:S*S* (B*5 + C) => 7*7(2*5+20)

    其中B对应Box数量,5对应边界框的定位信息(w,y,w,h)和边界框置信度(Confidience)。分辨率是7*7,每个Cell预测2个Box,这2个Box共用1套条件类别概率(1*20)。

YOLOv2:S*S*K* (5 + C) => 13*13*9(5+20)

    分辨率提升至13*13,对小目标适应性更好,借鉴了FSRCNN的思想,每个Cell对应K个Anchor box(YOLOv2中K=5),每个Anchor box对应1组条件类别概率(1*20)。

    聚类:聚类是指事先没有“标签”而通过某种成团分析找出事物之间存在聚集性原因的过程。即在没有划分类别的情况下,根据数据相似度进行样本分组。

    在FSR-CNN中Anchor Box的大小和比例是按经验设定的,然后网络会在训练过程中调整Anchor Box的尺寸,最终得到准确的Anchor Boxes。若一开始就选择了更好的、更有代表性的先验Anchor Boxes,那么网络就更容易学到准确的预测位置。

    YOLOv2使用K-means聚类方法类训练Bounding Boxes,可以自动找到更好的宽高维度的值用于一开始的初始化。传统的K-means聚类方法使用的是欧氏距离函数,意味着较大的Anchor Boxes会比较小的Anchor Boxes产生更多的错误,聚类结果可能会偏离。由于聚类目的是确定更精准的初始Anchor Box参数,即提高IOU值,这应与Box大小无关,因此YOLOv2采用IOU值为评判标准,即K-means 采用的距离函数(度量标准) 为:

d(box,centroid) = 1 - IOU(box,centroid)

    如下图,左边是聚类的簇个数和IOU的关系,两条曲线分别代表两个不同的数据集。分析聚类结果并权衡模型复杂度与IOU值后,YOLOv2选择K=5,即选择了5种大小的Box 维度来进行定位预测。

    其中紫色和灰色也是分别表示两个不同的数据集,可以看出其基本形状是类似的。更重要的是,可以看出聚类的结果和手动设置的Anchor Box位置和大小差别显着——结果中扁长的框较少,而瘦高的框更多(更符合行人的特征)。

    YOLOv2采用的5种Anchor的Avg IOU是61,而采用9种Anchor Boxes的Faster RCNN的Avg IOU是60.9,也就是说本文仅选取5种box就能达到Faster RCNN的9中box的效果。选择值为9的时候,AVG IOU更有显着提高。说明K-means方法的生成的boxes更具有代表性。

    直接对Bounding Boxes求回归会导致模型不稳定,其中心点可能会出现在图像任何位置,有可能导致回归过程震荡,甚至无法收敛,尤其是在最开始的几次迭代的时候。大多数不稳定因素产生自预测Bounding Box的中心坐标(x,y)位置的时候。

    YOLOv2的网络在特征图(13*13)的每一个单元格中预测出5个Bounding Boxes(对应5个Anchor Boxes),每个Bounding Box预测出5个值(tx,ty,tw,th,t0),其中前4个是坐标偏移值,t0是置信度结果(类似YOLOv1中的边界框置信度Confidence)。YOLOv2借鉴了如下的预测方式,即当Anchor Box的中心坐标和宽高分别是(xa,ya)和(wa,wh)时,Bounding Box坐标的预测偏移值(tx,ty,tw,th)与其坐标宽高(x,y,w,h)的关系如下:                         

tx = (x-xa)/wa

ty= (y-ya)/ha

tw = log(w/wa)

th = log(h/ha)

    基于这种思想,YOLOv2在预测Bounding Box的位置参数时采用了如下强约束方法:

    上图中,黑色虚线框是Anchor Box,蓝色矩形框就是预测的Bounding Box结果,预测出的Bounding Box的坐标和宽高为(bx,by)和(bw,bh),计算方式如图中所示,其中:对每个Bounding Box预测出5个值(tx,ty,tw,th,t0),Cell与图像左上角的横纵坐标距离为(cx,cy),σ定义为sigmoid激活函数(将函数值约束到[0,1]),该Cell对应的Anchor Box对应的宽高为(pw,ph)。

    简而言之,(bx,by)就是(cx,cy)这个Cell附近的Anchor Box针对预测值(tx,ty)得到的Bounding Box的坐标预测结果,同时可以发现这种方式对于较远距离的Bounding Box预测值(tx,ty)能够得到很大的限制。

    YOLOv2通过添加一个转移层,把高分辨率的浅层特征连接到低分辨率的深层特征(把特征堆积在不同Channel中)而后进行融合和检测。具体操作是先获取前层的26*26的特征图,将其同最后输出的13*13的特征图进行连接,而后输入检测器进行检测(检测器的FC层起到了全局特征融合的作用),以此来提高对小目标的检测能力。    

    为了适应不同尺度下的检测任务,YOLOv2在训练网络时,其在检测数据集上fine-tuning时候采用的输入图像的size是动态变化的。具体来讲,每训练10个Batch,网络就会随机选择另一种size的输入图像。因为YOLOv2用到了参数是32的下采样,因此也采用32的倍数作为输入的size,即采用{320,352,…,608}的输入尺寸(网络会自动改变尺寸,并继续训练的过程)。

这一策略让网络在不同的输入尺寸上都能达到较好的预测效果,使同一网络能在不同分辨率上进行检测。输入图片较大时,检测速度较慢,输入图片较小时,检测速度较快,总体上提高了准确率,因此多尺度训练算是在准确率和速度上达到一个平衡。

    上表反映的是在检测时,不同大小的输入图片情况下的YOLOv2和其他目标检测算法的对比。可以看出通过多尺度训练的检测模型,在测试的时候,输入图像在尺寸变化范围较大的情况下也能取得mAP和FPS的平衡。

    YOLOv1采用的训练网络是GoogleNet,YOLOv2采用了新的分类网络Darknet-19作为基础网络,它使用了较多的3*3卷积核,并把1*1的卷积核置于3*3的卷积核之间,用来压缩特征,同时在每一次池化操作后把通道(Channels)数翻倍(借鉴VGG网络)。

    YOLOv1采用的GooleNet包含24个卷积层和2个全连接层,而Darknet-19包含19个卷积层和5个最大池化层(Max Pooling Layers),后面添加Average Pooling层(代替v1中FC层),而Softmax分类器作为激活被用在网络最后一层,用来进行分类和归一化。

    在ImageNet数据集上进行预训练,主要分两步(采用随机梯度下降法):

输入图像大小是224*224,初始学习率(Learning Rate)为0.1,训练160个epoch,权值衰减(Weight Decay)为0.0005,动量(Momentum)为0.9,同时在训练时采用标准的数据增强(Data Augmentation)方式如随机裁剪、旋转以及色度、亮度的调整。

fine-tuning:第1步结束后,改用448*448输入(高分辨率模型),学习率改为0.001,训练10个epoch,其他参数不变。结果表明:fine-tuning后的top-1准确率为76.5%,top-5准确率为93.3%,若按照原来的训练方式,Darknet-19的top-1准确率是72.9%,top-5准确率为91.2%。可以看出,两步分别从网络结构和训练方式方面入手提高了网络分类准确率。

    预训练之后,开始基于检测的数据集再进行fine-tuning。    

    首先,先把最后一个卷积层去掉,然后添加3个3*3的卷积层,每个卷积层有1024个卷积核,并且后面都连接一个1*1的卷积层,卷积核个数(特征维度)根据需要检测的类数量决定。(比如对VOC数据,每个Cell需要预测5个Boungding Box,每个Bounding Box有4个坐标值、1个置信度值和20个条件类别概率值,所以每个单元格对应125个数据,此时卷积核个数应该取125。)

    然后,将最后一个3*3*512的卷积层和倒数第2个卷积层相连(提取细粒度特征),最后在检测数据集上fine-tuning预训练模型160个epoch,学习率采用0.001,并且在第60和90个epoch的时候将学习率除以10,权值衰减、动量和数据增强方法与预训练相同。

    YOLO9000通过结合分类和检测数据集,使得训练得到的模型可以检测约9000类物体,利用带标注的分类数据集量比较大的特点,解决了带标注的检测数据集量比较少的问题。具体方法是:一方面采用WordTree融合数据集,另一方面联合训练分类数据集和检测数据集。

    分类数据集和检测数据集存在较大差别:检测数据集只有粗粒度的标记信息,如“猫”、“狗”,而分类数据集的标签信息则更细粒度,更丰富。比如“狗”就包括“哈士奇”、“金毛狗”等等。所以如果想同时在检测数据集与分类数据集上进行训练,那么就要用一种一致性的方法融合这些标签信息。

    用于分类的方法,常用Softmax(比如v2),Softmax意味着分类的类别之间要互相独立的,而ImageNet和COCO这两种数据集之间的分类信息不相互独立(ImageNet对应分类有9000种,而COCO仅提供80种目标检测),所以使用一种多标签模型来混合数据集,即假定一张图片可以有多个标签,并且不要求标签之间独立,而后进行Softmax分类。

    由于ImageNet的类别是从WordNet选取的,作者采用以下策略重建了一个树形结构(称为WordTree):

遍历ImageNet的标签,然后在WordNet中寻找该标签到根节点(所有的根节点为实体对象)的路径;

如果路径只有一条,将该路径直接加入到WordTree结构中;

否则,从可选路径中选择一条最短路径,加入到WordTree结构中。

WordTree的作用就在于将两种数据集按照层级进行结合。

    如此,在WordTree的某个节点上就可以计算该节点的一些条件概率值,比如在terrier这个节点,可以得到如下条件概率值:

    进而,如果要预测此节点的概率(即图片中目标是Norfolk terrier的概率),可以根据WordTree将该节点到根节点的条件概率依次相乘得到,如下式:

其中:        

    YOLO9000在WordTree1k(用有1000类别的ImageNet1k创建)上训练了Darknet-19模型。为了创建WordTree1k作者添加了很多中间节点(中间词汇),把标签由1000扩展到1369。

    训练过程中GroundTruth标签要顺着向根节点的路径传播:为了计算条件概率,模型预测了一个包含1369个元素的向量,而且基于所有“同义词集”计算Softmax,其中“同义词集”是同一概念下的所属词。

    现在一张图片是多标记的,标记之间不需要相互独立。在训练过程中,如果有一个图片的标签是“Norfolk terrier”,那么这个图片还会获得“狗”以及“哺乳动物”等标签。

    如上图所示,之前的ImageNet分类是使用一个大Softmax进行分类,而现在WordTree只需要对同一概念下的同义词进行Softmax分类。然后作者分别两个数据集上用相同训练方法训练Darknet-19模型,最后在ImageNet数据集上的top-1准确率为72.9%,top-5准确率为91.2%;在WordTree数据集上的top-1准确率为71.9%,top-5准确率为90.4%。

    这种方法的好处是有“退而求其次”的余地:在对未知或者新的物体进行分类时,性能损失更低,比如看到一个狗的照片,但不知道是哪种种类的狗,那么就预测其为“狗”。

    以上是构造WordTree的原理,下图是融合COCO数据集和ImageNet数据集以及生成它们的WordTree的示意图(用颜色区分了COCO数据集和ImageNet数据集的标签节点), 混合后的数据集对应的WordTree有9418个类。另一方面,由于ImageNet数据集太大,YOLO9000为了平衡两个数据集之间的数据量,通过过采样(Oversampling)COCO数据集中的数据,使COCO数据集与ImageNet数据集之间的数据量比例达到1:4。

    对YOLO9000进行评估,发现其mAP比DPM高,而且YOLO有更多先进的特征,YOLO9000是用部分监督的方式在不同训练集上进行训练,同时还能检测9000个物体类别,并保证实时运行。虽然YOLO9000对动物的识别性能很好,但是对衣服或者装备的识别性能不是很好(这跟数据集的数据组成有关)。

    YOLO9000的网络结构和YOLOv2类似,区别是每个单元格只采用3个Anchor Boxes。

    YOLO9000提出了一种在分类数据集和检测数据集上联合训练的机制,即使用检测数据集(COCO)的图片去学习检测相关的信息即查找对象(例如预测边界框坐标、边界框是否包含目标及目标属于各个类别的概率),使用仅有类别标签的分类数据集(ImageNet)中的图片去扩展检测到的对象的可识别种类。

    具体方法是:当网络遇到一个来自检测数据集的图片与标记信息,就把这些数据用完整的损失函数(v2和9000均沿用了v1网络的损失函数)反向传播,而当网络遇到一个来自分类数据集的图片和分类标记信息,只用代表分类误差部分的损失函数反向传播这个图片。

    YOLO v2 在大尺寸图片上能够实现高精度,在小尺寸图片上运行更快,可以说在速度和精度上达到了平衡,具体性能表现如下所示。

coco数据集

voc2012数据集

5. YOLOv3原理

https://www.paddlepaddle.org.cn/tutorials/projectdetail/2412195/

R-CNN系列算法需要先产生候选区域,再对候选区域做分类和位置坐标的预测,这类算法被称为两阶段目标检测算法。

与R-CNN系列算法不同,YOLOv3使用单个网络结构,在产生候选区域的同时即可预测出物体类别和位置,不需要分成两阶段来完成检测任务。另外,YOLOv3算法产生的预测框数目比Faster R-CNN少很多。Faster R-CNN中每个真实框可能对应多个标签为正的候选区域,而YOLOv3里面每个真实框只对应一个正的候选区域。这些特性使得YOLOv3算法具有更快的速度,能到达实时响应的水平。

Joseph Redmon等人在2015年提出YOLO(You Only Look Once,YOLO)算法,通常也被称为YOLOv1;2016年,他们对算法进行改进,又提出YOLOv2版本;2018年发展出YOLOv3版本。

YOLOv3算法的基本思想可以分成两部分:
1、按一定规则在图片上产生一系列的候选区域,然后根据这些候选区域与图片上物体真实框之间的位置关系对候选区域进行标注。跟真实框足够接近的那些候选区域会被标注为正样本,同时将真实框的位置作为正样本的位置目标。偏离真实框较大的那些候选区域则会被标注为负样本,负样本不需要预测位置或者类别。
2、使用卷积神经网络提取图片特征并对候选区域的位置和类别进行预测。这样每个预测框就可以看成是一个样本,根据真实框相对它的位置和类别进行了标注而获得标签值,通过网络模型预测其位置和类别,将网络预测值和标签值进行比较,就可以建衫梁立起损失函数。

目前大多数基于卷积神经网络的模型所采用的方式大体如下:
1、按一定的规则在图片上生成一系列位置固定的锚框,将这些锚框看作是可能的候选区域。
2、对锚框是否包含目标物体进行预测,如果包含目标物体,还需要预测所包含物体的类别,以及预测框相对于锚框位置需要调整的幅度。

将原始图片划分为m*n个区域,原始图片高度H=640, 宽度W=480,如果我们选择小块区域的尺寸为32×32,则m和n分别为:
m=640/32=20
n=480/32=15
将原始图片划分成20行15列小方块区域。
YOLOv3算法会在每个区域的中心,生成一系列锚框。

锚李裤框的位置都是固定好的,不可能刚好跟物体边界框重合,需要在锚框的基哪塌简础上进行位置的微调以生成预测框。预测框相对于锚框会有不同的中心位置和大小,采用什么方式能得到预测框呢?我们先来考虑如何生成其中心位置坐标。

比如上面图中在第10行第4列的小方块区域中心生成的一个锚框,如绿色虚线框所示。以小方格的宽度为单位长度,

那么问题来了,tx、ty、tw、th取什么值的时候,才能使得预测框和真实框重合呢?

6. 目标检测 YOLO系列——YOLO v1

YOLO v1:You Only Look Once: Unified, Real-Time Object Detection
YOLO v2:YOLO9000:Better,Faster,Stronger
YOLO v3:YOLOv3: An Incremental Improvement

近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN),它们是two-stage的,需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal,然后再在Region Proposal上做分类与回归。而另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个CNN网络直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。这里我们谈的是Yolo-v1版本算法,其性能是差于后来的SSD算法的,但是Yolo后来也继续进行改进,产生了Yolo9000、YOLO v3算法。

传统方法常采用滑动窗口法,滑动窗口的目标检测算法思路非常简单,它将检测问题转化为了图像分类问题。其基本原理就是采用不同大小和比例(宽高比)的窗口在整张图片上以一定的步长进行滑动,然后对这些窗口对应的区域做图像分类,这样就可以实现对整张图片的检测了,如 DPM 就是采用这种思路。但是这个方法有致命的缺点,就是你并不知道要检测的目标大小是什么规模,所以你要设置不同大小和比例的窗口去滑动,而且还要选取合适的步长。但是这样会产生很多的子区域,并且都要经过分类器去做预测,这需要很大的计算量,所以你的分类器不能太复杂,因为要保证速度。解决思路之一就是减少要分类的子区域,这就是R-CNN的一个改进策略,其采用了 selective search 方法来找到最有可能包含目标的子区域(Region Proposal),其实可以看成采用启发式方法过滤掉很多子区域,这会提升效率。

如果你使用的是CNN分类器,那么滑动窗口是非常耗时的。但是结合卷积运算的特点,我们可以使用CNN实现更高效的滑动窗口方法。这里要介绍的是一种全卷积的方法,简单来说就是网络中用卷积层代替了全连接层,如图所示。输入图片大小是16x16,经过一系列卷积操作,提取了2x2的特征图,但是这个2x2的图上每个元素都是和原图是一一对应的,如图上蓝色的格子对应蓝色的区域,这不就是相当于在原图上做大小为14x14的窗口滑动,且步长为2,共产生4个字区域。最终输出的通道数为4,可以看成4个类别的预测概率值,这样一次CNN计算就可以实现窗口滑动的所有子区域的分类预测。这其实是overfeat算法的思路。之所可以CNN可以实现这样的效果是因为卷积操作的特性,就是图片的空间位置信息的不变性,尽管卷积过程中图片大小减少,但是位置对应关系还是保存的。这个思路也被R-CNN借鉴,从而诞生了Fast R-cNN算法。

上面尽管可以减少滑动窗口的计算量,但是只是针对一个固定大小与步长的窗口,这是远远不够的。Yolo算法很好的解决了这个问题,它不再是窗口滑动了,而是直接将原始图片分割成互不重合的小方块,然后通过卷积最后生产这样大小的特征图,基于上面的分析,可以认为特征图的每个元素也是对应原始图片的一个小方块,然后用每个元素来可以预测那些中心点在该小方格内的目标,这就是Yolo算法的朴素思想。

整体来看,Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测,整个系统如图所示:首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标。相比R-CNN算法,其是一个统一的框架,其速度更快,而且Yolo的训练过程也是end-to-end的。

具体来说,Yolo的CNN网络将输入的图片分割成 网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如图所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测B个边界框(bounding box)以及边界框的 置信度 (confidence score)。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为 ,当该边界框是背景时(即不包含目标),此时 。而当该边界框包含目标时, 。边界框的准确度可以用预测框与实际框(ground truth)的 IOU (intersection over union,交并比)来表征,记为 IOU 。因此置信度可以定义为 。

很多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。边界框的大小与位置可以用4个值来表征:(x,y,h,w),其中(x,y)是边界框的中心坐标,而w和h是边界框的宽与高。还有一点要注意,中心坐标的预测值(x,y)是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如图所示。而边界框的w和h预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在[0,1]范围。这样,每个边界框的预测值实际上包含5个元素:(x,y,w,h,c),其中前4个表征边界框的大小与位置,而最后一个值是置信度。

值得注意的是,不管一个单元格预测多少个边界框,其只预测一组类别概率值,这是Yolo算法的一个缺点,在后来的改进版本中,Yolo9000是把类别概率预测值与边界框是绑定在一起的。同时,我们可以计算出各个边界框类别置信度(class-specificconfidence scores):

边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏。后面会说,一般会根据类别置信度来过滤网络的预测框。

总结一下,每个单元格需要预测 个值。如果将输入图片划分为 网格,那么最终预测值为 大小的张量。整个模型的预测值结构如下图所示。对于PASCALVOC数据,其共有20个类别,如果使用S=7,B=2,那么最终的预测结果就是 大小的张量。在下面的网络结构中我们会详细讲述每个单元格的预测值的分布位置。

Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,如图所示。对于卷积层,主要使用1x1卷积来做channle rection,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数:max(x,0)。但是最后一层却采用线性激活函数。除了上面这个结构,文章还提出了一个轻量级版本Fast Yolo,其仅使用9个卷积层,并且卷积层中使用更少的卷积核。

可以看到网络的最后输出为 大小的张量。这和前面的讨论是一致的。这个张量所代表的具体含义如图所示。对于每一个单元格,前20个元素是类别概率值,然后2个元素是边界框置信度,两者相乘可以得到类别置信度,最后8个元素是边界框的(x,y,w,h)。大家可能会感到奇怪,对于边界框为什么把置信度c和(x,y,w,h)都分开排列,而不是按照(x,y,w,h,c)这样排列,其实纯粹是为了计算方便,因为实际上这30个元素都是对应一个单元格,其排列是可以任意的。但是分离排布,可以方便地提取每一个部分。这里来解释一下,首先网络的预测值是一个二维张量P,其shape为 。

采用切片,那么 就是类别概率部分; 是置信度部分; 是边界框的预测结果。这样,提取每个部分是非常方便的,这会方面后面的训练及预测时的计算。

在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。整个网络的流程如下图所示:

损失函数计算如下:

其中第一项是边界框中心坐标的误差项, 指的是第i个单元格存在目标,且该单元格中的第j个边界框负责预测该目标。第二项是边界框的高与宽的误差项。第三项是包含目标的边界框的置信度误差项。第四项是不包含目标的边界框的置信度误差项。而最后一项是包含目标的单元格的分类误差项, 指的是第i个单元格存在目标。

在说明Yolo算法的预测过程之前,这里先介绍一下非极大值抑制算法(non maximum suppression, NMS),这个算法不单单是针对Yolo算法的,而是所有的检测算法中都会用到。NMS算法主要解决的是一个目标被多次检测的问题,如图中人脸检测,可以看到人脸被多次检测,但是其实我们希望最后仅仅输出其中一个最好的预测框,比如对于美女,只想要红色那个检测结果。那么可以采用NMS算法来实现这样的效果:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。

下面就来分析Yolo的预测过程,这里我们不考虑batch,认为只是预测一张输入图片。根据前面的分析,最终的网络输出是 ,但是我们可以将其分割成三个部分:类别概率部分为 ,置信度部分为 ,而边界框部分为 (对于这部分不要忘记根据原始图片计算出其真实值)。然后将前两项相乘可以得到 类别置信度值为 ,这里总共预测了 边界框。

所有的准备数据已经得到了,那么先说第一种策略来得到检测框的结果。首先,对于每个预测框根据类别置信度选取置信度最大的那个类别作为其预测标签,经过这层处理我们得到各个预测框的预测类别及对应的置信度值,其大小都是[7,7,2]。一般情况下,会设置置信度阈值,就是将置信度小于该阈值的box过滤掉,所以经过这层处理,剩余的是置信度比较高的预测框。最后再对这些预测框使用NMS算法,最后留下来的就是检测结果。一个值得注意的点是NMS是对所有预测框一视同仁,还是区分每个类别,分别使用NMS。Ng在deeplearning.ai中讲应该区分每个类别分别使用NMS,但是看了很多实现,其实还是同等对待所有的框,可能是不同类别的目标出现在相同位置这种概率很低吧。

上面的预测方法应该非常简单明了,但是对于Yolo算法,其却采用了另外一个不同的处理思路(至少从C源码看是这样的),其区别就是先使用NMS,然后再确定各个box的类别。其基本过程如图所示。对于98个boxes,首先将小于置信度阈值的值归0,然后分类别地对置信度值采用NMS,这里NMS处理结果不是剔除,而是将其置信度值归为0。最后才是确定各个box的类别,当其置信度值不为0时才做出检测结果输出。这个策略不是很直接,但是貌似Yolo源码就是这样做的。Yolo论文里面说NMS算法对Yolo的性能是影响很大的,所以可能这种策略对Yolo更好。

总结一下Yolo的优缺点。首先是优点,Yolo采用一个CNN网络来实现检测,是单管道策略,其训练与预测都是end-to-end,所以Yolo算法比较简洁且速度快。第二点由于Yolo是对整张图片做卷积,所以其在检测目标有更大的视野,它不容易对背景误判。另外,Yolo的泛化能力强,在做迁移时,模型鲁棒性高。

Yolo的缺点,首先Yolo各个单元格仅仅预测两个边界框,而且属于一个类别。对于小物体,Yolo的表现会不如人意。这方面的改进可以看SSD,其采用多尺度单元格。也可以看Faster R-CNN,其采用了anchor boxes。Yolo对于在物体的宽高比方面泛化率低,就是无法定位不寻常比例的物体。当然Yolo的定位不准确也是很大的问题。

参考链接
YOLO算法的原理与实现
https://cloud.tencent.com/developer/article/1058057

阅读全文

与yolo算法各个版本的改进相关的资料

热点内容
苹果如何创建服务器错误 浏览:494
软考初级程序员大题分值 浏览:473
js压缩视频文件 浏览:578
linux如何通过命令创建文件 浏览:989
应用加密app还能访问应用嘛 浏览:432
安卓怎么用支付宝交违章罚款 浏览:665
php面向对象的程序设计 浏览:504
数据挖掘算法书籍推荐 浏览:894
投诉联通用什么app 浏览:150
web服务器变更ip地址 浏览:954
java正则表达式验证邮箱 浏览:360
成熟商务男装下载什么软件app 浏览:609
加密2h代表长度是多少厘米 浏览:23
拍卖程序员 浏览:101
电脑的图片放在哪个文件夹 浏览:274
unsignedintjava 浏览:216
编译器下载地址 浏览:43
什么是面对对象编程 浏览:708
b站服务器什么时候恢复 浏览:721
6p相当于安卓机什么水准 浏览:499