目标检测之Yolo学习之路-Yolov1,Yolov2,Yolov3

前言:
计算机视觉在我们一般业务场景中主要分为图像分类,目标检测,语义分割,实例分割。众所周知图像分类仅仅是将图像分出类别,常用于工业检测;目标检测相对比图像识别难多了,可以看成是图像分类和定位的结合,不仅需要把图像分出图像类别还需要把所在图像位置用方框标出;语义分割主要是按图片内容进行分割,在像素级别把图像分割成不同类别;实例分割是将图片按照对象个体进行分割,在像素级别分割成不同个体;可见下图。

近年来计算机视觉任务取得了巨大的成功,如图像识别技术中的VGG,GooLeNet,目标检测中的Yolo,Rcnn,SSD等,语义分割的FCN,Unet,实例分割的Mask Rcnn等,论文成出不穷,技巧百花齐放。目前目标检测算法主要可以分为两类,一种是RCNN系列算法,它是two-stage算法,可认为参数不能再一个网络中就计算出来,需要分步计算;另外一种就是one-stage算法,所有参数能在一个网络中计算出来。一般来将Rcnn系列算法速度慢,精度稍高,另外一种Yolo/SSD系列算法速度快,精度高。但这不是绝对,主要还是取决于各自所需实现的业务场景。本文主要针对Yolo系列讲解我自己的理解,如有错误望指正,谢谢!!!
**

Yolov1

**
Yolov1的检测效果其实并不特别好,现在也基本本不用,但是其方法还是值得我们去学习借鉴。Yolo算法采用了一个单独的CNN模型实现了端对端的目标检测,只需要把图像,label,box输入就可以训练模型了,相比于RCNN算法,其速度更快,但效果并不优越,主要是为后期的Yolov2,v3做了早起的雏形。
网络架构
Yolov1的特征提取网络是借鉴GooLNet模型,包含了24个卷积层和2个全连接,但是未使用inception module,而是使用了11卷集核(跨通道信息交互,升维降维,增加非线性单元)和33卷积核(相比大卷积核增加非线性单元,减少参数)层替代,如下图。

网络输出:
我们可看出网络是直接输入一张图片,输出是7x7x30的tensor。7x7可理解为原图通过降采样的到的特征图映射,通过比例还原可发现77每个点可对应原图的一片区域的中心,而本文正是通过这种方式去预测77的每个点对应原图区域的目标,7x7特征图每个点都会预测两个box(x_min,y_min,w,h,confidence scores),及其每个类别的概率,共20个类别,因此输出是7x7x(2x5+20)=7x7x30,其中confidence scores是反映了这个特征点对应的原图区域是否含有物体,及其这个box坐标预测的准确度,公式 定义:confidence score =P(object)*IOU(truth&pred),若有没有目标。则confidence为0,若存在目标,confiednce score =truth box与predicted box 的IOU(图像交并比)
网络训练:
目标检测网络训练之前,往往会采用预训练模型,首先利用imagenet 1000class的分类任务数据集预训练分类卷基层,使用图2中的GooLeNet加上一个average-pooling和一个全连接,作为预训练网络,将训练好的20层GooLeNet卷积层应用到目标检测网络中并加入4个卷积层和2个全连接,Yolov1模型搭建完毕。
损失函数:
Yolov1算法损失函数采用的是均方误差作为损失函数,因为均方误差比较好优化,但是这并不符合作者目标最大化平均精度,因此把误差分为了定位误差和分类误差,且分配了不同的权值,定位误差采用加大权值。网络预测了两个box,但是对应的类别只有一个,因此在训练的时候选择与truth的IOU最大的box来预测目标,其他则视为不存在目标,由此可见Yolov1只能预测所在区域的单一目标,若存在多个目标则预测不了,这是Yolov1算法的缺点。损失函数具体形式见下图,

我们由图3可知,对于定位误差的w, h的损失函数用了开方,是由于对不同大小的box预测中,相比于大box预测偏一点,小box预测偏相同大小尺寸对于IOU影响更大,而误差平方和对的偏移对于loss是一样的(下图),为了缓和这个问题,作者就用box的w,h去平方根代替原本的w,h。

网络预测:
对于预测的98个box,首先将小于置信度阀值的值归0,然后分类别对置信度值采用NMS,这里NMS处理结果不是剔除,而是将置信度值归0.最后才是确定各个box类别,当其置信度不为0时才做出检测结果输出,见图5。


优缺点分析
优点: Yolov1是采用一个CNN来实现目标检测,训练和预测都是end to end,所以速度比较快。
缺点:每个特征区域只有两个box且只选一个作为预测值对于尺寸变化较多或者有多个目标的区域识别效果不好,由于其最后的特征图较小,对应原图区域较大, 那么对应小物体识别效果也会不太好。

Yolov2

Yolov2在两个方面进行了改进:
第一:作者使用了许多技巧对Yolov1目标检测方法进行了改进,保持了速度,提高了精度。
第二:作者提出了目标分类和检测的联合训练方法,通过这种方法Yolo9000可以同时在数据集上进行训练,能实现多达9000种物体的实时检测。

Yolov2精度的改进方法

1.Batch Normalization
BN层简单来讲就是对网络每一层输入做了归一化,把数据分布转换成均值为0,方差位1的标准正态分布,这样就不需要每层神经元去学习输入数据的分布,收敛速度加快,BN有类似dropout的效果,因此去掉了dropout层,实验表明,BN有助于提高测试效果。
2.High Resolution Classfifier
现在分类或目标检测都会在预训练网络基础上fine-tuning自己的网络,而且预训练网络基本都是在imagenet上跑,一方面数据量大,一方面训练时间久,而且也容易得到。
Yolov2中预训练分为两步:先用224224训练,大概160epoch,然后调整到448448,在训练10个epoch。两步都在imagenet上训练,最后在检测数据集上fine-tuning,检测时用448448作为输入过渡。
3. Convolutional with anchor boxes。
Yolov2借鉴了Faster rcnn 使用了anchor。
为了引入anchor,作者去掉了后面全连接层和一个pooling,得到了更高的分辨率的特征。
作者还修改了网络结构,用416x416大小的输入替代原来的448x448.这样做希望得到的特征图都有奇数的高和宽,奇数大小的高和宽会使得每个特征图在划分cell的时候只有一个中心cell。因为大目标一般会占据图像的中心,所以希望用一个cell中心去预测而不是4个中心cell.网络最终将416x416的输入下采样32倍变为13x13;Yolov1中将输入图像分为7x7的网格,每个网格预测2个bounding box,一共只预测98个,Yolov2输出feature map13x13,每个cell有5个anchor box预测得到5个bounding box,一共预测845个box,增加box数量可以提高定位精度。
4.Dimension Custers
使用anchor的时候,必须使用精选的anchor才能提高检测精度,不然可能效果会很差,例如faster rcnn 中使用的anchor都是经过长时间选择验证出来的。Yolov2使用的方法和faster rcnn不一样,作者使用了k-means聚类方法训练bunding boxes,这样可以自动找到比较好的bounding boxes尺寸,k means聚类未采用欧氏距离而是使用了 d(box)=1-IOU(box,centroid),这样有利于消除尺寸变化带来的误差,这种方式有利于适应不同数据集之间的anchor大小差异。
5.Direction prediction
作者对于边界框预测沿用了yolov1方式,就是i预测边界框中心相对于对应cell左上角位置的相对偏移值,每个cell有5个anchor box,来预测5个bounding box,每个bounding box预测5个值。分别为 tx,ty,tw,th,to,to类似于Yolov1的confidence score,为了将bounding box中心点约束在当前cell中,使用了sigmoid函数将tx,ty归一化处理,将值约束在0-1,这便于模型训练更稳定。


6.Fine Grained Features
这里添加了一个直通层,源码中是reorg layer,将前面一层的26x26特征图和本层13x13的特征图进行链接,以前面高分辨率的特征图连接到低分辨率的特征图上。由于高分辨率特征图,特征图大,对应原图区域小,因此其含有更多物体的细节低级特征,有利于识别小物体,而低分辨率特征图,特征图小,对应原图区域大,采集的主要是原图的语义信息,有利于识别大物体。对于13x13的特征图而言,可能对于大物体识别足够,但是对于小物体检测略显不足。
具体操作,26
26*512特征图经过passthrough处理后,变成13x13x2048,然后和13x13x1024连接一起变成13x13x3072的特征图。
7.Multi Scale Training
Yolov2没有全连接层,因此不需要固定输入大小,作者希望Yolov2对不同尺寸具有鲁棒性,训练的时候使用了不同尺寸大小图片进行训练,没经过10次训练,就会随机选择新的尺寸训练,由于降采样是32倍,那么就使用32倍数进行尺度池化,最小是320x320,最大608x608。经过试验在小尺寸图片测试中Yolov2成绩比较好,输入为228x228,帧率达到90FPS,mAP达到Faster rcnn水平。
Yolov2的网络结构(Fster):
1.大多网络使用VGG16作为检测的特征提取部分,但是其复杂度有些冗余,作者选用了新的分类网络作为特征提取网络,darknet19,并使用了较多的3x3卷积核,每次池化操作后通道数翻倍,网络使用了全局平均池化。新的特征提取网络结构如下:

网络训练:
1.分类网络训练:使用1000类的imagenet训练160次,使用随即梯度下降,starting learning rate 0.1,polynomialrate decay 4,weight deacy 0.0005,momentunm为0.9.使用了random crops,rotations,exposure shifts等。
2.检测网络:作者去掉原网的最后一个卷积层,增加了三个3x3x1024的卷积核,且每个上述卷积层后跟一个1x1的卷积和,输出维度,是所需的数量。作者的检测模型初始学习了0.001训练160epoch,60次和90次时候,学习率衰减为原来的百分之十,weight deacy 为0.0005,momentum为0.9.
Stronger:
带标注的检测数据集量比较少,而代标注的分类数据集比较多,Yolo9000主要通过结合分类和检测数据集使得训练得到检测模型可以检测约9000类物体,一方面构造数据集(Word Tree),另一方面解决模型训练问题(joint classificationand detention)

Yolov3

yolov3相比于yolov2在性能上有较大的提神,主要是其backbone网络的提升,其模型比yolov2相比复杂不少,因此速度稍慢;当然Yolov3还有一个轻量化的backbone-tiny darknet,在Pascal Titan X上处理608x608速度可以达到20fps;但是相比于其他模型则快不少,比RCNN快接近1000倍,比faster rcnn快近100倍。

Yolov3沿用的特点:
1.Yolov3依然沿着Yolov1,v2的方式,将整张图划分为不同区域,预测每一块区域的边界框尺寸及其类别,
2.依然是一个端对端的模型,只需要一个Loss函数就可以搞定
3.leak relu激活函数
4.batch normalization
5.train on multi-scale
6.Dimension Clusters :依然采用聚类的方式获得anchors,聚类了9个anchor,根据特征图大小选取anchors,特征图13x13选取最大的3个anchors,特征图52x52选取最小的3个anchors,特征图26x26选取中等大小的3个anchors。
7.Fine Grained features 把13x13大小特征图上采样传递给26x26特征图,26x26特征图上采样传递给52x52特征图
8.Direction location prediction:
Yolov3改进之处:
1.使用了多尺度预测。
网络最终输出了3个tensor分别是13x13x255,26x26x255,52x52x255;每个输出和之前yolov1,v2是一样的方式预测,但是其维度255是每个区域预测3个anchor box,每个anchor box 需要预测其x,y,w,h,confidence,class,因此为(5+80)=255;13x13的特征图是通过darknet53分类网络,然后接多个BN,卷积,激活,最后得到13x13的特征图;26x26同样通过darknet53分类网络,然后接多个BN,卷积,激活,得到26x26的特征图,但是其还把最开始得到的13x13的特征图上采样和26x26的特征图concat一起,同样52x52的特征图也是如此,也和26x26上采样后做了concat,这做了3个尺度的预测,我们知道特征图大对应原图的区域小,多描述细节,特征图小,对应原图区域大,多描述语义特征,因此这种方式有利于提高检测精度。
2.更好更复杂的分类网络,darknet53。

3.分类器预测-类别预测:
作者未像YOLOV2那样,直接使用softmax去找出类别,因为softmax是可以计算概率最大的那个类别,但是仅仅只能选取一个类别,而对于目标检测同一区域可能有多个重叠的目标,因此softmax不适合。Yolov3使用的是多个独立的logistic分类器代替softmax,每个独立的logistic只需要算出是否属于该类别就行,因此本文分类损失采用的是binary cross-entropy loss。
4.部件结构来看:
Yolov1有全连接,池化,Yolov2只有池化,Yolov3没有池化和全连接,预训练模型有池化。
损失函数:
Yolov3和yolov2一样在论文当中对于损失函数未曾提及丝毫,我们由前面可知,损失函数包括定位损失,置信度损失,分类损失。我看了不同框架写出来的损失函数有些不一样,下面是一段keras框架写出来的损失函数:

由上可知定位损失采用的是总方误差,类别和置信度采用二值交叉熵作为损失函数。Yolov3的比较形象的解构图
相较于Faster RCNN:
1.Yolov3是端对端-算法,Faster RCNN需要反复训练RPN和Fast RCNN网络
2.Yolov3速度快,Faster RCNN速度慢。
总结:
Yolo的进阶是越来越完善,精度越来越好,虽然速度有所下降但是依然能达到实时标准,是比较成熟的工程算法,且github上已经给出了许多复现教程,复现特别容易,Yolov系列中V3是最常用的,本文主要是个人学习所收集的资料,如有错误请指正,部分内容是借鉴他人博客,路径见下.
yoloV1,看过好多篇,这篇感觉讲的最通俗易懂
YOLOv1-darknet 内容解析
Yolov1论文
论文笔记1 --(YOLOv2)YOLO9000:Better,Faster,Stronger
Yolov2论文
yolo系列之yolo v3【深度解析
从YOLOv1到YOLOv3,目标检测的进化之路
Yolov3论文
Yolov3 代码

目标检测之Yolo学习之路-Yolov1,Yolov2,Yolov3相关推荐

  1. YOLO系列总结:YOLOv1, YOLOv2, YOLOv3, YOLOv4, YOLOv5, YOLOX

    文章目录 YOLO系列总结:YOLOv1, YOLOv2, YOLOv3, YOLOv4, YOLOv5, YOLOX 前言 YOLO v1: You Only Look Once: Unified, ...

  2. 【目标检测】yolo系列:从yolov1到yolov5之YOLOv3详解及复现

    在v1.v2的原理和技巧介绍之后,v3除了网络结构,其余的改变并不多.本文着重描述yolov3的原理细节. 相关阅读: 论文:YOLOv3: An Incremental Improvement 源码 ...

  3. 【目标检测】yolo系列:从yolov1到yolov5之YOLOv2详解及复现

    YOLO v2 Yolov2论文链接:YOLO9000: Better, Faster, Stronger yolov2的改进 从Yolov2论文的标题可以直观看到就是Better.Faster.St ...

  4. 【目标检测】yolo系列:从yolov1到yolov5之YOLOv1详解及复现

    检测器通常能够被分为两类,一类是two-stage检测器,最具代表的为faster R-CNN:另一类是one-stage检测器,包括YOLO,SSD等.一般来说,two-stage检测器具有高定位和 ...

  5. 【目标检测】yolo系列:从yolov1到yolov5之YOLOv5训练自己数据集(v6.0)

    一.源码下载及requirments 源码下载地址:https://github.com/ultralytics/yolov5 (持续更新中) 本人所用环境如下: pytorch:1.8(因为cuda ...

  6. 单阶段目标检测模型YoLo系列(一):YoLoV3详解及代码实现

    目录 1.YoLoV3网络结构 1.1 Backbone:Darknet-53 1.2 构建特征金字塔 1.3 YoLo Head 2.yolov3模型预测结果的解码 2.1 先验框 2.2 检测框解 ...

  7. yolo 负样本_SSD——样本正负比控制+多尺度检测 (目标检测)(one-stage)(深度学习)(ECCV 2016)...

    SSD--样本正负比控制+多尺度检测 (目标检测)(one-stage)(深度学习)(ECCV 2016) 发布时间:2018-11-23 20:57, 浏览次数:1399 , 标签: SSD one ...

  8. 目标检测之yolo系列

    YOLO v.s Faster R-CNN 1.统一网络:YOLO没有显示求取region proposal的过程.Faster R-CNN中尽管RPN与fast rcnn共享卷积层,但是在模型训练过 ...

  9. 目标检测模型 YOLO系列

    目标检测模型 YOLO系列 文章目录 目标检测模型 YOLO系列 YOLOv1 一.背景 二.YOLO模型 主要思想 模型结构 损失函数 三.优缺点 四.参考 YOLOv2与YOLO9000 YOLO ...

最新文章

  1. 两种常见的点云配准方法ICPNDT
  2. 字节输入流 InputStream
  3. linux运行rmp文件,linux 里rpm包到底是干什么用的啊?
  4. android面试之fragment,当你面试的时候,被问到关于Fragment的种种
  5. 为什么我的elec352稍微有点崩
  6. win2008 mysql端口_Win7系统下SqlServer 2008修改IP端口的方法
  7. 成都高端企业网站建设前网站推广优化战略规划成都辰星建站
  8. 共享onload事件
  9. CODE[VS]1160 蛇形矩阵
  10. C++ 中map容器
  11. Silverlight 2.5D RPG游戏技巧与特效处理:(二)纸娃娃系统
  12. 网卡调优RSS、RPS、RFS和XPS
  13. 冰封王座人工只能_魔兽争霸3玩家热议 人工智能能否轻松战war3胜职业选手?
  14. 封装的APP封装源码-可以封装安卓和IOS
  15. R mean() 函数 - 计算平均值
  16. Java中将对象转换成String的三种方法
  17. activiti设置和使用启动人;activiti:initiator的作用及其使用
  18. Python实现仿射密码
  19. UE4蓝图案例:媒体播放器的开关
  20. 绿联USB对拷线MAC版使用经验踩坑分享(支持macOS11 BigSur系统及以下)

热门文章

  1. 安装已中止,安装程序并未成功地运行完成
  2. 银河麒麟桌面操作系统V10-常见运维问题类别:系统使用 02
  3. java juc exchanger_JUC之Exchanger
  4. java juc exchanger_JUC——Exchanger
  5. 渗透测试学习与实战阶段分析
  6. js 判断安卓,ios,微信浏览器
  7. 导数,方向导数与梯度的关系
  8. trapz 函数在matlab 和 python中的区别
  9. 基于JAVA老年人健康饮食管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  10. 「Web应用架构」模式:前端的后端(BFF)