文章目录

  • 前言
  • 背景
  • 一、YOLO的核心原理预览
  • 二、网络结构
    • 为什么每个网格有固定的B个Bounding Boes?(即B=2)
  • 三、网络细节
    • 3.1 网络单元(grid)
      • 3.1.1 作用
      • 3.1.2 细节特征
    • 3.2 网络实现
      • 3.2.1 检测策略
        •  实现过程如下:
      • 3.2.2 预测形状
      • 3.2.3 非极大值抑制(Non-Maximum Suppression)
        • 作用
        • 具体实现
    • 3.3 目标损失函数
      • 3.3.1 思路
      • 3.3.2 分类
      • 3.3.3 细节
        • 分类预测损失
        • 坐标预测损失
        • 置信度预测损失
  • 四、YOLO的优点
  • 五、YOLOv1的伏笔——YOLOv2,YOLOv3的诞生

前言

代码地址:GitHub:ultralytics/yolov3

本文适用于目标检测之YOLO零基础入门。YOLO检测效果如下:

若想了解Faster RCNN算法的细节与思想,可参考:

  • 《Faster RCNN超详细入门 01-准备篇-背景 RCNN,SPPnet,Fast RCNN,RoI Pooling》
  • 《Faster RCNN超详细入门 02网络细节与训练方法(anchors,RPN,bbox,bounding box,Region proposal layer……)》

笔者在阅读《You Only Look Once:Unified, Real-Time Object Detection》原文后,根据自身理解及查阅资料,以入门角度尽可能想要还原论文细节,水平有限,欢迎交流。

  • 【读后再读】:《YOLO超详细入门02 v2零基础看懂 图文详解(含代码及原文)——网络架构,BN,高分辨率,细粒度特征,多尺度训练,Anchor Box,维度聚类,直接位置预测,输出特点,YOLO9000》
  • 【读后再读】:《YOLO超详细入门 03 v3 图文详解(含代码+原文)》

背景

  • 依照目标检测里程碑的 roadmap,我们可以看到 双阶段(two-stage )的算法,例如:RCNN、Fast RCNN 都是 YOLO 的前辈,在当时提出RPN (region proposal)可以说是当时的热门,但 two-stage 的算法缺点也相当明显。例如:RCNN 使用SS(Selective Search )找出 2000–3000 个 region proposal,将取出的 region proposal 压缩成一样大小之后再丟入CNN中提取特征,利用 SVM 进行分类,并对bounding box做线性回归,这一步骤执行起来非常耗时,并且这个方法对于box size的选择非常地敏感。
  • YOLO作为实时影像目标检测的开山鼻祖,采用单阶段(one-stage)方法,使其检测速度远超当时作为主流目标检测算法的R-CNN系列(two-stage),但也牺牲了部分准确率(而这为后续YOLO的改进埋下了伏笔)。
  • ;作者將region proposal创造性地,巧妙地转化为回归分析问题,也就是将挑选region proposal的问题也丢到model內,让model也帮忙预测bounding box。

一、YOLO的核心原理预览

  • YOLO将输入的图片resize成448 x 448,并且为 S x S(S = 7)个grid,如果物体的中心落入该grid中,那么该grid就需要负责检测该物体。
  • 一次性输出所检测到的目标信息,包括类别位置

  • 对于每一个网格(grid),都会预测出B个bounding boxes(B=2),这个bounding boxes有5个量,分别是物体的中心位置(x,y)和它的高(h)和宽(w),以及这次预测的置信度(confidence score)。

  • 每个框还要负责预测这个框中的物体是什么类别的,共预测C个类。

  • 综上,S×S 个网格,每个网格要预测 B个bounding box ,还要预测 C 个类。网络输出就是一个 S × S × (5×B+C)。(S x S个网格,每个网格都有B个预测框,每个框又有5个参数,再加上每个网格都有C个预测类)

二、网络结构


模型原理图如上,网络结构图如下。

网络结构是由GoogLeNet所启发,取代了GoogLeNet使用的inception。

为什么每个网格有固定的B个Bounding Boes?(即B=2)

YOLO 有 24 个卷积层,后面是 2 个全连接层(FC)。一些卷积层交替使用 1×1 减少层来减少特征图的深度。对于最后一个卷积层,它输出一个形状为 (7, 7, 1024) 的张量。然后张量被展平。使用 2 个全连接层作为线性回归的一种形式,它输出 7×7×30 参数,然后reshape为 (7, 7, 30),即每个位置 2 个bounding boxes预测。

  • 网络输入:448 x 448 x 3的RGB图片。
  • 中间层:由若干卷积层和最大池化层组成,用于提取图片的抽象特征
  • 全连接层:由两个全连接层组成,用来预测目标的位置类别概率值
  • 网络输出:7 × 7 × (2 x 5 + 20)= 1470的预测结果。

三、网络细节

3.1 网络单元(grid)

3.1.1 作用

  • 预测B个边界框,每个框都有一个置信度分数(confidence score)。
  • 不管框 B 的数量是多少,都只检测一个对象。
  • 预测物体在C个类别的概率(物体属于每一种类别的可能性)。

3.1.2 细节特征

每个网格单元只检测一个对象

  • YOLO 将输入图像划分为S × S网格。每个网格单元仅预测一个目的。例如,上面的黄色网格单元尝试预测其中心(蓝点)位于网格单元内的“人”对象。

每个网格单元对对象进行固定数量B的bounding boxes预测

  • 每个网格单元预测固定数量 B 的bounding boxes。在这个例子中,黄色网格单元进行两个边界框预测(蓝色框)来定位人的位置(B = 2)。

YOLO可能会错过太近的物体

  • 但是,单对象规则(one-object rule)限制了检测到的对象的接近程度。为此,YOLO 确实对物体的接近程度有一些限制。例如,上面的图,左下角有 9 个圣诞老人,但 YOLO 只能检测到 5 个。

3.2 网络实现

3.2.1 检测策略

  • YOLOv1采用的是“分而治之”的策略,将一张图片平均分成7×7个网格,每个网格分别负责预测中心点落在该网格内的目标。回忆一下,在Faster R-CNN中,是通过一个RPN来获得目标的感兴趣区域,这种方法精度高,但是需要额外再训练一个RPN网络,这无疑增加了训练的负担。在YOLOv1中,通过划分得到了7×7个网格,这49个网格就相当于是目标的感兴趣区域。通过这种方式,我们就不需要再额外设计一个RPN网络,这正是YOLOv1作为单阶段网络的简单快捷之处!

使用 b 个bounding boxes进行 (S x S) 预测。

  • 原文中为了评估 PASCAL VOC数据集,YOLO使用了 7×7 网格 (S×S)、2 个bounding boxes (B=2) 和 20 个类别 ©。

 实现过程如下:

1.YOLO将输入的图片resize成448 x 448,并且为 S x S(S = 7)个grid,如果物体的中心落入该grid中,那么该grid就需要负责检测该物体。
2.对于每一个网格(grid),都会预测出B个bounding boxes(B=2),这个bounding boxes有5个量,分别是物体的中心位置(x,y)和它的高(h)和宽(w),以及这次预测的置信度(confidence score)。
3.每个框还要负责预测这个框中的物体是什么类别的,共预测C个类。

4.综上,S×S 个网格,每个网格要预测 B个bounding box ,还要预测 C 个类。网络输出就是一个 S × S × (5×B+C)。

3.2.2 预测形状

Output = 7 × 7 × (2 x 5 + 20)= 1470

  • 通过图像的宽度和高度对bounding boxes的宽度w和高度h进行归一化。x和y是对应网络单元格*(grid)的偏移量。因此,x、y、w和h都在 0 和 1 之间。每个网络单元格有 20 个条件类概率。条件类概率是检测到的对象属于特定类别的概率(每个单元属于每个类别的概率)。因此,YOLO 的预测形状为 (S, S, B×5 + C) = (7, 7, 2×5 + 20) = (7, 7, 30)。

3.2.3 非极大值抑制(Non-Maximum Suppression)

算法原理图如下:

简化理解为:

作用

  • YOLO 可以对同一对象进行重复检测。为了解决这个问题,YOLO 应用非极大值抑制(NMS)来以删除重复的具有较低的置信度的预测。
  • NMS使得模型的 mAP 表现增加了 2-3%。

具体实现

1.设定置信度阈值(confidence score threshold),去掉无用的bounding box 再开始做NMS,可以有效减少多余的计算量。
2.设定IoU阈值(IoU threshold) (一般用0.5,如果太高会造成物件重复检测的问题),用来刪掉IoU值太高的两个框其中之一
3.使用置信度(confidence score)对Bounding box 排序然后用第一的Bounding box跟其他Bounding box算IoU,如果大于IoU threshould 就将其置信度归零。
4.重复步骤2-3,直到所有物件的IoU值为0,此时剩下的就是结果。

3.3 目标损失函数

总误差函数

3.3.1 思路

  • YOLO 预测每个网格单元的多个bouding boxes。为了计算TP(True positive)的损失,我们只希望其中一个bounding box负责检测物体。为此,我们选择与ground truth具有最高 IoU(交并比)的那个bounding box。这样便可以使得bounding boxes预测的更加精确。并且预测出来的某些尺寸和纵横比都会变得更好。

3.3.2 分类

YOLO用预测(predictions)和ground truth之间的平方和误差(sum-squared error)来计算损失。损失函数包括:

  • 分类预测损失
  • 坐标预测损失(预测的bounding box和ground truth之间的差距)
  • 置信度预测损失(框的客观真实性)

3.3.3 细节

分类预测损失

  • 如果检测到一个物体,则每个单元格的分类损失是每个类的类条件概率的平方差。

坐标预测损失

  • 坐标预测损失可算出预测bounding box位置和大小的误差(只计算负责检测物体的box)。
  • 使用差方和误差。w和h在进行误差计算的时候取的是它们的平方根,原因是对不同大小的bounding box预测中,相比于大bounding box预测偏一点,小box预测偏一点更不能忍受。我们不想对大的bounding box和小的bounding box中的绝对误差进行同等赋权。例如,一个大的bounding box中的 2 像素误差对于一个小的bounding box来说是相同的。
  • 而差方和误差函数中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将bounding box的w和h取平方根代替原本的w和h。为了部分解决这个问题,YOLO 实际上预测的是bounding boxes的宽度(w)和高度(h)的平方根(square root),而不仅仅是宽度和高度。
  • 因为坐标误差比分类误差大,为了增加对坐标误差为了提高bounding box的准确性,我们将损失乘以  λcoordλ_{coord}λcoord​  (默认值:5)。

置信度预测损失

  • 如果在 box 中检测到物体,则置信度预测损失为:

  • 如果在 box 中没有检测到物体,则置信度预测损失为:

  • 大多数box不包含任何物体对象。这会导致类不平衡问题,即我们训练模型时检测背景比检测物体更加频繁。为了解决这个问题,我们通过乘以 λnoobjλ_{noobj}λnoobj​ (默认值:0.5),对这种损失进行赋权。

四、YOLO的优点

  • 快速,实时处理数据。

  • 采用但阶段网络(one-stage)。预测(物体位置和类别)由一个网络进行。可以进行端到端(end-to-end)训练以提高准确性。

  • 通用性强。当从自然图像推广到艺术品等其他领域时,YOLO的效果也同样优于其他方法。

  • RPN(Region Proposal)区域提议方法将分类器限制在特定区域。而YOLO 在预测边界时却访问整个图像。

  • YOLO 在背景区域中的表现更好,错误率更低。

  • YOLO中的每个网格单元(gride cell)都负责检测一个物体,而这实际上使得YOLO在进行预测时增强了空间多样性。

五、YOLOv1的伏笔——YOLOv2,YOLOv3的诞生

  • 【读后再读】:《YOLO超详细入门02 v2零基础看懂 图文详解(含代码及原文)——网络架构,BN,高分辨率,细粒度特征,多尺度训练,Anchor Box,维度聚类,直接位置预测,输出特点,YOLO9000》
  • 【读后再读】:《YOLO超详细入门 03 v3 图文详解(含代码+原文)》

SSD与YOLOv3的对比,详细请见参考论文《SSD vs. YOLO for Detection of Outdoor Urban Advertising Panels under Multiple Variabilities》

SSD 是 YOLOv1的强大竞争对手,它在当时展示了更高的实时处理精度。与基于区域的检测器相比,YOLO 的坐标定位误差更高,recall(召回率:衡量定位所有目标物体的好坏程度)更低。YOLOv2 是YOLO的第二个版本,其目标是显着提高准确性,同时使其更快。
详情下回分解。

YOLO 超详细入门(含开源代码)——网络结构、细节、目标损失函数、优点相关推荐

  1. YOLO 超详细入门02 v2 (含代码及原文)

    文章目录 前言 背景 总结 一.YOLOv2改进之框架 1.1 网络架构 1.2 Batch Normalization 二.YOLOv2改进方法之尺寸相关 2.1 High Resolution C ...

  2. 超详细——入门Github的代码上传

      Github的使用与Gitee相差无几,由于网速原因,国内开发者主要使用Gitee作为版本管理器,但有些场景及项目需要用到Github,今天我将对Github的使用制作一个简单的初学者入门教程,不 ...

  3. Java~链表反转/链表逆置的多种方法(超详细,含完整代码)

    单链表的反转,有一个单链表,我们要如何对他进行反转呢?这里我们以leetcode--206为例子 附上题目链接力扣https://leetcode-cn.com/problems/reverse-li ...

  4. 自学前端设计——【开源骚客】FPGA超详细入门视频教程

    前言 本文基于[开源骚客]FPGA超详细入门视频教程,简单做个笔记 00. FPGA开发软件的安装 Quartus II 13.1 Modelsim Notepad++ Vim 01. 我的第一个FP ...

  5. mybatis-generator生成带中文注释POJO类的超详细教程含代码和图解

    mybatis-generator生成带中文注释POJO类的超详细教程含代码和图解 mybatis-generator自动生成带中文注释POJO类和增删改查,idea和eclipes都可以使用 MyC ...

  6. TypeScript超详细入门教程(上)

    TypeScript超详细入门教程(上) 01 开篇词:Hello~TypeScript 01 开篇词:Hello~TypeScript 更新时间:2019-10-30 13:49:46 既然我已经踏 ...

  7. GoJS超详细入门(插件使用无非:引包、初始化、配参数(json)、引数据(json)四步)...

    GoJS超详细入门(插件使用无非:引包.初始化.配参数(json).引数据(json)四步) 一.总结 一句话总结:插件使用无非:引包.初始化.配参数(json).引数据(json)四步. 1.goj ...

  8. arcgis 地图_ArcGIS超详细入门操作:ArcGIS矢量化地图详细步骤

    今天给大家带来的干货是[ArcGIS超详细入门操作:ArcGIS矢量化地图详细步骤],欢迎大家收藏查阅! 在桌面上新建一个文件夹,打开ArcCatalog, "文件"--" ...

  9. Faster RCNN超详细入门 02 网络细节与训练方法

    文章目录 前言 论文结构 Abstract Introduction Related Work Region Proposal Network Experiments Conclusion 网络架构 ...

最新文章

  1. cli3 px转rem适配移动端_Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
  2. 生日QQ配对【找到你生日QQ了吗?】
  3. 使用android ProgressBar和Toast生成一个界面
  4. Understanding HBase and BigTable 译文
  5. python输出结果空格分割_用Python编写固定宽度,以空格分隔的CSV输出
  6. Silverlight Blend动画设计系列十二:三角函数(Trigonometry)动画之自由旋转(Free-form rotation)...
  7. 华为机试HJ100:等差数列
  8. JavaScript在一个数组中插入另一个数组
  9. Java Tricks —— 不小于一个数的最小2的幂次方
  10. 条款28:避免返回handles指向对象内部的成分(Avoid returning handles to objects internals)...
  11. Jasmine入门(上)
  12. 2022-07-08 Unity Json2——LitJson
  13. EXCEL电子表格使用技巧大全
  14. pandas支持读取哪些类型文件_Pandas教程: 读取Excel文件
  15. win10 mysql 卸载不干净,安装提示,已经存在
  16. 【WEB】前端系统配色方案(全览)
  17. 微信小程序样式 WXSS
  18. Android 输入法挤压屏幕解决方案
  19. java最新版下载地址
  20. C# 使用NPOI批量导出

热门文章

  1. 在c语言中有函数leapyear定义如下,商业计划书的制作、优化与演示超星尔雅期末测试答案...
  2. Unity Excel表格合并
  3. [吐槽]] 一句三不知
  4. gap year_你应该选择gap year吗?了解gap year的好处
  5. 单节1A锂电池充电芯片方案,PD和QC快充充电器5V输入
  6. 2018D2T2 P5023 填数游戏
  7. 刘海屏水滴屏小米89等安卓P底部留黑or白适配
  8. 1705117130徐铭晨
  9. 国产arm64服务CentOS系统上编译使用x11vnc-desktop,无图形界面服务器Docker内开启图形化远程桌面
  10. windows 配置FTP教程