深度学习目标检测之 YOLO v1

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

  • 论文名: 《You Only Look Once:Unified, Real-Time Object Detection》
  • 论文地址:https://arxiv.org/pdf/1506.02640v5.pdf
  • 代码:https://github.com/pjreddie/darknet

1. YOLO的核心思想

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

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

2.YOLO的实现方法

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

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

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

Bbox置信度=P(Object)∗IOUpredtruthBbox置信度 = P(Object) \ast IOU_{pred}^{truth} Bbox=P(Object)IOUpredtruth

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

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

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

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

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

在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruthPr(Class_{i}|Object) \ast Pr(Object) \ast IOU_{pred}^{truth} = Pr(Class_{i}) \ast IOU_{pred}^{truth} Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruth

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

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

注意:

  • 每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。
  • 其中坐标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间

简单的概括就是:

(1) 给个一个输入图像,首先将图像划分成7*7的网格

(2) 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)

(3) 根据上一步可以预测出772个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可

损失函数

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

  • 第一,8维的localization error和20维的classification error同等重要显然是不合理的;
  • 第二,如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。

解决办法:

  • 更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 λcoord\lambda_{coord}λcoord 在pascal VOC训练中取5。
  • 对没有object的box的confidence loss,赋予小的loss weight,记为λnoobj\lambda_{noobj}λnoobj在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。

最后整个的损失函数如下所示:
在这里插入图片描述
损失由三部分组成,分别是:坐标预测损失、置信度预测损失、类别预测损失。

使用的是差方和误差。需要注意的是,w和h在进行误差计算的时候取的是它们的平方根,原因是对不同大小的bounding box预测中,相比于大bounding box预测偏一点,小box预测偏一点更不能忍受。而差方和误差函数中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将bounding box的w和h取平方根代替原本的w和h。

定位误差比分类误差更大,所以增加对定位误差的惩罚,使 λcoord=5λ_{coord}=5λcoord=5

在每个图像中,许多网格单元不包含任何目标。训练时就会把这些网格里的框的“置信度”分数推到零,这往往超过了包含目标的框的梯度。从而可能导致模型不稳定,训练早期发散。因此要减少了不包含目标的框的置信度预测的损失,使 λnoobj=0.5λ_{noobj}=0.5λnoobj=0.5

1iobj1_{i}^{obj}1iobj 表示网格 i 中存在对象。
1ijobj1_{ij}^{obj}1ijobj 表示 网格 i 的第 j 个 Bbox 中存在对象。
1ijnoobj1_{ij}^{noobj}1ijnoobj表示网格 i 的第 j 个 Bbox 中不存在对象。

这个损失函数中:

  • 只有当某个网格中有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可以每秒处理 45 张图像;YOLO的极速版本每秒可以处理150帧图像。这就意味着 YOLO 可以以小于 25 毫秒延迟,实时地处理视频。对于欠实时系统,在准确率保证的情况下,YOLO速度快于其他方法。
  • YOLO 实时检测的平均精度是其他实时监测系统的两倍。
  • 迁移能力强,能运用到其他的新的领域(比如艺术品目标检测)。

YOLO的缺点

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

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

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

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

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

  • YOLO方法模型训练依赖于物体识别标注数据,因此,对于非常规的物体形状或比例,YOLO的检测效果并不理想。同一类物体出现的新的不常见的长宽比和其他情况时,泛化能力偏弱。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编程珠玑番外篇

1.Plan 9 的八卦 在 Windows 下喜欢用 FTP 的同学抱怨 Linux 下面没有如 LeapFTP 那样的方便的工具. 在苹果下面用惯了 Cyberduck 的同学可能也会抱怨 Linux 下面使用 FTP 和 SFTP 是一件麻烦的事情. 其实一点都不麻烦, 因为在 LINUX 系统上压根就不需要用 FTP. 为什么呢? 因…

BT下载原理分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 BitTorrent协议。 BT全名为BitTorrent,是一个p2p软件,你在下载download的同时,也在为其他用户提供上传upload,因为大家是“互相帮助”,所以不会随着用户数的增加而…

表格列求和_excel表格制作,Excel表格的基本操作,包含制作一个表格10方面的知识...

创建表格,插入与删除一行一列或多行多行,一次移动一行一列或多行多列,拆分与合并单元格,单元格内换行,表格求和与求平均值是Excel表格的基本操作;除此之外,Excel表格的基本操作还包括调整行高列…

深度学习之 FPN (Feature Pyramid Networks)

论文题目:Feature Pyramid Networks for Object Detection论文链接:https://arxiv.org/abs/1612.03144论文代码:Caffe版本 https://github.com/unsky/FPN 《Feature Pyramid Networks for Object Detection》这篇论文主要解决的问题是目标检…

ISLR—第二章 Statistical Learning

Statistical Learning Y 和X的关系why estimate f 用来预测 预测的时候可以将f^当成一个black box来用,目的主要是预测对应x时候的y而不关系它们之间的关系。用来推断 推断的时候,f^不能是一个black box,因为我们想知道predictor和response之…

提高编程思想

虚函数和抽象函数有什么区别 虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写 抽象函数是没有代码,子类继承后一定要重写 ****************************************************************** 在一…

python特效代码_网页爱心特效弱爆了,我让你点击网页显示所有python模块!

点击网页特效上周写了一篇文章快速搭建个人博客的教程文章:其中说到了一个点击网页出现爱心特效的插件 click_heart.js ,当然大家可能也见过其他博客上面,有点击网页出现类似 富强、民主、文明、和谐等等,关于代码在这里不多赘述,…

Python 包管理之 poetry

poetry是一个Python虚拟环境和依赖管理的工具。poetry和pipenv类似,另外还提供了打包和发布的功能。 官方文档:python-poetry.org/docs/ python项目部署:poetry管理本地环境,上线用docker poetry 安装 poetry提供多种安装方式&#xff0c…

Windows数据库编程接口简介

数据库是计算机中一种专门管理数据资源的系统,目前几乎所有软件都需要与数据库打交道(包括操作系统,比如Windows上的注册表其实也是一种数据库),有些软件更是以数据库为核心因此掌握数据库系统的使用方法以及数据库系统…

映客都是互刷礼物吗_映客互刷礼物有什么用_映客守护有什么用

一起直播、互刷礼物、改ID发性感照,赵本山女375x332 - 122KB - PNG一起直播、互刷礼物、改ID发性感照,赵本山女600x893 - 247KB - JPEG一起直播、互刷礼物、改ID发性感照,赵本山女600x448 - 151KB - JPEG土豪互刷礼物吓坏男主播 即兴表演铁头功撞墙560x688 - 57KB - JPEG一起直…

Python 之打包工具 setup.py

1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而这个过程就是 打包。 打包,就是将你的源代码进一步封…

周进度----06

周学习进度06 周学习进度06 第16周 所花时间: 60min60min100min100min100min100min90min60min60min 代码量(行) 500-800 博客量(篇) 4 了解到的知识 css样式表的一些知识 项目流程的初步了解 一周的学习心得…

八个实用的CMD命令及开始→运行→命令集锦

这篇文章是很久前收藏在自己笔记本内的,具体的来源地址不清楚,先谢一下原作者吧. 共享出来大家一起学习一下: 一,ping    它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DO…

2019如何转换2010_9102年,你还不知道PPT怎么转换成视频吗?小心落伍了

你在刷抖音的时候有没有刷过这类视频:成为人生赢家必备的书单、5个让你看透人性的电影、6个让你升职加薪的APP...如果你细心观察的话,会发现这类视频的做法基本都是一个样的,像在翻相册一样,一页页过去,所以它们也叫做…

深度学习之RetinaNet

总述 Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。 目标识别有两大经典结构: 第一类是以Faster RCNN为代表的两级识别方法,这种结构的第…

js生成图片

var image new Image(); var c document.getElementById("myCanvas"); var ctx c.getContext("2d"); var img document.getElementById("scream"); ctx.font "10px Arial";function createImg(name, zuowei, color) {// 姓名ctx…

浅谈如何学习linux

一.为什么要学linux? 当然最重要是爱好和兴趣!如果你这种必要学,或者根本不喜欢,请不要浪费时间,你学也学不好! 二.起步 你应该为自己创造一个学习linux的环境--在电脑上装一个linux或unix 问题1:版本…

python的datetime函数_Python连载8-datetime包函数介绍

一、datetime包(上接连载7内容)1.函数:datetime(1)用法:输入一个日期,来返回一个datetime类?(2)格式:datetime.datetime(年,月,日,hour,minute,second)其中hour,minute,…

深度学习之 soft-NMS

论文:《Improving Object DetectionWith One Line of Code》soft-NMS 英文论文链接:https://arxiv.org/pdf/1704.04503.pdfsoft-NMS github 链接:https://github.com/bharatsingh430/soft-nms 绝大部分目标检测方法,最后都要用到…

项目微管理 - 总结也是新的开始

时间都去哪了?听着这首耳熟能详的旋律,感叹着飞速流逝的年华,我渐渐的陷入到沉思之中。时间过的真的很快,从一名程序员到接手一个一线项目团队一晃已经2年多了。在这段时间里,我接触了各种各样的人,处理了各…