打个广告,复现Yolov3之后的深度原理剖析请移步下文(含代码):

【算法实验】能检测COCO并鉴黄的SexyYolo(含Yolov3的深度原理剖析)


Yolov1论文链接:You Only Look Once: Unified, Real-Time Object Detection

Yolov2解读:【论文解读】Yolo三部曲解读——Yolov2

Yolov3解读:【算法实验】能检测COCO并鉴黄的SexyYolo(含Yolov3的深度原理剖析)

【论文解读】Yolo三部曲解读——Yolov3

(您的点赞是对分享的最大认可,谢谢)

一、物体检测算法概述

(算法原理可以直接看第二节)

物体检测(object detection)是计算机视觉中一个重要的分支,其大致功能是在一张图片中,用最小矩形框框出目标物体位置,并进行分类。先上图,Yolo v1可以识别20个类别:

图一 Yolo检测示例图

物体检测的两个步骤可以概括为:

步骤一:检测目标位置(生成矩形框)

步骤二:对目标物体进行分类

物体检测主流的算法框架大致分为one-stage与two-stage。two-stage算法代表有R-CNN系列,one-stage算法代表有Yolo系列。按笔者理解,two-stage算法将步骤一与步骤二分开执行,输入图像先经过候选框生成网络(例如faster rcnn中的RPN网络),再经过分类网络;one-stage算法将步骤一与步骤二同时执行,输入图像只经过一个网络,生成的结果中同时包含位置与类别信息。two-stage与one-stage相比,精度高,但是计算量更大,所以运算较慢。

就R-CNN系列算法与Yolo系列算法简单列出发表时间线:

图二 RCNN、Yolo发表时间线

可见,Yolo系列发表日期全部在Faster RCNN之后,Faster RCNN算法的精度是state-of-the-art级别的,Yolo算法的精度没有超越Faster RCNN,而是在速度与精度之间进行权衡。Yolo v3在改进多次之后,既有一定的精度,也保持了较高的运行速度。在很多边缘计算、实时性要求较高的任务中,Yolo v3备受青睐。在RCNN算法日益成熟之后,Yolo算法却能横空出世,离不开其高性能和使用回归思想做物体检测的两个特点。

First, YOLO is extremely fast. Since we frame detection as a regression problem we don’t need a complex pipeline.
Second, YOLO reasons globally about the image when making predictions. Unlike sliding window and region proposal-based techniques, YOLO sees the entire image.
Third, YOLO learns generalizable representations of objects. When trained on natural images and tested on art- work, YOLO outperforms top detection methods like DPM and R-CNN by a wide margin.

上述论文中提及的三点:

  1. Yolo很快,因为用回归的方法,并且不用复杂的框架。
  2. Yolo会基于整张图片信息进行预测,而其他滑窗式的检测框架,只能基于局部图片信息进行推理。
  3. Yolo学到的图片特征更为通用。作者尝试了用自然图片数据集进行训练,用艺术画作品进行预测,Yolo的检测效果更佳。

本文重点讲解Yolo v1算法细节。v1相比v2、v3以及其他物体检测算法,思路简单清晰,非常适合物体检测初学者上手。即使没有过任何物体检测相关知识,只需要一点卷积神经网络基础,便可以看懂Yolo v1。

二、Yolo v1算法原理

图三 Yolo v1网络结构

直接上结构图,输入图像大小为448*448,经过若干个卷积层与池化层,变为7*7*1024张量(图一中倒数第三个立方体),最后经过两层全连接层,输出张量维度为7*7*30,这就是Yolo v1的整个神经网络结构,和一般的卷积物体分类网络没有太多区别,最大的不同就是:分类网络最后的全连接层,一般连接于一个一维向量,向量的不同位代表不同类别,而这里的输出向量是一个三维的张量(7*7*30)。上图中Yolo的backbone网络结构,受启发于GoogLeNet,也是v2、v3中Darknet的先锋。本质上来说没有什么特别,没有使用BN层,用了一层Dropout。除了最后一层的输出使用了线性激活函数,其他层全部使用Leaky Relu激活函数。网络结构没有特别的东西,不再赘述。

  • 网络输出张量维度

这里的输出维度非常重要,下面逐一解释。

(1) 7*7的含义

7*7是指图片被分成了7*7个格子,如下所示:

图四 初始格点

在Yolo中,如果一个物体的中心点,落在了某个格子中,那么这个格子将负责预测这个物体。这句话怎么理解,用上图举例,设左下角格子假设坐标为

,小狗所在的最小包围矩形框的中心,落在了
这个格子中。那么7*7个格子中,
这个格子所对应的物体置信度标签为1,而那些没有物体中心点落进来的格子,对应的物体置信度标签为0。这个设定就好比该网络在一开始,就将整个图片上的预测任务进行了分工,一共设定7*7个按照方阵列队的检测人员,每个人员负责检测一个物体,大家的分工界线,就是看被检测物体的中心点落在谁的格子里。当然,是7*7还是9*9,是上图中的参数S,可以自己修改,精度和性能会随之有些变化。

(2) 30的含义

刚才设定了49个检测人员,那么每个人员负责检测的内容,就是这里的30(注意,30是张量最后一维的长度)。在Yolo v1论文中,30是由

得到的。其中4+1是矩形框的中心点坐标
,长宽
以及是否属于被检测物体的置信度
;2是一个格子共回归两个矩形框,每个矩形框分别产生5个预测值(
);20代表预测20个类别。这里有几点需要注意:1. 每个方格(grid) 产生2个预测框,2也是参数,可以调,但是一旦设定为2以后,那么每个方格只产生两个矩形框,最后选定置信度更大的矩形框作为输出,

也就是最终每个方格只输出一个预测矩形框。2. 每个方格只能预测一个物体。虽然可以通过调整参数,产生不同的矩形框,但这只能提高矩形框的精度。所以当有很多个物体的中心点落在了同一个格子里,该格子只能预测一个物体。也就是格子数为7*7时,该网络最多预测49个物体。

YOLO imposes strong spatial constraints on bounding box predictions since each grid cell only predicts two boxes and can only have one class. This spatial constraint limits the number of nearby objects that our model can predict. Our model struggles with small objects that appear in groups, such as flocks of birds.

如上述原文中提及,在强行施加了格点限制以后,每个格点只能输出一个预测结果,所以该算法最大的不足,就是对一些邻近小物体的识别效果不是太好,例如成群结队的小鸟。

  • Loss函数

看到这里读者或许会有疑问,Yolo里的每个格点,是怎么知道该预测哪个物体的?这就是神经网络算法的能力。首先拿到一批标注好的图片数据集,按照规则打好标签,之后让神经网络去拟合训练数据集。训练数据集中的标签是通过人工标注获得,当神经网络对数据集拟合的足够好时,那么就相当于神经网络具备了一定的和人一样的识别能力。

神经网络结构确定之后,训练效果好坏,由Loss函数和优化器决定。Yolo v1使用普通的梯度下降法作为优化器。这里重点解读一下Yolo v1使用的Loss函数:

图五 Yolo v1算法Loss函数

论文中Loss函数,密密麻麻的公式初看可能比较难懂。其实论文中给出了比较详细的解释。所有的损失都是使用平方和误差公式,暂时先不看公式中的

,输出的预测数值以及所造成的损失有:
  1. 预测框的中心点

    。造成的损失是图五中的第一行。其中
    为控制函数,在标签中包含物体的那些格点处,该值为 1 ;若格点不含有物体,该值为 0。也就是只对那些有真实物体所属的格点进行损失计算,若该格点不包含物体,那么预测数值不对损失函数造成影响。
    数值与标签用简单的平方和误差。
  2. 预测框的宽高
    。造成的损失是图五的第二行。
    的含义一样,也是使得只有真实物体所属的格点才会造成损失。这里对
    在损失函数中的处理分别取了

    根号,原因在于,如果不取根号,损失函数往往更倾向于调整尺寸比较大的预测框。例如,20个像素点的偏差,对于800*600的预测框几乎没有影响,此时的IOU数值还是很大,但是对于30*40的预测框影响就很大。取根号是为了尽可能的消除大尺寸框与小尺寸框之间的差异。

  3. 第三行与第四行,都是预测框的置信度C。当该格点不含有物体时,该置信度的标签为0;若含有物体时,该置信度的标签为预测框与真实物体框的IOU数值(IOU计算公式为:两个框交集的面积除以并集的面积)。
  4. 第五行为物体类别概率P,对应的类别位置,该标签数值为1,其余位置为0,与分类网络相同。

此时再来看

,Yolo面临的物体检测问题,是一个典型的类别数目不均衡的问题。其中49个格点,含有物体的格点往往只有3、4个,其余全是不含有物体的格点。此时如果不采取点措施,那么物体检测的mAP不会太高,因为模型更倾向于不含有物体的格点。
的作用,就是让含有物体的格点,在损失函数中的权重更大,

让模型更加“重视”含有物体的格点所造成的损失。在论文中,

的取值分别为5与0.5。
  • 一些技巧
  1. 回归offset代替直接回归坐标

We parametrize the bounding box x and y coordinates to be offsets of a particular grid cell location so they are also bounded between 0 and 1

不直接回归中心点坐标数值,而是回归相对于格点左上角坐标的位移值。例如,第一个格点中物体坐标为

,另一个格点中的物体坐标为
,这四个数值让神经网络暴力回归,有一定难度。所以这里的offset是指,既然格点已知,那么物体中心点的坐标一定在格点正方形里,相对于格点左上角的位移值一定在区间[0, 1)中。让神经网络去预测
会更加容易,在使用时,加上格点左上角坐标
即可。

2. 同一格点的不同预测框有不同作用

At training time we only want one bounding box predictor to be responsible for each object. We assign one predictor to be “responsible” for predicting an object based on which prediction has the highest current IOU with the ground truth. This leads to specialization between the bounding box predictors. Each predictor gets better at predicting certain sizes, aspect ratios, or classes of object, improving overall recall.

前文中提到,每个格点预测两个或多个矩形框。此时假设每个格点预测两个矩形框。那么在训练时,见到一个真实物体,我们是希望两个框都去逼近这个物体的真实矩形框,还是只用一个去逼近?或许通常来想,让两个人一起去做同一件事,比一个人做一件事成功率要高,所以可能会让两个框都去逼近这个真实物体。但是作者没有这样做,在损失函数计算中,只对和真实物体最接近的框计算损失,其余框不进行修正。这样操作之后作者发现,一个格点的两个框在尺寸、长宽比、或者某些类别上逐渐有所分工,总体的召回率有所提升。

3. 使用非极大抑制生成预测框

However, some large objects or objects near the border of multiple cells can be well localized by multiple cells. Non-maximal suppression can be used to fix these multiple detections. While not critical to performance as it is for R-CNN or DPM, non-maximal suppression adds 2 - 3% in mAP.

通常来说,在预测的时候,格点与格点并不会冲突,但是在预测一些大物体或者邻近物体时,会有多个格点预测了同一个物体。此时采用非极大抑制技巧,过滤掉一些重叠的矩形框。但是mAP提升并没有显著提升。(非极大抑制,物体检测的老套路,这里不再赘述)

4. 推理时将

作为输出置信度

在推理时,使用物体的类别预测最大值

乘以 预测框的最大值
,作为输出预测物体的置信度

。这样也可以过滤掉一些大部分重叠的矩形框。输出检测物体的置信度,同时考虑了矩形框与类别,满足阈值的输出更加可信。

三、Yolo v1与其他算法比较

与其他算法比较的结论照搬论文,如下性能的硬件环境都是GPU Titan X。

图六 Yolo算法性能比较

backbone同为VGG-16,Yolo比Faster R-CNN少了将近7点mAP,但是速度变为三倍,Fast Yolo和Yolo相比,少11点mAP,但是速度可以达到155张图片每秒。后续的Yolo v3中,准确率和速度综合再一次提升,所以v1的性能不再过多分析。

下面重点看论文中的错误分析:

图七 错误对比分析

首先给出图中各个单词的含义:

• Correct: correct class and IOU > .5
• Localization: correct class, .1 < IOU < .5
• Similar: class is similar, IOU > .1
• Other: class is wrong, IOU > .1
• Background: IOU < .1 for any object

其中,Yolo的Localization错误率更高,直接对位置进行回归,确实不如滑窗式的检测方式准确率高。但是Yolo对于背景的误检率更低,由于Yolo在推理时,可以“看到”整张图片,所以能够更好的区分背景与待测物体。作者提到Yolo对于小物体检测效果欠佳,不过在v2与v3中都做了不少改进。

四、小结

Yolo v1整体思路简单清晰,但是透彻的理解还是需要花点功夫。从上次自以为全部看懂了Yolo v1,到写完这篇文章,这期间又明白了不少细节。v1中埋了不少伏笔,都成为了v2和v3的突破口。虽然版本演进,Yolo算法在不断完善,但是v1版本才是用回归做物体检测的开山之作。

PS:Yolo v2与v3的解读正在路上。随时欢迎指正与补充。

fasterrcnn论文_【论文解读】Yolo三部曲解读——Yolov1相关推荐

  1. fasterrcnn论文_论文笔记:Fast(er) RCNN

    在 RCNN 初步试水取得成功后,研究人员又迅速跟进,针对 RCNN 中的几点不足提出改进,接连推出了 fast-rcnn 和 faster-rcnn.关于这两篇论文,网上相关的文章实在是多如牛毛,因 ...

  2. dbscan论文_论文分享 :Linkage Based Face Clustering via GCN

    本文要解决的问题是人脸聚类,这类任务的目的是将一批无标记的人脸通过聚类使得自同一个人的人脸聚在一起.作者将这个问题转换为链路预测的问题,当两个人脸属于同一个人时,那么他们之间存在一条边.作者发现特征空 ...

  3. 基于特征的对抗迁移学习论文_[论文笔记] 对抗样本不是bugs,而是特征

    [论文笔记] Adversarial Examples Are Not Bugs, They Are Features 说在前面 个人心得: 这是关于对抗样本可解释性的工作 理论部分看不懂,看懂了再来 ...

  4. 关系查询处理 查询优化 论文_论文导读基于查询负载的分布式RDF图分割和分配...

    Adaptive Distributed RDF Graph Fragmentation and Allocation based on Query Workload PengPeng, Lei Zo ...

  5. 小米手环深圳通服务器维护,在知网上怎么发表论文_论文如何上传知网

    有的期刊有好多版本,一定要找到自己发表文章的版本,点击相应期刊图片.06 时期和期数找不对是找不到文章的哦!07 第一栏选择作者,第二栏输入姓名也可用工作单我这么跟你说 你随便写点东西交点版面费没有发 ...

  6. faster rcnn论文_【论文解读】精读Faster RCNN

    Faster R-CNN论文链接: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 推荐代 ...

  7. 【YOLO系列】--YOLOv1超详细解读/总结

    文章目录 前言 摘要 一.Introduction-介绍 二. Unified Detection-统一检测 三.Comparison to Other Detection Systems-与其他目标 ...

  8. YOLOv5:解读yolo.py

    YOLOv5:解读yolo.py 前言 前提条件 相关介绍 yolo.py parse_model()函数 Detect类 Model类 参考 前言 记录一下自己阅读yolo.py代码的一些重要点,方 ...

  9. c语言编写订货系统,学位论文_基于c语言的仓库订货系统的仿真.doc

    学位论文_基于c语言的仓库订货系统的仿真 本科毕业论文(设计.创作) 题目: 基于C语言的仓库订货系统的仿真 学生姓名: 学号: 所在系院: 信息与通信技术系 专业: 电子信息工程 入学时间: 201 ...

最新文章

  1. Apache2.2中文手册
  2. 减少运维工作量,如何通过 ROS 轻松实现资源编排新方式
  3. activex 控件的id 定义位置+使用ocx控件的客户端程序中对控件定义的文件中控件id定义的位置...
  4. tar: bzip2:无法 exec: 没有那个文件或目录
  5. TextArea换行 滚动条
  6. 流程型企业SCM、ERP、MES、PCS如何集成?
  7. shell脚本中执行命令_如何在Shell脚本中执行命令?
  8. 剑指offer(面试战备ing,持续更新)
  9. 平面变压器的设计(翻译)(5)
  10. 国科大学习资料--高级软件工程-复习题设计题答案
  11. 由iconfont引起的svg、ttf、woff、woff2图标的研究及转换(svgs2fonts)
  12. provide 与 inject 的使用
  13. 给程序员的十条沟通技巧建议【奥利给】
  14. mysql的my.ini常用配置
  15. 最近灌水paper的一些记录
  16. eNSP WLAN WDS 手拉手
  17. 准确进行网速测试的方法(适用于电信,联通等多种网络)
  18. 计算机丢失api-ms-win-crt-runtime-l1-1-0.dll快速解决方案
  19. windows 下安装 JDK (含安装包)
  20. SIM7600CE TCP/IP连接与PPP拨号上网

热门文章

  1. 11款样式新颖的 jQuery/CSS3 网页菜单
  2. 关于线程插入函数如何用的问题
  3. WinDbg分析dump文件排查bug
  4. php 安装mysql扩展注意事项
  5. 【Shell】数某关键字在文件中出现次数
  6. Impala的安装(含使用CM安装 和 手动安装)(图文详解)
  7. LeetCode62 Unique Paths
  8. IIS出现问题时修改配置文件的几项说明
  9. C# 线程手册 第四章 线程设计原则 对等线程模型
  10. 将文件复制到FTP服务器时发生错误的解决办法