YOLO v1

论文

前言

这周的目标是把目标检测的算法复习一下,同时研读下CVPR2019目标检测的新文章。

首先我们明确下 目标检测要完成一个什么样的任务。目标检测顾名思义就是检测图像中哪里有我们要检测的物体,这些物体是什么。“哪里有我们要检测的物体”,进一步抽象就是定位,确定物体在哪里;“这些物体是什么”,进一步抽象就是分类,确定物体的类别。看图说话↓\downarrow↓

定位就是把物体框出来,分类就是确定物体的类别。

根据目标检测要完成的任务,目标检测的方法也主要分两类,one-stage和two-stage。one-stage是一步解决定位和分类的问题,主要网络YOLO、SSD、YOLO-v2、YOLO-v3等;two-stage是定位,分类两步走,主要网络是R-CNN家族,有R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN等。本周回顾one-stage的方法。

YOLO目标检测的思路

YOLO全称是 You Only Look Once。

第一步,将图像划分成S×SS×SS×S个网格,图片中物体的中心落在某一个网格上,那么该物体与该网格建立关系,该网格对该物体负责!每个物体都能找到对应的网格。

第二步,每个网格预测B个框框(bounding boxes)的位置和每个框框对应的置信度(confidence)。表示一个框框需要4个参数,中心点坐标(x,yx,yx,y)和框框的宽高(w,hw,hw,h)。这里的置信度指该框框圈住物体的可信程度。在测试阶段,它直接表示预测框体的可信度,用来执行NMS算法;在训练阶段,它需要制作标签以用于训练。计算包括两项,一是框框对应的网格包含物体的可能性Pr(Object)Pr(Object)Pr(Object);二是框框和物体真实框框的重叠程度,用IoU度量。因此置信度的计算公式为Pr(Object)⋅IoUPr(Object)\cdot IoUPr(Object)⋅IoU。如果该网格不包含任何物体,那么Pr(Object)=0Pr(Object)=0Pr(Object)=0,该框框的置信度也为0;如果该网格包含物体,那么Pr(Object)=1Pr(Object)=1Pr(Object)=1,则该框框的置信度为IoU的值。

第三步,预测包含物体的网格所属的类别,即计算网格属于各个类别的条件概率,Pr(Classi∣Object)Pr(Class_i|Object)Pr(Classi​∣Object)。结合第二步得到的置信度,我们可以得到每一个框框对每一个类别的置信度。
Pr(Classi∣Object)⋅Pr(Object)⋅IoU=Pr(classi)⋅IoUPr(Class_i|Object) \cdot Pr(Object) \cdot IoU = Pr(class_i) \cdot IoU Pr(Classi​∣Object)⋅Pr(Object)⋅IoU=Pr(classi​)⋅IoU

第二步完成物体的定位,第三步完成了物体的分类。其实第二、第三步是在一次性完成,此处只是为了便于理解,分点说明。

按照YOLO的检测思路,总结一下我们的网络应该输出什么内容。先看第二步,一个网格需要B个框框,而一个框框需要x,y,w,hx,y,w,hx,y,w,h四个参数定位参数和一个置信度,共计5个参数,因此共计S⋅S⋅B⋅5S \cdot S \cdot B \cdot 5S⋅S⋅B⋅5;再看第三步,一个网格要预测CCC个类别,共计S⋅S⋅CS \cdot S \cdot CS⋅S⋅C。所以!最终的输出的维度是S⋅S⋅(B⋅5+C)S \cdot S \cdot (B\cdot 5 + C)S⋅S⋅(B⋅5+C)。

网络结构

网络结构比较常规,毕竟本文关键在于思路!想法!
连续的卷积池化,最后接两个全连接层。设置的参数S=7,B=2,C=20S=7, B=2, C=20S=7,B=2,C=20,因此模型的输出为7×7×307×7×307×7×30

损失函数

个人觉得损失函数部分是这篇文章的精髓之处,表达式如下:
λcoord ∑i=0S2∑j=0Blijobj[(xi−x^i)2+(yi−y^i)2]+λcoord ∑i=0S2∑j=0Blijobj[(wi−w^i)2+(hi−h^i)2]+∑i=0S2∑j=0Blijobj(Ci−C^i)2+λnoobj ∑i=0S2∑j=0Blijnoobj (Ci−C^i)2+∑i=0S2liobj∑c∈classes (pi(c)−p^i(c))2\lambda_{\text { coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{l}_{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{l}_{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{l}_{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{l}_{i j}^{\text { noobj }}\left(C_{i}-\hat{C}_{i}\right)^{2}\\ +\sum_{i=0}^{S^{2}} \mathbb{l}_{i}^{\mathrm{obj}} \sum_{c \in \text { classes }}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2} λ coord ​i=0∑S2​j=0∑B​lijobj​[(xi​−x^i​)2+(yi​−y^​i​)2]+λ coord ​i=0∑S2​j=0∑B​lijobj​[(wi​​−w^i​​)2+(hi​​−h^i​​)2]+i=0∑S2​j=0∑B​lijobj​(Ci​−C^i​)2+λ noobj ​i=0∑S2​j=0∑B​lij noobj ​(Ci​−C^i​)2+i=0∑S2​liobj​c∈ classes ∑​(pi​(c)−p^​i​(c))2

损失函数共有三部分,框体位置损失(第一二项),框体置信度损失(第三四项),网格类别损失(第五项)。接下一个一个看。

框体位置损失

先看第一项:
λcoord ∑i=0S2∑j=0Blijobj[(xi−x^i)2+(yi−y^i)2]\lambda_{\text { coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{l}_{i j}^{\mathrm{obj}}\left[\left(x_{i}-\hat{x}_{i}\right)^{2}+\left(y_{i}-\hat{y}_{i}\right)^{2}\right] λ coord ​i=0∑S2​j=0∑B​lijobj​[(xi​−x^i​)2+(yi​−y^​i​)2]
这一项计算框体中心点坐标损失。

  • λcoord\lambda_{coord}λcoord​是赋予该项损失的权重,权重越大,表明我们希望该项能优化的更好
  • ∑i=0S2∑j=0B\sum_{i=0}^{S^{2}} \sum_{j=0}^{B}∑i=0S2​∑j=0B​表示每一个预测框体都要计算损失,总共要计算S2⋅BS^2\cdot BS2⋅B个框体的损失
  • lijobj\mathbb{l}_{i j}^{\mathrm{obj}}lijobj​表示哪些预测结果需要计算loss。作者定义了一类预测框体,如果有物体的中心落在网格iii中,并且第jjj个预测框体是BBB个预测框体中与实际框体IoU最大的框体,那么称jjj框体对该网格负责(reasonable),对应地lijobj=1\mathbb{l}_{i j}^{\mathrm{obj}}=1lijobj​=1;否则为0。
  • xi,yix_i,y_ixi​,yi​是物体框体中心点坐标的实际值,是经过归一化的的。归一化的方法如图所示。

图中的网格划分是3×33×33×3,框体的中心落在中间的网格。x,yx,yx,y是框体中心点在中间网格中的相对位置,值介于0,10,10,1之间。

再看第二项:
λcoord ∑i=0S2∑j=0Blijobj[(wi−w^i)2+(hi−h^i)2]\lambda_{\text { coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{l}_{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] λ coord ​i=0∑S2​j=0∑B​lijobj​[(wi​​−w^i​​)2+(hi​​−h^i​​)2]
这一项计算框体宽高的损失。

  • wi,hiw_i,h_iwi​,hi​同样是经过归一化的值,归一化的方法是除以图片的宽和高
  • 此处对宽和高取平方根是因为同样的损失对于大小不同的框体精度的影响不一致。大框体收到的影响小于小框体。例如原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w1,h=7相比,损失大小都是22+22=82^2+2^2=822+22=8,但其实前者的误差比后者小。加上根号后,前者:(10−8)2+(20−22)2=0.159(\sqrt{10}-\sqrt{8})^2 + (\sqrt{20}-\sqrt{22})^2=0.159(10​−8​)2+(20​−22​)2=0.159, 后者:(3−1)2+(5−7)2=0.704(\sqrt{3}-\sqrt{1})^2 + (\sqrt{5}-\sqrt{7})^2=0.704(3​−1​)2+(5​−7​)2=0.704,前者比后者小,能正确度量!

框体置信度损失

先看第一项
∑i=0S2∑j=0Blijobj(Ci−C^i)2\sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{l}_{i j}^{\mathrm{obj}}\left(C_{i}-\hat{C}_{i}\right)^{2}i=0∑S2​j=0∑B​lijobj​(Ci​−C^i​)2

  • lijobj\mathbb{l}_{i j}^{\mathrm{obj}}lijobj​表示的含义和上一项一致。
  • CiC_iCi​是框体的置信度真实值,大小等于预测框体与实际框体的IoU。
  • 这一项计算的是对网格负责的框体的损失。

再看第二项
λnoobj ∑i=0S2∑j=0Blijnoobj (Ci−C^i)2\lambda_{\text { noobj }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{l}_{i j}^{\text { noobj }}\left(C_{i}-\hat{C}_{i}\right)^{2}λ noobj ​i=0∑S2​j=0∑B​lij noobj ​(Ci​−C^i​)2

  • 这一项计算的是不对网格负责的框体的损失
  • 由于不对网格负责的框体的数量一般来说都大于对网格负责框体的损失,因此为它增加一个权重λnoobj\lambda_{noobj}λnoobj​,文中取值为0.5

类别预测损失
∑i=0S2liobj∑c∈classes (pi(c)−p^i(c))2\sum_{i=0}^{S^{2}} \mathbb{l}_{i}^{\mathrm{obj}} \sum_{c \in \text { classes }}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2}i=0∑S2​liobj​c∈ classes ∑​(pi​(c)−p^​i​(c))2

  • ∑i=0S2liobj\sum_{i=0}^{S^{2}} \mathbb{l}_{i}^{\mathrm{obj}}∑i=0S2​liobj​ 只计算有物体中心的网格。
  • pi(c)p_i(c)pi​(c)网格所属类别对应的独热编码,0或1.
  • 这里没有采用交叉熵,将它当成回归问题,直接差值的平方作为损失。

算法优缺点

优点

  • 快。将物体检测问题作为回归问题进行求解,网络结构简单,在保证检测准确率的情况下,能达到45FPS的检测速度(TianX)
  • 背景误检率低。YOLO在训练和推理过程中能‘看到’整张图像的整体信息,而基于region proposal的物体检测方法(如rcnn/fast rcnn),在检测过程中,只‘看到’候选框内的局部图像信息。因此,若当图像背景(非物体)中的部分数据被包含在候选框中送入检测网络进行检测时,容易被误检测成物体。测试证明,YOLO对于背景图像的误检率低于fast rcnn误检率的一半。

缺点

  • 由于YOLO默认同一个网格中框体属于同一种物体,因此当网格内出现不同物体时,效果差;
  • 由于YOLO一个网格只能预测两个物体,因此网格中出现多余两个物体时,效果差
  • 定位精度较差,模型召回率较低。

【目标检测】 YOLO相关推荐

  1. yolov3网络结构图_目标检测——YOLO V3简介及代码注释(附github代码——已跑通)...

    GitHub: liuyuemaicha/PyTorch-YOLOv3​github.com 注:该代码fork自eriklindernoren/PyTorch-YOLOv3,该代码相比master分 ...

  2. 目标检测YOLO系列------YOLO简介

    目标检测YOLO系列------YOLO简介 1.为什么会出现YOLO算法 2.YOLO算法会逐渐成为目标检测的主流吗     YOLO以及各种变体已经广泛应用于目标检测算法所涉及到的方方面面,为了梳 ...

  3. 目标检测—YOLO不难学,你只是不会方法!

    目标检测是图像处理和计算机视觉领域中的一个经典课题,在交通监控.图像检索.人机交互等方面有着广泛的应用.随着研究发现,目标检测领域应用深度学习,可以有效的提高检测效果和性能.于是,深度学习在目标检测领 ...

  4. 重温目标检测--YOLO v3

    YOLOv3: An Incremental Improvement https://pjreddie.com/yolo/ 本文是对 YOLO系列的进一步完善. 先上和其他检测算法的 COCO 对比结 ...

  5. 重温目标检测--YOLO v2 -- YOLO9000

    YOLO9000:Better, Faster, Stronger CVPR 2017, Best Paper Honorable Mention https://pjreddie.com/darkn ...

  6. 重温目标检测--YOLO v1

    You Only Look Once:Unified, Real-Time Object Detection CVPR2016 https://pjreddie.com/darknet/yolo/ Y ...

  7. 目标检测- YOLO v1--You Only Look Once

    You Only Look Once: Unified, Real-Time Object Detection 项目主页: http://pjreddie.com/darknet/yolov1/ 考虑 ...

  8. 目标检测 /yolo算法原理的详解

    前言 谈到计算机视觉时,我们都会联想到图像分类,图像分类是计算机视觉最基本的任务之一,在图像分类的基础上,我们还有更复杂的任务,比如目标检测,物体定位,图像分割等,本文主要讲目标检测,目标检测是分类与 ...

  9. Tensorflow框架:目标检测Yolo思想

    Yolo-You Only Look Once YOLO算法采用一个单独的CNN模型实现end-to-end的目标检测: Resize成448448,图片分割得到77网格(cell) CNN提取特征和 ...

  10. [目标检测]YOLO原理

    1 YOLO 创新点: 端到端训练及推断 + 改革区域建议框式目标检测框架 + 实时目标检测 1.1 创新点 (1) 改革了区域建议框式检测框架: RCNN系列均需要生成建议框,在建议框上进行分类与回 ...

最新文章

  1. C语言1e12怎么识别,求大神帮助词法分析,当输入第一个1.2e12时可以输出,当时输入第二个1.2e12时就不能输出了,万分感谢,还有不能识别x=7*8+9中的+9,...
  2. Java-Map从入门到性能分析3【LinkedHashMap(性能耗时对比、模拟LRU缓存)、TreeMap(排序、性能对比)】
  3. bzoj5090[lydsy11月赛]组题
  4. 打开 mhtml 文件 显示不全_3dmax打开时显示缺少外部文件的解决方法与步骤
  5. java guava_多线程(java和guava两种方式):
  6. regex flag
  7. ansible笔记(8):常用模块之系统类模块(二)
  8. 建造者模式(Java与Kotlin版)
  9. JavaScript-callapply方法
  10. 天线SMA处抗静电保护收发开关
  11. css 都有哪些字体,css字体有哪些
  12. 松下弧焊机器人 调电压_松下焊接机器人操作规程
  13. MATLAB系统辨识工具箱学习,详细教程!
  14. 计算机表格操作教程,Excel使用教程 Excel表格的10个基本操作
  15. Android Wear和二维码
  16. 微信小程序如何实现切换主题(更改皮肤)
  17. laravel中公共子视图继承实现
  18. 高速文件服务器搭建教程,文件服务器配置教程.doc
  19. 人大金仓 过期 更换license
  20. Python中range()函数用法

热门文章

  1. 系统进程网络流量监控软件
  2. IE6下的Aborted解决办法
  3. java加密文件夹_怎样用JAVA给文件夹加密,拜求各位大侠!
  4. 二次剪辑必备小技能—视频水印去除
  5. 期货突破(期货突破交易法)
  6. 留学回国人员申办上海常住户口实施细则
  7. office2007设置默认粘贴为选择性粘贴
  8. python excel转csv日期变数字_将Excel转换为CSV正确转换日期字段
  9. 安装Chromium浏览器并添加Flash插件Pepper Flash Player
  10. Android简易计算器的制作(源码)(两种方法)