提交 da41f96b 编写于 作者: W wizardforcel

2021-01-06 14:49:09

上级 66a7087d
......@@ -39,12 +39,12 @@ YOLO 的检测机制基于单个**卷积神经网络**(**CNN**),该预测
前面的照片显示了三个主要步骤,从边界框的开发到使用非最大抑制和最终边界框。 具体步骤如下:
1. YOLO 中的 CNN 使用整个图像中的特征来预测每个边界框。 因此,预测是全局的,而不是局部的。
2. 整个图像分为 S x S 个网格单元,每个网格单元预测 B 个边界框以及边界框包含对象的概率(P)。 因此,总共有 S xS x B 个边界框,每个边界框都有相应的概率。
2. 整个图像分为`S x S`个网格单元,每个网格单元预测`B`个边界框以及边界框包含对象的概率(`P`)。 因此,总共有`S x S x B`个边界框,每个边界框都有相应的概率。
3. 每个边界框包含五个预测(`x``y``w``h``c`),其中 以下内容适用:
* o(`x``y`是边界框中心相对于网格单元坐标的坐标。
* o(`w``h`是边框相对于图像尺寸的宽度和高度。
* o(`c`是置信度预测,表示预测框和地面真实框之间的 IOU。
* `o(x, y)`是边界框中心相对于网格单元坐标的坐标。
* `o(w, h)`是边框相对于图像尺寸的宽度和高度。
* `o(c)`是置信度预测,表示预测框和地面真实框之间的 IOU。
4. 网格单元包含对象的概率定义为类乘以 IOU 值的概率。 这意味着,如果网格单元仅部分包含一个对象,则其概率将较低,而 IOU 值将保持较低。 这将对该网格单元的边界框产生两个影响:
......@@ -53,13 +53,13 @@ YOLO 的检测机制基于单个**卷积神经网络**(**CNN**),该预测
5. 通常,每个网格单元只能包含一个类,但是使用锚框原理,可以将多个类分配给一个网格单元。 锚框是预定义的形状,表示要检测的类的形状。 例如,如果我们检测到三个类别(汽车,摩托车和人),那么我们可能可以通过两个锚框形状来解决-一个代表摩托车和人,另一个代表汽车。 可以通过查看先前图像中最右边的图像来确认。 我们可以通过使用 K 均值聚类等算法分析每个类的形状来确定锚框形状以形成训练 CSV 数据。
让我们以前面的图像为例。 在这里,我们有三类:`car``motorcycle``human`。 我们假设一个`5 x 5`的网格具有 2 个锚定框和 8 个维度(5 个边界框参数(`x``y``w``h``c`)和 3 类(c1,c2 和 c3))。 因此,输出向量大小为 5 x 5 x 2 x 8
让我们以前面的图像为例。 在这里,我们有三类:`car``motorcycle``human`。 我们假设一个`5 x 5`的网格具有 2 个锚定框和 8 个维度(5 个边界框参数(`x``y``w``h``c`)和 3 类(`c1``c2``c3`))。 因此,输出向量大小为`5 x 5 x 2 x 8`
我们为每个锚框重复两次`Y = [x, y, w, h, c, c1, c2, c3, x, y, w, h, c, c1, c2, c3]`参数。 下图说明了边界框坐标的计算:
![](img/f5d56455-e35e-4b5b-9e23-90dfae98c4c7.png)
图像的大小为 448 x448。此处,出于说明目的,显示了`human``car`两类的计算方法。 请注意,每个锚定框的大小为 448/5〜89
图像的大小为`448 x 448`。此处,出于说明目的,显示了`human``car`两类的计算方法。 请注意,每个锚定框的大小为`448/5 ~ 89`
# YOLO v3 神经网络架构
......@@ -71,7 +71,7 @@ TYOLO v3 由 Joseph Redmon 和 Ali Farhadi 于 2018 年在论文[《YOLOv3:增
YOLO v3 的最重要的功能是它的检测机制,它是在三种不同的规模上完成的-在第 82、94 和 106 层:
* 该网络由第 1 层和第 74 层之间的 23 个卷积和残差块组成,其中输入图像大小从`608`降低到`19`,深度通过交替的`3 x 3` 1 x 从`3`增长到`1,024` 1 个过滤器
* 该网络由第 1 层和第 74 层之间的 23 个卷积和残差块组成,其中输入图像大小从`608`降低到`19`,深度通过交替的`3 x 3``1 x 1`个过滤器从`3`增长到`1,024`
* 除 5 种情况下,将步幅值`2``3 x 3`过滤器一起用于减小尺寸外,步幅通常保持为`1`
* 剩余的块之后是交替的`1 x 1``1 x 1`过滤器的预卷积块,直到在第 82 层进行第一次检测为止。已经使用了两次短路-一个在第 61 和 85 层之间,另一个在第 36 和 97 层之间 。
......@@ -96,7 +96,7 @@ YOLO v3 的最重要的功能是它的检测机制,它是在三种不同的规
# 用于对象检测的 Darknet 简介
Darknet 是一个开放的神经网络框架,由 C 编写,并由 YOLO 的第一作者 Joseph Redmon 管理。 有关 Darknet 的详细信息,请访问 [pjreddie.com](https://pjreddie.com/) 。 在本节中,我们将讨论用于对象检测的 Darknet 和 Tiny Darknet。
Darknet 是一个开放的神经网络框架,由 C 编写,并由 YOLO 的第一作者 Joseph Redmon 管理。 有关 Darknet 的详细信息,请访问 [pjreddie.com](https://pjreddie.com/)。 在本节中,我们将讨论用于对象检测的 Darknet 和 Tiny Darknet。
# 使用 Darknet 检测对象
......@@ -129,9 +129,9 @@ Resolving pjreddie.com (pjreddie.com)... 128.208.4.108
Connecting to pjreddie.com (pjreddie.com)|128.208.4.108|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 248007048 (237M) [application/octet-stream]
Saving to: yolov3.weights
Saving to: 'yolov3.weights'
yolov3.weights 100%[======================================================>] 236.52M 8.16MB/s in 29s
(8.13 MB/s) - yolov3.weights saved [248007048/248007048]
(8.13 MB/s) - 'yolov3.weights' saved [248007048/248007048]
```
4. 然后,一旦输入`darknet$ ./darknet detect cfg/yolov3.cfg yolov3.weight data/carhumanbike.png`,您将在终端中获得以下输出:
......@@ -408,7 +408,7 @@ Person, bicycle, car, motorbike, airplane, bus, train, truck, boat, traffic ligh
# 使用 YOLO v3 训练自己的图像集以开发自定义模型
在本节中,我们将学习如何使用 YOLO v3 训练您自己的自定义检测器。 训练过程涉及许多不同的步骤。 为了清楚起见,以下流程图中显示了每个步骤的输入和输出。 YOLO 的《YOLOv3:Incremental Improvement》由 Redmon,Joseph,Farhadi 和 Ali 于 2018 年在 arXiv 上发布,其中包含许多训练步骤。这些训练步骤也包含在[VOG2] VOLO 训练 YOLO 下 [的部分:https://pjreddie.com/darknet/yolo/](https://pjreddie.com/darknet/yolo/)
在本节中,我们将学习如何使用 YOLO v3 训练您自己的自定义检测器。 训练过程涉及许多不同的步骤。 为了清楚起见,以下流程图中显示了每个步骤的输入和输出。 YOLO 的《YOLOv3:Incremental Improvement》由 Redmon,Joseph,Farhadi 和 Ali 于 2018 年在 arXiv 上发布,其中包含许多训练步骤。这些训练步骤也包含在 [VOC 的“训练 YOLO”部分](https://pjreddie.com/darknet/yolo/)
下图显示了如何使用 YOLO v3 训练 VOC 数据集。 在我们的案例中,我们将使用我们自己的自定义家具数据,该数据用于在“第 6 章”,“使用迁移学习的视觉搜索”中使用 Keras 对图像进行分类:
......@@ -425,22 +425,22 @@ Person, bicycle, car, motorbike, airplane, bus, train, truck, boat, traffic ligh
3. 确保您的班级名称中没有空格; 例如,使用`caesar_salad`代替`caesar salad`
4. 每个班级至少收集 100 张图像以开始初始训练(因此,请完成步骤 1 至 10 以开发模型),然后随着图像数量的增加而增加数量。 理想情况下,1,000 张图像是训练的不错数目。
5. 将所有图像批量调整为 416 x 416 —您可以在 macOS 预览窗格中选择选项,然后选择多个图像,然后批量调整大小,或者可以使用 Ubuntu 中的 ImageMagick 等程序在终端中批量调整大小。 之所以需要执行此步骤,是因为 YOLO v3 希望图像的尺寸为 416 x 416,因此会自行调整图像的尺寸,但这可能会导致该图像的边界框出现不同的外观,从而在某些情况下无法检测到。
5. 将所有图像批量调整为`416 x 416` — 您可以在 macOS 预览窗格中选择选项,然后选择多个图像,然后批量调整大小,或者可以使用 Ubuntu 中的 ImageMagick 等程序在终端中批量调整大小。 之所以需要执行此步骤,是因为 YOLO v3 希望图像的尺寸为`416 x 416`,因此会自行调整图像的尺寸,但这可能会导致该图像的边界框出现不同的外观,从而在某些情况下无法检测到。
# 生成注释文件
此步骤涉及为数据集中每个图像中的每个对象创建边界框坐标。 此边界框坐标通常由四个参数表示:(x,y)用于确定初始位置以及宽度和高度。 边界框可以表示为`.xml``.txt`形式。 该坐标文件也称为注释文件。 请按照以下步骤完成本节:
此步骤涉及为数据集中每个图像中的每个对象创建边界框坐标。 此边界框坐标通常由四个参数表示:`(x, y)`用于确定初始位置以及宽度和高度。 边界框可以表示为`.xml``.txt`形式。 该坐标文件也称为注释文件。 请按照以下步骤完成本节:
1. 许多图像注释软件应用程序都用于标记图像。 在面部关键点检测期间,我们已经在“第 3 章”,“使用 OpenCV 和 CNN 进行面部检测”中介绍了 VGG 图像注释器。 在“第 11 章”,“具有 CPU/GPU 优化功能的边缘设备深度学习”中,我们将介绍用于自动图像注释的 CVAT 工具。 在本章中,我们将介绍一个称为`labelImg`的注释工具。
2.[这里](https://pypi.org/project/labelImg/)下载`pypi``labelImg`注释软件。 您可以按照此处的说明为操作系统安装`labelImg`-如果有任何问题,一种简单的安装方法是在终端中键入`pip3 install lableImg`。 然后,要运行它,只需在终端中键入`labelImg`
3.`labelImg`中,在“打开目录”框中单击图像目录。 选择每个图像并通过单击 Create / RectBox 创建一个包围框,然后为包围框添加一个类名,例如`bed``chair``sofa`。 保存注释,然后单击右箭头转到下一张图像。
3.`labelImg`中,在“打开目录”框中单击图像目录。 选择每个图像并通过单击`Create/RectBox` 创建一个包围框,然后为包围框添加一个类名,例如`bed``chair``sofa`。 保存注释,然后单击右箭头转到下一张图像。
4. 如果图片中图像中有多个类别或同一类别的多个位置,请在每个类别周围绘制矩形。 多个类别的示例是同一图像中的汽车和行人。 同一类别内多个位置的示例是同一图像中不同位置的不同汽车。 因此,如果图像由多把椅子和一张沙发组成,则在每把椅子周围绘制矩形,并在类名称中为每张沙发分别键入`chair`,在其周围绘制一个矩形并键入`sofa`。 如果图像仅由沙发组成,则在沙发周围绘制一个矩形,并输入`sofa`作为类名。 下图说明了这一点:
![](img/316469f3-0238-48f0-bb5a-9e97d0c19d51.png)
此图显示了如何标记属于同一类的多个图像。
# 将.xml 文件转换为.txt 文件
# 将`.xml`文件转换为`.txt`文件
YOLO v3 需要将注释文件另存为`.txt`文件而不是`.xml`文件。 本节介绍如何转换和排列`.txt`文件以输入模型。 有许多工具可用于此类转换-我们将在此处提及两个工具:
......@@ -449,7 +449,7 @@ YOLO v3 需要将注释文件另存为`.txt`文件而不是`.xml`文件。 本
该过程的输出将是一个包含`.jpg``.xml``.txt`文件的目录。 每个图像`.jpg`文件将具有一个对应的`.xml``.txt`文件。 您可以从目录中删除`.xml`文件,因为我们将不再需要这些文件。
# 创建合并的 train.txt 和 test.txt 文件
# 创建合并的`train.txt`和`test.txt`文件
顾名思义,此步骤涉及一个表示所有图像的`.txt`文件。 为此,我们将运行一个简单的 Python 文件(每个文件用于训练和测试图像)以创建`combinedtrain.txt``combinedtest.txt`文件。 转到[这里](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter07/Chapter7_yolo_combined_text.py)获取 Python 文件。
......@@ -469,7 +469,7 @@ chair
sofa
```
# 创建一个 YOLO .data 文件
# 创建一个 YOLO `.data`文件
这些步骤涉及`train``valid`文件夹的路径。 开始之前,请将合并的`train`,合并的`test``.names`文件复制到`darknet`目录。 以下代码块显示了典型的`.data`文件(在本示例中为`furniture.data`)的外观:
......@@ -508,7 +508,7 @@ backup = backup
10. 605、689、773 行。这些是 YOLO 预测之前的最后卷积层。 将`filters`值从其默认值`255`设置为`(5+ # of classes)x3`。 因此,对于 3 个类别,过滤器值应为 24。
11. 线 610、694、778。这是锚点,是具有高宽比的预设边界框,如此处所示。 锚点的大小由(宽度,高度)表示,它们的值不需要更改,但是了解其上下文很重要。 `(10, 13)`,`(16, 30)`,`(32, 23)`,`(30, 61)`,`(62, 45)`,`(59, 119)`,`(116, 90)`,`(156, 198)`,(373 (326)。 总共有九个锚点,范围从`10`的高度到`373`的高度。 这表示从最小到最大的图像检测。 对于此练习,我们不需要更改锚点。
12. 609、693、777 行。这些是蒙版。 他们指定我们需要选择哪些锚框进行训练。 如果较低级别的值为`0, 1, 2`,并且您在区域`94`和`106`的输出中继续观察到 NaN,请考虑增加该值。 选择该值的最佳方法是查看训练图像边界框从最小到最大图像的比例,了解它们的下落位置,并选择适当的蒙版来表示。 在我们的测试案例中,最小尺寸的边界框从`62, 45, 40`开始,因此我们选择`5, 6, 7`作为最小值。 下表显示了蒙版的默认值和调整后的值:
12. 609、693、777 行。这些是蒙版。 他们指定我们需要选择哪些锚框进行训练。 如果较低级别的值为`0, 1, 2`,并且您在区域`94`和`106`的输出中继续观察到`NaN`,请考虑增加该值。 选择该值的最佳方法是查看训练图像边界框从最小到最大图像的比例,了解它们的下落位置,并选择适当的蒙版来表示。 在我们的测试案例中,最小尺寸的边界框从`62, 45, 40`开始,因此我们选择`5, 6, 7`作为最小值。 下表显示了蒙版的默认值和调整后的值:
| **默认值** | **调整值** |
| 6, 7, 8 | 7, 8, 9 |
......@@ -517,7 +517,7 @@ backup = backup
`9`的最大值表示`bed`,并且`6`的最小值表示`chair`。
请注意,如果图像中的边界框不同,则可以调整`mask`值以获得所需的结果。 因此,从默认值开始并进行调整以避免出现 NaN 结果。
请注意,如果图像中的边界框不同,则可以调整`mask`值以获得所需的结果。 因此,从默认值开始并进行调整以避免出现`NaN`结果。
# 启用 GPU 进行训练
......@@ -572,7 +572,7 @@ Region 106 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.419326, .5R: -nan, .
**特征金字塔网络****FPN**)由多个特征金字塔组成,这些特征金字塔由每个 CNN 层之间的较高维度和较低分辨率组成。 FPN 中使用此金字塔特征来检测不同比例的物体。 FPN 使用最后一个全连接层要素,该要素将基于其最近的邻居应用 2x 的上采样,然后将其添加到其先前的要素向量中,然后将`3 x 3`卷积应用于合并的层。 这个过程一直重复到第二个卷积层。 结果是在所有级别上都具有丰富的语义,从而导致不同级别的对象检测。
[RetinaNet](https://arxiv.org/abs/1708.02002)由林宗义,Priya Goyal,Ross Girshick,Kakaiming He 在《密集物体检测的焦点损失》中引入, 和皮奥特·多拉尔(PiotrDollár)。 RetinaNet 是一个密集的一级网络,由一个基本的 ResNet 型网络和两个特定于任务的子网组成。 基本网络使用 FPN 为不同的图像比例计算卷积特征图。 第一个子网执行对象分类,第二个子网执行卷积包围盒回归。
[RetinaNet](https://arxiv.org/abs/1708.02002) 由林宗义,Priya Goyal,Ross Girshick,Kakaiming He 在《密集物体检测的焦点损失》中引入, 和皮奥特·多拉尔(PiotrDollár)。 RetinaNet 是一个密集的一级网络,由一个基本的 ResNet 型网络和两个特定于任务的子网组成。 基本网络使用 FPN 为不同的图像比例计算卷积特征图。 第一个子网执行对象分类,第二个子网执行卷积包围盒回归。
大多数 CNN 对象检测器可分为两类-一级和二级网络。 在诸如 YOLO 和 SSD 的单阶段网络中,单个阶段负责分类和检测。 在诸如 R-CNN 的两阶段网络中,第一阶段生成对象位置,第二阶段评估其分类。 一级网络以其速度而闻名,而二级网络以其准确率而闻名。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册