YOLO v1到YOLO v4(上)

一. YOLO v1

这是继RCNN,fast-RCNN和faster-RCNN之后,rbg(RossGirshick)针对DL目标检测速度问题提出的另外一种框架。YOLO V1其增强版本GPU中能跑45fps,简化版本155fps。

论文下载:http://arxiv.org/abs/1506.02640

代码下载:https://github.com/pjreddie/darknet

YOLO的核心思想

提出了一种新的目标检测方法YOLO。先前的目标检测工作重新调整了分类器的用途以执行检测。取而代之的是,将目标检测作为一个回归问题,以空间分隔的边界框和关联的类概率来处理。一个单一的神经网络在一次评估中直接从完整图像预测边界框和类概率。由于整个检测通道是一个单一的网络,因此可以直接对检测性能进行端到端的优化。统一架构非常快。基本YOLO模型以每秒45帧的速度实时处理图像。另一个更小版本的网络Fast YOLO每秒处理155帧,同时仍然可以实现其他实时检测器的两倍。与最先进的检测系统相比,YOLO定位误差更大,但在背景下预测误报的可能性较小。最后,YOLO学习对象的一般表示。当从自然图像推广到其他领域(如艺术作品)时,它优于其他检测方法,包括DPM和R-CNN。

·
YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。

·
faster RCNN中也直接用整张图作为输入,但是faster-RCNN整体还是采用了RCNN那种 proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了,而YOLO则采用直接回归的思路。

二. YOLO的实现方法

·
将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格中,则这个网格就负责预测这个object。

·
每个网格要预测B个bounding box,每个bounding
box除了要回归自身的位置之外,还要附带预测一个confidence值。

这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的:

其中如果有object落在一个grid cell里,第一项取1,否则取0。第二项是预测的bounding box和实际的groundtruth之间的IoU值。

·
每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则SxS个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S x S x (5*B+C)的一个tensor。

注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。

·
举例说明: 在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。

整个网络结构如下图所示:

·
在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:

等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。

· 得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。

·
注:

*由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。

*虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。

三. YOLO的实现细节

·
每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。

其中坐标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。

·
在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。作者简单粗暴的全部采用了sum-squared error loss来做这件事。

这种做法存在以下几个问题:

第一,8维的localization error和20维的classification error同等重要显然是不合理的;

第二,如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。

解决办法:

·
更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为
在pascal VOC训练中取5。

·
对没有object的box的confidence loss,赋予小的loss weight,记为
在pascal VOC训练中取0.5。

·
有object的box的confidence loss和类别的loss的loss weight正常取1。

·
对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。

为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。(也是个近似逼近方式)

·
一个网格预测多个box,希望的是每个box predictor专门负责预测某个object。具体做法就是看当前预测的box与ground truth box中哪个IoU大,就负责哪个。这种做法称作box predictor的specialization。

·
最后整个的损失函数如下所示:


这个损失函数中:

§ 只有当某个网格中有object的时候才对classification error进行惩罚。

§ 只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。

·
其他细节,例如使用激活函数使用leak RELU,模型用ImageNet预训练等等,在这里就不一一赘述了。

·
注:

*YOLO方法模型训练依赖于物体识别标注数据,因此,对于非常规的物体形状或比例,YOLO的检测效果并不理想。

*YOLO采用了多个下采样层,网络学到的物体特征并不精细,因此也会影响检测效果。

  • YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。

四. YOLO的缺点

·
YOLO对相互靠的很近的物体,还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。

·
同一类物体出现的新的不常见的长宽比和其他情况时,泛化能力偏弱。

·
由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。

YOLO9000 YOLOv2

原文下载:https://arxiv.org/pdf/1612.08242v1.pdf

工程代码:http://pjreddie.com/darknet/yolo/

摘要

  1. 提出YOLOv2:代表着目前业界最先进物体检测的水平,它的速度要快过其他检测系统(FasterR-CNN,ResNet,SSD),使用者可以在它的速度与精确度之间进行权衡。

  2. 提出YOLO9000:这一网络结构可以实时地检测超过9000种物体分类,这归功于它使用了WordTree,通过WordTree来混合检测数据集与识别数据集之中的数据。

  3. 提出了一种新的联合训练算法( Joint Training Algorithm ),使用这种联合训练技术同时在ImageNet和COCO数据集上进行训练。YOLO9000进一步缩小了监测数据集与识别数据集之间的代沟。

简介

目前的检测数据集(DetectionDatasets)有很多限制,分类标签的信息太少,图片的数量小于分类数据集(Classification Datasets),而且检测数据集的成本太高,使其无法当作分类数据集进行使用。而现在的分类数据集却有着大量的图片和十分丰富分类信息。

文章提出了一种新的训练方法–联合训练算法,这种算法可以把这两种的数据集混合到一起。使用一种分层的观点对物体进行分类,用巨量的分类数据集数据来扩充检测数据集,从而把两种不同的数据集混合起来。

联合训练算法的基本思路就是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用监测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性。

YOLO9000就是使用联合训练算法训练出来的,他拥有9000类的分类信息,这些分类信息学习自ImageNet分类数据集,而物体位置检测则学习自COCO检测数据集。

All of our code and pre-trained models are available online at http://pjreddie.com/yolo9000/

BETTER

YOLO一代有很多缺点,作者希望改进的方向是:改善recall,提升定位的准确度,同时保持分类的准确度。

目前计算机视觉的趋势是更大更深的网络,更好的性能表现通常依赖于训练更大的网络或者把多种model综合到一起。但是YOLO v2则着力于简化网络。具体的改进见下表:

·
Batch Normalization

使用Batch Normalization对网络进行优化,让网络提高了收敛性,同时还消除了对其他形式的正则化(regularization)的依赖。通过对YOLO的每一个卷积层增加Batch Normalization,最终使得mAP提高了2%,同时还使model正则化。使用Batch
Normalization可以从model中去掉Dropout,而不会产生过拟合。

·
High resolution classifier

目前业界标准的检测方法,都要先把分类器(classifier)放在ImageNet上进行预训练。从Alexnet开始,大多数的分类器都运行在小于256256的图片上。而现在YOLO从224224增加到了448*448,这就意味着网络需要适应新的输入分辨率。

为了适应新的分辨率,YOLO v2的分类网络以448*448的分辨率先在ImageNet上进行Fine Tune,Fine Tune10个epochs,让网络有时间调整他的滤波器(filters),好让其能更好的运行在新分辨率上,还需要调优用于检测的Resulting
Network。最终通过使用高分辨率,mAP提升了4%。

·
Convolution with anchor boxes

YOLO一代包含有全连接层,从而能直接预测Bounding
Boxes的坐标值。Faster R-CNN的方法只用卷积层与Region
Proposal Network来预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。

所以最终YOLO去掉了全连接层,使用Anchor Boxes来预测 Bounding Boxes。作者去掉了网络中一个Pooling层,这让卷积层的输出能有更高的分辨率。收缩网络让其运行在416416而不是448448。由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLO的卷积层采用32这个值来下采样图片,所以通过选择416416用作输入尺寸最终能输出一个1313的Feature Map。使用Anchor Box会让精确度稍微下降,但用了它能让YOLO能预测出大于一千个框,同时recall达到88%,mAP达到69.2%。

·
Dimension clusters

之前Anchor Box的尺寸是手动选择的,所以尺寸还有优化的余地。为了优化,在训练集(training set)Bounding Boxes上跑了一下k-means聚类,来找到一个比较好的值。

如果用标准的欧式距离的k-means,尺寸大的框比小框产生更多的错误。因为的目的是提高IOU分数,这依赖于Box的大小,所以距离度量的使用:

通过分析实验结果,左图:在model复杂性与high recall之间权衡之后,选择聚类分类数K=5。右图:是聚类的中心,大多数是高瘦的Box。

Table1是说明用K-means选择Anchor Boxes时,当Cluster IOU选择值为5时,AVG IOU的值是61,这个值要比不用聚类的方法的60.9要高。选择值为9的时候,AVG
IOU更有显著提高。总之就是说明用聚类的方法是有效果的。

·
Direct location prediction

用Anchor Box的方法,会让model变得不稳定,尤其是在最开始的几次迭代的时候。大多数不稳定因素产生自预测Box的(x,y)位置的时候。按照之前YOLO的方法,网络不会预测偏移量,而是根据YOLO中的网格单元的位置来预测坐标,这就让Ground Truth的值介于0到1之间。而为了让网络的结果能落在这一范围内,网络使用一个 Logistic Activation来对于网络预测结果进行限制,让结果介于0到1之间。网络在每一个网格单元中预测出5个Bounding
Boxes,每个Bounding Boxes有五个坐标值tx,ty,tw,th,t0,他们的关系见下图(Figure3)。假设一个网格单元对于图片左上角的偏移量是cx,cy,Bounding Boxes
Prior的宽度和高度是pw,ph,那么预测的结果见下图右面的公式:

因为使用了限制让数值变得参数化,也让网络更容易学习、更稳定。

Dimension clusters和Direct location prediction,improves YOLO by almost 5% over the version with anchor boxes.

·
Fine-Grained Features

YOLO修改后的Feature Map大小为1313,这个尺寸对检测图片中尺寸大物体来说足够了,同时使用这种细粒度的特征对定位小物体的位置可能也有好处。Faster R-CNN、SSD都使用不同尺寸的Feature Map来取得不同范围的分辨率,而YOLO采取了不同的方法,YOLO加上了一个Passthrough Layer来取得之前的某个2626分辨率的层的特征。这个Passthrough layer能够把高分辨率特征与低分辨率特征联系在一起,联系起来的方法是把相邻的特征堆积在不同的Channel之中,这一方法类似与Resnet的Identity Mapping,从而把2626512变成13132048。YOLO中的检测器位于扩展后(expanded )的Feature Map的上方,所以他能取得细粒度的特征信息,这提升了YOLO 1%的性能。

·
Multi-ScaleTraining

作者希望YOLO v2能健壮的运行于不同尺寸的图片之上,所以把这一想法用于训练model中。

区别于之前的补全图片的尺寸的方法,YOLO v2每迭代几次都会改变网络参数。每10个Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320,352……608},最小320320,最大608608,网络会自动改变尺寸,并继续训练的过程。

这一政策让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,所以你可以在YOLO v2的速度和精度上进行权衡。

Figure4,Table 3:在voc2007上的速度与精度

·
Further Experiments


YOLO v1到YOLO v4(上)相关推荐

  1. YOLO v1到YOLO v4(下)

    YOLO v1到YOLO v4(下) Faster YOLO使用的是GoogleLeNet,比VGG-16快,YOLO完成一次前向过程只用8.52 billion 运算,而VGG-16要30.69bi ...

  2. PyTorch 实现经典模型7:YOLO (v1, v2, v3, v4)

    YOLO (v1, v2, v3, v4) 网络结构 YOLO v3 网络结构 代码 Ref <机器爱学习>YOLO v1深入理解 <机器爱学习>YOLOv2 / YOLO90 ...

  3. 目标检测:YOLO V1、YOLO V2、YOLO V3 算法

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) yoloV3模型 目标检测:YOLO V1.YOLO V2.Y ...

  4. 【YOLO系列】YOLO V1 论文精读与学习总结

    目录 0. 前言 1.YOLO V1 大体思路 2. YOLO V1的训练过程 2.1 YOLO V1网络结构 2.2 具体训练过程 2.2.1 把主干结构在ImageNet上进行预训练 2.2.2 ...

  5. YOLO V1,V2, V3的记录

    YOLO V1写的比较好的 https://zhuanlan.zhihu.com/p/378508 模型的输出需要固度维度,看模型的网络结构,可以知道固定维度是. 具体的方法是将输入图像按照模型的输出 ...

  6. [paper reading] YOLO v1

    [paper reading] YOLO v1 GitHub:Notes of Classic Detection Papers 本来想放到GitHub的,结果GitHub不支持公式. 没办法只能放到 ...

  7. CNN:RCNN、SPPNet、Fast RCNN、Faster RCNN、YOLO V1 V2 V3、SSD、FCN、SegNet、U-Net、DeepLab V1 V2 V3、Mask RCNN

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) CNN: 目标检测: RCNN SPPNet Fast RCN ...

  8. YOLO系列之yolo v1

    yolo v1发表在CVPR2016上,是经典的one-stage检测算法.在没接触yolo之前,我曾经就和师兄争论过,是否能把bounding box的坐标和宽高像分类网络那样预测出来,Yolo v ...

  9. YOLO v1学习笔记

    YOLO v1学习笔记 一. 概述 1.优点: 2. 缺点: 二.模型详细介绍 1.设计思路 2.网络结构 3.网络输出详细介绍 三.损失函数 1.位置误差 2.置信度误差 3.分类误差 四.模型预测 ...

最新文章

  1. 6个你必须知道的机器学习的革命性的教训
  2. POJ2406-Power Strings【KMP】
  3. 【BZOJ1814】Ural 1519 Formula 1 插头DP
  4. Maven学习之(一)基本配置
  5. 【引用】如何结束线程运行(转)
  6. U盘量产及在虚拟机中测试
  7. Atitit 纯java项目的提升进度大法---通用json dsl接口
  8. qt.qpa.screen: QXcbConnection: Could not connect to display(vnpy,云主机,图形界面)
  9. 【论文写作】网上选课系统中数据库设计模块如何写
  10. [原创]jQuery Validation范例
  11. 关于概率性事件的产品性能和客户体验讨论
  12. 素数环java_素数环(java实现)
  13. 安装绿色版本XShell6
  14. jwplayer html插件,jQuery插件JWPlayer视频播放器用法实例分析
  15. 在知网上找不到的英文文献应该去哪里找?
  16. macbook系统占用硬盘大_解决macos双系统情况下重制macos系统导致windows系统盘一直占用的情况...
  17. 晶体三极管的放大原理
  18. php图片处理案例,使用GD、ImageGick与PHP框架的图片处理技术
  19. 如何用Automator制作工资表
  20. Linux下文件内容更新了,文件夹时间戳却没变?

热门文章

  1. 2021-2027年中国智能马桶盖行业市场研究及前瞻分析报告
  2. 使用idea新建maven工程的web项目的步骤
  3. RabbitMQ超详细安装教程(Linux)
  4. 将TVM集成到PyTorch
  5. CVD-ALD前驱体材料
  6. TensorFlow XLA加速编译器
  7. 双精度张量内核加快了高性能计算
  8. 摄像头ISP系统原理(上)
  9. 2021年大数据HBase(六):HBase的高可用!【建议收藏】
  10. CentOS7环境搭建使用PhpStorm上传代码