提交 f967db61 编写于 作者: W wizardforcel

2020-12-06 11:44:42

上级 cb55352a
......@@ -27,7 +27,7 @@
本章中提供的代码要求:
* Python 3.5+(强烈建议使用 Anaconda 发行版( [https://www.anaconda.com/distribution/](https://www.anaconda.com/distribution/)
* Python 3.5+(强烈建议使用 [Anaconda 发行版](https://www.anaconda.com/distribution/)
* 库:
* 科学 0.19+
* NumPy 1.10+
......@@ -36,7 +36,7 @@
* Matplotlib 2.0+
* 海上 0.9+
可以在 GitHub 存储库上的 [https://github.com/PacktPublishing/HandsOn-Unsupervised-Learning-with-Python/tree/master/Chapter06](https://github.com/PacktPublishing/HandsOn-Unsupervised-Learning-with-Python/tree/master/Chapter06) 上找到示例
[可以在 GitHub 存储库上找到示例](https://github.com/PacktPublishing/HandsOn-Unsupervised-Learning-with-Python/tree/master/Chapter06)
......@@ -861,7 +861,7 @@ X_tsne = tsne.fit_transform(Xf)
t-SNE plot for the novelty detection with the wine dataset
可以看到,许多接近训练离群点的样本本身就是离群点,并且通常,几乎所有远测样本都是离群点。 但是,由于维数的减少,很难得出更多的结论。 但是,我们知道,当噪声足够小时,找到内点的可能性就很大(这是合理的结果)。 作为练习,我请读者检查一下单个化学性质(可从 [https://scikit-learn.org/stable/datasets/index.html#wine-dataset](https://scikit-learn.org/stable/datasets/index.html#wine-dataset) 获得),以及每个 他们或小组,找出哪个阈值可以将一个离群值转换为离群值(例如,回答此问题:与训练集兼容的最大酒精含量是多少?)。
可以看到,许多接近训练离群点的样本本身就是离群点,并且通常,几乎所有远测样本都是离群点。 但是,由于维数的减少,很难得出更多的结论。 但是,我们知道,当噪声足够小时,找到内点的可能性就很大(这是合理的结果)。 作为练习,我请读者检查一下[单个化学性质](https://scikit-learn.org/stable/datasets/index.html#wine-dataset),以及每个 他们或小组,找出哪个阈值可以将一个离群值转换为离群值(例如,回答此问题:与训练集兼容的最大酒精含量是多少?)。
......
此差异已折叠。
......@@ -4,7 +4,7 @@
上一章中描述的示例 TensorFlow iOS 应用程序,Simple 和 Camera 以及 Android 应用程序 TF Classify 都使用了 Inception v1 模型,该模型是 Google 公开提供的预先训练的图像分类深度神经网络模型。 该模型针对 ImageNet( [http://image-net.org](http://image-net.org) )进行了训练,ImageNet 是最大和最知名的图像数据库之一,其中有超过一千万个图像被标注为对象类别。 Inception 模型可用于将图像分类为 [http://image-net.org/challenges/LSVRC/2014/browse-synsets](http://image-net.org/challenges/LSVRC/2014/browse-synsets) 中列出的 1,000 个类别之一。 这 1000 个对象类别包括很多对象中的很多犬种。 但是,识别狗品种的准确性不是很高,约为 70%,因为模型经过训练可以识别大量对象,而不是像狗品种之类的特定对象。
上一章中描述的示例 TensorFlow iOS 应用程序,Simple 和 Camera 以及 Android 应用程序 TF Classify 都使用了 Inception v1 模型,该模型是 Google 公开提供的预先训练的图像分类深度神经网络模型。 该模型针对 [ImageNet](http://image-net.org) 进行了训练,ImageNet 是最大和最知名的图像数据库之一,其中有超过一千万个图像被标注为对象类别。 Inception 模型可用于将图像分类为[列出的 1,000 个类别之一](http://image-net.org/challenges/LSVRC/2014/browse-synsets)。 这 1000 个对象类别包括很多对象中的很多犬种。 但是,识别狗品种的准确性不是很高,约为 70%,因为模型经过训练可以识别大量对象,而不是像狗品种之类的特定对象。
如果我们想提高准确性并在使用改进模型的智能手机上构建移动应用程序怎么办,那么当我们四处走走并看到一只有趣的狗时,我们可以使用该应用程序告诉我们它是哪种狗。
......@@ -36,7 +36,7 @@
If you're unfamiliar with CNN, check out the videos and notes of one of the best resources on it, the Stanford CS231n course *CNN for Visual Recognition* ([http://cs231n.stanford.edu](http://cs231n.stanford.edu)). Another good resource on CNN is Chapter 6 of *Michael Nielsen's* online book, *Neural Networks and Deep Learning*: [http://neuralnetworksanddeeplearning.com/chap6.html#introducing_convolutional_networks](http://neuralnetworksanddeeplearning.com/chap6.html#introducing_convolutional_networks).
在接下来的两个部分中,我们将使用针对 TensorFlow 的两个最佳的经过预训练的 CNN 模型和一个犬种数据集来重新训练模型并生成更好的犬种识别模型。 第一个模型是 Inception v3,它是比 Inception v1 更准确的模型,已针对准确性进行了优化,但尺寸较大。 另一个模型是 MobileNet,它针对移动设备的大小和效率进行了优化。 TensorFlow 支持的预训练模型的详细列表位于 [https://github.com/tensorflow/models/tree/master/research/slim#pre-trained-models](https://github.com/tensorflow/models/tree/master/research/slim#pre-trained-models)
在接下来的两个部分中,我们将使用针对 TensorFlow 的两个最佳的经过预训练的 CNN 模型和一个犬种数据集来重新训练模型并生成更好的犬种识别模型。 第一个模型是 Inception v3,它是比 Inception v1 更准确的模型,已针对准确性进行了优化,但尺寸较大。 另一个模型是 MobileNet,它针对移动设备的大小和效率进行了优化。 TensorFlow 支持的预训练模型的详细列表位于[这里](https://github.com/tensorflow/models/tree/master/research/slim#pre-trained-models)
......@@ -46,7 +46,7 @@ If you're unfamiliar with CNN, check out the videos and notes of one of the best
在上一章中设置的 TensorFlow 源代码中,有一个 Python 脚本`tensorflow/examples/image_retraining/retrain.py`,可用于重新训练 Inception v3 或 MobileNet 模型。 在运行脚本以重新训练 Inception v3 模型以进行狗品种识别之前,我们需要首先下载 Stanford Dogs 数据集( [http://vision.stanford.edu/aditya86/ImageNetDogs](http://vision.stanford.edu/aditya86/ImageNetDogs), 120 个犬种的图片(您只需要在链接中下载图片,而不是注释即可)。
在上一章中设置的 TensorFlow 源代码中,有一个 Python 脚本`tensorflow/examples/image_retraining/retrain.py`,可用于重新训练 Inception v3 或 MobileNet 模型。 在运行脚本以重新训练 Inception v3 模型以进行狗品种识别之前,我们需要首先下载[斯坦福狗数据集](http://vision.stanford.edu/aditya86/ImageNetDogs), 120 个犬种的图片(您只需要在链接中下载图片,而不是注释即可)。
`~/Downloads`中解压缩下载的狗`images.tar`文件,您应该在`~/Downloads/Images`中看到文件夹列表,如以下屏幕截图所示。 每个文件夹对应一个犬种,并且包含约 150 张图像(您无需为图像提供显式标签,因为文件夹名称用于标记文件夹中包含的图像):
......@@ -244,7 +244,7 @@ bazel-bin/tensorflow/tools/graph_transforms/transform_graph
在测试中使用`label_image`脚本可以正确运行`quantized_stripped_dogs_retrained.pb``transform_dog_retrained.pb`。 但是只有第一个可以在 iOS 和 Android 应用程序中正常工作。
有关图形转换工具的详细文档,请参见其 GitHub README,网址为 [https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md。](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md)
有关图形转换工具的详细文档,请参见其 [GitHub README](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md)
......@@ -256,7 +256,7 @@ bazel-bin/tensorflow/tools/graph_transforms/transform_graph
上一节中生成的剥离和量化模型的大小仍超过 20 MB。 这是因为用于再训练的预先构建的 Inception v3 模型是大规模的深度学习模型,具有超过 2500 万个参数,并且 Inception v3 并非以移动优先为目标。
2017 年 6 月,谷歌发布了 MobileNets v1,共 16 种针对 TensorFlow 的移动优先深度学习模型。 这些模型的大小只有几 MB,具有 47 万至 424 万个参数,仍然达到了不错的精度(仅比 Inception v3 低一点)。 有关更多信息,请参见其自述文件: [https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md](https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md)
2017 年 6 月,谷歌发布了 MobileNets v1,共 16 种针对 TensorFlow 的移动优先深度学习模型。 这些模型的大小只有几 MB,具有 47 万至 424 万个参数,仍然达到了不错的精度(仅比 Inception v3 低一点)。 有关更多信息,请参见[其自述文件](https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md)
上一节中讨论的`retrain.py`脚本还支持基于 MobileNet 模型的重新训练。 只需运行如下命令:
......
......@@ -39,7 +39,7 @@ Andrej Karpathy wrote a good introduction to RCNN, "Playing around with RCNN, St
If you’re really interested in deep learning research and want to know all the details of how each detector works to decide which one to use, you should definitely read the papers of each method and try to reproduce the training process on your own. It’ll be a long but rewarding road. But if you want to take Andrej Karpathy’s advice, “don’t be a hero” (search on YouTube for “deep learning for computer vision Andrej”), then you can “take whatever works best, download a pre-trained model, potentially add/delete some parts of it, and fine-tune it on your app,” which is also the approach we’ll use here.
在开始研究哪种方法最适合 TensorFlow 之前,让我们快速了解一下数据集。 有 3 个主要的数据集用于训练对象检测:PASCAL VOC( [http://host.robots.ox.ac.uk/pascal/VOC](http://host.robots.ox.ac.uk/pascal/VOC) ),ImageNet( [http:// image -net.org](http://image-net.org) )和 Microsoft COCO( [http://cocodataset.org](http://cocodataset.org) ),它们具有的类数分别为 20、200 和 80。 TensorFlow 对象检测 API 当前支持的大多数预训练模型都在 80 级 MS COCO 数据集上进行了训练(有关预训练模型及其训练的数据集的完整列表,请参见 [https: //github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md)
在开始研究哪种方法最适合 TensorFlow 之前,让我们快速了解一下数据集。 有 3 个主要的数据集用于训练对象检测:[PASCAL VOC](http://host.robots.ox.ac.uk/pascal/VOC)[ImageNet](http://image-net.org)[Microsoft COCO](http://cocodataset.org),它们具有的类数分别为 20、200 和 80。 TensorFlow 对象检测 API 当前支持的大多数预训练模型都在 80 级 MS COCO 数据集上进行了训练(有关预训练模型及其训练的数据集的完整列表,请参见[这里](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md)
尽管我们不会从头开始进行培训,但是您会经常提到 PASCAL VOC 或 MS COCO 数据格式,以及它们涵盖的 20 或 80 个通用类,它们都是在重新训练或使用经过训练的模型时使用的。 在本章的最后部分,我们将尝试使用 VOC 训练的 YOLO 模型和 COCO 训练的模型。
......@@ -51,7 +51,7 @@ If you’re really interested in deep learning research and want to know all the
TensorFlow 对象检测 API 在其官方网站 [https://github.com/tensorflow/models/tree/master/research/object_detection](https://github.com/tensorflow/models/tree/master/research/object_detection) 上有详细记录,您一定要查看其“快速入门: Jupyter notebook for the 现成的推断”指南,快速介绍了如何在 Python 中使用良好的预训练模型进行检测。 但是那里的文档分布在许多不同的页面上,有时难以理解。 在本节和下一节中,我们将通过重组在许多地方记录的重要细节并添加更多示例和代码说明来简化官方文档,并提供有关以下内容的两个分步教程:
TensorFlow 对象检测 API 在其[官方网站](https://github.com/tensorflow/models/tree/master/research/object_detection)上有详细记录,您一定要查看其“快速入门: Jupyter notebook for the 现成的推断”指南,快速介绍了如何在 Python 中使用良好的预训练模型进行检测。 但是那里的文档分布在许多不同的页面上,有时难以理解。 在本节和下一节中,我们将通过重组在许多地方记录的重要细节并添加更多示例和代码说明来简化官方文档,并提供有关以下内容的两个分步教程:
1. 如何设置 API 并使用其预训练的模型进行现成的推断
2. 如何使用 API​​重新训练预训练模型以执行更具体的检测任务
......@@ -87,7 +87,7 @@ sudo pip install matplotlib
protoc object_detection/protos/*.proto --python_out=.
```
这将编译`object_detection/protos`目录中的所有 Protobuf,以使 TensorFlow 对象检测 API 满意。 Protobuf 或 Protocol Buffer 是一种自动序列化和检索结构化数据的方法,它比 XML 轻巧且效率更高。 您所需要做的就是编写一个描述数据结构的.proto 文件,然后使用 protoc(proto 编译器)生成自动解析和编码 protobuf 数据的代码。 注意`--python_out`参数指定了所生成代码的语言。 在本章的下一部分中,当我们讨论如何在 iOS 中使用模型时,我们将使用带有`--cpp_out`的协议编译器,因此生成的代码是 C ++。 有关协议缓冲区的完整文档,请参见 [https://developers.google.com/protocol-buffers](https://developers.google.com/protocol-buffers)
这将编译`object_detection/protos`目录中的所有 Protobuf,以使 TensorFlow 对象检测 API 满意。 Protobuf 或 Protocol Buffer 是一种自动序列化和检索结构化数据的方法,它比 XML 轻巧且效率更高。 您所需要做的就是编写一个描述数据结构的.proto 文件,然后使用 protoc(proto 编译器)生成自动解析和编码 protobuf 数据的代码。 注意`--python_out`参数指定了所生成代码的语言。 在本章的下一部分中,当我们讨论如何在 iOS 中使用模型时,我们将使用带有`--cpp_out`的协议编译器,因此生成的代码是 C ++。 有关协议缓冲区的完整文档,请参见[这里](https://developers.google.com/protocol-buffers)
4. 仍在模型/研究中,运行`export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim`,然后运行`python object_detection/builders/model_builder_test.py`以验证一切正常。
5. 启动`jupyter notebook`命令并在浏览器中打开`http://localhost:8888`。 首先单击`object_detection`,然后选择`object_detection_tutorial.ipynb`笔记本并逐个单元运行演示。
......@@ -111,7 +111,7 @@ PATH_TO_LABELS = os.path.join('data', 'mscoco_label_map.pbtxt')
NUM_CLASSES = 90
```
笔记本代码下载并使用了预训练的对象检测模型`ssd_mobilenet_v1_coco_2017_11_17`(使用 SSD 方法构建,我们在上一章中介绍的 MobileNet CNN 模型之上,在上一节中进行了简要介绍)。 TensorFlow 检测模型动物园中提供了 TensorFlow 对象检测 API 支持的预训练模型的完整列表: [https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo。 md](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md) ,并且大多数都是使用 MS COCO 数据集进行训练的。 用于推理的确切模型是`frozen_inference_graph.pb`文件(在下载的`ssd_mobilenet_v1_coco_2017_11_17.tar.gz`文件中),该模型用于现成的推理以及重新训练。
笔记本代码下载并使用了预训练的对象检测模型`ssd_mobilenet_v1_coco_2017_11_17`(使用 SSD 方法构建,我们在上一章中介绍的 MobileNet CNN 模型之上,在上一节中进行了简要介绍)。 TensorFlow 检测模型动物园中提供了 [TensorFlow 对象检测 API 支持的预训练模型的完整列表](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md),并且大多数都是使用 MS COCO 数据集进行训练的。 用于推理的确切模型是`frozen_inference_graph.pb`文件(在下载的`ssd_mobilenet_v1_coco_2017_11_17.tar.gz`文件中),该模型用于现成的推理以及重新训练。
位于`models/research/object_detection/data/mscoco_label_map.pbtxt`中的`mscoco_label_map.pbtxt`标签文件具有 90(NUM_CLASSES)个项目,用于`ssd_mobilenet_v1_coco_2017_11_17`模型可以检测到的对象类型。 它的前两个项目是:
......@@ -479,7 +479,7 @@ If you run the app, after completing the following steps, and encounter an error
需要第一个–force_load,因为它确保 TensorFlow 所需的 C ++构造函数将被链接,否则,您仍可以构建和运行该应用程序,但会遇到有关未注册会话的错误。
最后一个库用于 nsync,这是一个 C 库,可导出互斥量和其他同步方法( [https://github.com/google/nsync](https://github.com/google/nsync)。 在新的 TensorFlow 版本中引入。
最后一个库用于 nsync,这是一个 C 库,[可导出互斥量和其他同步方法](https://github.com/google/nsync)。 在新的 TensorFlow 版本中引入。
4. 搜索“标题搜索路径”,并添加以下值:
......@@ -523,7 +523,7 @@ Loading the TensorFlow object detection models in your app with the manual Tenso
1. 拖放上一节中的三个物体检测模型图`ssd_mobilenet_v1_frozen_inference_graph.pb``faster_rcnn_inceptionv2_frozen_inference_graph.pb``faster_rcnn_resnet101_frozen_inference_graph.pb`,以及`mscoco_label_map.pbtxt`标签映射文件和几个 测试图像发送到`TFObjectDetectionAPI`项目。
2. 将 TensorFlow iOS 示例简单应用程序或上一章中创建的 iOS 应用程序中的`ios_image_load.mm`及其`.h`文件添加到项目中。
3. [https://github.com/google/protobuf/releases](https://github.com/google/protobuf/releases) (在 Mac 上为`protoc-3.4.0-osx-x86_64.zip`文件)下载协议缓冲区版本 3.4.0。 要使用 TensorFlow 1.4 库需要确切的 3.4.0 版本,而更高版本的 TensorFlow 可能需要更高版本的协议缓冲区。
3.[这里](https://github.com/google/protobuf/releases)(在 Mac 上为`protoc-3.4.0-osx-x86_64.zip`文件)下载协议缓冲区版本 3.4.0。 要使用 TensorFlow 1.4 库需要确切的 3.4.0 版本,而更高版本的 TensorFlow 可能需要更高版本的协议缓冲区。
4. 假设下载的文件解压缩到`~/Downloads`目录中,请打开“终端”窗口并运行以下命令:
```py
......@@ -637,13 +637,13 @@ num_detections: 100, detection_scores size: 100, detection_classes size: 100, de
正如我们在第一部分中提到的,YOLO2( [https://pjreddie.com/darknet/yolo](https://pjreddie.com/darknet/yolo)是另一个很酷的对象检测模型,它使用了与 RCNN 系列不同的方法。 它使用单个神经网络将输入图像划分为固定大小的区域(但不像 RCNN 系列方法那样提供区域建议),并预测每个区域的边界框,类别和概率。
正如我们在第一部分中提到的,[YOLO2](https://pjreddie.com/darknet/yolo) 是另一个很酷的对象检测模型,它使用了与 RCNN 系列不同的方法。 它使用单个神经网络将输入图像划分为固定大小的区域(但不像 RCNN 系列方法那样提供区域建议),并预测每个区域的边界框,类别和概率。
TensorFlow Android 示例应用程序具有使用预训练的 YOLO 模型的示例代码,但没有 iOS 示例。 由于 YOLO2 是最快的对象检测模型之一,而且非常准确(请在其网站上查看其与 SSD 模型的 mAP 比较),因此有必要了解一下如何在 iOS 应用中使用它。
YOLO 使用称为 Darknet( [https://pjreddie.com/darknet](https://pjreddie.com/darknet) )的独特开源神经网络框架来训练其模型。 还有另一个名为 darkflow 的库( [https://github.com/thtrieu/darkflow](https://github.com/thtrieu/darkflow),该库可以将使用 Darknet 训练的 YOLO 模型的神经网络权重转换为 TensorFlow 图格式,并重新训练预训练的 楷模。
YOLO 使用称为 [Darknet](https://pjreddie.com/darknet) 的独特开源神经网络框架来训练其模型。 [还有另一个名为 darkflow 的库](https://github.com/thtrieu/darkflow),该库可以将使用 Darknet 训练的 YOLO 模型的神经网络权重转换为 TensorFlow 图格式,并重新训练预训练的 楷模。
要以 TensorFlow 格式构建 YOLO2 模型,请首先从 [https://github.com/thtrieu/darkflow 获取 darkflow 回购。](https://github.com/thtrieu/darkflow) 因为它需要 Python 3 和 TensorFlow 1.0(Python 2.7 和 TensorFlow 1.4 或更高版本也可能工作),所以我们将使用 Anaconda 来设置一个新的具有 Python 3 支持的 TensorFlow 1.0 环境:
要以 TensorFlow 格式构建 YOLO2 模型,请首先从[这里](https://github.com/thtrieu/darkflow)获取 darkflow。因为它需要 Python 3 和 TensorFlow 1.0(Python 2.7 和 TensorFlow 1.4 或更高版本也可能工作),所以我们将使用 Anaconda 来设置一个新的具有 Python 3 支持的 TensorFlow 1.0 环境:
```py
conda create --name tf1.0_p35 python=3.5
......
......@@ -24,15 +24,15 @@
使用深度神经网络将图像内容与另一种图像的样式合并的原始思想和算法发表在题为*艺术风格的神经算法*[https:// arxiv 的论文)中。 。于 2015 年夏季发布。 ]),是 2014 年 ImageNet 图像识别挑战赛的获胜者,该挑战赛具有 16 个卷积层或特征图,分别代表不同级别的图像内容。 在这种原始方法中,首先将最终传输的图像初始化为与内容图像合并的白噪声图像。 内容损失函数定义为内容图像和结果图像的卷积层 conv4_2 上都被馈入 VGG-19 网络后,特定的一组特征表示形式的平方误差损失。 样式损失函数计算样式图像和所得图像在五个不同卷积层上的总误差差。 然后,将总损失定义为内容损失和样式损失的总和。 在训练期间,损失会降到最低,并生成将一个图像的内容与另一个图像的样式混合在一起的结果图像。](https://arxiv.org/abs/1508.06576)
使用深度神经网络将图像内容与另一种图像的样式合并的原始思想和算法于 2015 年夏季发表在题为[《艺术风格的神经算法》](https://arxiv.org/abs/1508.06576)的论文中。它是 2014 年 ImageNet 图像识别挑战赛的获胜者,该挑战赛具有 16 个卷积层或特征图,分别代表不同级别的图像内容。 在这种原始方法中,首先将最终传输的图像初始化为与内容图像合并的白噪声图像。 内容损失函数定义为内容图像和结果图像的卷积层 conv4_2 上都被馈入 VGG-19 网络后,特定的一组特征表示形式的平方误差损失。 样式损失函数计算样式图像和所得图像在五个不同卷积层上的总误差差。 然后,将总损失定义为内容损失和样式损失的总和。 在训练期间,损失会降到最低,并生成将一个图像的内容与另一个图像的样式混合在一起的结果图像。
尽管原始神经样式转换算法的结果令人惊叹,但其性能却很差-训练是样式转换图像生成过程的一部分,通常在 GPU 上花费几分钟,在 CPU 上花费约一个小时才能生成良好的图像。 结果。
If you're interested in the details of the original algorithm, you can read the paper along with a well-documented Python implementation, at [https://github.com/log0/neural-style-painting/blob/master/art.py](https://github.com/log0/neural-style-painting/blob/master/art.py). We won't discuss this original algorithm as it's not feasible to run on mobile phone, but it's fun and instrumental to try it to get a better understanding of how to use a pre-trained deep CNN model for different computer vision tasks.
自然地,在 2016 年,论文中发布了一种“快三个数量级”的新算法,即*实时样式传递和超分辨率*的感知损失( [https:// cs .stanford.edu / people / jcjohns / eccv16 /](https://cs.stanford.edu/people/jcjohns/eccv16/),作者是 Justin Johnson 等。 它使用单独的训练过程,并定义了更好的损失函数,这些函数本身就是深度神经网络。 训练后(在下一节中我们将看到,在 GPU 上可能要花费几个小时),使用训练后的模型来生成样式转换的图像在计算机上几乎是实时的,而在智能手机上只需几秒钟。
自然地,在 2016 年,论文中发布了一种“快三个数量级”的新算法,即[《实时样式传递和超分辨率的感知损失》](https://cs.stanford.edu/people/jcjohns/eccv16/),作者是 Justin Johnson 等。 它使用单独的训练过程,并定义了更好的损失函数,这些函数本身就是深度神经网络。 训练后(在下一节中我们将看到,在 GPU 上可能要花费几个小时),使用训练后的模型来生成样式转换的图像在计算机上几乎是实时的,而在智能手机上只需几秒钟。
使用这种快速神经传递算法仍然有一个缺点:只能针对特定样式训练模型,因此,要在您的应用中使用不同的样式,必须逐一训练这些样式以为每种样式生成一个模型 。 2017 年发表了一篇名为*学习风格的艺术表现形式*[https://arxiv.org/abs/1610.07629](https://arxiv.org/abs/1610.07629) )的新论文,它发现一个单一的深度神经网络模型可以 概括许多不同的样式。 TensorFlow Magenta 项目( [https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization)包括具有多种样式的预训练模型,我们将在最后一部分中看到 本章的两个部分在 iOS 和 Android 应用程序中使用这种模型来产生强大而神奇的艺术效果是多么容易。
使用这种快速神经传递算法仍然有一个缺点:只能针对特定样式训练模型,因此,要在您的应用中使用不同的样式,必须逐一训练这些样式以为每种样式生成一个模型 。 2017 年发表了一篇名为[《学习风格的艺术表现形式》](https://arxiv.org/abs/1610.07629)的新论文,它发现一个单一的深度神经网络模型可以 概括许多不同的样式。 [TensorFlow Magenta 项目](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization)包括具有多种样式的预训练模型,我们将在最后一部分中看到 本章的两个部分在 iOS 和 Android 应用程序中使用这种模型来产生强大而神奇的艺术效果是多么容易。
......@@ -424,7 +424,7 @@ mHandler.sendMessage(msg);
TensorFlow Magenta 项目( [https://github.com/tensorflow/magenta](https://github.com/tensorflow/magenta) )允许您使用 10 多种经过预训练的模型来生成新的音乐和图像。 在本节和下一节中,我们将重点介绍使用 Magenta 的图像样式化模型。 您可以单击链接在计算机上安装 Magenta,尽管要在移动应用程序中使用其炫酷的图像样式传输模型,也不必安装 Magenta。 在 *2017* 中基于论文*习得的艺术风格*实现的洋红色预训练风格转换模型,消除了一个模型只能具有一种风格并允许多种风格的限制 包含在单个模型文件中,您可以选择使用这些样式的任意组合。 您可以在[上快速浏览该演示,网址为 https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization) ,但可以在此处下载两个预先训练的检查点模型。 由于检查点文件中保存了某些 NaN(不是数字)错误,因此无法直接在您的移动应用中使用。 我们不会详细说明如何删除这些数字并生成可在您的应用中使用的`.pb`模型文件(如果感兴趣,您可以查看 [https://github.com/tensorflow/ tensorflow / issues / 9678](https://github.com/tensorflow/tensorflow/issues/9678) ),我们仅使用 TensorFlow Android 示例`tensorflow/examples/android/assets`中包含的经过预训练的`stylize_quantized.pb`模型文件来查看其工作原理。
[TensorFlow Magenta 项目](https://github.com/tensorflow/magenta)允许您使用 10 多种经过预训练的模型来生成新的音乐和图像。 在本节和下一节中,我们将重点介绍使用 Magenta 的图像样式化模型。 您可以单击链接在计算机上安装 Magenta,尽管要在移动应用程序中使用其炫酷的图像样式传输模型,也不必安装 Magenta。 在 *2017* 中基于论文*习得的艺术风格*实现的洋红色预训练风格转换模型,消除了一个模型只能具有一种风格并允许多种风格的限制 包含在单个模型文件中,您可以选择使用这些样式的任意组合。 您可以在[这个页面](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization)上快速浏览该演示,但可以在此处下载两个预先训练的检查点模型。 由于检查点文件中保存了某些 NaN(不是数字)错误,因此无法直接在您的移动应用中使用。 我们不会详细说明如何删除这些数字并生成可在您的应用中使用的`.pb`模型文件(如果感兴趣,您可以查看 这里](https://github.com/tensorflow/tensorflow/issues/9678)),我们仅使用 TensorFlow Android 示例`tensorflow/examples/android/assets`中包含的经过预训练的`stylize_quantized.pb`模型文件来查看其工作原理。
如果您确实想训练自己的模型,则可以按照前面的 image_stylization 链接中的训练模型下的步骤进行。 但是请注意,您至少需要 500 GB 的可用磁盘空间才能下载 ImageNet 数据集,并需要强大的 GPU 来完成培训。 在本节或下一节中看到代码和结果之后,您更有可能对预训练的`stylize_quantized.pb`模型启用的炫酷样式转换效果感到满意。
......@@ -527,7 +527,7 @@ tensorflow::Status run_status = session->Run({{input_layer, image_tensor}, {styl
尽管 TensorFlow Android 示例应用程序已经具有使用多种样式模型的代码(实际上我们在上一节的 iOS 应用中使用了 Android 示例应用程序中的模型),但示例应用程序中与 TensorFlow 相关的代码却与 超过 600 行的`StylizeActivity.java`文件中包含很多 UI 代码。 您还可以通过 TensorFlow Android 样式转换的 Codelab( [https://codelabs.developers.google.com/codelabs/tensorflow-style-transfer-android/index.html](https://codelabs.developers.google.com/codelabs/tensorflow-style-transfer-android/index.html)进行操作,但是代码 与 TensorFlow Android 示例应用程序大致相同。 由于我们已经使用 TensorFlow 快速样式传输模型实现了 Android 应用程序的简约实现,因此很有趣的是,我们如何仅需更改几行代码就可以拥有一个强大的多样式样式传输应用程序。 这也应该是一种更直观的方法,以了解如何将出色的 TensorFlow 模型添加到现有的 Android 应用中。
尽管 TensorFlow Android 示例应用程序已经具有使用多种样式模型的代码(实际上我们在上一节的 iOS 应用中使用了 Android 示例应用程序中的模型),但示例应用程序中与 TensorFlow 相关的代码却与 超过 600 行的`StylizeActivity.java`文件中包含很多 UI 代码。 您还可以通过 TensorFlow Android 样式转换的 [Codelab](https://codelabs.developers.google.com/codelabs/tensorflow-style-transfer-android/index.html) 进行操作,但是代码 与 TensorFlow Android 示例应用程序大致相同。 由于我们已经使用 TensorFlow 快速样式传输模型实现了 Android 应用程序的简约实现,因此很有趣的是,我们如何仅需更改几行代码就可以拥有一个强大的多样式样式传输应用程序。 这也应该是一种更直观的方法,以了解如何将出色的 TensorFlow 模型添加到现有的 Android 应用中。
因此,这就是在我们之前构建的 Android 应用中使用多样式传输模型所需要的:
......
......@@ -32,14 +32,14 @@
RNN allows us to handle sequences of input and/or output, because the network, by design, has memory of previous items in an input sequence or can generate a sequence of output. This makes RNN more appropriate for speech recognition, (where the input is a sequence of words uttered by users), image captioning, (where the output is a natural language sentence consisting of a series of words), text generation, and time series prediction. If you're unfamiliar with RNN, you should definitely check out *Andrey Karpathy's* blog, *The Unreasonable Effectiveness of Recurrent Neural Networks* ([http://karpathy.github.io/2015/05/21/rnn-effectiveness](http://karpathy.github.io/2015/05/21/rnn-effectiveness)). We'll also cover some detailed RNN models later in the book.
关于 RNN 端到端语音识别的第一篇研究论文发表于 2014 年( [http://proceedings.mlr.press/v32/graves14.pdf](http://proceedings.mlr.press/v32/graves14.pdf) ),使用的是**连接主义的时间分类****CTC** )层。 2014 年下半年,百度发布了 Deep Speech( [https://arxiv.org/abs/1412.5567](https://arxiv.org/abs/1412.5567) ),这是第一个使用基于 CTC 的端到端 RNN 构建但拥有庞大数据集的商业系统之一 ,并在嘈杂的环境中实现了比传统 ASR 系统更低的错误率。 如果您有兴趣,可以查看深度语音的 TensorFlow 实现( [https://github.com/mozilla/DeepSpeech](https://github.com/mozilla/DeepSpeech),但是生成的模型会 由于此类基于 CTC 的系统存在问题,因此需要太多的资源才能在手机上运行。 在部署期间,它需要一个大型语言模型来纠正部分由 RNN 的性质引起的生成的文本错误(如果您想知道为什么,请阅读前面链接的 RNN 博客以获取一些见识)。
[关于 RNN 端到端语音识别的第一篇研究论文发表于 2014 年](http://proceedings.mlr.press/v32/graves14.pdf),使用的是**连接主义的时间分类****CTC** )层。 2014 年下半年,百度发布了 [Deep Speech](https://arxiv.org/abs/1412.5567),这是第一个使用基于 CTC 的端到端 RNN 构建但拥有庞大数据集的商业系统之一 ,并在嘈杂的环境中实现了比传统 ASR 系统更低的错误率。 如果您有兴趣,可以查看[深度语音的 TensorFlow 实现](https://github.com/mozilla/DeepSpeech),但是生成的模型会 由于此类基于 CTC 的系统存在问题,因此需要太多的资源才能在手机上运行。 在部署期间,它需要一个大型语言模型来纠正部分由 RNN 的性质引起的生成的文本错误(如果您想知道为什么,请阅读前面链接的 RNN 博客以获取一些见识)。
在 2015 年和 2016 年,较新的语音识别系统使用了类似的端到端 RNN 方法,但将 CTC 层替换为基于注意力的模型( [https://arxiv.org/pdf/1508.01211.pdf](https://arxiv.org/pdf/1508.01211.pdf),因此 运行模型时不需要大型语言模型,因此可以在内存有限的移动设备上进行部署。 在本书的此版本中,我们将不会探讨这种可能性,而将介绍如何在移动应用中使用最新的高级 ASR 模型。 相反,我们将从一个更简单的语音识别模型开始,我们知道该模型肯定会在移动设备上很好地工作。
在 2015 年和 2016 年,较新的语音识别系统使用了类似的端到端 RNN 方法,但将 CTC 层替换为[基于注意力的模型](https://arxiv.org/pdf/1508.01211.pdf),因此 运行模型时不需要大型语言模型,因此可以在内存有限的移动设备上进行部署。 在本书的此版本中,我们将不会探讨这种可能性,而将介绍如何在移动应用中使用最新的高级 ASR 模型。 相反,我们将从一个更简单的语音识别模型开始,我们知道该模型肯定会在移动设备上很好地工作。
要将离线语音识别功能添加到移动应用程序,您还可以使用以下两个领先的开源语音识别项目之一:
* CMU Sphinx( [https://cmusphinx.github.io](https://cmusphinx.github.io) )大约 20 年前开始,但仍在积极开发中。 要构建具有语音识别功能的 Android 应用,您可以使用其为 Android 构建的 PocketSphinx( [https://github.com/cmusphinx/pocketsphinx-android](https://github.com/cmusphinx/pocketsphinx-android) )。 要构建具有语音识别功能的 iOS 应用,您可以使用 OpenEars 框架( [https://www.politepix.com/openears](https://www.politepix.com/openears),这是一个免费的 SDK,使用 CMU PocketSphinx 构建离线语音识别和文本转换 在 iOS 应用中进行语音转换。
* Kaldi( [https://github.com/kaldi-asr/kaldi](https://github.com/kaldi-asr/kaldi) ),成立于 2009 年,最近非常活跃,截至 2018 年 1 月,已有 165 个参与者。要在 Android 上进行尝试,您可以 查看此博客文章: [http://jcsilva.github.io/2017/03/18/compile-kaldi-android](http://jcsilva.github.io/2017/03/18/compile-kaldi-android) 。 对于 iOS,请查看在 iOS 上使用 Kaldi 的原型: [https://github.com/keenresearch/keenasr-ios-poc](https://github.com/keenresearch/keenasr-ios-poc)
* [CMU Sphinx](https://cmusphinx.github.io) 大约 20 年前开始,但仍在积极开发中。 要构建具有语音识别功能的 Android 应用,您可以使用其为 Android 构建的 [PocketSphinx](https://github.com/cmusphinx/pocketsphinx-android)。 要构建具有语音识别功能的 iOS 应用,您可以使用 [OpenEars 框架](https://www.politepix.com/openears),这是一个免费的 SDK,使用 CMU PocketSphinx 构建离线语音识别和文本转换 在 iOS 应用中进行语音转换。
* [Kaldi](https://github.com/kaldi-asr/kaldi),成立于 2009 年,最近非常活跃,截至 2018 年 1 月,已有 165 个参与者。要在 Android 上进行尝试,您可以查看[此博客文章](http://jcsilva.github.io/2017/03/18/compile-kaldi-android)。 对于 iOS,请查看[在 iOS 上使用 Kaldi 的原型](https://github.com/keenresearch/keenasr-ios-poc)
由于这是一本关于在移动设备上使用 TensorFlow 的书,因此 TensorFlow 可用于为图像处理,语音处理和文本处理以及其他智能任务(本章其余部分的)构建强大的模型。 我们将重点介绍如何使用 TensorFlow 训练简单的语音识别模型并将其在移动应用中使用。
......@@ -51,13 +51,13 @@ RNN allows us to handle sequences of input and/or output, because the network, b
在本节中,我们将总结编写良好的 TensorFlow 简单音频识别教程( [https://www.tensorflow.org/versions/master/tutorials/audio_recognition](https://www.tensorflow.org/versions/master/tutorials/audio_recognition)中使用的步骤。 一些在训练模型时可能对您有帮助的提示。
在本节中,我们将总结[编写良好的 TensorFlow 简单音频识别教程](https://www.tensorflow.org/versions/master/tutorials/audio_recognition)中使用的步骤。 一些在训练模型时可能对您有帮助的提示。
我们将建立的简单语音命令识别模型将能够识别 10 个单词:“是”,“否”,“上”,“下”,“左”,“右”,“开”,“关” “停止”和“开始”; 它也可以检测沉默。 如果没有发现沉默,并且没有发现 10 个单词,它将生成“未知”。 稍后运行`tensorflow/example/speech_commands/train.py`脚本时,我们将下载语音命令数据集并用于训练模型,实际上除了这 10 个单词外,还包含 20 个单词:“零”,“两个”,“三个”。 ..,“十”(到目前为止,您已经看到的 20 个词称为核心词)和 10 个辅助词:“床”,“鸟”,“猫”,“狗”,“快乐”,“房子” ,“马文”,“希拉”,“树”和“哇”。 核心词比辅助词(约 1750)具有更多的`.wav`文件记录(约 2350)。
The speech commands dataset is collected from an Open Speech Recording site ([https://aiyprojects.withgoogle.com/open_speech_recording](https://aiyprojects.withgoogle.com/open_speech_recording)). You should give it a try and maybe contribute a few minutes of your own recordings to help it improve and also get a sense of how you can collect your own speech commands dataset if needed. There's also a Kaggle competition ([https://www.kaggle.com/c/tensorflow-speech-recognition-challenge](https://www.kaggle.com/c/tensorflow-speech-recognition-challenge)) on using the dataset to build a model and you can learn more about speech models and tips there.
在移动应用中要训练和使用的模型基于纸质卷积神经网络,用于小尺寸关键词发现( [http://www.isca-speech.org/archive/interspeech_2015/papers/i15_1478.pdf](http://www.isca-speech.org/archive/interspeech_2015/papers/i15_1478.pdf),这与大多数其他基于 RNN 的大规模语音识别模型不同。 基于 CNN 的语音识别模型是可能的,但很有趣,因为对于简单的语音命令识别,我们可以在短时间内将音频信号转换为图像,或更准确地说,将频谱图转换为频率 窗口期间音频信号的分布(有关使用`wav_to_spectrogram`脚本生成的示例频谱图图像,请参见本节开头的 TensorFlow 教程链接)。 换句话说,我们可以将音频信号从其原始时域表示转换为频域表示。 进行此转换的最佳算法是**离散傅立叶变换****DFT** ),**快速傅立叶变换****FFT** )只是一种有效的选择 DFT 实现的算法。
在移动应用中要训练和使用的模型基于纸质卷积神经网络,[用于小尺寸关键词发现](http://www.isca-speech.org/archive/interspeech_2015/papers/i15_1478.pdf),这与大多数其他基于 RNN 的大规模语音识别模型不同。 基于 CNN 的语音识别模型是可能的,但很有趣,因为对于简单的语音命令识别,我们可以在短时间内将音频信号转换为图像,或更准确地说,将频谱图转换为频率 窗口期间音频信号的分布(有关使用`wav_to_spectrogram`脚本生成的示例频谱图图像,请参见本节开头的 TensorFlow 教程链接)。 换句话说,我们可以将音频信号从其原始时域表示转换为频域表示。 进行此转换的最佳算法是**离散傅立叶变换****DFT** ),**快速傅立叶变换****FFT** )只是一种有效的选择 DFT 实现的算法。
As mobile developers, you probably don't need to understand DFT and FFT. But you'd better appreciate how all this model training works when used in mobile apps by knowing that behind the scenes of the TensorFlow simple speech commands model training that we're about to cover, it's the use of FFT, one of the top 10 algorithms in the 20th century, among other things of course, that makes the CNN-based speech command recognition model training possible. For a fun and intuitive tutorial on DFT, you can read this article: [http://practicalcryptography.com/miscellaneous/machine-learning/intuitive-guide-discrete-fourier-transform](http://practicalcryptography.com/miscellaneous/machine-learning/intuitive-guide-discrete-fourier-transform) .
......@@ -506,7 +506,7 @@ if(!_recorder){
[_recorder recordForDuration:1];
```
5.`AVAudioRecorderDelegate``audioRecorderDidFinishRecording`的委托方法中,我们使用 Apple 的扩展音频文件服务,该服务用于读写压缩和线性 PCM 音频文件,以加载记录的音频,并将其转换为模型所需的格式, 并将音频数据读入存储器。 我们在这里不会显示这部分代码,它主要基于此博客: [https://batmobile.blogs.ilrt.org/loading-audio-file-on-an-iphone/](https://batmobile.blogs.ilrt.org/loading-audio-file-on-an-iphone/) 。 在此处理之后,`floatInputBuffer`指向原始音频样本。 现在,我们可以将数据传递到工作线程中的`audioRecognition`方法中,并在 UI 线程中显示结果:
5.`AVAudioRecorderDelegate``audioRecorderDidFinishRecording`的委托方法中,我们使用 Apple 的扩展音频文件服务,该服务用于读写压缩和线性 PCM 音频文件,以加载记录的音频,并将其转换为模型所需的格式, 并将音频数据读入存储器。 我们在这里不会显示这部分代码,[它主要基于此博客](https://batmobile.blogs.ilrt.org/loading-audio-file-on-an-iphone/)。 在此处理之后,`floatInputBuffer`指向原始音频样本。 现在,我们可以将数据传递到工作线程中的`audioRecognition`方法中,并在 UI 线程中显示结果:
```py
dispatch_async(dispatch_get_global_queue(0, 0), ^{
......@@ -617,7 +617,7 @@ Could not create TensorFlow Graph: Not found: Op type not registered 'DecodeWav'
我们已经在前面的章节中看到了这种臭名昭著的错误,除非您知道它的真正含义,否则弄清楚该修复程序可能要花很多时间。 TensorFlow 操作由两部分组成:位于 `tensorflow/core/ops`文件夹中的称为 ops 的定义(这有点令人困惑,因为 op 既可以表示其定义,其实现,也可以表示其定义)。 和位于 `tensorflow/core/kernels`文件夹中的实现(称为内核)。 `tensorflow/contrib/makefile`文件夹中有一个名为`tf_op_files.txt`的文件,其中列出了在手动构建库时需要内置到 TensorFlow iOS 库中的操作的定义和实现。 `tf_op_files.txt`文件应该包含所有操作定义文件,如 *TensorFlow 为移动部署准备模型*[https://www.tensorflow.org/mobile/ prepare_models](https://www.tensorflow.org/mobile/prepare_models),因为它们占用的空间很小。 但从 TensorFlow 1.4 或 1.5 开始,`tf_op_files.txt`文件中并未包含所有操作的 op 定义。 因此,当我们看到“未注册操作类型”错误时,我们需要找出哪个操作定义和实现文件负责该操作。 在我们的情况下,op 类型名为`DecodeWav`。 我们可以运行以下两个 Shell 命令来获取信息:
我们已经在前面的章节中看到了这种臭名昭著的错误,除非您知道它的真正含义,否则弄清楚该修复程序可能要花很多时间。 TensorFlow 操作由两部分组成:位于 `tensorflow/core/ops`文件夹中的称为 ops 的定义(这有点令人困惑,因为 op 既可以表示其定义,其实现,也可以表示其定义)。 和位于 `tensorflow/core/kernels`文件夹中的实现(称为内核)。 `tensorflow/contrib/makefile`文件夹中有一个名为`tf_op_files.txt`的文件,其中列出了在手动构建库时需要内置到 TensorFlow iOS 库中的操作的定义和实现。 `tf_op_files.txt`文件应该包含所有操作定义文件,如[为 TensorFlow 移动部署准备模型](https://www.tensorflow.org/mobile/prepare_models),因为它们占用的空间很小。 但从 TensorFlow 1.4 或 1.5 开始,`tf_op_files.txt`文件中并未包含所有操作的 op 定义。 因此,当我们看到“未注册操作类型”错误时,我们需要找出哪个操作定义和实现文件负责该操作。 在我们的情况下,op 类型名为`DecodeWav`。 我们可以运行以下两个 Shell 命令来获取信息:
```py
$ grep 'REGISTER.*"DecodeWav"' tensorflow/core/ops/*.cc
......@@ -772,7 +772,7 @@ func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully f
}
```
如果您确实想将尽可能多的代码移植到 Swift,则可以用 Swift 替换 C 中的音频文件转换代码(请参见 [https://developer.apple.com/documentation/audiotoolbox/extended_audio_file_services](https://developer.apple.com/documentation/audiotoolbox/extended_audio_file_services) 细节)。 还有一些非官方的开源项目提供了官方 TensorFlow C ++ API 的 Swift 包装器。 但是为了简单起见和达到适当的平衡,我们将保持 TensorFlow 模型的推论,在本示例中,还将保持音频文件的读取和转换,以及在 C ++和 Objective-C 中与控制 UI 和 录音,并启动呼叫以进行音频处理和识别。
如果您确实想将尽可能多的代码移植到 Swift,[则可以用 Swift 替换 C 中的音频文件转换代码](https://developer.apple.com/documentation/audiotoolbox/extended_audio_file_services)。 还有一些非官方的开源项目提供了官方 TensorFlow C ++ API 的 Swift 包装器。 但是为了简单起见和达到适当的平衡,我们将保持 TensorFlow 模型的推论,在本示例中,还将保持音频文件的读取和转换,以及在 C ++和 Objective-C 中与控制 UI 和 录音,并启动呼叫以进行音频处理和识别。
这就是构建使用语音命令识别模型的 Swift iOS 应用所需的全部内容。 现在,您可以在 iOS 模拟器或实际设备上运行它,并看到与 Objective-C 版本完全相同的结果。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册