YOLO v3实现 Prat1

目标检测是近年来深度学习发展的一个重要领域。近年来,人们开发了许多目标检测算法,其中包括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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值