提交 2f6df974 编写于 作者: W wizardforcel

2021-01-02 18:13:44

上级 e0e4f59d
......@@ -149,7 +149,7 @@ Dialogflow 与 GCP 紧密集成,因此我们必须首先创建一个 Google
单击“创建代理”按钮,然后根据您的喜好填写有关代理的必要信息,其中包括代理的名称,默认语言,时区和 Google 项目名称。
如果您在此步骤之前没有使用过 GCP,则必须创建一个项目。 我们已经在 “第 6 章”,*中使用 Python* 在 Google Cloud Platform 上进行深度学习,讨论了 GCP 项目的创建。 或者,您可以简单地让 GCP 在创建代理时自动为您创建一个新项目。
如果您在此步骤之前没有使用过 GCP,则必须创建一个项目。 我们已经在 “第 6 章”,“使用 Python 在 Google Cloud Platform 上进行深度学习”中,讨论了 GCP 项目的创建。 或者,您可以简单地让 GCP 在创建代理时自动为您创建一个新项目。
# 步骤 3 –了解仪表板
......@@ -397,9 +397,9 @@ ngrok http 8000
# 使用 Django 创建测试 UI 来管理订单
我们之前在本书中使用了 Django,即在“第 8 章”,*在 Microsoft Azure 上使用 Python 进行深度学习*和“第 10 章”,*保护网络安全 带有深度学习的应用*。 因此,我们将跳过有关 Django 如何工作以及如何开始使用它的实质性细节。 让我们直接研究创建可以与您的声音进行交互的 UI!
我们之前在本书中使用了 Django,即在“第 8 章”,“在 Microsoft Azure 上使用 Python 进行深度学习”和“第 10 章”,“使用深度学习的应用保护网络安全”。 因此,我们将跳过有关 Django 如何工作以及如何开始使用它的实质性细节。 让我们直接研究创建可以与您的声音进行交互的 UI!
如果尚未在系统上安装 Django,请按照“第 8 章”,*在 Microsoft Azure 上使用 Python* 进行深度学习的 *Django Web 开发的简介*部分。 ]。
如果尚未在系统上安装 Django,请按照“第 8 章”,“在 Microsoft Azure 上使用 Python 进行深度学习”的“Django Web 开发的简介”部分。
# 第 1 步-创建 Django 项目
......@@ -700,7 +700,7 @@ Dialogflow Gateway 促进了语音 UI 和 Dialogflow 代理之间的交互。
# 步骤 4.2 –为 Dialogflow 代理项目创建服务帐户
我们先前在“第 6 章”,*使用 Python* 在 Google Cloud Platform 上进行深度学习中详细讨论了如何为 GCP 项目创建服务帐户。 为链接到 Dialogflow 代理的项目创建一个新的服务密钥,如下所示:
我们先前在“第 6 章”,“使用 Python 在 Google Cloud Platform 上进行深度学习”中详细讨论了如何为 GCP 项目创建服务帐户。 为链接到 Dialogflow 代理的项目创建一个新的服务密钥,如下所示:
![](img/ad8232d2-aff2-47bb-8654-343e8a131ef2.png)
......
......@@ -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)
拜耳过滤器通过应用去马赛克算法将原始图像转换为自然的,经过颜色处理的图像。 图像传感器由光电二极管组成,光电二极管产生与光的亮度成比例的带电光子。 光电二极管本质上是灰度的。 拜耳滤镜用于将灰度图像转换为彩色图像。 来自拜耳滤镜的彩色图像经过**图像信号处理****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)
这是一个拜耳过滤器的示例:
......
......@@ -219,7 +219,7 @@ LBP 直方图显示了类似的趋势–这是合理的,因为 LBP 是一种
![](img/bc423047-2415-499b-af4d-f2def7195590.png)
解决第一个问题的可能方法是应用高斯滤波,我们已在“第 1 章”,*计算机视觉和 TensorFlow 基本原理*中进行了研究,以抑制该模式。 下图可以看到应用高斯滤波器然后进行 LBP 的结果:
解决第一个问题的可能方法是应用高斯滤波,我们已在“第 1 章”,“计算机视觉和 TensorFlow 基本原理”中进行了研究,以抑制该模式。 下图可以看到应用高斯滤波器然后进行 LBP 的结果:
![](img/778bcbd0-5e25-4aed-b127-8214475ad655.png)
......
......@@ -336,7 +336,7 @@ plt.scatter(yvalx[6], yvaly[6], color = 'red')
plt.show()
```
请注意,对于 50 张图片,模型预测效果不是很好; 这里的想法是向您展示该过程,以便您随后可以通过收集更多图像在此代码的基础上进行构建。 随着图像数量的增加,模型精度将提高。 尝试为不同的人和不同的方向拍摄图像。 如“第 9 章”,*使用多任务深度学习*的动作识别中所述,可以将此处描述的技术扩展为与身体关键点检测一起使用。 此外,“第 11 章”,*通过 CPU / GPU 优化*在边缘设备上进行深度学习,在 Raspberry Pi 上针对 OpenVINO 提供了一个部分,其中提供了 Python 代码来预测和显示 35 个面部关键点 基于 OpenVINO 工具包预训练模型的积分。
请注意,对于 50 张图片,模型预测效果不是很好; 这里的想法是向您展示该过程,以便您随后可以通过收集更多图像在此代码的基础上进行构建。 随着图像数量的增加,模型精度将提高。 尝试为不同的人和不同的方向拍摄图像。 如“第 9 章”,“使用多任务深度学习的动作识别”中所述,可以将此处描述的技术扩展为与身体关键点检测一起使用。 此外,“第 11 章”,“通过 CPU / GPU 优化在边缘设备上进行深度学习”,在 Raspberry Pi 上针对 OpenVINO 提供了一个部分,其中提供了 Python 代码来预测和显示 35 个面部关键点 基于 OpenVINO 工具包预训练模型的积分。
# 使用 CNN 预测面部表情
......@@ -402,4 +402,4 @@ plt.show()
尽管由于各种肤色,方向,面部表情,头发颜色和光照条件而引起的复杂性,面部识别仍然是计算机视觉的成功故事。 在本章中,我们学习了面部检测技术。 对于每种技术,您都需要记住,面部检测需要大量训练有素的图像。 人脸检测已在许多视频监控应用程序中广泛使用,并且 Google,亚马逊,微软和英特尔等公司的基于云的设备和边缘设备均可使用标准 API。 我们将在“第 11 章”,*中对基于云的 API 进行了解,并在“第 4 章”中对具有 CPU / GPU 优化功能的边缘设备进行深度学习*,“图像深度学习”和 第 5 章,“神经网络架构和模型”。 在本章中,简要介绍了用于面部检测和表情分类的 CNN 模型。
在下一章中,将详细说明 CNN。 这将帮助您了解 CNN 的构造块,为何选择某些功能块以及每个块在最终对象检测指标中的作用。 之后,我们将参考 “第 3 章”,*使用 OpenCV 和 CNN 进行面部检测的示例*,以评估如何优化 CNN 参数以更好地进行面部检测。
\ No newline at end of file
在下一章中,将详细说明 CNN。 这将帮助您了解 CNN 的构造块,为何选择某些功能块以及每个块在最终对象检测指标中的作用。 之后,我们将参考 “第 3 章”,“使用 OpenCV 和 CNN 进行面部检测”的示例,以评估如何优化 CNN 参数以更好地进行面部检测。
\ No newline at end of file
......@@ -2,7 +2,7 @@
边缘检测的概念在“第 1 章”,“计算机视觉和 TensorFlow 基础知识”中进行了介绍。 在本章中,您将学习如何使用边缘检测在体积上创建卷积运算,以及不同的卷积参数(例如滤波器大小,尺寸和操作类型(卷积与池化))如何影响卷积体积(宽度与深度)。 本章将为您提供有关神经网络如何查看图像以及图像如何使用可视化对图像进行分类的非常详细的概述。 您将从建立第一个神经网络开始,然后在图像通过其不同层时对其进行可视化。 然后,您将网络模型的准确率和可视化与诸如 VGG 16 或 Inception 之类的高级网络进行比较。
请注意,本章和下一章将提供神经网络的基础理论和概念以及当今实际使用的各种模型。 但是,这个概念是如此广泛,以至于不可能将您需要了解的所有内容都放在这两章中。 因此,为了便于阅读,将为每章讨论的主题引入其他概念,从“第 6 章”,*使用转移学习*的视觉搜索开始,以防止您不得不 阅读本书时,请参考这些章节。
请注意,本章和下一章将提供神经网络的基础理论和概念以及当今实际使用的各种模型。 但是,这个概念是如此广泛,以至于不可能将您需要了解的所有内容都放在这两章中。 因此,为了便于阅读,将为每章讨论的主题引入其他概念,从“第 6 章”,“使用转移学习的视觉搜索”开始,以防止您不得不 阅读本书时,请参考这些章节。
在本章中,我们将介绍以下主题:
......@@ -72,7 +72,7 @@ CNN 的图像过滤和处理方法包括执行多种操作,所有这些操作
通常,在卷积层中,有许多执行不同类型边缘检测的滤波器。 在前面的示例中,我们有 32 个过滤器,这将导致 32 个不同的堆栈,每个堆栈由 5 x 5 层组成。
3 x 3 滤波器将在本书的其余部分中广泛用于神经网络开发。 例如,您将在 ResNet 和 Inception 层中看到大量使用它,我们将在“第 5 章”,*神经网络体系结构和模型*中进行讨论。 TensorFlow 中可以将大小为 3 x 3 的 32 个过滤器表示为`.tf.keras.layers.Conv2D(32, (3,3))`。 在本章的后面,您将学习如何将此卷积与 CNN 的其他层一起使用。
3 x 3 滤波器将在本书的其余部分中广泛用于神经网络开发。 例如,您将在 ResNet 和 Inception 层中看到大量使用它,我们将在“第 5 章”,“神经网络体系结构和模型”中进行讨论。 TensorFlow 中可以将大小为 3 x 3 的 32 个过滤器表示为`.tf.keras.layers.Conv2D(32, (3,3))`。 在本章的后面,您将学习如何将此卷积与 CNN 的其他层一起使用。
# 卷积– 1 x 1 过滤器
......@@ -92,7 +92,7 @@ CNN 的图像过滤和处理方法包括执行多种操作,所有这些操作
1 x 1 卷积在所有 128 个通道中与 5 x 5 输入层执行逐元素乘法–将其在深度维度上求和,并应用 ReLU 激活函数在 5 x 5 中创建单个点 输出表示 128 的输入深度。本质上,通过使用这种机制(卷积+整个深度的和),它会将三维体积折叠为具有相同宽度和高度的二维数组。 然后,它应用 32 个过滤器以创建 5 x 5 x 32 输出,如前所示。 这是有关 CNN 的基本概念,因此请花一些时间来确保您理解这一点。
本书将使用 1 x 1 卷积。 稍后,您将了解到池化会减小宽度,而 1 x 1 卷积会保留宽度,但可以根据需要收缩或扩展深度。 例如,您将看到在网络和 Inception 层中使用了 1 x 1 卷积(在“第 5 章”,*神经网络体系结构和模型*中。具有 1 的 32 滤波器) x 1 的卷积可以在 TensorFlow 中表示为`.tf.keras.layers.Conv2D(32, (1,1))`
本书将使用 1 x 1 卷积。 稍后,您将了解到池化会减小宽度,而 1 x 1 卷积会保留宽度,但可以根据需要收缩或扩展深度。 例如,您将看到在网络和 Inception 层中使用了 1 x 1 卷积(在“第 5 章”,“神经网络体系结构和模型”中。具有 1 的 32 滤波器) x 1 的卷积可以在 TensorFlow 中表示为`.tf.keras.layers.Conv2D(32, (1,1))`
# 汇集
......@@ -187,7 +187,7 @@ CNN 的图像过滤和处理方法包括执行多种操作,所有这些操作
# 内部协方差平移和批量归一化
在训练过程中,每层输入的分布会随着上一层的权重因子的变化而变化,从而导致训练变慢。 这是因为它要求较低的学习率和权重因子选择。 谢尔盖·艾菲(Sergey Ioffe)和克里斯汀·塞格迪(Christian Szegedy)在题为*批量归一化:通过减少内部协方差漂移*加速深度网络训练的论文中称这种现象**内部协方差漂移**。 有关详细信息,请参阅[这里](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)中找到该论文的详细信息。
麻省理工学院的 Shibani Santurkar,Dimitris Tsipras,Andrew Ilyas 和 Aleksander Madry 在其论文中详细阐述了批量规范化的优势。 可以在[这个页面](https://arxiv.org/abs/1805.11604)中找到该论文的详细信息。
该论文的作者发现,批量归一化并不能减少内部协方差漂移。 批量归一化的学习速度可以归因于归一化输入的平滑性,这归因于归一化输入而不是常规输入数据的使用,规则数据可能由于扭结,尖锐的边缘和局部最小值或最大值而具有较大的差异。 这使梯度下降算法更加稳定,从而允许它使用更大的步长以实现更快的收敛。 这样可以确保它不会出现任何错误。
......@@ -241,7 +241,7 @@ CNN 具有许多不同的参数。 训练 CNN 模型需要许多输入图像并
* **退出(DROP)**:对于退出,将丢弃 20% 的神经元。 剩余的神经元为 *1,024 * 0.8 = 820* 。 第二次删除的参数数= *820 x 820 +1 = 672401。*
* **CNN 的最后一层始终是 Softmax**:对于 Softmax,参数数= *7 x 820 +1 = 5,741*
在“第 3 章”,*使用 OpenCV 和 CNN 进行面部检测的第一张图中用于面部表情识别的神经网络类别有 7 个类别,其准确率约为 54%。*
在“第 3 章”,“使用 OpenCV 和 CNN 进行面部检测”的第一张图中,用于面部表情识别的神经网络类别有 7 个类别,其准确率约为 54%。
在以下各节中,我们将使用 TensorFlow 输出优化各种参数。 我们从基准情况开始,然后尝试通过调整此处描述的参数进行五次迭代。 该练习应该使您对 CNN 的参数以及它们如何影响最终模型的输出有很好的了解。
......@@ -401,7 +401,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)
请注意,在“第 6 章”,*使用传递学习*的视觉搜索中,我们将执行更高级的编码,并使用相同的三个类提供详细的说明。
请注意,在“第 6 章”,“使用迁移学习的视觉搜索”中,我们将执行更高级的编码,并使用相同的三个类提供详细的说明。
# 神经网络输入和参数
......@@ -453,7 +453,7 @@ train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input,rotat
model = Sequential([Conv2D(96, 11, padding='valid', activation='relu',input_shape=(img_height, img_width,3)), MaxPooling2D(),Dropout(0.2),Conv2D(256, 5, padding='same', activation='relu'),MaxPooling2D(),Conv2D(384, 3, padding='same', activation='relu'),Conv2D(384, 3, padding='same', activation='relu'), Conv2D(256, 3, padding='same', activation='relu'),MaxPooling2D(), Dropout(0.2),Conv2D(1024, 3, padding='same', activation='relu'), MaxPooling2D(),Dropout(0.2),Flatten(),Dense(4096, activation='relu'), Dense(3)])
```
该模型的基本思想与 AlexNet 相似,将在“第 5 章”,*神经网络体系结构和模型*中进行介绍。 该模型大约有 16 层。
该模型的基本思想与 AlexNet 相似,将在“第 5 章”,“神经网络体系结构和模型”中进行介绍。 该模型大约有 16 层。
# 编译和训练模型
......@@ -467,7 +467,7 @@ model = Sequential([Conv2D(96, 11, padding='valid', activation='relu',input_shap
* **损失函数**:用于图像处理的最常用损失函数是二进制交叉熵,分类交叉熵,均方误差或`sparse_categorical`交叉熵。 当分类任务是二进制时,例如处理猫和狗图像或停车标志与无停车标志图像时,将使用二进制交叉熵。 当我们有两个以上的类时(例如,配有床,椅子和沙发的家具店),将使用分类交叉熵。 稀疏分类交叉熵与分类交叉熵类似,不同之处在于,该类被其索引代替-例如,我们将传递 0、1 和 2 而不是将床,椅子和沙发作为类, 指定类时出现错误,可以使用稀疏分类交叉熵来解决此问题。 Keras 中还有许多其他损失函数。 有关更多详细信息,请参阅[这里](https://keras.io/losses/)
* **指标**:这些指标用于设置准确率。
在下面的代码中,我们使用`adam`优化器。 编译模型后,我们使用 Keras `model.fit()`函数开始训练。 `model.fit()`函数将序列发生器用作我们先前定义的输入图像矢量。 它还需要时期数(迭代参数),每个时期的步骤(每个时期的批次数),验证数据和验证步骤。 请注意,将在“第 6 章”,*使用转移学习*的视觉搜索中详细描述每个参数:
在下面的代码中,我们使用`adam`优化器。 编译模型后,我们使用 Keras `model.fit()`函数开始训练。 `model.fit()`函数将序列发生器用作我们先前定义的输入图像矢量。 它还需要时期数(迭代参数),每个时期的步骤(每个时期的批次数),验证数据和验证步骤。 请注意,将在“第 6 章”,“使用迁移学习的视觉搜索”中详细描述每个参数:
```py
model.compile(optimizer='adam',loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy'])
......@@ -594,7 +594,7 @@ for i in range(0,12):
* 我们的自定义神经网络与更高级的神经网络相比如何?
* 与我们的自定义神经网络相比,高级神经网络如何看待图像? 所有的神经网络都以相似或不同的方式看到图像吗?
为了回答这些问题,我们将针对两个高级网络 VGG16 和 InceptionV3 训练分类器,并在网络的不同层上可视化椅子图像。 “第 5 章”,*神经网络体系结构和模型*提供了网络的详细说明,而“第 6 章”,“使用转移学习的视觉搜索”,提供了代码的详细说明。 因此,在本节中,我们将只专注于可视化部分。 在完成“第 5 章”,*神经网络体系结构和模型*和“第 6 章”,*视觉搜索之后,您可能需要重新访问编码部分 转移学习*,以便您对代码有深刻的了解。 VGG 16 中的层数为 26。您可以在[上找到有关此代码的代码 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)
为了回答这些问题,我们将针对两个高级网络 VGG16 和 InceptionV3 训练分类器,并在网络的不同层上可视化椅子图像。 “第 5 章”,“神经网络体系结构和模型”提供了网络的详细说明,而“第 6 章”,“使用转移学习的视觉搜索”,提供了代码的详细说明。 因此,在本节中,我们将只专注于可视化部分。 在完成“第 5 章”,“神经网络体系结构和模型”和“第 6 章”之后,您可能需要重新访问编码部分 ,以便您对代码有深刻的了解。 VGG 16 中的层数为 26。您可以在[这个页面](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter04/Chapter4_classification_visualization_custom_model%26VGG.ipynb)上找到有关此代码的代码
请注意,前面的代码同时运行自定义网络和 VGG 16 模型。 在此练习中,请勿运行标记为自定义网络的单元,以确保仅执行 VGG16 模型。 Keras 有一个简单的 API,可以在其中导入 VGG16 或 InceptionV3 模型。 这里要注意的关键是 VGG 16 和 InceptionV3 均在具有 1,000 个类的 ImageNet 数据集上进行了训练。 但是,在这种情况下,我们将使用三个类来训练该模型,以便我们可以仅使用 VGG 16 或 Inception 模型。 Keras 将针对不兼容的形状抛出错误:`[128,1000]``[128,3]`相对,其中`128`是批量大小。 要解决此问题,请在模型定义中使用`include_top = False`,该模型将删除最后的全连接层,并仅用三个类将它们替换为我们自己的层。 同样,“第 6 章”,“使用转移学习的视觉搜索”对此进行了详细描述。 在训练 135 个步骤并验证 15 个步骤后,VGG 16 模型的验证准确率约为`0.89`
......@@ -627,7 +627,7 @@ Epoch 1/10
上图显示了 VGG 16 模型如何在前 16 层看到椅子。 请注意,与我们的自定义模型相比,VGG 16 模型效率更高,因为每一层都在执行某种类型的图像激活。 不同层的图像特征不同,但总体趋势是相同的–随着我们深入层,图像将转换为更抽象的结构。
接下来,我们使用 Inception V3 模型执行相同的练习。 在“第 6 章”,*使用转移学习*的视觉搜索中描述了此代码。 下图显示了 Inception V3 模型如何形象化椅子图像:
接下来,我们使用 Inception V3 模型执行相同的练习。 在“第 6 章”,“使用迁移学习的视觉搜索”中描述了此代码。 下图显示了 Inception V3 模型如何形象化椅子图像:
![](img/14fe515f-fe1f-4482-ae88-579c472b1b1e.png)
......
......@@ -20,7 +20,7 @@
# AlexNet 概述
**AlexNet** 由 Alex Krizhevsky,Ilya Sutskever 和 Geoffrey E. Hinton 于 2012 年在名为*深度卷积神经网络的图像网络分类*中引入。 原始论文可以在[这个页面](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 之前,计算机视觉问题主要是通过传统的机器学习方法解决的,该方法通过收集更大的数据集并改进模型和技术以最大程度地减少过度拟合来进行逐步改进。
......@@ -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)上阅读该论文。
自 2012 年 AlexNet 成功以来,越来越多的研究人员致力于改进 AlexNet 的 CNN 架构以提高准确率。 焦点转移到较小的窗口大小,较小的滤镜和较小的步幅。 VGG16 是由 Karen Simonyan 和 Andrew Zisserman 于 2014 年在《用于大规模图像识别的超深度卷积网络》中引入的。 可以在[这个页面](https://arxiv.org/abs/1409.1556)上阅读该论文。
在 ILSVRC-2014 中,该模型在 ImageNet 中的前五名测试准确率达到 92.7%。
......@@ -289,7 +289,7 @@ ResNet 的主要功能描述如下:
# R-CNN 概述
**区域特定的 CNN****R-CNN**)由 Ross Girshick,Jeff Donahue,Trevor Darrell 和 Jitendra Malik 在题为*丰富特征层次结构的论文中进行了介绍,可用于精确的对象检测 和语义分割*。 它是一种简单且可扩展的对象检测算法,与 VOC2012 上的最佳结果相比,其平均平均精度提高了 30% 以上。 可以在[这里](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),而 PASCAL 代表模式分析统计建模和计算学习。 从 2005 年到 2012 年,PASCAL VOC 在对象类识别方面面临挑战。 PASCAL VOC 注释广泛用于对象检测,并且使用`.xml`格式。
......@@ -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)阅读本文。
R-CNN 和 Fast R-CNN 都依赖于选择性搜索方法来开发 2,000 个区域的方案,这导致每幅图像的检测速度为 2 秒,而最有效的检测方法为 0.2 秒。 任少渠,何开明,罗斯·吉尔希克和孙健写了一篇名为 《Faster R-CNN:借助区域提议网络实现实时目标检测》的论文,以提高目标检测的速度和准确率。 您可以在[这里](https://arxiv.org/abs/1506.01497)阅读本文。
下图显示了更快的 R-CNN 的体系结构:
......@@ -407,7 +407,7 @@ R-CNN 和 Fast R-CNN 都依赖于选择性搜索方法来开发 2,000 个区域
* 然后将此向量输入到两个全连接层中-框回归层和框分类层。
* 区域提案总数为 21,500(60 x 40 x 9)。
为了训练 RPN,基于与训练数据重叠的**交叉相交****IoU**)为每个锚定框分配一个二进制类别标签。 IoU 用于测量对象检测的准确率。 在“第 7 章”,*使用 YOLO* 的对象检测中详细描述。 现在,您已经足够知道 IoU 是以两个边界框之间的重叠面积与其联合面积之比来衡量的。 这意味着 IOU = 1,这意味着两个完整的边界框重叠,因此您只能看到一个,而当 IoU = 0 时,这意味着两个边界框彼此完全分开。
为了训练 RPN,基于与训练数据重叠的**交叉相交****IoU**)为每个锚定框分配一个二进制类别标签。 IoU 用于测量对象检测的准确率。 在“第 7 章”,“使用 YOLO 的对象检测”中详细描述。 现在,您已经足够知道 IoU 是以两个边界框之间的重叠面积与其联合面积之比来衡量的。 这意味着 IOU = 1,这意味着两个完整的边界框重叠,因此您只能看到一个,而当 IoU = 0 时,这意味着两个边界框彼此完全分开。
二进制类级别具有正样本和负样本,它们具有以下属性:
......@@ -522,7 +522,7 @@ GAN 的一些实际用例如下:
# 光谱神经网络
频谱 GNN 首先由 Joan Bruna,Wojciech Zaremba,Arthus Szlam 和 Yann LeCun 在题为*频谱网络和图上的深局部连接网络*的论文中提出。 您可以在[这个页面](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 可用以下公式表示:
......@@ -534,7 +534,7 @@ GAN 的一些实际用例如下:
* `x`为输入信号
* `U`为标准化图拉普拉斯![](img/747421bf-3b58-478d-aae6-1ac114dcfa84.png)的特征向量矩阵
Kipf 和 Welling(在其文章*中使用图卷积网络进行半监督分类,ICLR 2017* )进一步简化了此方法,以解决诸如以下这样的过拟合问题:
Kipf 和 Welling(在其文章《使用图卷积网络进行半监督分类》中)进一步简化了此方法,以解决诸如以下这样的过拟合问题:
![](img/7eb04f21-ffdb-4a50-9c56-03cca2a0ef83.png)
......@@ -552,7 +552,7 @@ GNN 层汇总了来自其邻居的特征信息,并应用 ReLU 激活,合并
# 强化学习概述
强化学习是机器学习的一种类型,其中代理根据当前累积的奖励信号的反馈来预测奖励(或结果),从而学会在当前环境中采取行动。 由克里斯托弗·沃特金斯(Christopher Watkins)在题为*从延迟奖励中学习*的论文中介绍的`Q`-学习是强化学习中最受欢迎的算法之一。`Q`表示质量-这是在产生奖励时特定行为的价值:
强化学习是机器学习的一种类型,其中代理根据当前累积的奖励信号的反馈来预测奖励(或结果),从而学会在当前环境中采取行动。 由克里斯托弗·沃特金斯(Christopher Watkins)在题为《从延迟奖励中学习》的论文中介绍的`Q`-学习是强化学习中最受欢迎的算法之一。`Q`表示质量-这是在产生奖励时特定行为的价值:
* 在每个学习状态下,`Q`表存储状态,操作和相应奖励的值。
* 代理在`Q`表中进行搜索,以执行使长期累积奖励最大化的下一个操作。
......@@ -578,7 +578,7 @@ GNN 层汇总了来自其邻居的特征信息,并应用 ReLU 激活,合并
由于`Q`学习包括对估计的动作值的最大化步长,因此它倾向于高估值。
在强化学习中,可以使用卷积网络来创建能够在复杂情况下获得积极回报的主体行为。 这个概念最早由 Mnih 等人提出。 在 2015 年发表在题为*的文章中,该文章通过深度强化学习*进行了人为控制。 可以在[这个页面](https://web.stanford.edu/class/psych209/Readings/MnihEtAlHassibis15NatureControlDeepRL.pdf)中找到本文的详细信息。
在强化学习中,可以使用卷积网络来创建能够在复杂情况下获得积极回报的主体行为。 这个概念最早由 Mnih 等人提出,在 2015 年发表在题为《通过深度强化学习进行人为控制》的文章中。该文章可以在[这个页面](https://web.stanford.edu/class/psych209/Readings/MnihEtAlHassibis15NatureControlDeepRL.pdf)中找到本文的详细信息。
这包括三个卷积层和一个全连接隐藏层。 请注意,在强化学习中,卷积网络得出的解释与监督学习中得出的解释不同。 在监督学习中,CNN 用于将图像分类为不同的类别。 在强化学习中,图片代表一种状态,而 CNN 用于创建代理在该状态下执行的动作。
......@@ -601,7 +601,7 @@ GNN 层汇总了来自其邻居的特征信息,并应用 ReLU 激活,合并
2. 删除最后一个 softmax 层,并将 CNN 的其余部分视为新数据集的固定特征提取器。
3. 用定义自己的类数的自定义 softmax 替换 softmax 层,并使用数据集训练结果模型。
2. 微调 ConvNet。 为了减少过度拟合,请保持一些较早的层固定,并且仅微调网络的较高层部分。 正如我们在“第 4 章”,“图像深度学习”的可视化示例中所看到的那样,最后一层非常抽象,并且针对特定数据集进行了调整,因此冻结了整个模型并进行了更改 将“步骤 1”的 softmax 设置为新的 softmax 可能会导致更高的准确率。 为了提高准确率,最好从 CNN 的中间训练您的自定义图像,这样,在全连接层之前的最后几层将具有特定于您的应用程序的功能,这将导致更高的预测准确率。 在“第 6 章”,*使用转移学习*的视觉搜索中,我们将对此概念进行编码,并看到从 CNN 中部附近开始训练的准确率提高。
2. 微调 ConvNet。 为了减少过度拟合,请保持一些较早的层固定,并且仅微调网络的较高层部分。 正如我们在“第 4 章”,“图像深度学习”的可视化示例中所看到的那样,最后一层非常抽象,并且针对特定数据集进行了调整,因此冻结了整个模型并进行了更改 将“步骤 1”的 softmax 设置为新的 softmax 可能会导致更高的准确率。 为了提高准确率,最好从 CNN 的中间训练您的自定义图像,这样,在全连接层之前的最后几层将具有特定于您的应用程序的功能,这将导致更高的预测准确率。 在“第 6 章”,“使用迁移学习的视觉搜索”中,我们将对此概念进行编码,并看到从 CNN 中部附近开始训练的准确率提高。
# 概要
......
......@@ -18,7 +18,7 @@
DeepLab 于 2015 年开始使用 V1,并于 2019 年迅速移至 V3 +。下表列出了不同 DeepLab 版本的比较:
| | **DeepLab V1** | **DeepLab V2** | **DeepLab V3** | **DeepLab V3 +** |
| **论文** | *具有深度卷积网络和全连接 CRF 的语义图像分割,2015* | *DeepLab:使用深度卷积网络,Atrous 卷积和全连接 CRF 进行语义图像分割,* 2017 | *重新思考原子卷积以进行语义图像分割,* 2017 | *具有可分割卷积的语义语义分割的编解码器,* 2018 |
| **论文** | 《具有深度卷积网络和全连接 CRF 的语义图像分割》,2015 | 《DeepLab:使用深度卷积网络,Atrous 卷积和全连接 CRF 进行语义图像分割》,2017 | 《重新思考原子卷积以进行语义图像分割》,2017 | 《具有可分割卷积的语义语义分割的编解码器》,2018 |
| **作者** | 陈良杰,乔治·帕潘德里欧,Iasonas Kokkinos,凯文·墨菲和艾伦·尤里 | 陈良杰,乔治·帕潘德里欧,Iasonas Kokkinos,凯文·墨菲和艾伦·尤里 | 陈良杰,乔治·帕潘德里欧,弗洛里安·施罗夫和哈特维格·亚当 | 陈良杰,朱玉坤,乔治·帕潘德里欧,弗洛里安·施罗和哈特维格·亚当 |
| **关键概念** | 原子卷积,全连接**条件随机字段****CRF**) | **多孔空间金字塔池****ASPP**) | ASPP,图像级功能和批量规范化 | ASPP 和编码器/解码器模块 |
......@@ -26,7 +26,7 @@ DeepLabV3 +使用**空间金字塔池**(**SPP**)的概念来定义其架构
# 空间金字塔合并
我们在“第 5 章”,*神经网络体系结构和模型*中介绍的大多数 CNN 模型都需要固定的输入图像大小,这限制了输入图像的纵横比和比例。 固定大小约束不是来自卷积运算; 相反,它来自全连接层,该层需要固定的输入大小。 卷积操作从 CNN 的不同层中的图像的边缘,拐角和不同形状生成特征图。 特征图在不同的层中是不同的,并且是图像中形状的函数。 它们不会随着输入大小的变化而显着变化。 SPP 代替了最后一个合并层,紧接在全连接层之前,由并行排列的空间容器组成,其空间大小与输入图像的大小成正比,但其总数固定为全连接层数。 空间池化层通过保持过滤器大小固定但更改特征向量的大小来消除输入图像的固定大小约束。
我们在“第 5 章”,“神经网络体系结构和模型”中介绍的大多数 CNN 模型都需要固定的输入图像大小,这限制了输入图像的纵横比和比例。 固定大小约束不是来自卷积运算; 相反,它来自全连接层,该层需要固定的输入大小。 卷积操作从 CNN 的不同层中的图像的边缘,拐角和不同形状生成特征图。 特征图在不同的层中是不同的,并且是图像中形状的函数。 它们不会随着输入大小的变化而显着变化。 SPP 代替了最后一个合并层,紧接在全连接层之前,由并行排列的空间容器组成,其空间大小与输入图像的大小成正比,但其总数固定为全连接层数。 空间池化层通过保持过滤器大小固定但更改特征向量的大小来消除输入图像的固定大小约束。
DeepLabV3 的架构基于两种神经网络-Atrous 卷积和编码器/解码器网络。
......@@ -97,13 +97,13 @@ Google Colab DeepLab 笔记本包含三个示例图像,还为您提供获取 U
与 MobileNet 模型相比,对象对异常模型的预测显示出更多的改进。 与 MobileNet 模型相比,对于例外模型,可以清楚地检测出自行车,人和桌子的细分。
MobileNet 是一种有效的神经网络模型,可用于手机和边缘设备。 与常规卷积相反,它使用深度卷积。 要详细了解 MobileNet 和深度卷积,请参阅“第 11 章”,*具有 GPU / CPU 优化功能的边缘深度学习*
MobileNet 是一种有效的神经网络模型,可用于手机和边缘设备。 与常规卷积相反,它使用深度卷积。 要详细了解 MobileNet 和深度卷积,请参阅“第 11 章”,“具有 GPU / CPU 优化功能的边缘深度学习”
# 使用 DCGAN 生成人工图像
在“第 5 章”,“神经网络架构和模型”中,我们了解了 DCGAN。 它们由生成器模型和鉴别器模型组成。 生成器模型采用表示图像特征的随机矢量,并通过 CNN 生成人工图像 *G(z)*。 因此,生成器模型返回生成新图像及其类别的绝对概率 *G(z)***鉴别器**`D`)网络是二进制分类器。 它从样本概率,图像分布(p 数据)和来自生成器的人造图像中获取真实图像,以生成最终图像 *P(z)*的概率。 从真实图像分布中采样。 因此,鉴别器模型返回条件概率,即最终图像的类别来自给定分布。
在“第 5 章”,“神经网络架构和模型”中,我们了解了 DCGAN。 它们由生成器模型和鉴别器模型组成。 生成器模型采用表示图像特征的随机矢量,并通过 CNN 生成人工图像`G(z)`。 因此,生成器模型返回生成新图像及其类别的绝对概率具有可分割卷积的语义语义分割的编解码器。 **鉴别器**`D`)网络是二进制分类器。 它从样本概率,图像分布(p 数据)和来自生成器的人造图像中获取真实图像,以生成最终图像`P(z)`的概率。 从真实图像分布中采样。 因此,鉴别器模型返回条件概率,即最终图像的类别来自给定分布。
鉴别器将生成真实图像的概率信息馈送到生成器,生成器使用该信息来改进其预测,以创建人造图像 *G(z)*。 随着训练的进行,生成器会更好地创建可以欺骗鉴别器的人工图像,并且鉴别器将发现很难将真实图像与人工图像区分开。 这两个模型相互对立,因此命名为对抗网络。 当鉴别器不再能够将真实图像与人工图像分离时,模型收敛。
鉴别器将生成真实图像的概率信息馈送到生成器,生成器使用该信息来改进其预测,以创建人造图像`G(z)`。 随着训练的进行,生成器会更好地创建可以欺骗鉴别器的人工图像,并且鉴别器将发现很难将真实图像与人工图像区分开。 这两个模型相互对立,因此命名为对抗网络。 当鉴别器不再能够将真实图像与人工图像分离时,模型收敛。
GAN 训练遵循针对几个时期的鉴别器和生成器训练的替代模式,然后重复进行直到收敛为止。 在每个训练期间,其他组件保持固定,这意味着在训练发电机时,鉴别器保持固定,而在训练鉴别器时,发电机保持固定,以最大程度地减少发电机和鉴别器相互追逐的机会 。
......@@ -169,7 +169,7 @@ TensorFlow.org 有一个很好的图像修复示例,您可以在 Google Colab
OpenCV 提供了两种图像修复方法,如下所示:
* `cv.INPAINT_TELEA`基于论文*,2004 年由 Alexandru Telea 提出的一种基于快速行进方法*的图像修复技术。该方法用所有图像的归一化加权和替换待修复邻域中的像素。 附近的已知像素。 那些位于该点附近和边界轮廓上的像素将获得更大的权重。 修复像素后,将使用快速行进方法将像素移动到下一个最近的像素:
* `cv.INPAINT_TELEA`基于论文《一种基于快速行进方法的图像修复技术》,2004 年由 Alexandru Telea 提出。该方法用所有图像的归一化加权和替换待修复邻域中的像素。 附近的已知像素。 那些位于该点附近和边界轮廓上的像素将获得更大的权重。 修复像素后,将使用快速行进方法将像素移动到下一个最近的像素:
```py
import numpy as np
......@@ -182,7 +182,7 @@ cv.waitKey(0)
cv.destroyAllWindows()
```
* `cv.INPAINT_NS`基于 Bertalmio,Marcelo,Andrea L. Bertozzi 和 Guillermo Sapiro 在 2001 年发表的论文 *Navier-Stokes,流体动态以及图像和视频修补*。它连接具有相同强度的点 同时在修复区域的边界匹配梯度向量。 此方法使用流体动态算法:
* `cv.INPAINT_NS`基于 Bertalmio,Marcelo,Andrea L. Bertozzi 和 Guillermo Sapiro 在 2001 年发表的论文《Navier-Stokes,流体动态以及图像和视频修补》。它连接具有相同强度的点 同时在修复区域的边界匹配梯度向量。 此方法使用流体动态算法:
```py
import numpy as np
......@@ -210,7 +210,7 @@ cv.destroyAllWindows()
1. 选择 VGG19 网络-它具有五个卷积(Conv2D)网络,每个 Conv2D 具有四层,然后是全连接层。
2. 通过 VGG19 网络加载内容图像。
3. 预测前五个卷积。
4. 加载没有顶层的 VGG19 模型(类似于我们在“第 6 章”,*使用转移学习*的视觉搜索中所做的工作),并列出该层的名称。
4. 加载没有顶层的 VGG19 模型(类似于我们在“第 6 章”,“使用迁移学习的视觉搜索”中所做的工作),并列出该层的名称。
5. VGG19 中的卷积层具有特征提取功能,而全连接层执行分类任务。 如果没有顶层,则网络将仅具有顶层五个卷积层。 从前面的章节中我们知道,初始层传达原始图像的输入像素,而最终层捕捉图像的定义特征和图案。
6. 这样,图像的内容就由中间特征图表示–在这种情况下,这是第五个卷积块。
......
......@@ -17,7 +17,7 @@
# OpenPose 背后的理论
OpenPose 是第一个针对图像或视频中的多个人的开源实时二维姿态估计系统。 它主要由**卡内基梅隆大学****CMU**)的学生和教职员工开发。 论文的标题是 *OpenPose:使用零件亲和力字段进行实时多人 2D 姿势估计*,作者是 Zhe Cao,Gines Hidalgo,Tomas Simon,Shih-En-Wei 和 Yaser Sheikh。 您可以在[这个页面](https://arxiv.org/abs/1812.08008)上找到该论文。
OpenPose 是第一个针对图像或视频中的多个人的开源实时二维姿态估计系统。 它主要由**卡内基梅隆大学****CMU**)的学生和教职员工开发。 论文的标题是《OpenPose:使用零件亲和力字段进行实时多人 2D 姿势估计》,作者是 Zhe Cao,Gines Hidalgo,Tomas Simon,Shih-En-Wei 和 Yaser Sheikh。 您可以在[这个页面](https://arxiv.org/abs/1812.08008)上找到该论文。
请注意,OpenPose 首次出现在 CVPR 2017 中,题目为*,使用部分相似性字段*进行实时多人 2D 姿势估计,可在[中找到 https://arxiv.org/abs /1611.08050](https://arxiv.org/abs/1611.08050) 。 接下来是 2018 年的论文 *OpenPose:使用零件相似性字段的实时多人 2D 姿势估计*,网络得到了进一步改善。
......@@ -35,7 +35,7 @@ OpenPose 是第一个针对图像或视频中的多个人的开源实时二维
* 置信度图是特定特征(身体部位)可以位于任何给定像素中的概率的二维表示。 另一方面,特征图表示 CNN 给定层中给定过滤器的输出图。
* 网络体系结构由几个 1 x 1 和 3 x 3 内核组成。 每个 3 x 3 内核的输出是串联的。
* OpenPose 是第一个实时多人系统,使用三个独立的 CNN 块检测 135 个关键点:(a)身体和脚部检测,(b)手部检测和(c)人脸检测。
* 在对象检测讨论(“第 5 章”,*神经网络体系结构和模型*和“第 7 章”,*使用 YOLO* 进行对象检测)中,我们 发现,与诸如 SSD 或 YOLO 等单次检测方法相比,诸如 Faster R-CNN 之类的区域提议方法可带来更高的准确率,但速度却更低。 同样,对于人体姿势估计,自下而上的方法与自下而上的方法相比,具有较高的准确率,但速度较低。 自上而下的方法分别为每个由人组成的边界框提供图像。 自下而上的方法提供了由一个人的多个边界框组成的整个图像,从而产生了一个较小分辨率的人的图像。
* 在对象检测讨论(“第 5 章”,“神经网络体系结构和模型”和“第 7 章”,*使用 YOLO* 进行对象检测)中,我们 发现,与诸如 SSD 或 YOLO 等单次检测方法相比,诸如 Faster R-CNN 之类的区域提议方法可带来更高的准确率,但速度却更低。 同样,对于人体姿势估计,自下而上的方法与自下而上的方法相比,具有较高的准确率,但速度较低。 自上而下的方法分别为每个由人组成的边界框提供图像。 自下而上的方法提供了由一个人的多个边界框组成的整个图像,从而产生了一个较小分辨率的人的图像。
在 2019 年,OpenPose 的作者以及其他一些人(Gines Hidalgo,Yaadhav Raaj,Haroon Idrees,Donglai Xiang,Hanbyul Joo,Tomas Simon1 和 Yaser Sheikh)提高了 OpenPose 的准确率和检测时间。 HTG0]单网络全身姿势估计。 您可以在[这个页面](https://arxiv.org/abs/1909.13423)上找到本文。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册