参考:

http://blog.csdn.net/u011534057/article/details/51244354

https://zhuanlan.zhihu.com/p/24916786

论文下载: http://arxiv.org/abs/1506.02640 
darknet版的代码下载: https://github.com/pjreddie/darknet

tensorflow版本的代码下载: https://github.com/hizhangp/yolo_tensorflow

源码分析可参考: https://zhuanlan.zhihu.com/p/25053311

后续我会针对这个模型给出具体的实践文章。

这是继RCNN,fast-RCNN 和 faster-RCNN之后,rbg(Ross Girshick)大神挂名的又一大作,起了一个很娱乐化的名字:YOLO。 
虽然目前版本还有一些硬伤,但是解决了目前基于DL检测中一个大痛点,就是速度问题。 
其增强版本GPU中能跑45fps,简化版本155fps。

YOLO主要特点是:

  • 速度快,能够达到实时的要求。在 Titan X 的 GPU 上 能够达到 45 帧每秒。
  • 使用全图作为 Context 信息,背景错误(把背景错认为物体)比较少。
  • 泛化能力强。

1. YOLO的核心思想

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

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

2.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。 
    整个网络结构如下图所示:

    网络设计:

    网络结构借鉴了 GoogLeNet 。24个卷积层,2个全链接层。(用1×1 reduction layers 紧跟 3×3 convolutional layers 取代Goolenet的 inception modules )

  • 在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处理,就得到最终的检测结果。

3.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预训练等等。

损失函数设计:

损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。简单的全部采用了sum-squared error loss来做这件事会有以下不足: a) 8维的localization error和20维的classification error同等重要显然是不合理的; b) 如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。 解决方案如下:

  • 一个网格预测多个bounding box,在训练时我们希望每个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体做法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种做法称作bounding box predictor的specialization(专职化)。每个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的越来越好。(个人理解:IOU最大者偏移会更少一些,可以更快速的学习到正确位置)

大致流程:

  1. Resize成448*448,图片分割得到7*7网格(cell)
  2. CNN提取特征和预测:卷积不忿负责提特征。全链接部分负责预测:a) 7*7*2=98个bounding box(bbox) 的坐标 和是否有物体的confidence 。     b) 7*7=49个cell所属20个物体的概率。
  3. 过滤bbox(通过nms)

  • 一幅图片分成7x7个网格(grid cell),某个物体的中心落在这个网格中此网格就负责预测这个物体。
  • 最后一层输出为 (7*7)*30的维度。每个 1*1*30的维度对应原图7*7个cell中的一个,1*1*30中含有类别预测和bbox坐标预测。总得来讲就是让网格负责类别信息,bounding box主要负责坐标信息(部分负责类别信息:confidence也算类别信息)。具体如下:

    • 每个网格(1*1*30维度对应原图中的cell)要预测2个bounding box (图中黄色实线框)的坐标(,w,h) ,其中:中心坐标的 相对于对应的网格归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。 每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。 这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息:confidence = 。其中如果有ground true box(人工标记的物体)落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的ground truth box之间的IOU值。即:每个bounding box要预测 ,共5个值 ,2个bounding box共10个值,对应 1*1*30维度特征中的前10个。

 

  • 每个网格还要预测类别信息,论文中有20类。7x7的网格,每个网格要预测2个 bounding box 和 20个类别概率,输出就是 7x7x(5x2 + 20)  。 (通用公式: SxS个网格,每个网格要预测B个bounding box还要预测C个categories,输出就是S x S x (5*B+C)的一个tensor。 注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的)

    • 等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。
    • 对每一个网格的每一个bbox执行同样操作: 7x7x2 = 98 bbox  (每个bbox既有对应的class信息又有坐标信息)
  • 得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。 

4.YOLO的缺点

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

  • 对测试图像中,同一类物体出现的新的不常见的长宽比和其他情况是。泛化能力偏弱。

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

YOLOv1深刻解读相关推荐

  1. 关于大数据最深刻解读

    大数据的初步理解 似乎一夜之间,大数据(Big Data)变成一个IT行业中最时髦的词汇. 首先,大数据不是什么完完全全的新生事物,Google的搜索服务就是一个典型的大数据运用,根据客户的需求,Go ...

  2. 范数的深刻解读(转自知乎)

    https://www.zhihu.com/question/21868680 转载于:https://www.cnblogs.com/lgdblog/p/7442826.html

  3. XenophonDAO如何使用一颗巧克力的成本摆脱美元霸权,深刻解读$OXPH

    我们的失败总是在别人的胜利中彰显,我们的财富总是通过培育别人的繁荣来为我们自己制造贫穷. --爱德华多·加莱亚诺<拉丁美洲被切开的血管> 2022年对于加密货币市场来说是一个重大的机遇与历 ...

  4. 【深度学习 学习率,优化器】——深刻解读训练网络时各种学习率,优化器的区别,learning rate, Momentum

    机梯度下降及各种更新方法 普通更新 最简单的更新形式是沿着负梯度方向改变参数(因为梯度指向的是上升方向,但是我们通常希望最小化损失函数).假设有一个参数向量x及其梯度dx,那么最简单的更新的形式是: ...

  5. 深刻解读TD-SCDMA

    简介 TD-SCDMA--Time Division-Synchronous Code Division Multiple Access(时分同步的码分多址技术). TD-SCDMA作为中国提出的第三 ...

  6. 调研1181位老年人 深刻解读广州老年教育市场

    为积极应对人口老龄化,缓解老龄人口带来的社会压力,发展老年教育成为新常态下政府解决民生问题的必然选择,是建设学习型社会,构建终身学习体系的重要举措. 根据广州市民政局发布的数据显示,2020年60周岁 ...

  7. 菜鸟python_菜鸟爱Python第1期:Python发展史?对Python最深刻的解读

    这是胜天半子的第1篇原创. 前言 也许你不是一名程序员,也许你甚至都不是做IT行业的,但你的定位只要不是被时代所抛弃的老年人,你,多多少少应该听过"Python"一词,多多少少看到 ...

  8. python的设计理念和应用_菜鸟爱Python第1期:Python发展史?对Python最深刻的解读...

    这是胜天半子的第1篇原创. 前言 也许你不是一名程序员,也许你甚至都不是做IT行业的,但你的定位只要不是被时代所抛弃的老年人,你,多多少少应该听过"Python"一词,多多少少看到 ...

  9. yolov1-v5学习笔记及源码解读

    目录 深度学习网络分类 评价指标 原理 yolov1 yolov2 yolov3 yolov4 yolov5 源码解读(v3为例) 深度学习网络分类 深度学习经典检测方法 通常分为 two-stage ...

最新文章

  1. java 连接池_初探数据库连接池
  2. cve-2019-11581 Atlassian Jira未授权服务端模板注入漏洞
  3. 【CEO赠书】《精益数据分析》:如何构建数据指标体系
  4. spring指导的index.html在spring文件夹中的位置
  5. 程序员的乐趣从哪来?编程能给我带来乐趣吗?
  6. rtx二次开发 java_RTX二次开发集成
  7. 效仿盖茨:PPstream创始人的心路历程
  8. 你用Deepfakes给小电影换个脸,人脸识别AI也看不出来:95%萌混过关
  9. tf.nn.bidirectional_dynamic_rnn()函数详解
  10. 按位与、按位或、按位异或、左移、右移运算符的简单介绍(部分二进制运算符的简单介绍)...
  11. (八) 一起学 Unix 环境高级编程 (APUE) 之 信号
  12. 惯性系统常用坐标系_惯性坐标系与非惯性坐标系
  13. steam无法连接至计算机,无法连接至steam网络怎么办 无法连接至steam网络解决方法【图文】...
  14. 2020年黄历表_2020年黄历表(死亡时辰吉凶对照表)
  15. 铝碳化硅封装材料行业研究及十四五规划分析报告
  16. kanzi 粒子插件
  17. java获取wps文档字数
  18. Linux 快速上手(基于Java开发)
  19. 计算机和管理结合,计算机应用技术与信息管理的结合
  20. 2011年国外最受欢迎的15个儿童网站

热门文章

  1. icache的方面以及使用
  2. 使用yum安装CDH Hadoop集群
  3. java.net.SocketException: Broken pipe问题解决
  4. archlinux使用sudo
  5. 请说明Request和Session的生命周期
  6. mysql hex2bin_mysqlbinlog指令
  7. 信息学奥赛一本通 1167:再求f(x,n)
  8. 常用技巧 —— 位运算 —— 位运算基础
  9. Menagerie(AtCoder-2234)
  10. 爬楼梯(信息学奥赛一本通-T1204)