前言

  之前无论是传统目标检测,还是RCNN,亦或是SPP NET,Faste Rcnn,Faster Rcnn,都是二阶段目标检测方法,即分为“定位目标区域”与“检测目标”两步,而YOLO V1,V2,V3都是一阶段的目标检测。

  从R-CNN到FasterR-CNN网络的发展中,都是基于proposal+分类的方式来进行目标检测的,检测精度比较高,但是检测速度不行,YOLO提供了一种更加直接的思路:

  直接在输出层回归boundingbox的位置和boundingbox所属类别的置信度,相比于R-CNN体系的目标检测,YOLO将目标检测从分类问题转换为回归问题。其主要特点是

  •速度快,能够达到实时的要求,在TitanX的GPU上达到45fps;

  •使用全图Context信息,背景错误(把背景当做物体)比较少;

  •泛化能力强;

 YOLO V1
  
 
 
UnifiedDetection(统一检测)核心思想:
.将输入图像划分为S*S个gridcell(网格单元);如果一个object物体的中心是位于这个gridcell内,那么这个gridcell就负责检测这个物体;如下图
2.每一个gridcell需要预测B个boundingboxes坐标信息(x,y,w,h)以及这些boundingboxes的置信度confidence。
YOLOv1中的坐标信息(x,y,w,h)表示的是boxes中心点坐标相对于当前图像宽度、高度的比值,w、h是boxes的宽度、高度和实际图像的宽度、高度的比值;
置信度confidence反映的是模型对于这个预测的boundingbox中包含物体的可能性大小。
3.每个gridcell还需要预测C个类别的概率(conditionalclassprobability),以判断当前cell属于哪个类别C。
•NOTE:Confidence置信度表示的是boundingboxes包含物体的概率值,而conditionalclassprobability表示的是每个gridcell属于某个类别的概率值。
4.每个gridcell的class信息和每个boundingbox预测的confidence信息相乘,就可以得到每个boundingbox的class-specificconfidencescore。
论文建议:S=7,B=2,在PASCALVOC数据集中,最终预测值形状为7x7x30的Tensor对象,C=20(该数据集的类别)

 这个30的维度是这样的:S*S(B*5+C),5的意思是两个边框的x、y、w、h、confidence。(confidence 代表了所预测的 box 中含有 object 的置信度和这个 box 预测的有多准这两重信息)
主干网络:
  其主干网络是Googlenet

其想做的事如此看来很清晰,先判断是目标还是背景,若是目标,则再判断是属于这20个类别的哪个类(此VOC数据集是20个类别,别的数据集就是别的类别)

因为论文建议了我们一个grid cell最好是承载着两个边框,即bounding box,那么,这幅7*7个cell的图就有98个边框了,如下图

每个边框都是上面公式计算来的,我有写的,即背景还是物体的概率*20个类哪个类别的概率,如下图

然后呢 ,就是处理这98个框框,如下图

这总共是20个类别,一行行的这么处理,直到20行处理完毕

然后对结果遍历,如果置信度的评分大于0,那这个框就可以代表此物体,如果得分小于0,就不行,如下图

来看一下损失函数吧,我把它分成了三类

总结一下,并分析一下优缺点:

优点
•运行速度快,因为是一阶段的;
•背景预测错误的情况比较少;
缺点
•对于实际物体的效果没有FasterR-CNN效果好;
•如果一个gridcell中包含多个相同类别的小物体,那么YOLOv1每个单元格最多可以检测出两个物体(论文的建议设置导致的,因为它建议一个grid cell 里面最好只是两个边框,如果不是两个边框,效果不会好)。如下图

 YOLO V2

  算法的增强正是有了对原来的基础不断改进才得来的,YOLO V2相对于V1主要有三方面变化。

Better,Faster,Stronger:
•1.Better:从精度方面进行改进,让效果从YOLOv1的63.4%mAP上升到YOLOv2的78.6%mAP,基本和FasterR-CNN以及SSD持平。
•2.Faster:网络结构方面做了更改,让模型速度更快;
•3.Stronger:对这个损失函数做一个变化;

 

•BatchNormalization
•在每一个卷积层后加入BatchNormalization,mAP提升2%,BatchNormalization有助于规范化模型,防止过拟合。
•HighResolutionClassifier:
•一般的目标检测方法中,基本上会使用ImageNet预训练的模型来提取特征,比如使用AlexNet或者VGG网络,那么输入的图片会被resize到不足256*256的大小,这样会导致分辨率不够高,目标检测比较困难;在YOLOv2中自定义了darknet分类网络,将图像的输入分辨率更改为448*448,然后在ImageNet上训练10轮,训练后的网络可以适应高分辨率的输入;应用到检测的时候,对检测部分网络进行finetune,mAP提升4%。

ConvolutionalwithAnchorBoxes:
•借鉴FasterR-CNN中的anchor思想,产生多个boundingboxes先验框,通过这种方式可以提升模型的recall召回率。
•删除全部的全连接层,去掉最后一个池化层,以确保输出的特征图具有更高的分辨率,然后通过缩减网络让图片输入分辨率为416*416,这样最终输出的特征图为13*13;

•DimensionCluster(维度聚类):
相当于考试时你偷看了一眼答案是BADDCDDD,但你不知道是第几道题是这些答案,于是你尽量遇到不会的时候多选D.
这里是基于训练数据的真实框的大小来做的密度的聚类
•AnchorBoxes的宽高纬度通常需要通过精选的先验框来给定,然后通过网络学习转换系数,最终得到准确的boundingbox候选框;如果可以通过维度聚类一开始就给定更具有代表性的boxes维度,那么网络就会更容易预测位置。
•使用K-Means聚类方法来训练boundingboxes;采用IoU作为KMeans聚类的距离公式。

下图是聚类的不同标准下的平均IOU值

DirectLocationPrediction(直接位置预测):
•在AnchorBoxes中,模型不是特别稳定,原因是:模型的位置预测值为偏移量的值(在整个图像上的),在模型中相当于anchor可以检测很远目标的box的情况,范围太大,反向传播的就会很慢,这样就会导致模型收敛比较慢。
•YOLOv2中不采用直接的offset方法,使用了预测相对于grid  cell的坐标位置的方法,并且将ground truth通过logistic函数限制在0~1之间,这样的范围更小,有利于反向传播的速度,。
•通过DimensionCluster+DirectLocationPrediction的改进,mAP提升5%。

 具体做法如下:

  其沿用了Faster RCNN中Anchor box(锚点框)的思想,通过kmeans方法在VOC数据集(COCO数据集)上对检测物体的宽高进行了聚类分析,得出了5个聚类中心,因此选取5个anchor的宽高: (聚类时衡量指标distance = 1-IOU(bbox, cluster))

COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)

  这样每个grid cell将对应5个不同宽高的anchor, 如下图所示:(上面给出的宽高是相对于grid cell,对应的实际宽高还需要乘以32(2的5次方),因为这里给出的原图大小是416*416大小的,经过卷积啊池化啊下采样了5次后变成了13*13大小的)

关于预测的bbox的计算:(416*416-------13*13 为例),卷积池化等经历了5次下采样,缩小了2的5次方倍(看下面这三段话的时候,记得看此行往上数第9到12行字,相信你会明白的)

    (1) 输入图片尺寸为416*416, 最后输出结果为13*13*125,这里的125指5*(5 + 20),5表示5个anchor,25表示[x, y, w, h, confidence ] + 20 class ),即每一个anchor预测一组值。

    (2) 对于每一anchor预测的25个值, x, y是相对于该grid cell左上角的偏移值,需要通过logistic函数将其处理到0-1之间。如13*13大小的grid,对于index为(6, 6)的cell,预测的x, y通过logistic计算为xoffset, yoffset,   则对应的实际x = 6 + xoffset,   y = 6+yoffset, 由于0<xoffset<1, 0<yoffset<1, 预测的实际x, y总是在(6,6)的cell内。对于预测的w, h是相对于anchor的宽高,还需乘以anchor的(w, h), 就得到相应的宽高

    (3) 由于上述尺度是在13*13下的,需要还原为实际的图片对应大小,还需乘以缩放倍数32

Fine-GrainedFeatures(细粒度特征):
•在FasterR-CNN和SSD中,通过不同的方式获得了多尺度的适应性,FasterR-CNN中使用不同的scale,SSD直接从不同大小的featuremap上来提取ROI区域;为了提升对小尺度物体的检测,在YOLOv2中加入了转移层(passthroughlayer),这个层次的功能就是将浅层特征图(26*26*256)连接到深层特征图(13*13*512)中,类似ResNet的残差网络结构。
•对于26*26*512的特征图按行、按列隔一个进行采样,产生4个13*13*512维度的新特征图,然后concat合并得到13*13*2048的特征图,最后将其连接到深层特征图上。相当于做了特征融合,对于小目标检测比较有效。
•通过这种结构,mAP提升了1%。

 即如下图这样提取特征,范围更大,最后再融合到一起

Multi-ScaleTraining:
•由于YOLOv2中仅存在卷积层和池化层,所以可以进行动态调整,每经过10个epoch,随机选择新的图片尺寸进行训练。由于YOLOv2中降采样的参数为32,所以以32个像素为增量值设置不同大小的图像来进行训练,最小尺寸320,最大尺寸608,尺寸可选值{320,352,....,608}总共十个不同尺寸的的图像。
•这种设计让YOLO在低性能的GPU、高帧率视频等场景的应用更加适合。

 下面是一个对比,YOLO V2的map在高分辨率时最高,40帧率也满足实时性的要求
Faster:
  为了改善YOLO模型的检测速度,YOLOv2在Faster方面也做了一些改进。
•大多数神经网络依赖于VGGNet来提取特征,VGG-16特征提取功能是非常强大的,但是复杂度有点高,对于224*224的图像,前向计算高达306.9亿次浮点数运算。
•YOLOv2中使用基于GoogleNet的定制网络DarkNet,一次前向传播仅需要85.2亿次浮点数计算。精度相比来降低2%(88%/90%)
DarkNet-19:
 •大量使用3*3的卷积;
•在3*3卷积前使用1*1卷积来压缩通道;
•在每一个卷积后加入BN,稳定模型;
•使用GlobalAveragePooling;
•使用MaxPooling。

 模型训练细节:
•分类模型训练;使用下列参数及数据处理方式,将Darknet-19在标准的1000类ImageNet上训练160epoch;
•随机梯度下降
•startinglearningrate:0.1,初始学习率
•polynomialratedecay:4,线性的学习率下降
•weightdecay:0.0005,权重衰减的质数,权重的偏移,移动平均数形式
•momentum:0.9  动量
•输入数据大小:224*224
•数据增强:randomcrops(随机裁剪)、rotations(旋转)、hue/saturation/exposureshifts(调整色度).

 分类模型训练:
当初始224*244的训练完成后(160epochs)
进行更高分辨率下的图像分类训练(训练10epochs):•learning_rate:0.001  •输入数据大小:448*448
目标检测网络的训练:
将分类网络的最后一个卷积层去掉,更改为三个3*3*1024的卷积层,并且每个卷积层后跟一个1*1的卷积层,输出维度为检测需要的数目;比如在VOC数据集中,需要预测5个框,每个框4个坐标值(偏移值)+1个置信度+20个类别概率值,也就是输出为125维。同时将转移层(passthroughlayer)从倒数第二层做一个连接的操作。
•训练方式以及Loss的定义和YOLOv1类似。
 
YOLO V3
 
 先来观摩一下效果和速度的对比,如下图

YOLOv3对YOLOv1和YOLOv2的内容既有保留又有改进,其保留的内容如下
•从YOLOv1开始,YOLO算法都是通过划分单元格的方式来检测的,只是划分的数量不一样;
•全部都是采用LeakyReLU激活函数;
•采用端到端的训练;
•从YOLOv2开始,将BN和LeakyReLU放到每一个卷积层之后;
•从YOLOv2开始,多尺度训练,在速度和准确率之间tradeoff。
•从YOLOv2开始,位置信息的预测全部是预测相对于gridcell的位置信息。

在YOLOv3中借鉴了大量其它网络结构的优点,其主要改进如下:
•1.YOLOv3的改进主要是backbone网络的提升,从v2的darknet-19到v3的deaknet-53。在v3中,还提供了轻量高速的网络tiny-darknet;
•2.借鉴FPN(特征金字塔)在不同scala的featuremap上提取特征信息,然后做融合。相比于v2中仅仅通过多尺度图像的训练来讲,v3对于小目标的检测效果更好;
•3.AnchorBoxes数目从v2中的5个提升到v3中的9个;
52*52大小的特征图上:10x13,16x30,33x23。26*26大小的特征图上 30x61,64x45,59x119  13*13大小的特征图上:116x90,156x198,373x326
•4.采用Logistic分类器替换Softmax分类器;因为softmax做分类器的话,它一次只能分一个类别,无法针对一个单元格有多个物体,所以换成了logistic
•5.Loss损失函数进行了改进;

 

 
 
 
 

YOLO V1、V2、V3算法 精要解说的更多相关文章

  1. android google map v1 v2 v3 参考

    V1,V2已经不被推荐使用,谷歌强烈推荐使用V3. 本人在选择时着实纠结了良久,现在总结如下: 对于V1,现在已经申请不到API KEY了,所以不要使用这个版本.这个是网址:https://devel ...

  2. 目标检测:YOLO(v1 to v3)——学习笔记

    前段时间看了YOLO的论文,打算用YOLO模型做一个迁移学习,看看能不能用于项目中去.但在实践过程中感觉到对于YOLO的一些细节和技巧还是没有很好的理解,现学习其他人的博客总结(所有参考连接都附于最后 ...

  3. GoogLeNet 之 Inception v1 v2 v3 v4

    论文地址 Inception V1 :Going Deeper with Convolutions Inception-v2 :Batch Normalization: Accelerating De ...

  4. 从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2

    from:https://blog.csdn.net/qq_14845119/article/details/73648100 Inception v1的网络,主要提出了Inceptionmodule ...

  5. 51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))

    Bash游戏V1 有一堆石子共同拥有N个. A B两个人轮流拿.A先拿.每次最少拿1颗.最多拿K颗.拿到最后1颗石子的人获胜.如果A B都很聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得 ...

  6. 51Nod 最大M子段和系列 V1 V2 V3

    前言 \(HE\)沾\(BJ\)的光成功滚回家里了...这堆最大子段和的题抠了半天,然而各位\(dalao\)们都已经去做概率了...先%为敬. 引流之主:老姚的博客 最大M子段和 V1 思路 最简单 ...

  7. 51Nod 最大公约数之和V1,V2,V3;最小公倍数之和V1,V2,V3

    1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 输入 1个数N ...

  8. DNN:windows使用 YOLO V1,V2

    本文有修改,如有疑问,请移步原文. 原文链接:  YOLO v1之总结篇(linux+windows) 此外:  YOLO-V2总结篇   Yolo9000的改进还是非常大的 由于原版的官方YOLOv ...

  9. Object Detection(RCNN, SPPNet, Fast RCNN, Faster RCNN, YOLO v1)

    RCNN -> SPPNet -> Fast-RCNN -> Faster-RCNN -> FPN YOLO v1-v3 Reference RCNN: Rich featur ...

随机推荐

  1. CSS三列自适应布局(两边宽度固定,中间自适应)

    https://blog.csdn.net/cinderella_hou/article/details/52156333 https://blog.csdn.net/wangchengiii/art ...

  2. idea隐藏配置文件

  3. Ubuntu 16.04 安装Redis服务器端

    ~ sudo apt-get install redis-server 安装完成后,Redis服务器会自动启动,我们检查Redis服务器程序 检查Redis服务器系统进程 ~ ps -aux|grep ...

  4. centos初始化脚本

    centos初始化脚本 添加IP.主机名.挂载/dev/sdb1磁盘 #!/bin/bash # ip=$ hostname=$ if [ -z $ip ] || [ -z $hostname ]; ...

  5. PTA的Python练习题(三)

    继续在PTA上编写Python的编程题. 从 第2章-11 求平方与倒数序列的部分和 开始 1. a,b=map(int,input().split()) s=0 while(a<=b): s= ...

  6. leetcode刷题-- 5. 动态规划

    动态规划思路 参考 状态转移方程: 明确「状态」-> 定义dp数组/函数的含义 -> 明确「选择」-> 明确 base case 试题 53最大子序和 题目描述 53 给定一个整数数 ...

  7. .net core 2.1控制台使用Quartz.net实现定时任务执行

    权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_33435149/article/de ...

  8. jsp 页面使用标签遍历

    <tbody> <c:forEach items="${page.list}" var="exhiMain"> <c:set va ...

  9. 设计模式课程 设计模式精讲 16-4 代理模式Coding-动态代理

    1 代码演练 1.1 动态代理 2 疑难解答 2.1 动态代理invoke怎么执行的? 2.2 感觉这块理解的不是很好,下边有时间再看看 1 代码演练 1.1 动态代理 重点: 重点关注动态代理类 测 ...

  10. windows下hashcat利用GPU显卡性能破解密码

    由于一般密码破解工具的破解速度实在是太慢,而且支持的密码破解协议也不多,暴力破解的话,有的密码1年时间也破不出来,用字典跑的话必须要明文密码在字典里才行,而且密码字典太大的话,也很浪费时间,跑不出来也 ...