这是继 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*SS∗S 个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是 S∗S∗(5∗B+C)S * S * (5*B+C)S∗S∗(5∗B+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(Classi​∣Object)∗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的检测效果并不理想。同一类物体出现的新的不常见的长宽比和其他情况时,泛化能力偏弱。

深度学习目标检测之 YOLO v1相关推荐

  1. 深度学习目标检测之 YOLO v4

    论文原文:https://arxiv.org/abs/2004.10934 代码 原版c++: https://github.com/AlexeyAB/darknet keras:https://gi ...

  2. 深度学习目标检测之 YOLO v3

    论文名:<YOLOv3: An Incremental Improvement> 论文地址 https://pjreddie.com/media/files/papers/YOLOv3.p ...

  3. 深度学习目标检测之 YOLO v2

    论文名:<YOLO9000: Better, Faster, Stronger> 原文:https://arxiv.org/pdf/1612.08242v1.pdf 代码:http://p ...

  4. keras faster物体检测_全网 | 深度学习目标检测算法(精选12篇)

    太多的公众号每天的文章是否让你眼花缭乱?刷了好多文章,发现大都是转来转去?今天我在全网公众号里为大家精选主题为深度学习目标检测算法的文章12篇,其中包括综述,R-CNN,SPP-Net,Fast R- ...

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

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

  6. 深度学习目标检测 RCNN F-RCNN SPP yolo-v1 v2 v3 残差网络ResNet MobileNet SqueezeNet ShuffleNet

    深度学习目标检测--结构变化顺序是RCNN->SPP->Fast RCNN->Faster RCNN->YOLO->SSD->YOLO2->Mask RCNN ...

  7. 深度学习目标检测详细解析以及Mask R-CNN示例

    深度学习目标检测详细解析以及Mask R-CNN示例 本文详细介绍了R-CNN走到端到端模型的Faster R-CNN的进化流程,以及典型的示例算法Mask R-CNN模型.算法如何变得更快,更强! ...

  8. 姿态检测 树莓派_怎样在树莓派上轻松实现深度学习目标检测?

    原标题:怎样在树莓派上轻松实现深度学习目标检测? 雷锋网按:本文为 AI 研习社编译的技术博客,原标题 How to easily Detect Objects with Deep Learning ...

  9. 深度学习目标检测指南:如何过滤不感兴趣的分类及添加新分类?

    编译 | 庞佳 责编 | Leo 出品 | AI 科技大本营(公众号ID:rgznai100) AI 科技大本营按:本文编译自 Adrian Rosebrock 发表在 PyImageSearch 上 ...

最新文章

  1. c c++ 函数内数组初值_C/C++函数指针与指针函数
  2. [codeforces 339]D. Xenia and Bit Operations
  3. R语言ineq算基尼系数_5 月编程语言排行榜:Java第一,R跌出Top20
  4. python学不会的表情包-小学生绞尽脑汁也学不会的python(反射)
  5. 微信OPENID授权方法
  6. floodFill函数
  7. java修改hidden_Java ColumnConfig.setHidden方法代码示例
  8. codeforces 15C. Industrial Nim
  9. Kafka解析之topic创建(3)——合法性验证
  10. centos6.4安装及升级gcc 4.8.2(已实践)
  11. mysql有子查询么_sql-带有子查询的mysql更新查询
  12. poj 2945 Find the Clones 用trie树实现
  13. 新增5大运维特性!华为云DAS服务高效运维有妙招
  14. SQL Server-【知识与实战VII】存储过程(上)
  15. 加入go行列的一个敲门砖吗----小玩意cs多人即时聊天,没有用数据库的,没有用框架的
  16. 禾赛科技李一帆:别让无人车的未来被一个小传感器憋死
  17. ThingsBoard 多个设备的最新遥测数据合并计算案例
  18. 月影无终的伤感日志最新推荐:搁浅的回忆,谁来承受
  19. 淘宝运营 淘宝补流量的作用 如何安全补单
  20. 升到初二后成绩“一落千丈”?你家孩子也有这个困扰么?

热门文章

  1. IDR、CRA、BLA、RASL、RADL、closed-gop、open-gop
  2. Windows 9信息曝光:统一开发接口、整合Cortana到任务栏
  3. 什么是转向灯?使用转向灯有何技巧?
  4. 优秀Unix管理员的七个习惯
  5. Linux下编译FFMpeg
  6. 分布式消息中间件 : Rocketmq
  7. Maven 依赖-镜像仓库替换为 -- 阿里云镜像仓库(飞快实现 pom 引入)
  8. Linux操作系统load average过高,kworker占用较多cpu
  9. 关于.c和.h 和定义变量的问题
  10. NB-IOT连接移动onenet平台流程