前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

YOLO v1

作者头像
狼啸风云
修改2022-09-04 22:08:22
9790
修改2022-09-04 22:08:22
举报

Joseph Redmon和Ali Farhadi在2015年提出了YOLO目标检测深度网络,并在2017年和2018年进行了改进,这三个工作都发表在了当年的CVPR上。Joseph Redmon是华盛顿大学的博士,主要研究就方向为计算机视觉,这是Joseph Redmon的个人主页,Ali Farhadi是华盛顿大学的副教授,也是Joseph Redmon的导师,这是AIi Farhadi的个人主页

文章链接为:

Redmon, J., et al. (2015). "You Only Look Once: Unified, Real-Time Object Detection." 779-788.

Redmon, J. and A. Farhadi (2017). YOLO9000: Better, Faster, Stronger. IEEE Conference on Computer Vision and Pattern Recognition.

Redmon, J. and A. Farhadi (2018). "YOLOv3: An Incremental Improvement.

概述

  • YOLO把目标检测问题转化为空间分隔的边界框和相关类概率的回归问题。
  • 单个神经网络在一次评估中直接从完整的图像中预测边界框和类概率。
  • 整个检测流水线是单个网络,因此可以直接对检测性能进行端到端优化。

像deformable parts models (DPM)这样的系统使用滑动窗口方法,分类器在整个图像上均匀间隔的位置运行。R-CNN系列一般采用区域建议region proposal的方法产生潜在的bounding box,然后用分类器对这些提出的框进行分类,分类后,利用后处理对bounding box进行细化,消除重复检测,并根据场景[13]中的其他对象对bounding box重新打分。这个目标检测流程很复杂,并且每部分必须单独训练,因此优化很难。YOLO把目标检测问题只看成回归问题,直接从图像像素到bounding box坐标和分类概率。使用这个系统,仅仅需要输入一次图像就能判断出现了什么目标,目标出现在哪。大致流程如下图所示,

第一步:将输入图像的分辨率调整为448x448。

第二步:在图像上运行一个单一的卷积网络。

第三步:通过模型的置信度对检测结果的阈值进行设定。

具体方法为:在YOLO检测系统的基础上进行了改进,然后利用数据集组合方法和联合训练算法对ImageNet中的9000多个类和COCO中的检测数据进行模型训练。

优势:

(1)YOLO的第一个优势是非常快。

(2)YOLO在整幅图像上对图像进行预测:

(3)YOLO学习目标通用的表示:

与DPM、R-CNN相比YOLO的泛化能力更强,比如在自然图像上训练在艺术品上测试,当应用到新的领域或未知的输入时。

缺点:

YOLO对边界框的预测施加了强大的空间约束,因为每个网格单元只能预测两个框,并且只能有一个类。这种空间限制限制了我们的模型可以预测的附近物体的数量,这个模型在应对小物体的时候效果不太好。最后,当我们训练一个接近检测性能的损失函数时,我们的损失函数在小bounding box 和大bounding box中对错误的处理是相同的。大box 里的小错误影响不是那么严重,但小box里面的小错误对IOU有很大的影响,错误主要是不正确的定位造成的。由于我们的模型学会了从数据中预测边界框,所以它很难推广到具有全新的不同纵横比或配置的对象。我们的模型还使用相对粗糙的特征来预测边界框,因为我们的架构从输入图像中有多个下采样层。

原理:


系统将输入分成SxS的格子。如果目标的中心落在这个格子内,这个格子就对这个目标负责。每个格子预测这些bounding box B 和这些box的置信分数。这些置信度得分反映了一个box包含目标的可信度有多高与box的预测有多准确。

通常置信度定义为:

P_{r}(O b j e c t) * I O U_{\text {pred }}^{\text {truth }}

如果在单元格中不存在目标,置信分数应该置为零。否则置信分数等于预测框和标签之间的IOU。


每个边界框由五部分组成:x,y,w,h和置信度。(x, y)坐标表示box的中心相对于网格单元格的边界。宽度和高度相对于整个图像来预测。最终,置信度预测代表了预测框和任何ground truth框之间的IOU。每个网格也预测C个类的条件概率:

P_{r}(O b j e c t) * I O U_{\text {pred }}^{\text {truth }}

这些概率以网格包含一个目标为条件。我们仅仅预测每个单元格子一类概率的集合,而不考虑box B的数量。

测试的时候,我们把类的条件概率和单一盒子的置信概率乘起来:

\operatorname{Pr}\left(\text { Class }_{i} \mid \text { Object }\right) * \operatorname{Pr}(\text { Object }) * \mathrm{IOU}_{\text {pred }}^{\text {truth }}=\operatorname{Pr}\left(\text { Class }_{i}\right) * \mathrm{IOU}_{\text {pred }}^{\text {truth }}

这个公式给每个盒子一个类别置信分数。这些使得类别的概率出现在盒子中,并且很好的预测了盒子是否为目标。

网络设计

首先网络的卷积层从图像中提取特征,全连接层预测输出的概率和坐标。网络模型来源于GoogLeNet图像分类的思想。由24个卷积层外加两个全连接层。和GoogLeNet中使用inception模块有所不同,在3x3卷积层的后面,这个网络仅仅使用1x1来减少卷积层,和NIN网络类似,整个网络结构如下图:

这个模型有24个卷积层后接两个全连接层组成。交替的使用1x1的卷积层从前层减少特征空间。在ImageNet分类任务以一半的分辨率(224x224)上预训练卷积层,然后将检测分辨率提高一倍。网络最终的输出是7x7x30的预测张量。

可对网络进行简化这就是Fast YOLO,除了网络规模,在训练和测试期间,所有参数都是相同的,简化方式为:用9个卷积层代替24个卷积层,这些层上的滤波器更少。

训练

在ImageNet 1000类数据集上训练网络的卷积层作为预训练,预训练的时候使用上图20个卷积层加一个平均池化层加一个全连接层。训练这个网络需要将近一周时间,与Caffe的模型动物园相比,在ImageNet 2012验证集上top-5精度单独达到了88%。

之后转变这个模型来执行检测。在它们的例子后面,我们加入四个卷积层和两个全连接层,并且任意初始化权重。检测通常需要细粒度的视觉信息因此我们把网络的分辨率从224x224增加到448x448。最终的层预测分类概率和边界框坐标。根据图像的宽度和高度对边界框进行归一化,因此边界框的宽度和高度在0到1之间。我们将边界框x和y坐标参数化为特定网格单元格位置的偏移量,因此它们也在0和1之间有界。

最后一层使用线性激活函数,所有其它层使用泄露校正线性激活函数,如下所示:

\phi(x)=\left\{\begin{array}{ll} x, & \text { if } x>0 \\ 0.1 x, & \text { otherwise } \end{array}\right.

对模型的输出平方和进行优化。使用和平方误差的原因是它很好优化,这与我们最大化平均精度的目标并不完全一致。它对定位误差等权重,分类误差可能不理想。然而,每个图像中许多单元格不包含目标。这将这些单元格的“置信度”分数推向零,通常会压倒包含对象的单元格的梯度。这可能导致模型不稳定,导致早期的培训出现分歧。

为了解决这个问题,我们增加了bounding box坐标预测损失,减少对不包含物体的盒子的误差预测。我们使用两个参数,\lambda_{coord}\lambda_{noobj} 来达到这个目的,并且我们设置\lambda_{coord} = .5\lambda_{noobj}=.5

在大box和小box中平方和误差也等于权重误差。我们的误差标准应该能返佣大框的小偏差没有小box的小偏差重要。为了部分解决这个问题,我们预测边界box的宽度和高度的平方根,而不是直接预测宽度和高度。YOLO在每个网格上预测多个bounding box。在训练的时候,这个网络的设想是每个bounding box对每一个目标负责。我们指定一个预测器来“负责”预测一个基于该预测器的对象,该对象的当前欠条最高,且具有基本事实。

在大box和小box里,平方和误差同样的权重。我们的误差度量应该反映出大box中的小偏差比小box中的小偏差更重要。为了部分解决这个问题,我们预测bounding box的宽度和高度的平方根,而不是直接预测宽度和高度。

YOLO预测每个网格单元有多个bounding box。在训练时,让一个bounding box预测器负责每个对象。基于该预测器的对象我们指定一个预测器来“负责”预测一个,该对象与ground truth有最高的IOU。这将导致bounding box预测器之间的专门化。在对特定尺寸,宽高比,目标类进行预测的时候,每个预测器的性能更好,类提升整体的召回。

在训练期间我们优化下面的多部分损失函数:

\begin{array}{c} \lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\mathrm{obj}}\left[\left(x_{i}-\hat{x}_{i}\right)^{2}+\left(y_{i}-\hat{y}_{i}\right)^{2}\right] \\ +\lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\mathrm{obj}}\left[\left(\sqrt{w_{i}}-\sqrt{\hat{w}_{i}}\right)^{2}+\left(\sqrt{h_{i}}-\sqrt{\hat{h}_{i}}\right)^{2}\right] \\ +\sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\mathrm{obj}}\left(C_{i}-\hat{C}_{i}\right)^{2} \\ +\lambda_{\text {noobj }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {noobj }}\left(C_{i}-\hat{C}_{i}\right)^{2} \\ +\sum_{i=0}^{S^{2}} \mathbb{1}_{i}^{\text {obj }} \sum_{c \in \text { classes }}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2} \end{array}

\mathbb{1}_{i}^{\text {obj }}代表目标是否出现在一个单元格i中,\mathbb{1}_{i}^{\text {obj }} 代表了单元格i中第j个bounding box预测器对那个预测进行负责。如果目标出现在那个单元格中,损失函数仅对分类误差起作用(因此前面讨论的条件分类概率)。如果预测器对标签盒子负责,它仅仅对bounding box坐标误差起作用。在那个单元格子中,与任何预测器都有最高的IOU。

在PASCAL VOC 2007和2012上训练和测试这个网络,大约135轮。当在2012上测试的时候,我们也包括VOC 2007测试数据进行训练。整个训练过程中batch size 为64,momentum为0.9,decay为0.005。学习率的设置为:第一轮缓慢的把学习率从10^{-3} 上升到10^{-2} 。如果我们从一个较高的学习率开始,我们的模型常常由于不稳定的梯度而发散。开始用10^{-2} 训练75轮,然后用10^{-3}训练30轮,最终用10^{-4} 训练30轮。

为了避免过拟合,我们使用dropout和广泛的数据增强。在开始的全连接层后面dropout层设置为0.5,以组织层间的协同适配。为了增加数据,引入随机缩放和平移,最大可达原始图像大小的20%。还在HSV颜色空间中随机调整图像的曝光和饱和度,最高达1.5倍。

推断

像训练一样,预测测试图像的检测只需要一个网络评估。在PASCAL VOC上,网络预测每个图像的98个bounding box和每个box的分类概率。YOLO在测试时间非常快,不像是基于分类器的方法,YOLO仅仅需要单一的网络进行评估。网格设计加强了bounding box预测中的空间多样性。通常很清楚一个对象落在哪个网格单元格中,并且网络仅为每个对象预测一个方框。然而,一些大型对象或多个单元边界附近的对象可以被多个单元很好地定位。非最大抑制可以用来修复这些多重检测。虽然不像R-CNN或DPM那样对性能至关重要,但非最大抑制在mAP中增加了2-3%。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年12月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 优势:
  • 缺点:
  • 原理:
  • 网络设计
  • 训练
  • 推断
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档