目标检测是近年来深度学习发展的一个重要领域。近年来,人们开发了许多目标检测算法,其中包括YOLO、SSD、Mask RCNN和RetinaNet。

在过去的几个月里,我一直在一个研究实验室致力于改进对象检测。从这段经历中,我最大的收获是认识到,学习对象检测的最好方法是自己实现算法,从零开始。这正是我们在本教程中要做的。

我们将使用PyTorch实现一个基于YOLO v3的对象检测器,这是一种速度更快的对象检测算法。

The code for this tutorial is designed to run on Python 3.5, and PyTorch 0.4. It can be found in it’s entirety at this Github repo.

This tutorial is broken into 5 parts:

  1. Part 1 (This one): Understanding How YOLO works
  2. Part 2 : Creating the layers of the network architecture
  3. Part 3 : Implementing the the forward pass of the network
  4. Part 4 : Objectness score thresholding and Non-maximum suppression
  5. Part 5 : Designing the input and the output pipelines

Prerequisites

  • 你应该了解卷积神经网络是如何工作的,这还包括剩余块、跳过连接和向上采样的知识。
  • 什么是对象检测、边框回归、IoU和非最大抑制。
  • 基本的PyTorch使用方法,您应该能够轻松地创建简单的神经网络。

我在文章末尾提供了链接,以防您在任何方面都有不足。

What is YOLO?

YOLO stands for You Only Look Once. It’s an object detector that uses features learned by a deep convolutional neural network to detect an object. Before we get out hands dirty with code, we must understand how YOLO works.

A Fully Convolutional Neural Network

YOLO只使用卷积层,是一个完全卷积的网络(FCN)。它有75个卷积层,具有跳过连接和向上采样层。不使用池化的形式,使用带stride 2的卷积层对feature map进行下采样。这有助于防止通常归因于池的低级特性的丢失。

作为FCN, YOLO对输入图像的大小是不变的。然而,在实践中,由于各种问题只有在我们实现算法时才会出现,我们可能希望保持输入大小不变。

其中一个很大的问题是,如果我们想批量处理图像(批量图像可以由GPU并行处理,从而提高速度),我们需要具有固定高度和宽度的所有图像。需要将多个图像连接成一个大批(将多个PyTorch张量连接成一个)

网络通过一个叫做网络步幅的因素对图像进行下采样。例如,如果网络的步幅是32,那么大小为416 x 416的输入图像将产生大小为13 x 13的输出。一般来说,网络中任意一层的步幅等于该层的输出小于网络输入图像的系数。

Interpreting the output

通常,(对于所有的对象检测器都是如此)卷积层学习到的特征被传递到一个分类器/回归器上,这个分类器/回归器进行检测预测(边界框的坐标,类标签)。等等)。

在YOLO中,预测是通过使用使用1x1卷积的卷积层来完成的。

现在,首先要注意的是我们的输出是一个feature map。由于我们使用了1x1卷积,所以预测映射的大小正好是之前feature映射的大小。在YOLO v3(及其后代)中,解释这个预测映射的方法是,每个单元格可以预测固定数量的边界框。

Though the technically correct term to describe a unit in the feature map would be a neuron, calling it a cell makes it more intuitive in our context.

在深度方面,我们在feature map中有(B x (5 + C))项。B表示每个单元格可以预测的包围框的数量。根据本文的研究,每一个B包围框都可以专门用于检测某一类对象。每个包围框都有5 + C属性,这些属性描述了每个包围框的中心坐标、尺寸、object - score和C类置信度。YOLO v3预测每个单元格有3个包围框。

如果对象的中心落在该单元格的接受域中,则期望feature map的每个单元格通过其中一个包围框来预测对象。(接受域是输入图像对细胞可见的区域。请参阅卷积神经网络的链接以获得进一步的澄清)。

这与YOLO的训练方式有关,其中只有一个包围框负责检测任何给定的对象。首先,我们必须确定这个包围框属于哪个单元格。

为了做到这一点,我们将输入图像分割成与最终feature map相同的维度网格。

让我们考虑下面的一个例子,其中输入图像是416 x 416,网络的步幅是32。如前所述,feature map的维数将是13 x 13。然后我们将输入图像分成13 x 13个单元格。

然后,选择包含对象的ground truth box中心的cell(在输入图像上)作为负责预测对象的cell。在图像中,标记为红色的单元格包含ground truth box(标记为黄色)的中心。

现在,红色的细胞是网格第7行的第7个细胞。我们现在将feature map (feature map上对应的cell)的第7行第7个cell指定为负责检测dog的cell。

现在,这个单元格可以预测三个包围框。哪个将被分配到狗的真实标签?为了理解这一点,我们必须围绕锚的概念展开讨论。

Note that the cell we’re talking about here is a cell on the prediction feature map. We divide the input image into a grid just to determine which cell of the prediction feature map is responsible for prediction

Anchor Boxes

预测边界框的宽度和高度可能是有意义的,但是在实践中,这会导致在训练过程中出现不稳定的梯度。另外,大多数现代对象检测器预测日志空间转换,或者简单地偏移到预先定义的称为锚的默认边界框。

然后,将这些变换应用于锚箱,得到预测结果。YOLO v3有三个锚点,每个单元可以预测三个包围框。

回到我们之前的问题,负责检测狗的边界框将是锚点与真值框有最高IoU的那个。

Making Predictions

下面的公式描述了如何转换网络输出,以获得预测框。

bx, by, bw, bh are the x,y center co-ordinates, width and height of our prediction. tx, ty, tw, th is what the network outputs. cx and cy are the top-left co-ordinates of the grid. pw and ph are anchors dimensions for the box.

Center Coordinates

注意,我们通过一个sigmoid函数运行我们的中心坐标预测。这迫使输出的值介于0和1之间。为什么会这样呢?

通常情况下,YOLO不能预测包围框中心的绝对坐标。它预测偏移量为:

  • 相对于预测对象的网格单元左上角。
  • 由特征图上单元格的尺寸标准化,即1。

例如,考虑我们的狗的形象。如果中心的预测是(0.4,0.7),那么这意味着中心位于(6.4,6.7)在13 x 13 feature map上。(因为红细胞的左上角坐标是(6,6))。

但等一下,如果预测的x,y坐标大于1(1.2,0.7)会发生什么。这意味着中心位于(7.2,6.7)注意到中心现在在格子中就在红色格子的右边,或者第7行第8个格子。这打破了YOLO背后的理论,因为如果我们假设红盒子是用来预测狗的,那么狗的中心一定是在红格子里,而不是在它旁边的那个格子里。

因此,为了解决这个问题,输出通过一个sigmoid函数传递,该函数将输出压扁在0到1之间,有效地保持预测网格的中心。

Dimensions of the Bounding Box

通过对输出应用对数空间转换,然后使用锚点进行乘法,可以预测边界框的大小。

How the detector output is transformed to give the final prediction. Image Credits. http://christopher5106.github.io/

结果的预测,bw和bh,由图像的高度和宽度标准化。(通过这种方式选择培训标签)。因此,如果bx和by对包含狗的盒子的预测是(0.3,0.8),那么13 x 13 feature map上的实际宽度和高度是(13 x 0.3, 13 x 0.8)。

Objectness Score

对象得分表示对象被包含在包围框内的概率。红色的和相邻的网格应该接近1,而角上的网格应该接近0。

对象得分也通过一个sigmoid传递,因为它被解释为一个概率。

Class Confidences

类置信度表示属于特定类(狗、猫、香蕉、车等)的被检测对象的概率。v3之前,YOLO习惯用softmax来处理类分数。

然而,v3中已经放弃了这种设计选择,作者选择使用sigmoid。原因是软最大化类分数假定类是互斥的。简单地说,如果一个对象属于一个类,那么它就保证不属于另一个类。这对于COCO数据库是正确的,我们将在其上建立我们的检测器。

然而,这种假设可能不适用于女性和人这种分类。这就是作者避免使用Softmax激活的原因。

Prediction across different scales.

YOLO v3跨越3个不同的尺度进行预测。检测层用于对三种不同尺寸的地物图进行检测,其步幅分别为32、16、8。这意味着,在输入416 x 416的情况下,我们在13 x 13, 26 x 26和52 x 52的刻度上进行检测。

网络对输入图像进行下采样,直到第一个检测层,在第一个检测层使用stride 32的一个层的feature map进行检测。此外,层被向上采样2倍,并与具有相同特征图大小的前一层的特征图连接。另一个检测现在是在step 16的图层上进行的。重复相同的上采样过程,在stride 8层进行最终检测。

在每个尺度上,每个单元格使用3个锚点预测3个包围框,使得使用的锚点总数为9。(不同尺度的锚是不同的)

作者报告说,这有助于YOLO v3更好地检测小对象,这是YOLO早期版本经常遇到的问题。向上采样可以帮助网络学习细粒度的特征,这些特征对于检测小对象是有帮助的

Output Processing

对于大小为416 x 416的图像,YOLO预测((52 x 52) + (26 x 26) + 13 x 13) x 3 = 10647个包围框。然而,在我们的图像中,只有一个对象,狗。如何将检测从10647减少到1?

Thresholding by Object Confidence

首先,我们根据它们的对象得分对它们进行过滤。通常,得分低于阈值的框会被忽略。

Non-maximum Suppression

NMS旨在解决同一图像多次检测的问题。例如,红色网格单元格的所有3个包围框可能检测到一个框,或者相邻单元格可能检测到相同的对象。

如果你不知道NMS,我提供了一个网站的链接来解释同样的问题。

Our Implementation

YOLO只能检测数据集中用于训练网络的类的对象。我们将使用我们的检测器的官方权重文件。这些权值是通过对COCO数据集上的网络进行训练得到的,因此我们可以检测到80个对象类别。

这就是第一部分。本文对YOLO算法进行了充分的解释,使您能够实现检测器。然而,如果你想深入了解YOLO是如何工作的,它是如何训练的,以及与其他检测器相比,它的表现如何,你可以阅读原始论文,我在下面提供了链接。

这部分就讲到这里。在下一部分中,我们将实现组装检测器所需的各个层

扩展阅读

  1. YOLO V1: You Only Look Once: Unified, Real-Time Object Detection
  2. YOLO V2: YOLO9000: Better, Faster, Stronger
  3. YOLO V3: An Incremental Improvement
  4. Convolutional Neural Networks
  5. Bounding Box Regression (Appendix C)
  6. IoU
  7. Non maximum suppresion
  8. PyTorch Official Tutorial

YOLO v3实现 Prat1相关推荐

  1. python实现yolo目标检测_从零开始PyTorch项目:YOLO v3目标检测实现

    在过去几个月中,我一直在实验室中研究提升目标检测的方法.在这之中我获得的最大启发就是意识到:学习目标检测的最佳方法就是自己动手实现这些算法,而这正是本教程引导你去做的. 在本教程中,我们将使用 PyT ...

  2. 从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附代码)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1.跟踪基础知识简介 首先要说明一点,现在多目标跟踪算法的效果,与 ...

  3. 【项目实践】从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附注释项目代码)...

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|集智书童 1.跟踪基础知识简介 首先要说明一点,现在多目标 ...

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

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

  5. 从零开始PyTorch项目:YOLO v3目标检测实现

    从零开始PyTorch项目:YOLO v3目标检测实现 目标检测是深度学习近期发展过程中受益最多的领域.随着技术的进步,人们已经开发出了很多用于目标检测的算法,包括 YOLO.SSD.Mask RCN ...

  6. yolo类检测算法解析——yolo v3

    原文:https://www.cnblogs.com/cvtoEyes/p/8608205.html yolo类检测算法解析--yolo v3 计算机视觉的发展史可谓很长了,它的分支很多,而且理论那是 ...

  7. layer output 激活函数_深入理解YOLO v3实现细节 - 第3篇 构建v3的Loss_layer

    深入理解YOLO v3实现细节系列文章,是本人根据自己对YOLO v3原理的理解,结合开源项目tensorflow-yolov3,写的学习笔记.如有不正确的地方,请大佬们指出,谢谢! 目录 第1篇 数 ...

  8. 探索 YOLO v3 实现细节 - 第6篇 预测 (完结)

    YOLO,即You Only Look Once的缩写,是一个基于卷积神经网络(CNN)的物体检测算法.而YOLO v3是YOLO的第3个版本,即YOLO.YOLO 9000.YOLO v3,检测效果 ...

  9. DL之YoloV3:Yolo V3算法的简介(论文介绍)、各种DL框架代码复现、架构详解、案例应用等配图集合之详细攻略

    DL之YoloV3:Yolo V3算法的简介(论文介绍).各种DL框架代码复现.架构详解.案例应用等配图集合之详细攻略 目录 Yolo V3算法的简介(论文介绍) 0.YoloV3实验结果 1.Yol ...

最新文章

  1. CentOS7 开放端口
  2. 2020-11-11(aidl)
  3. C/C++中计算函数运行时间
  4. php项目中sql,php – 大括号{}在SQL查询中做了什么?
  5. (笔试题)滑动窗口的最大值
  6. python项目实战:实时博客项目 源码下载
  7. VSCode无法写入用户设置 请打开用户设置并清除错误或警告, 然后重式
  8. echrts多条折线
  9. BAT中删除目录,如何不显示删除的文件
  10. 【离散数学】第五版前四章知识网图
  11. dp hp oracle 备份软件_HP-DP备份软件设置
  12. 如何用photoshop做24色环_photoshop制作漂亮色环的教程(2)
  13. AI上推荐 之 隐语义模型(LFM)和矩阵分解(MF)
  14. exp oracle 904,EXP-00008: ORACLE error 904 encountered的解决方法
  15. quartz表删除顺序
  16. 部署WekaFS并行文件系统的10大理由
  17. useradd与adduser(更全面)创建用户命令 和 让用户拥有root权限
  18. iPhone 全系尺寸大全
  19. cps评分和tps评分_【一点资讯】一文总结:PD-1/PD-L1免疫检查点抑制剂和TPS、CPS、IPS...
  20. 即席查询-KylinPresto

热门文章

  1. 外卖和快递行业数据_2020年中国即时配送行业市场规模与发展趋势分析 用户和订单量逐年增长【组图】...
  2. 金山反间谍(系统清理专家)2007.1.31更新日志
  3. 房屋收租小程序开发快速搭建
  4. HTML静态网页 图片热点、框架、表单
  5. 0成本300万UV,打造爆款的6个方法论(附大会PPT下载)
  6. iOS 开发实战培训
  7. 解决mybatis不加@Parm注解报错问题
  8. 【图片批量处理软件分享】可批量添加水印/批量重命名/批量裁剪/批量缩小尺寸
  9. 2018-2019 ACM-ICPC, Asia East Continent Finals D.F.I.L(VP)
  10. Qt下的综合练习—汽车信息管理系统(三)车辆出售功能的实现