提交 6f01a967 编写于 作者: W wizardforcel

2020-12-30 22:20:51

上级 69f91f40
......@@ -43,7 +43,7 @@
由于大小限制,我们无法将图像数据上传到 GitHub。 您可以使用自己的相机中的图像,也可以从 Kaggle 下载图像数据集:
* 食物图像(用于汉堡和薯条样本):使用手机相机拍摄照片。
* Kaggle 家具检测器: [https://www.kaggle.com/akkithetechie/furniture-detector](https://www.kaggle.com/akkithetechie/furniture-detector)
* [Kaggle 家具检测器](https://www.kaggle.com/akkithetechie/furniture-detector)
如果您一开始不了解某个概念,请重新访问它,并阅读所有引用的论文。
......@@ -59,7 +59,7 @@
充分利用本书的最佳方法是阅读理论,了解为什么要以这种方式开发模型,尝试样例练习,然后更新代码以适合您的需求。
如果您对本书的任何部分有任何疑问并陷入困境,可以随时通过 LinkedIn( [https://www.linkedin.com/in/krish-kar-554739b2/ext](https://www.linkedin.com/in/krish-kar-554739b2/ext)与我联系。
如果您对本书的任何部分有任何疑问并陷入困境,可以随时通过 [LinkedIn](https://www.linkedin.com/in/krish-kar-554739b2/ext) 与我联系。
# 下载示例代码文件
......@@ -78,13 +78,13 @@
* Mac 版 Zipeg / iZip / UnRarX
* 适用于 Linux 的 7-Zip / PeaZip
本书的代码包也托管在 GitHub 的 [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0) 上。 如果代码有更新,它将在现有的 GitHub 存储库中进行更新。
本书的代码包也托管在 [GitHub](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0) 上。 如果代码有更新,它将在现有的 GitHub 存储库中进行更新。
我们还从 **[https://github.com/PacktPublishing/](https://github.com/PacktPublishing/)** 提供了丰富的书籍和视频目录中的其他代码包。 去看一下!
我们还从[这里](https://github.com/PacktPublishing/)提供了丰富的书籍和视频目录中的其他代码包。 去看一下!
# 下载彩色图像
我们还提供了 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图像。 您可以在此处下载: [https://static.packt-cdn.com/downloads/9781838827069_ColorImages.pdf](https://static.packt-cdn.com/downloads/9781838827069_ColorImages.pdf)
我们还提供了 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图像。 [您可以在此处下载](https://static.packt-cdn.com/downloads/9781838827069_ColorImages.pdf)
# 使用约定
......
......@@ -13,7 +13,7 @@
# 技术要求
如果尚未安装,请从 [https://www.anaconda.com](https://www.anaconda.com) 安装 Anaconda。 Anaconda 是 Python 的软件包管理器。 您还需要使用`pip install opencv-python`为要执行的所有计算机视觉工作安装 OpenCV。 OpenCV 是用于计算机视觉工作的内置编程功能的库。
如果尚未安装,请从[这里](https://www.anaconda.com)安装 Anaconda。 Anaconda 是 Python 的软件包管理器。 您还需要使用`pip install opencv-python`为要执行的所有计算机视觉工作安装 OpenCV。 OpenCV 是用于计算机视觉工作的内置编程功能的库。
# 使用图像哈希和过滤检测边缘
......@@ -45,7 +45,7 @@ print hamming_distance(hash1,hash2)
# 使用拜耳滤光片形成彩色图案
拜耳过滤器通过应用去马赛克算法将原始图像转换为自然的,经过颜色处理的图像。 图像传感器由光电二极管组成,光电二极管产生与光的亮度成比例的带电光子。 光电二极管本质上是灰度的。 拜耳滤镜用于将灰度图像转换为彩色图像。 来自拜耳滤镜的彩色图像经过**图像信号处理****ISP** ),该过程涉及数周的各种参数手动调整,以产生所需的人眼图像质量。 当前正在进行一些研究工作,以将手动 ISP 转换为基于 CNN 的处理以生成图像,然后将 CNN 与图像分类或对象检测模型合并以生成一个采用 Bayer 彩色图像并使用边界框检测对象的相干神经网络管道 。 此类工作的详细信息可以在 Sivalogeswaran Ratnasingam 在 2019 年发表的题为《 *深度相机:用于图像信号处理的全卷积神经网络》* 的论文中找到。 本文的链接显示在此处: [http://openaccess.thecvf.com/content_ICCVW_2019/papers/LCI/Ratnasingam_Deep_Camera_A_Fully_Convolutional_Neural_Network_for_Image_Signal_ICCVW_2019_paper.pdf](http://openaccess.thecvf.com/content_ICCVW_2019/papers/LCI/Ratnasingam_Deep_Camera_A_Fully_Convolutional_Neural_Network_for_Image_Signal_ICCVW_2019_paper.pdf)
拜耳过滤器通过应用去马赛克算法将原始图像转换为自然的,经过颜色处理的图像。 图像传感器由光电二极管组成,光电二极管产生与光的亮度成比例的带电光子。 光电二极管本质上是灰度的。 拜耳滤镜用于将灰度图像转换为彩色图像。 来自拜耳滤镜的彩色图像经过**图像信号处理****ISP** ),该过程涉及数周的各种参数手动调整,以产生所需的人眼图像质量。 当前正在进行一些研究工作,以将手动 ISP 转换为基于 CNN 的处理以生成图像,然后将 CNN 与图像分类或对象检测模型合并以生成一个采用 Bayer 彩色图像并使用边界框检测对象的相干神经网络管道 。 此类工作的详细信息可以在 Sivalogeswaran Ratnasingam 在 2019 年发表的题为《 *深度相机:用于图像信号处理的全卷积神经网络》* 的论文中找到。 [本文的链接显示在此处](http://openaccess.thecvf.com/content_ICCVW_2019/papers/LCI/Ratnasingam_Deep_Camera_A_Fully_Convolutional_Neural_Network_for_Image_Signal_ICCVW_2019_paper.pdf)
这是一个拜耳过滤器的示例:
......@@ -246,7 +246,7 @@ plt.imshow(blurimg, cmap='gray')
# 使用 OpenCV 进行图像过滤
通过将滤镜应用于真实图像,可以更好地理解先前描述的图像滤镜概念。 OpenCV 提供了一种方法。 我们将使用的 OpenCV 代码可以在 [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter01/Chapter1_imagefiltering.ipynb](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter01/Chapter1_imagefiltering.ipynb) 中找到。
通过将滤镜应用于真实图像,可以更好地理解先前描述的图像滤镜概念。 OpenCV 提供了一种方法。 我们将使用的 OpenCV 代码可以在[这个页面](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter01/Chapter1_imagefiltering.ipynb)中找到。
重要代码在以下代码段中列出。 导入图像后,我们可以添加噪点。 没有噪声,图像滤镜效果将无法很好地显现。 之后,我们需要保存图像。 对于均值和高斯滤波器,这不是必需的,但是如果我们不使用中值滤波器保存图像,然后再次将其导回,则 Python 将显示错误。
......@@ -398,7 +398,7 @@ for i,histcolor in enumerate(color):
图像匹配是一种将两个不同的图像匹配以找到共同特征的技术。 图像匹配技术具有许多实际应用,例如匹配指纹,使地毯颜色与地板或墙壁颜色匹配,使照片匹配以找到同一个人的两个图像,或者比较制造缺陷以将它们分为相似的类别以进行更快的分析。 本节概述了 OpenCV 中可用的图像匹配技术。 这里描述了两种常用的方法: **BruteForce****BFMatcher** )和**快速库,用于近似最近的邻居****FLANN** )。 在本书的稍后部分,我们还将讨论其他类型的匹配技术,例如[第 2 章](../Text/2.html)*使用局部二进制模式*的内容识别和视觉搜索等直方图匹配和局部二进制模式。 [第 6 章](../Text/6.html)*中使用转移学习的视觉搜索*中的内容。
在 BFMatcher 中,将比较测试图像和目标图像各部分之间的汉明距离,以实现最佳匹配。 另一方面,FLANN 速度更快,但只会找到最接近的邻居–因此,它找到了很好的匹配项,但不一定是最佳匹配项。 **KNN** 工具假定相似的事物彼此相邻。 它根据目标与源之间的距离找到最接近的第一近邻。 可以在 [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter01/Chapter1_SIFT.ipynb](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter01/Chapter1_SIFT.ipynb) 上找到用于图像匹配的 Python 代码。
在 BFMatcher 中,将比较测试图像和目标图像各部分之间的汉明距离,以实现最佳匹配。 另一方面,FLANN 速度更快,但只会找到最接近的邻居–因此,它找到了很好的匹配项,但不一定是最佳匹配项。 **KNN** 工具假定相似的事物彼此相邻。 它根据目标与源之间的距离找到最接近的第一近邻。 可以在[这个页面](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter01/Chapter1_SIFT.ipynb)上找到用于图像匹配的 Python 代码。
请注意,在下图中,BFMatcher 找到了更相似的图像。 该图是前面的代码(`preface_SIFT.ipynb`)返回的输出。 我们来看一下:
......@@ -410,7 +410,7 @@ for i,histcolor in enumerate(color):
# 使用轮廓和 HOG 检测器进行物体检测
轮廓是图像中形状相似的封闭区域。 在本节中,我们将使用轮廓来分类和检测图像中的简单对象。 我们将使用的图像由苹果和橙子组成,我们将使用轮廓和 Canny 边缘检测方法来检测对象并将图像类名称写在边界框上。 该部分的代码可以在 [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter01/Chapter1_contours_opencv_object_detection_HOG.ipynb](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter01/Chapter1_contours_opencv_object_detection_HOG.ipynb) 中找到。
轮廓是图像中形状相似的封闭区域。 在本节中,我们将使用轮廓来分类和检测图像中的简单对象。 我们将使用的图像由苹果和橙子组成,我们将使用轮廓和 Canny 边缘检测方法来检测对象并将图像类名称写在边界框上。 该部分的代码可以在[这个页面](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter01/Chapter1_contours_opencv_object_detection_HOG.ipynb)中找到。
以下各小节介绍了该方法。
......@@ -567,7 +567,7 @@ RGB 颜色如下:
TensorFlow 是一个**端到端****E2E** )机器学习平台,其中图像和数据被转换为张量以由神经网络进行处理。 例如,大小为`224 x 224`的图像可以表示为等级`4`的张量为`128, 224, 224, 3`,其中`128`是神经网络的批量大小,`224`是高度和宽度, `3`是颜色通道(R,G 和 B)。
如果您的代码基于 TensorFlow 1.0,那么将其转换为 2.0 版可能是最大的挑战之一。 请遵循 [https://www.tensorflow.org/guide/migrate](https://www.tensorflow.org/guide/migrate) 上的说明,以转换为 2.0 版。 大多数时候,当您使用终端在 TensorFlow 中执行 Python 代码时,转换问题会在低级 API 中发生。
如果您的代码基于 TensorFlow 1.0,那么将其转换为 2.0 版可能是最大的挑战之一。 请遵循[这个页面](https://www.tensorflow.org/guide/migrate)上的说明,以转换为 2.0 版。 大多数时候,当您使用终端在 TensorFlow 中执行 Python 代码时,转换问题会在低级 API 中发生。
Keras 是 TensorFlow 的高级 API。 以下三行代码是安装 Keras 的起点:
......@@ -643,9 +643,9 @@ pip show tensorflow
Name: tensorflow
Version: 2.0.0rc0
Summary: TensorFlow is an open source machine learning framework for everyone.
Home-page: [https://www.tensorflow.org/](https://www.tensorflow.org/)
Home-page: https://www.tensorflow.org/
Author: Google Inc.
Author-email: [packages@tensorflow.org](mailto:packages@tensorflow.org)
Author-email: packages@tensorflow.org
License: Apache 2.0
Location: /home/.../anaconda3/lib/python3.7/site-packages
Requires: gast, google-pasta, tf-estimator-nightly, wrapt, tb-nightly, protobuf, termcolor, opt-einsum, keras-applications, numpy, grpcio, keras-preprocessing, astor, absl-py, wheel, six
......
......@@ -137,7 +137,7 @@ intersection = np.true_divide(np.sum(minima),np.sum(train_hist))
# LBP 的计算成本
与传统的神经网络方法相比,LBP 在计算上更便宜。 LBP 的计算成本由 Li Li,Paul Fieguth,Wang Xiaogang Wang,Matti Pietikäinen 和 Dewen Hu 在他们的论文*中使用新的稳健性基准*评估 LBP 和深纹理描述符。 论文的详细信息可以在这里找到: [https://www.ee.cuhk.edu.hk/~xgwang/papers/liuFWPHeccv16.pdf](https://www.ee.cuhk.edu.hk/~xgwang/papers/liuFWPHeccv16.pdf)
与传统的神经网络方法相比,LBP 在计算上更便宜。 LBP 的计算成本由 Li Li,Paul Fieguth,Wang Xiaogang Wang,Matti Pietikäinen 和 Dewen Hu 在他们的论文*中使用新的稳健性基准*评估 LBP 和深纹理描述符。 [论文的详细信息可以在这里找到](https://www.ee.cuhk.edu.hk/~xgwang/papers/liuFWPHeccv16.pdf)
作者确定了在 2.9 GHz Intel Quad-Core CPU 和 16 GB RAM 上对 480 张图像进行特征提取所花费的平均时间,这些图像的大小为 128 x 128。 该时间不包括训练时间。 研究发现,与被认为中等的 AlexNet 和 VGG 相比,LBP 特征提取非常快。
......@@ -200,7 +200,7 @@ LBP 直方图显示了类似的趋势–这是合理的,因为 LBP 是一种
在这里,LBP 预测似乎是正确的。
比较顶部直方图和底部直方图,以可视化直方图如何比较测试图像和训练图像。 可以在 [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter02/Chapter2_LBPmatching_texture.ipynb](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter02/Chapter2_LBPmatching_texture.ipynb) [中找到详细的 Python 代码。 。](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter02/Chapter2_LBPmatching_texture.ipynb)
比较顶部直方图和底部直方图,以可视化直方图如何比较测试图像和训练图像。 可以在[这个页面](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter02/Chapter2_LBPmatching_texture.ipynb)中找到详细的 Python 代码。
# 使脸色与基础色匹配-LBP 及其局限性
......
......@@ -113,9 +113,9 @@ Haar 级联分类器算法基于这样的思想,即人脸的图像在脸部的
# 使用深度神经网络预测面部关键点
在本节中,我们将讨论面部关键点检测的端到端管道。 面部关键点检测对于计算机视觉来说是一个挑战,因为它要求系统检测面部并获取有意义的关键点数据,将这些数据绘制在面部上,并开发出神经网络来预测面部关键点。 与对象检测或图像分类相比,这是一个难题,因为它首先需要在边界框内进行面部检测,然后再进行关键点检测。 正常的对象检测仅涉及检测代表对象周围矩形边界框的四个角的四个点,但是关键点检测需要在不同方向上的多个点(超过 10 个)。 可以在 [https://www.kaggle.com/c/facial-keypoints-detection](https://www.kaggle.com/c/facial-keypoints-detection) 上找到大量的关键点检测数据及其使用教程。 Kaggle 关键点检测挑战涉及一个 CSV 文件,该文件包含指向 7,049 个图像(96 x 96)的链接,每个图像包含 15 个关键点。
在本节中,我们将讨论面部关键点检测的端到端管道。 面部关键点检测对于计算机视觉来说是一个挑战,因为它要求系统检测面部并获取有意义的关键点数据,将这些数据绘制在面部上,并开发出神经网络来预测面部关键点。 与对象检测或图像分类相比,这是一个难题,因为它首先需要在边界框内进行面部检测,然后再进行关键点检测。 正常的对象检测仅涉及检测代表对象周围矩形边界框的四个角的四个点,但是关键点检测需要在不同方向上的多个点(超过 10 个)。 可以在[这个页面](https://www.kaggle.com/c/facial-keypoints-detection)上找到大量的关键点检测数据及其使用教程。 Kaggle 关键点检测挑战涉及一个 CSV 文件,该文件包含指向 7,049 个图像(96 x 96)的链接,每个图像包含 15 个关键点。
在本部分中,我们将不使用 Kaggle 数据,但将向您展示如何准备自己的数据以进行关键点检测。 有关该模型的详细信息,请参见 [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter03/Chapter3_face%20keypoint_detection.ipynb](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter03/Chapter3_face%20keypoint_detection.ipynb)
在本部分中,我们将不使用 Kaggle 数据,但将向您展示如何准备自己的数据以进行关键点检测。 有关该模型的详细信息,请参见[这里](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter03/Chapter3_face%20keypoint_detection.ipynb)
# 准备用于关键点检测的数据集
......@@ -156,7 +156,7 @@ faceresize = cv2.resize(detected_face, (img_size,img_size))
cv2.imwrite(img_name, faceresize)
```
为不同面部表情的不同人创建约 100 幅或更多图像(对于该测试,我总共拍摄了 57 张图像)。 如果您有更多图像,则检测会更好。 请注意,Kaggle 面部点检测使用 7,049 张图像。 拍摄所有图像并使用 VGG 注释器执行面部关键点注释,您可以从 [http://www.robots.ox.ac.uk/~vgg/software/via/](http://www.robots.ox.ac.uk/~vgg/software/via/) 获得该注释器。 您可以使用其他选择的注释工具,但是我发现此工具(免费)非常有用。 它绘制边界框以及不规则形状和绘制点。 在本练习中,我加载了所有图像,并使用点标记在图像中绘制了 16 个点,如下图所示:
为不同面部表情的不同人创建约 100 幅或更多图像(对于该测试,我总共拍摄了 57 张图像)。 如果您有更多图像,则检测会更好。 请注意,Kaggle 面部点检测使用 7,049 张图像。 拍摄所有图像并使用 VGG 注释器执行面部关键点注释,您可以从[这里](http://www.robots.ox.ac.uk/~vgg/software/via/)获得该注释器。 您可以使用其他选择的注释工具,但是我发现此工具(免费)非常有用。 它绘制边界框以及不规则形状和绘制点。 在本练习中,我加载了所有图像,并使用点标记在图像中绘制了 16 个点,如下图所示:
![](img/0e9ae20c-17b3-49b6-b7f4-33b1b0e20e39.png)
......@@ -183,7 +183,7 @@ VGG 注释器工具会生成一个输出 CSV 文件,该文件需要以我们
*(x0,y0),(x1,y1),(x2,y2),…。,(x15,y15)*,图像文件名
您可以使用自定义 Python 程序对此进行转换,尽管此处未显示。 GitHub 页面包含已处理的 CSV 文件,供您在 [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter03/testimgface.csv](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter03/testimgface.csv)参考。
您可以使用自定义 Python 程序对此进行转换,尽管此处未显示。 GitHub 页面包含已处理的 CSV 文件,[这里](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter03/testimgface.csv)供您参考。
# Keras–Python 代码中的预处理
......
......@@ -187,7 +187,7 @@ CNN 的图像过滤和处理方法包括执行多种操作,所有这些操作
# 内部协方差平移和批量归一化
在训练过程中,每层输入的分布会随着上一层的权重因子的变化而变化,从而导致训练变慢。 这是因为它要求较低的学习率和权重因子选择。 谢尔盖·艾菲(Sergey Ioffe)和克里斯汀·塞格迪(Christian Szegedy)在题为*批量归一化:通过减少内部协方差漂移*加速深度网络训练的论文中称这种现象**内部协方差漂移**。 有关详细信息,请参阅[https://arxiv.org/abs/1502.03167](https://arxiv.org/abs/1502.03167)
在训练过程中,每层输入的分布会随着上一层的权重因子的变化而变化,从而导致训练变慢。 这是因为它要求较低的学习率和权重因子选择。 谢尔盖·艾菲(Sergey Ioffe)和克里斯汀·塞格迪(Christian Szegedy)在题为*批量归一化:通过减少内部协方差漂移*加速深度网络训练的论文中称这种现象**内部协方差漂移**。 有关详细信息,请参阅[这里](https://arxiv.org/abs/1502.03167)
批次归一化通过从当前输入中减去上一层的批次平均值并将其除以批次标准偏差来解决协方差移位的问题。 然后将此新输入乘以当前权重系数,再乘以偏置项以形成输出。 下图显示了带有和不带有批次规范化的神经网络的中间输出功能:
......@@ -199,7 +199,7 @@ CNN 的图像过滤和处理方法包括执行多种操作,所有这些操作
tf.nn.batch_normalization(x,mean,variance,offset,scale,variance_epsilon,name=None)
```
麻省理工学院的 Shibani Santurkar,Dimitris Tsipras,Andrew Ilyas 和 Aleksander Madry 在其题为*的论文中详细阐述了批处理规范化的优势?* 。 可以在 [https://arxiv.org/abs/1805.11604](https://arxiv.org/abs/1805.11604) 中找到该论文的详细信息。
麻省理工学院的 Shibani Santurkar,Dimitris Tsipras,Andrew Ilyas 和 Aleksander Madry 在其题为*的论文中详细阐述了批处理规范化的优势?* 。 可以在[这个页面](https://arxiv.org/abs/1805.11604)中找到该论文的详细信息。
该论文的作者发现,批量归一化并不能减少内部协方差漂移。 批处理归一化的学习速度可以归因于归一化输入的平滑性,这归因于归一化输入而不是常规输入数据的使用,规则数据可能由于扭结,尖锐的边缘和局部最小值或最大值而具有较大的差异。 这使梯度下降算法更加稳定,从而允许它使用更大的步长以实现更快的收敛。 这样可以确保它不会出现任何错误。
......@@ -399,7 +399,7 @@ Epoch 1/5
在本节中,我们将开发自己的家具分类器网络。 这将分为三类:沙发,床和椅子。 基本过程描述如下。
该示例的详细代码可以在 GitHub 上找到: [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter04/Chapter4_classification_visualization_custom_model%26VGG.ipynb [](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter04/Chapter4_classification_visualization_custom_model%26VGG.ipynb)
[该示例的详细代码可以在 GitHub 上找到](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter04/Chapter4_classification_visualization_custom_model%26VGG.ipynb)
请注意,在[第 6 章](../Text/6.html)*使用传递学习*的视觉搜索中,我们将执行更高级的编码,并使用相同的三个类提供详细的说明。
......@@ -437,7 +437,7 @@ num_bed_train = len(os.listdir(train_bed_dir))
# 定义火车和验证生成器
训练生成器和验证生成器使用一种称为图像数据生成和流的方法。 他们在目录上使用它输入张量图像。 有关此过程的详细信息,请参阅 Keras 文档,网址为: [https://keras.io/preprocessing/image/](https://keras.io/preprocessing/image/)
训练生成器和验证生成器使用一种称为图像数据生成和流的方法。 他们在目录上使用它输入张量图像。 有关此过程的详细信息,[请参阅 Keras 文档](https://keras.io/preprocessing/image/)
一个典型的例子如下。 如 Keras 文档中所述,图像数据生成器具有许多参数,但此处仅使用其中一些。 预处理输入将图像转换为张量。 输入旋转范围将图像旋转 90 度并垂直翻转以进行图像增强。 我们可以使用在[第 1 章](../Text/1.html)*计算机视觉和 TensorFlow 基础知识*中学习到的图像变换,并使用`rotation`命令。 图像增强可以增加训练数据集,从而在不增加测试数据量的情况下提高模型的准确性:
......@@ -459,12 +459,12 @@ model = Sequential([Conv2D(96, 11, padding='valid', activation='relu',input_shap
接下来,我们编译模型并开始训练。 编译`option`指定三个参数:
* **优化器**:我们可以使用的优化器是`adam``rmsprop``sgd``adadelta``adagrad``adamax``nadam`。 有关 Keras 优化器的列表,请参考 [https://keras.io/optimizers](https://keras.io/optimizers)
* **优化器**:我们可以使用的优化器是`adam``rmsprop``sgd``adadelta``adagrad``adamax``nadam`。 有关 Keras 优化器的列表,请参考[这里](https://keras.io/optimizers)
* `sgd`代表随机梯度下降。 顾名思义,它使用梯度值作为优化程序。
* `adam`代表自适应力矩。 它在最后一步中使用渐变来调整渐变下降参数。 亚当运作良好,几乎不需要调整。 在本书中将经常使用它。
* `adagrad`适用于稀疏数据,并且几乎不需要调整。 对于`adagrad`,不需要默认学习率。
* **损失函数**:用于图像处理的最常用损失函数是二进制交叉熵,分类交叉熵,均方误差或`sparse_categorical`交叉熵。 当分类任务是二进制时,例如处理猫和狗图像或停车标志与无停车标志图像时,将使用二进制交叉熵。 当我们有两个以上的类时(例如,配有床,椅子和沙发的家具店),将使用分类交叉熵。 稀疏分类交叉熵与分类交叉熵类似,不同之处在于,该类被其索引代替-例如,我们将传递 0、1 和 2 而不是将床,椅子和沙发作为类, 指定类时出现错误,可以使用稀疏分类交叉熵来解决此问题。 Keras 中还有许多其他损失函数。 有关更多详细信息,请参阅 [https://keras.io/losses/](https://keras.io/losses/)
* **损失函数**:用于图像处理的最常用损失函数是二进制交叉熵,分类交叉熵,均方误差或`sparse_categorical`交叉熵。 当分类任务是二进制时,例如处理猫和狗图像或停车标志与无停车标志图像时,将使用二进制交叉熵。 当我们有两个以上的类时(例如,配有床,椅子和沙发的家具店),将使用分类交叉熵。 稀疏分类交叉熵与分类交叉熵类似,不同之处在于,该类被其索引代替-例如,我们将传递 0、1 和 2 而不是将床,椅子和沙发作为类, 指定类时出现错误,可以使用稀疏分类交叉熵来解决此问题。 Keras 中还有许多其他损失函数。 有关更多详细信息,请参阅[这里](https://keras.io/losses/)
* **指标**:这些指标用于设置准确性。
在下面的代码中,我们使用`adam`优化器。 编译模型后,我们使用 Keras `model.fit()`函数开始训练。 `model.fit()`函数将序列发生器用作我们先前定义的输入图像矢量。 它还需要时期数(迭代参数),每个时期的步骤(每个时期的批次数),验证数据和验证步骤。 请注意,将在[第 6 章](../Text/6.html)*使用转移学习*的视觉搜索中详细描述每个参数:
......@@ -637,7 +637,7 @@ Inception V3 模型的验证准确性约为 99%。 如您所见,与 VGG16
前面的图像清楚地显示了当我们更深入地进入神经网络时,椅子图像如何失去锐度并变得越来越模糊。 最终图像看起来不太像椅子。 神经网络可以看到许多相似的椅子图像,并根据它们来解释椅子。
在本节中,我们描述了如何在训练过程中查看中间激活层,以了解如何在神经网络上变换特征图。 但是,如果您想了解神经网络如何将要素和隐藏层转换为输出,请参阅 TensorFlow 神经网络游乐场,网址为 [https://bit.ly/2VNfkEn](https://bit.ly/2VNfkEn)
在本节中,我们描述了如何在训练过程中查看中间激活层,以了解如何在神经网络上变换特征图。 但是,如果您想了解神经网络如何将要素和隐藏层转换为输出,请参阅 [TensorFlow 神经网络游乐场](https://bit.ly/2VNfkEn)
# 概要
......
......@@ -20,7 +20,7 @@
# AlexNet 概述
**AlexNet** 由 Alex Krizhevsky,Ilya Sutskever 和 Geoffrey E. Hinton 于 2012 年在名为*深度卷积神经网络的图像网络分类*中引入。 原始论文可以在 [http://www.cs.utoronto.ca/~ilya/pubs/2012/imgnet.pdf](http://www.cs.utoronto.ca/~ilya/pubs/2012/imgnet.pdf) 中找到。
**AlexNet** 由 Alex Krizhevsky,Ilya Sutskever 和 Geoffrey E. Hinton 于 2012 年在名为*深度卷积神经网络的图像网络分类*中引入。 原始论文可以在[这个页面](http://www.cs.utoronto.ca/~ilya/pubs/2012/imgnet.pdf)中找到。
这是首次成功引入优化的 CNN 模型,以解决有关许多类别(超过 22,000 个)中的大量图像(超过 1,500 万个)的分类的计算机视觉问题。 在 AlexNet 之前,计算机视觉问题主要是通过传统的机器学习方法解决的,该方法通过收集更大的数据集并改进模型和技术以最大程度地减少过度拟合来进行逐步改进。
......@@ -54,7 +54,7 @@ from keras.regularizers import l2
以下代码加载 CIFAR 数据集。
CIFAR 数据集( [https://www.cs.toronto.edu/~kriz/cifar.html](https://www.cs.toronto.edu/~kriz/cifar.html)具有 10 个不同的类别,每个类别有 6,000 张图像。 这些类别包括飞机,汽车,鸟类,猫,鹿,狗,青蛙,马,船和卡车。 TensorFlow 具有内置的逻辑来导入 CIFAR 数据集。
[CIFAR 数据集](https://www.cs.toronto.edu/~kriz/cifar.html)具有 10 个不同的类别,每个类别有 6,000 张图像。 这些类别包括飞机,汽车,鸟类,猫,鹿,狗,青蛙,马,船和卡车。 TensorFlow 具有内置的逻辑来导入 CIFAR 数据集。
数据集包含训练和测试图像,这些图像将用于开发模型(训练)并验证其结果(测试)。 每个数据集都有两个参数, *x**y* ,分别表示图像的宽度( *x* )和高度( *y* ):
......@@ -186,7 +186,7 @@ model.compile(loss = 'categorical_crossentropy',
# VGG16 概述
自 2012 年 AlexNet 成功以来,越来越多的研究人员致力于改进 AlexNet 的 CNN 架构以提高准确性。 焦点转移到较小的窗口大小,较小的滤镜和较小的步幅。 VGG16 是由 Karen Simonyan 和 Andrew Zisserman 于 2014 年在题为*用于大规模图像识别的*超深度卷积网络中引入的。 可以在 [https://arxiv.org/abs/1409.1556](https://arxiv.org/abs/1409.1556) 上阅读该论文。
自 2012 年 AlexNet 成功以来,越来越多的研究人员致力于改进 AlexNet 的 CNN 架构以提高准确性。 焦点转移到较小的窗口大小,较小的滤镜和较小的步幅。 VGG16 是由 Karen Simonyan 和 Andrew Zisserman 于 2014 年在题为*用于大规模图像识别的*超深度卷积网络中引入的。 可以在[这个页面](https://arxiv.org/abs/1409.1556)上阅读该论文。
在 ILSVRC-2014 中,该模型在 ImageNet 中的前五名测试准确性达到 92.7%。
......@@ -212,8 +212,8 @@ VGG16 的基本思想总结如下:
初始模型也称为 GoogLeNet。 它是由 Christian Szegedy,Wei Liu,贾阳清,Pierre Sermanet,Scott Reed,Dragmir Anguelov,Dumitru Erhan,Vincent Vanhoucke 和 Andrew Rabinovich 在名为*深入卷积*的论文中介绍的。 Inception 的名称来自 Min Lin,陈强和 Shuicheng Yan 的论文 *Network in Network* 和著名的网络模因*。我们需要更深入地研究*。 以下是指向*接收*论文和*网络中的*论文的链接:
* **初始**[https://arxiv.org/abs/1409.4842](https://arxiv.org/abs/1409.4842)
* **网络**中的网络: [https://arxiv.org/abs/1312.4400](https://arxiv.org/abs/1312.4400)
* [**Inception**](https://arxiv.org/abs/1409.4842)
* [**网络中的网络**](https://arxiv.org/abs/1312.4400)
在论文*中,在网络*中,作者没有在输入图像上使用常规的线性滤波器,而是构造了一个微神经网络,并以类似于 CNN 的方式在输入图像上滑动了该神经网络。 通过将这些层中的一些层堆叠在一起,可以构建一个深度神经网络。 微型神经网络(也称为**多层感知器**)由具有激活功能的多个完全连接的层组成,如下图所示:
......@@ -253,7 +253,7 @@ VGG16 的基本思想总结如下:
# ResNet 概述
ResNet 由何凯敏,张向宇,任少卿和孙健在题为*图像识别的深度残差学习的论文中介绍,*的目的是解决深度神经网络的精度下降问题。 。 这种降级不是由过度拟合引起的,而是由以下事实造成的:在某个临界深度之后,输出会松散输入的信息,因此输入和输出之间的相关性开始发散,从而导致精度增加。 可以在 [https://arxiv.org/abs/1512.03385](https://arxiv.org/abs/1512.03385) 中找到该论文。
ResNet 由何凯敏,张向宇,任少卿和孙健在题为*图像识别的深度残差学习的论文中介绍,*的目的是解决深度神经网络的精度下降问题。 。 这种降级不是由过度拟合引起的,而是由以下事实造成的:在某个临界深度之后,输出会松散输入的信息,因此输入和输出之间的相关性开始发散,从而导致精度增加。 可以在[这个页面](https://arxiv.org/abs/1512.03385)中找到该论文。
ResNet-34 的前五位验证错误为 5.71%,优于 BN-inception 和 VGG。 ResNet-152 的前五位验证错误为 4.49%。 由六个不同深度的模型组成的集合实现了 3.57%的前五个验证误差,并在 ILSVRC-2015 中获得了第一名。 ILSVRC 代表 ImageNet 大规模视觉识别竞赛; 它评估了 2010 年至 2017 年的目标检测和图像分类算法。
......@@ -289,9 +289,9 @@ ResNet 的主要功能描述如下:
# R-CNN 概述
**区域特定的 CNN****R-CNN** )由 Ross Girshick,Jeff Donahue,Trevor Darrell 和 Jitendra Malik 在题为*丰富特征层次结构的论文中进行了介绍,可用于精确的对象检测 和语义分割*。 它是一种简单且可扩展的对象检测算法,与 VOC2012 上的最佳结果相比,其平均平均精度提高了 30%以上。 可以在 [https://arxiv.org/abs/1311.2524](https://arxiv.org/abs/1311.2524) 阅读本文。
**区域特定的 CNN****R-CNN** )由 Ross Girshick,Jeff Donahue,Trevor Darrell 和 Jitendra Malik 在题为*丰富特征层次结构的论文中进行了介绍,可用于精确的对象检测 和语义分割*。 它是一种简单且可扩展的对象检测算法,与 VOC2012 上的最佳结果相比,其平均平均精度提高了 30%以上。 可以在[这里](https://arxiv.org/abs/1311.2524)阅读本文。
VOC 代表视觉对象类( [http://host.robots.ox.ac.uk/pascal/VOC](http://host.robots.ox.ac.uk/pascal/VOC),而 PASCAL 代表模式分析统计建模和计算学习。 从 2005 年到 2012 年,PASCAL VOC 在对象类识别方面面临挑战。 PASCAL VOC 注释广泛用于对象检测,并且使用`.xml`格式。
VOC 代表[视觉对象类](http://host.robots.ox.ac.uk/pascal/VOC),而 PASCAL 代表模式分析统计建模和计算学习。 从 2005 年到 2012 年,PASCAL VOC 在对象类识别方面面临挑战。 PASCAL VOC 注释广泛用于对象检测,并且使用`.xml`格式。
整个对象检测模型分为图像分割,基于选择性搜索的区域提议,使用 CNN 的特征提取和分类以及使用**支持向量机(SVM)**的包围盒形成,如下图所示 :
......@@ -316,7 +316,7 @@ VOC 代表视觉对象类( [http://host.robots.ox.ac.uk/pascal/VOC](http://hos
# 基于图的分割
有许多基于图的分割方法可用,但此处为 R-CNN 描述的一种方法是 Pedro Felzenszwalb 和 Daniel Huttenlocher 在题为*高效基于图的图像分割*的论文中介绍的方法。 可以在 [http://people.cs.uchicago.edu/~pff/papers/seg-ijcv.pdf](http://people.cs.uchicago.edu/~pff/papers/seg-ijcv.pdf) 上阅读该论文。
有许多基于图的分割方法可用,但此处为 R-CNN 描述的一种方法是 Pedro Felzenszwalb 和 Daniel Huttenlocher 在题为*高效基于图的图像分割*的论文中介绍的方法。 可以在[这个页面](http://people.cs.uchicago.edu/~pff/papers/seg-ijcv.pdf)上阅读该论文。
此方法涉及将图像表示为图形(在本章的 *GNN 概述*部分中提供了详细说明),然后从图形中选择边缘,其中每个像素都链接到图形中的节点,并且 通过边缘连接到相邻像素。 边缘上的权重代表像素之间的差异。 分割标准基于被边界分开的图像的相邻区域的变化程度。 通过评估阈值函数来定义边界,该阈值函数表示与相邻像素之间的强度差相比,沿着边界的像素之间的强度差。 基于区域之间边界的存在,将分割定义为粗略或精细。
......@@ -378,7 +378,7 @@ SVM 和 softmax 之间的结果差异很小,这说明与使用 SVM 的多阶
# 更快的 R-CNN 概述
R-CNN 和 Fast R-CNN 都依赖于选择性搜索方法来开发 2,000 个区域的方案,这导致每幅图像的检测速度为 2 秒,而最有效的检测方法为 0.2 秒。 任少渠,何开明,罗斯·吉尔希克和孙健写了一篇名为 *Faster R-CNN:借助区域提议网络实现实时目标检测,以提高目标检测的 R-CNN 速度和准确性的论文*。 您可以在 [https://arxiv.org/abs/1506.01497](https://arxiv.org/abs/1506.01497) 阅读本文。
R-CNN 和 Fast R-CNN 都依赖于选择性搜索方法来开发 2,000 个区域的方案,这导致每幅图像的检测速度为 2 秒,而最有效的检测方法为 0.2 秒。 任少渠,何开明,罗斯·吉尔希克和孙健写了一篇名为 *Faster R-CNN:借助区域提议网络实现实时目标检测,以提高目标检测的 R-CNN 速度和准确性的论文*。 您可以在[这里](https://arxiv.org/abs/1506.01497)阅读本文。
下图显示了更快的 R-CNN 的体系结构:
......@@ -522,7 +522,7 @@ GAN 的一些实际用例如下:
# 光谱神经网络
频谱 GNN 首先由 Joan Bruna,Wojciech Zaremba,Arthus Szlam 和 Yann LeCun 在题为*频谱网络和图上的深局部连接网络*的论文中提出。 您可以在 [https://arxiv.org/pdf/1312.6203v3.pdf](https://arxiv.org/pdf/1312.6203v3.pdf) 中找到该论文的详细信息。
频谱 GNN 首先由 Joan Bruna,Wojciech Zaremba,Arthus Szlam 和 Yann LeCun 在题为*频谱网络和图上的深局部连接网络*的论文中提出。 您可以在[这个页面](https://arxiv.org/pdf/1312.6203v3.pdf)中找到该论文的详细信息。
频谱 GNN 是傅立叶域中的卷积。 频谱 GNN 可用以下公式表示:
......@@ -578,7 +578,7 @@ GNN 层汇总了来自其邻居的特征信息,并应用 ReLU 激活,合并
由于 *Q* 学习包括对估计的动作值的最大化步长,因此它倾向于高估值。
在强化学习中,可以使用卷积网络来创建能够在复杂情况下获得积极回报的主体行为。 这个概念最早由 Mnih 等人提出。 在 2015 年发表在题为*的文章中,该文章通过深度强化学习*进行了人为控制。 可以在 [https://web.stanford.edu/class/psych209/Readings/MnihEtAlHassibis15NatureControlDeepRL.pdf](https://web.stanford.edu/class/psych209/Readings/MnihEtAlHassibis15NatureControlDeepRL.pdf) 中找到本文的详细信息。
在强化学习中,可以使用卷积网络来创建能够在复杂情况下获得积极回报的主体行为。 这个概念最早由 Mnih 等人提出。 在 2015 年发表在题为*的文章中,该文章通过深度强化学习*进行了人为控制。 可以在[这个页面](https://web.stanford.edu/class/psych209/Readings/MnihEtAlHassibis15NatureControlDeepRL.pdf)中找到本文的详细信息。
这包括三个卷积层和一个完全连接的隐藏层。 请注意,在强化学习中,卷积网络得出的解释与监督学习中得出的解释不同。 在监督学习中,CNN 用于将图像分类为不同的类别。 在强化学习中,图片代表一种状态,而 CNN 用于创建代理在该状态下执行的动作。
......
......@@ -17,7 +17,7 @@
请注意,由于我们不是在构建模型,而是将使用已构建的模型(即具有预先训练的权重的模型)来预测图像类别,因此本部分不需要培训。
本部分的代码可以在以下位置找到: [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_CNN_PretrainedModel.ipynb](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_CNN_PretrainedModel.ipynb)
[本部分的代码可以在以下位置找到](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_CNN_PretrainedModel.ipynb)
让我们深入研究代码并了解其每一行的目的。
......@@ -140,7 +140,7 @@ plt.show()
* `fig.subplots_adjust`在图像之间添加垂直空间。
* `plt.title`将标题添加到每个图像。
请注意,完整的代码可以在本书的 GitHub 链接中找到,网址为 [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_CNN_PretrainedModel。 ipynb](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_CNN_PretrainedModel.ipynb)
请注意,[完整的代码可以在本书的 GitHub 链接中找到](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_CNN_PretrainedModel.ipynb)
为了验证模型,将九张不同的图像存储在目录中,并逐个通过每个模型以生成预测。 下表显示了使用三种不同的神经网络模型对每个目标图像的最终预测输出:
......@@ -550,7 +550,7 @@ for filename in os.listdir(path):
* 通过确定欧几里得距离的最小值和余弦相似度的最大值来计算图像相似度。
* 确定并显示与最小距离相对应的图像文件。
可以在本书的 GitHub 存储库中找到包括迁移学习和可视搜索的完整代码,网址为: [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master /Chapter06/Chapter6_Transferlearning_VisualSearch.ipynb](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_Transferlearning_VisualSearch.ipynb)
[可以在本书的 GitHub 存储库中找到包括迁移学习和可视搜索的完整代码](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_Transferlearning_VisualSearch.ipynb)
下图显示了使用三种不同的模型和两种不同的搜索算法(欧几里得距离和余弦相似度)对一张床的上传图像的视觉搜索预测:
......@@ -586,7 +586,7 @@ for filename in os.listdir(path):
# 使用 tf.data 使用可视搜索输入管道
TensorFlow `tf.data` API 是一种高效的数据管道,其处理数据的速度比 Keras 数据输入过程快一个数量级。 它在分布式文件系统中聚合数据并对其进行批处理。 有关更多详细信息,请参阅[https://www.tensorflow.org/guide/data](https://www.tensorflow.org/guide/data)
TensorFlow `tf.data` API 是一种高效的数据管道,其处理数据的速度比 Keras 数据输入过程快一个数量级。 它在分布式文件系统中聚合数据并对其进行批处理。 有关更多详细信息,请参阅[这里](https://www.tensorflow.org/guide/data)
以下屏幕截图显示了`tf.data`与 Keras 图像输入过程的图像上传时间比较:
......@@ -602,9 +602,7 @@ TensorFlow `tf.data` API 是一种高效的数据管道,其处理数据的速
* `tf.image.decode_jpeg`将 JPEG 图像解码为张量(请注意,转换必须没有文件路径)。
* `tf.image.convert_image_dtype`将图像转换为 dtype float 32。
以下链接提供了更新的视觉搜索代码:
[https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_Transferlearning_VisualSearch_tfdata_tensor.ipynb](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_Transferlearning_VisualSearch_tfdata_tensor.ipynb)
[以下链接提供了更新的视觉搜索代码](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_Transferlearning_VisualSearch_tfdata_tensor.ipynb)
如前所述,该代码包含`tf.data`。 除了`tf.data`以外,它还通过在`build_final_model`中进行以下更改来解冻模型的顶部:
......
......@@ -14,7 +14,7 @@
# YOLO 概述
我们在[第 5 章](../Text/5.html)*神经网络架构和模型*中了解到,每个已发布的神经网络架构都通过学习其架构和功能,然后开发一个全新的分类器来改进前一架构,从而对其进行了改进 准确性和检测时间。 YOLO 参加了**计算机视觉和模式识别会议(CVPR)**,在 2016 年*中,Joseph Redmon,Santosh Divvala,Ross Girshick 和 Ali Farhadi 只看了一次:统一的实时对象检测* 论文 [https://arxiv.org/pdf/1506.02640.pdf](https://arxiv.org/pdf/1506.02640.pdf) 。 YOLO 是一个非常快速的神经网络,可以以每秒 45 帧(基本 YOLO)到每秒 155 帧(快速 YOLO)的惊人速度一次检测多种物体。 相比之下,大多数手机相机以每秒 30 帧的速度捕获视频,而高速相机以每秒 250 帧的速度捕获视频。 YOLO 的每秒帧数等于大约 6 到 22 ms 的检测时间。 将此与人类大脑检测大约 13 毫秒图像所需的时间进行比较-YOLO 以与人类相似的方式立即识别图像。 因此,它为机器提供了即时目标检测功能。
我们在[第 5 章](../Text/5.html)*神经网络架构和模型*中了解到,每个已发布的神经网络架构都通过学习其架构和功能,然后开发一个全新的分类器来改进前一架构,从而对其进行了改进 准确性和检测时间。 YOLO 参加了**计算机视觉和模式识别会议(CVPR)**,在 2016 年中,Joseph Redmon,Santosh Divvala,Ross Girshick 和 Ali Farhadi 的论文 [《只看一次:统一的实时对象检测》](https://arxiv.org/pdf/1506.02640.pdf)。 YOLO 是一个非常快速的神经网络,可以以每秒 45 帧(基本 YOLO)到每秒 155 帧(快速 YOLO)的惊人速度一次检测多种物体。 相比之下,大多数手机相机以每秒 30 帧的速度捕获视频,而高速相机以每秒 250 帧的速度捕获视频。 YOLO 的每秒帧数等于大约 6 到 22 ms 的检测时间。 将此与人类大脑检测大约 13 毫秒图像所需的时间进行比较-YOLO 以与人类相似的方式立即识别图像。 因此,它为机器提供了即时目标检测功能。
在进一步研究细节之前,我们将首先讨论**交集****IOU** )的概念。
......@@ -63,7 +63,7 @@ YOLO 的检测机制基于单个**卷积神经网络**( **CNN** ),该预
# YOLO v3 神经网络架构
TYOLO v3 由 Joseph Redmon 和 Ali Farhadi 于 2018 年在论文 *YOLOv3:增量改进* [https://pjreddie.com/media/files/papers/YOLOv3.pdf](https://pjreddie.com/media/files/papers/YOLOv3.pdf) 中引入。 下图显示了 YOLO v3 神经网络架构。 该网络具有 24 个卷积层和 2 个完全连接的层。 它没有任何 softmax 层。
TYOLO v3 由 Joseph Redmon 和 Ali Farhadi 于 2018 年在论文[《YOLOv3:增量改进》](https://pjreddie.com/media/files/papers/YOLOv3.pdf)中引入。 下图显示了 YOLO v3 神经网络架构。 该网络具有 24 个卷积层和 2 个完全连接的层。 它没有任何 softmax 层。
下图以图形方式说明了 YOLO v3 架构:
......@@ -201,7 +201,7 @@ YOLO v3 模型在预测方面做得很好。 即使是很远的汽车也能正
# 使用 Tiny Darknet 检测对象
Tiny Darknet 是一个小型且快速的网络,可以非常快速地检测到对象。 它的大小为 4 MB,而 Darknet 的大小为 28 MB。 您可以在 [wget](https://pjreddie.com/darknet/tiny-darknet/) [https://pjreddie.com/media/files/tiny.weights](https://pjreddie.com/darknet/tiny-darknet/) 中找到其实现的详细信息。
Tiny Darknet 是一个小型且快速的网络,可以非常快速地检测到对象。 它的大小为 4 MB,而 Darknet 的大小为 28 MB。 您可以在[这个页面](https://pjreddie.com/darknet/tiny-darknet/)中找到其实现的详细信息。
完成上述步骤后,Darknet 应该已经安装在您的 PC 上。 在终端中执行以下命令:
......@@ -270,14 +270,14 @@ data/dog.jpg: Predicted in 0.130953 seconds.
# 使用 Darknet 进行实时预测
涉及 Darknet 的预测都可以使用终端中的命令行来完成。 有关更多详细信息,请参阅 [https://pjreddie.com/darknet/yolo/](https://pjreddie.com/darknet/yolo/)
涉及 Darknet 的预测都可以使用终端中的命令行来完成。 有关更多详细信息,请参阅[这里](https://pjreddie.com/darknet/yolo/)
到目前为止,我们已经在图像上使用 Darknet 进行了推断。 在以下步骤中,我们将学习如何在视频文件上使用 Darknet 进行推理:
1. 通过在终端中键入`**cd darknet**`转到`darknet`目录(已在前面的步骤中安装)。
2. 确保已安装 OpenCV。 即使您已安装 OpenCV,它仍可能会创建一个错误标志。 使用`**sudo apt-get install libopencv-dev**`命令将 OpenCV 安装在`darknet`目录中。
3.`darknet`目录中,有一个名为`Makefile`的文件。 打开该文件,设置`OpenCV = 1`并保存。
4. 通过转到 [https://pjreddie.com/media/files/yolov3.weights](https://pjreddie.com/media/files/yolov3.weights) 从终端下载权重。
4. 通过转到[这里](https://pjreddie.com/media/files/yolov3.weights)从终端下载权重。
5. 此时,由于更改了`Makefile`,因此必须重新编译。 您可以通过在终端中键入`**make**`来执行此操作。
6. 然后,通过在终端中键入以下命令来下载视频文件:
......@@ -302,7 +302,7 @@ data/dog.jpg: Predicted in 0.130953 seconds.
通过两种机制解决了该错误:
* 更改图像尺寸。
* 将 NVIDIA CUDA 版本从 9.0 更改为 10.1。 请访问 NVIDIA 网站以更改 NVIDIA 版本( [https://docs.nvidia.com/deploy/cuda-compatibility/index.html](https://docs.nvidia.com/deploy/cuda-compatibility/index.html)
* 将 NVIDIA CUDA 版本从 9.0 更改为 10.1。 [请访问 NVIDIA 网站以更改 NVIDIA 版本](https://docs.nvidia.com/deploy/cuda-compatibility/index.html)
首先,尝试更改图像尺寸。 如果这不起作用,则检查 CUDA 版本并更新(如果您仍在使用 9.0 版)。
......@@ -432,7 +432,7 @@ Person, bicycle, car, motorbike, airplane, bus, train, truck, boat, traffic ligh
此步骤涉及为数据集中每个图像中的每个对象创建边界框坐标。 此边界框坐标通常由四个参数表示:(x,y)用于确定初始位置以及宽度和高度。 边界框可以表示为`.xml``.txt`形式。 该坐标文件也称为注释文件。 请按照以下步骤完成本节:
1. 许多图像注释软件应用程序都用于标记图像。 在面部关键点检测期间,我们已经在[第 3 章](../Text/3.html)*使用 OpenCV 和 CNN* 进行面部检测中介绍了 VGG 图像注释器。 在[第 11 章](../Text/11.html)*具有 CPU / GPU 优化功能的边缘设备深度学习*中,我们将介绍用于自动图像注释的 CVAT 工具。 在本章中,我们将介绍一个称为`labelImg`的注释工具。
2. [https://pypi.org/project/labelImg/](https://pypi.org/project/labelImg/) 下载`pypi``labelImg`注释软件。 您可以按照此处的说明为操作系统安装`labelImg`-如果有任何问题,一种简单的安装方法是在终端中键入`pip3 install lableImg`。 然后,要运行它,只需在终端中键入`labelImg`
2.[这里](https://pypi.org/project/labelImg/)下载`pypi``labelImg`注释软件。 您可以按照此处的说明为操作系统安装`labelImg`-如果有任何问题,一种简单的安装方法是在终端中键入`pip3 install lableImg`。 然后,要运行它,只需在终端中键入`labelImg`
3.`labelImg`中,在“打开目录”框中单击图像目录。 选择每个图像并通过单击 Create / RectBox 创建一个包围框,然后为包围框添加一个类名,例如`bed``chair``sofa`。 保存注释,然后单击右箭头转到下一张图像。
4. 如果图片中图像中有多个类别或同一类别的多个位置,请在每个类别周围绘制矩形。 多个类别的示例是同一图像中的汽车和行人。 同一类别内多个位置的示例是同一图像中不同位置的不同汽车。 因此,如果图像由多把椅子和一张沙发组成,则在每把椅子周围绘制矩形,并在类名称中为每张沙发分别键入`chair`,在其周围绘制一个矩形并键入`sofa`。 如果图像仅由沙发组成,则在沙发周围绘制一个矩形,并输入`sofa`作为类名。 下图说明了这一点:
......@@ -445,13 +445,13 @@ Person, bicycle, car, motorbike, airplane, bus, train, truck, boat, traffic ligh
YOLO v3 需要将注释文件另存为`.txt`文件而不是`.xml`文件。 本节介绍如何转换和排列`.txt`文件以输入模型。 有许多工具可用于此类转换-我们将在此处提及两个工具:
* `RectLabel`:具有内置的转换器,可将`.xml`文件转换为`.txt`文件。
* 命令行`xmltotxt`工具:您可以在 [https://github.com/Isabek/XmlToTxt](https://github.com/Isabek/XmlToTxt) GitHub 页面上找到此工具。
* 命令行`xmltotxt`工具:您可以在 [GitHub 页面](https://github.com/Isabek/XmlToTxt)上找到此工具。
该过程的输出将是一个包含`.jpg``.xml``.txt`文件的目录。 每个图像`.jpg`文件将具有一个对应的`.xml``.txt`文件。 您可以从目录中删除`.xml`文件,因为我们将不再需要这些文件。
# 创建合并的 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](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter07/Chapter7_yolo_combined_text.py) 获取 Python 文件。
顾名思义,此步骤涉及一个表示所有图像的`.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 文件。
以下屏幕快照显示了 Python 代码的示例输出:
......@@ -485,7 +485,7 @@ backup = backup
# 调整 YOLO 配置文件
完成这些步骤后,文件排列部分完成,我们现在将致力于优化 YOLO 配置文件中的参数。 为此,请在 Darknet `cfg`目录下打开`YOLO-VOC.cfg`并进行以下更改。 生成的代码也可以从 [https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter07/yolov3-furniture.cfg](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter07/yolov3-furniture.cfg) 下载:
完成这些步骤后,文件排列部分完成,我们现在将致力于优化 YOLO 配置文件中的参数。 为此,请在 Darknet `cfg`目录下打开`YOLO-VOC.cfg`并进行以下更改。 生成的代码也可以从[这里](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter07/yolov3-furniture.cfg)下载:
请注意,在以下部分中,我们将描述各种行号和要更改的值–这些行号对应于`YOLO-VOC.cfg`文件。
......@@ -532,7 +532,7 @@ CUDNN = 1
在终端中一一执行以下命令:
1. 下载预训练的`darknet53`模型权重以加快训练速度。 运行在终端的 [https://pjreddie.com/media/files/darknet53.conv.74](https://pjreddie.com/media/files/darknet53.conv.74) 中找到的命令。
1. 下载预训练的`darknet53`模型权重以加快训练速度。 在终端中运行[这个页面](https://pjreddie.com/media/files/darknet53.conv.74)中找到的命令。
2. 完成预训练权重的下载后,在终端中执行以下命令:
......@@ -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](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.
先完成此消息的编辑!
想要评论请 注册