提交 78d6a186 编写于 作者: W wizardforcel

2020-12-09 10:45:36

上级 cdcf9fb5
......@@ -677,7 +677,7 @@ Graphical representation of the contingency matrix
![](img/539ec0a2-ed36-460b-818d-07dd652d1fc2.png)
集合`ν(x[i])`是一个以`x[i]`为中心的球,包括所有距离小于或等于的样本`R`。 另外,也可以只计算最接近的`k`个邻居,即更接近`x[i]``k`个样本(通常, 该集合是`ν(x[i])`的子集,但当`k`非常大)。 该过程很简单,但不幸的是,从计算的角度来看太昂贵了。 实际上,对于每个查询,有必要计算`M^2``N`维距离(即,假设每距离`N`个运算) ,复杂度为`O(NM^2)`,这是使暴力破解方法遭受维度诅咒的条件。 例如,在`N = 2``M = 1,000` 的情况下,复杂度为`O(2 * 10^6)`,但是当`N = 1,000``M = 10,000`时,其变为`O(10^11)`。 例如,如果每个操作需要 1 纳秒,那么查询将需要 100 秒,这在许多实际情况下超出了可容忍的限制。 此外,对于 64 位浮点值,成对距离矩阵每次计算将需要约 764 MB,再次考虑到任务的性质,这可能是一个过多的请求。
集合`ν(x[i])`是一个以`x[i]`为中心的球,包括所有距离小于或等于的样本`R`。 另外,也可以只计算最接近的`k`个邻居,即更接近`x[i]``k`个样本(通常, 该集合是`ν(x[i])`的子集,但当`k`非常大)。 该过程很简单,但不幸的是,从计算的角度来看太昂贵了。 实际上,对于每个查询,有必要计算`M^2``N`维距离(即,假设每距离`N`个运算) ,复杂度为`O(NM^2)`,这是使暴力破解方法遭受维度诅咒的条件。 例如,在`N = 2``M = 1,000` 的情况下,复杂度为`O(2 * 10^6)`,但是当`N = 1,000``M = 10,000`时,其变为`O(10^11)`。 例如,如果每个操作需要 1 纳秒,那么查询将需要 100 秒,这在许多实际情况下超出了可容忍的限制。 此外,对于 64 位浮点值,成对距离矩阵每次计算将需要约 764MB,再次考虑到任务的性质,这可能是一个过多的请求。
由于这些原因,仅当`M`非常小时并且在所有其他情况下都依赖于稍微复杂的结构时,KNN 具体实现才使用蛮力搜索。 第一种替代方法基于 **kd 树**,这是将二叉树自然扩展到多维数据集的方法。
......
......@@ -283,7 +283,7 @@ open tf_benchmark_example.xcworkspace
`tensorflow/examples/android`中有四个样本 TensorFlow Android 应用,分别为 TF 分类,TF 检测,TF 语音和 TF 风格化。 运行这些示例的最简单方法是使用 Android Studio 在前面的文件夹中打开项目,如“设置 Android Studio”部分中所示,然后通过编辑项目的`build.gradle`文件进行单个更改 并将`def nativeBuildSystem = 'bazel'`更改为`def nativeBuildSystem = 'none'`
现在,将 Android 设备连接到您的计算机,然后通过选择 Android Studio 的`Run | Run 'android'`构建,安装和运行该应用。这会在您的设备上安装四个名称为“TF 分类”,“TF 检测”,“TF 语音”和“TF 风格化”的 Android 应用。 “TF 分类”就像 iOS 相机应用程序一样,使用 TensorFlow Inception v1 模型对设备相机进行实时对象分类。 “TF 检测”使用另一种模型,称为**单发多检测器****SSD**)和 MobileNet,这是 Google 发布的一组新的深度学习模型,专门针对移动和嵌入式设备, 要执行对象检测,请在检测到的对象上绘制矩形。 “TF 语音”使用另一种不同的深度学习(语音识别)模型来收听和识别一小部分单词,例如`Yes``No``Left``Right``Stop``Start`。 “TF 风格化”使用另一种模型来更改相机看到的图像样式。 有关这些应用程序的更多详细信息,您可以在[这个页面](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android)中查看 TensorFlow Android 示例文档。
现在,将 Android 设备连接到您的计算机,然后通过选择 Android Studio 的`Run | Run 'android'`构建,安装和运行该应用。这会在您的设备上安装四个名称为“TF 分类”,“TF 检测”,“TF 语音”和“TF 风格化”的 Android 应用。 “TF 分类”就像 iOS 相机应用程序一样,使用 TensorFlow Inception v1 模型对设备相机进行实时对象分类。 “TF 检测”使用另一种模型,称为**单发多检测器****SSD**)和 MobileNet,这是 Google 发布的一组新的深度学习模型,专门针对移动和嵌入式设备, 要执行对象检测,请在检测到的对象上绘制矩形。 “TF 语音”使用另一种不同的深度学习(语音识别)模型来收听和识别一小部分单词,例如`Yes``No``Left``Right``Stop``Start`。 “TF 风格化”使用另一种模型来更改相机看到的图像样式。 有关这些应用程序的更多详细信息,您可以在[这个页面](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android)中查看 TensorFlow Android 示例文档。
......
......@@ -180,7 +180,7 @@ Out[5]: [u'final_result']
请注意,由于无法保证节点的顺序,因此此代码段并不总是有效,但它通常会为您提供所需的信息或验证。
现在,我们准备讨论如何进一步修改重新训练的模型,以便可以在移动设备上部署和运行它。 重新训练的模型文件`dog_retrained.pb`的大小太大,大约 80 MB,在部署到移动设备之前,应该经过两个步骤进行优化:
现在,我们准备讨论如何进一步修改重新训练的模型,以便可以在移动设备上部署和运行它。 重新训练的模型文件`dog_retrained.pb`的大小太大,大约 80MB,在部署到移动设备之前,应该经过两个步骤进行优化:
1. **去除未使用的节点**:删除模型中仅在训练期间使用但在推理期间不需要的节点。
2. **量化模型**:将模型参数的所有 32 位浮点数转换为 8 位值。 这样可以将模型大小减小到其原始大小的 25%,同时保持推理精度大致相同。
......@@ -254,7 +254,7 @@ bazel-bin/tensorflow/tools/graph_transforms/transform_graph
上一节中生成的剥离和量化模型的大小仍超过 20 MB。 这是因为用于再训练的预先构建的 Inception v3 模型是大规模的深度学习模型,具有超过 2500 万个参数,并且 Inception v3 并非以移动优先为目标。
上一节中生成的剥离和量化模型的大小仍超过 20MB。 这是因为用于再训练的预先构建的 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)
......@@ -269,7 +269,7 @@ python tensorflow/examples/image_retraining/retrain.py
--architecture mobilenet_1.0_224
```
生成的标签文件`dog_retrained_labels_mobilenet.txt`实际上与使用 Inception v3 模型进行再训练期间生成的标签文件相同。 `--architecture`参数指定 16 个 MobileNet 模型之一,而值`mobilenet_1.0_224`表示使用模型大小为 1.0 的模型(对于其他参数,其他三个可能的值分别为 0.75、0.50 和 0.25 – 1.0,准确但 最大尺寸,反之为 0.25)和 224 作为图像输入尺寸(其他三个值分别为 192、160 和 128)。 如果将`_quantized`添加到架构值的末尾,即`--architecture mobilenet_1.0_224_quantized`,则模型也将被量化,从而导致重新训练的模型大小约为 5.1 MB。 非量化模型的大小约为 17 MB。
生成的标签文件`dog_retrained_labels_mobilenet.txt`实际上与使用 Inception v3 模型进行再训练期间生成的标签文件相同。 `--architecture`参数指定 16 个 MobileNet 模型之一,而值`mobilenet_1.0_224`表示使用模型大小为 1.0 的模型(对于其他参数,其他三个可能的值分别为 0.75、0.50 和 0.25 – 1.0,准确但 最大尺寸,反之为 0.25)和 224 作为图像输入尺寸(其他三个值分别为 192、160 和 128)。 如果将`_quantized`添加到架构值的末尾,即`--architecture mobilenet_1.0_224_quantized`,则模型也将被量化,从而导致重新训练的模型大小约为 5.1MB。 非量化模型的大小约为 17MB。
您可以按以下步骤测试先前使用`label_image`生成的模型:
......
......@@ -6,7 +6,7 @@
对象检测比上一章中讨论的图像分类迈出了一步。 图像分类仅返回图像的类别标签,而对象检测返回图像中标识的对象列表以及每个标识对象的边界框。 现代的对象检测算法使用深度学习来构建可用于检测和定位单个图像中各种对象的模型。 在过去的几年中,更快,更准确的对象检测算法相继问世.2017 年 6 月,谷歌发布了 TensorFlow 对象检测 API,该 API 集成了几种领先的对象检测算法。
在本章中,我们将首先简要概述对象检测:创建有效的深度学习模型进行对象检测,然后使用该模型进行推理的过程。 然后,我们将详细讨论 TensorFlow 对象检测 API 的工作原理,如何使用其多个模型进行推理以及如何使用自己的数据集对其进行重新训练。 然后,我们将向您展示如何在 iOS 应用中使用预先训练的对象检测模型以及重新训练的模型。 我们将介绍一些强大的技巧,使您可以手动构建自定义的 TensorFlow iOS 库,以解决使用 TensorFlow pod 的问题; 这将帮助您准备好处理本书其余部分中介绍的任何受 TensorFlow 支持的模型。 在本章中,我们将不提供用于对象检测的 Android 示例应用程序,因为 TensorFlow 源代码已经附带了一个很好的示例,可以使用 TensorFlow 对象检测预训练模型以及 YOLO 模型进行操作。 我们将在本章最后介绍。 我们将向您展示如何在 iOS 应用中使用另一种领先的物体检测模型 YOLO v2。 总而言之,我们将在本章中介绍以下主题:
在本章中,我们将首先简要概述对象检测:创建有效的深度学习模型进行对象检测,然后使用该模型进行推理的过程。 然后,我们将详细讨论 TensorFlow 对象检测 API 的工作原理,如何使用其多个模型进行推理以及如何使用自己的数据集对其进行重新训练。 然后,我们将向您展示如何在 iOS 应用中使用预先训练的对象检测模型以及重新训练的模型。 我们将介绍一些强大的技巧,使您可以手动构建自定义的 TensorFlow iOS 库,以解决使用 TensorFlow Pod 的问题; 这将帮助您准备好处理本书其余部分中介绍的任何受 TensorFlow 支持的模型。 在本章中,我们将不提供用于对象检测的 Android 示例应用程序,因为 TensorFlow 源代码已经附带了一个很好的示例,可以使用 TensorFlow 对象检测预训练模型以及 YOLO 模型进行操作。 我们将在本章最后介绍。 我们将向您展示如何在 iOS 应用中使用另一种领先的物体检测模型 YOLO v2。 总而言之,我们将在本章中介绍以下主题:
* 物体检测:快速概述
* 设置 TensorFlow 对象检测 API
......@@ -27,13 +27,13 @@
2014 年,提出了一种最新的对象检测器,该对象检测器使用称为 RCNN(具有 CNN 特征的区域)的标记对象检测数据集对 AlexNet 进行了训练,与传统的检测方法相比,它在准确性上有了很大的提高。 RCNN 结合了一种称为区域提议的技术,该技术可生成大约 2,000 个可能的区域候选者,并在每个这些区域上运行 CNN 以进行分类和边界框预测。 然后,将这些结果合并以生成检测结果。 RCNN 的训练过程非常复杂,耗时数天,推理速度也很慢,在 GPU 上的图像上花费了将近一分钟。
自从提出 RCNN 以来,性能更好的对象检测算法接 came 而来:快速 RCNN,更快的 RCNN,YOLO(您只看一次),SSD(单发多盒检测器)和 YOLO v2。
自从提出 RCNN 以来,性能更好的对象检测算法纷至沓来:快速 RCNN,更快的 RCNN,YOLO(您只看一次),SSD(单发多框检测器)和 YOLO v2。
Andrej Karpathy wrote a good introduction to RCNN, "Playing around with RCNN, State of the Art Object Detector” in 2014 ([https://cs.stanford.edu/people/karpathy/rcnn](https://cs.stanford.edu/people/karpathy/rcnn)). There's a nice video lecture, “Spatial Localization and Detection", as part of Stanford’s CS231n course by Justin Johnson, on object detection, with details on RCNN, Fast RCNN, Faster RCNN, and YOLO. SSD is described in detail at [https://github.com/weiliu89/caffe/tree/ssd](https://github.com/weiliu89/caffe/tree/ssd). And the cool YOLO2 website is [https://pjreddie.com/darknet/yolo](https://pjreddie.com/darknet/yolo).
快速 RCNN 通过首先在整个输入图像上而不是数千个建议的区域上应用 CNN,然后处理区域建议,从而显着改善了训练过程和推理时间(10 小时的训练和 2.x 秒的推理)。 更快的 RCNN 通过使用区域建议网络进一步将推理速度提高到了实时(0.2 秒),因此在训练后,不再需要耗时的区域建议过程。
与 RCNN 检测系列不同,SSD 和 YOLO 都是单发方法,这意味着它们将单个 CNN 应用于完整的输入图像,而无需使用区域建议和区域分类。 这使这两种方法都非常快,它们的平均平均精度( mAP )约为 80%,优于 Faster RCNN。
与 RCNN 检测系列不同,SSD 和 YOLO 都是单发方法,这意味着它们将单个 CNN 应用于完整的输入图像,而无需使用区域建议和区域分类。 这使这两种方法都非常快,它们的平均平均精度(mAP)约为 80%,优于 Faster RCNN。
如果这是您第一次听说这些方法,则可能会感到有些迷茫。 但是,作为对使用 AI 增强移动应用程序功能感兴趣的开发人员,您无需了解设置深度神经网络架构和训练对象检测模型的所有细节; 您应该只知道如何使用以及(如果需要)重新训练经过预先训练的模型,以及如何在 iOS 和 Android 应用中使用经过预先训练或重新训练的模型。
......@@ -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)上有详细记录,您一定要查看其“快速入门: Jupyter 笔记本 for the 现成的推断”指南,快速介绍了如何在 Python 中使用良好的预训练模型进行检测。 但是那里的文档分布在许多不同的页面上,有时难以理解。 在本节和下一节中,我们将通过重组在许多地方记录的重要细节并添加更多示例和代码说明来简化官方文档,并提供有关以下内容的两个分步教程:
TensorFlow 对象检测 API 在其[官方网站](https://github.com/tensorflow/models/tree/master/research/object_detection)上有详细记录,您一定要查看其“快速入门:用于现成的推断的 Jupyter 笔记本”指南,快速介绍了如何在 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)
这将编译`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`笔记本并逐个单元运行演示。
......@@ -113,7 +113,7 @@ 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),并且大多数都是使用 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`模型可以检测到的对象类型。 它的前两个项目是:
位于`models/research/object_detection/data/mscoco_label_map.pbtxt`中的`mscoco_label_map.pbtxt`标签文件具有 90(`NUM_CLASSES`)个项目,用于`ssd_mobilenet_v1_coco_2017_11_17`模型可以检测到的对象类型。 它的前两个项目是:
```py
item {
......@@ -216,7 +216,7 @@ image_np_expanded = np.expand_dims(image_np, axis=0)
![](img/0df3a5c2-f983-4921-a901-b14c262d34a4.png)Figure 3.1 Detected objects with bounding boxes and confidence scores
*在 iOS* 中使用对象检测模型部分,我们将了解如何在 iOS 设备上使用相同的模型并绘制相同的检测结果。
“在 iOS 中使用对象检测模型”部分,我们将了解如何在 iOS 设备上使用相同的模型并绘制相同的检测结果。
您还可以在前面提到的 Tensorflow 检测模型 Zoo 中测试其他预训练模型。 例如,如果使用`faster_rcnn_inception_v2_coco`模型,将`object_detection_tutorial.ipynb`笔记本中的`MODEL_NAME = 'ssd_mobilenet_v1_coco_2017_11_17'`替换为`MODEL_NAME = ' faster_rcnn_inception_v2_coco_2017_11_08'`(可从 TensorFlow 检测模型 Zoo 页面的 URL 或`MODEL_NAME = ' faster_rcnn_resnet101_coco_2017_11_08'`中获得),则可以看到类似内容 其他两个基于 Faster RCNN 的模型的检测结果,但是它们花费的时间更长。
......@@ -227,7 +227,7 @@ Found 1 possible inputs: (name=image_tensor, type=uint8(4), shape=[?,?,?,3])
Found 4 possible outputs: (name=detection_boxes, op=Identity) (name=detection_scores, op=Identity) (name=detection_classes, op=Identity) (name=num_detections, op=Identity)
```
通常,与其他大型的基于 Inception 或 Resnet-CNN 的大型模型相比,基于 MobileNet 的模型速度最快,但准确性较低(的 mAP 值较小)。 顺便说一下,下载的`ssd_mobilenet_v1_coco, faster_rcnn_inception_v2_coco_2017_11_08``faster_rcnn_resnet101_coco_2017_11_08`文件的大小分别为 76 MB,149 MB 和 593 MB。 稍后我们将看到,在移动设备上,基于 MobileNet 的模型(例如`ssd_mobilenet_v1_coco`)运行速度要快得多,有时,大型模型(例如`faster_rcnn_resnet101_coco_2017_11_08`)只会在较旧的 iPhone 上崩溃。 希望您可以使用基于 MobileNet 的模型,经过重新训练的 MobileNet 模型或将来可以提供更高准确性的`ssd_mobilenet`的将来版本解决问题,尽管`ssd_mobilenet`的 v1 已经足够好 许多用例。
通常,与其他大型的基于 Inception 或 Resnet-CNN 的大型模型相比,基于 MobileNet 的模型速度最快,但准确性较低(mAP 值较小)。 顺便说一下,下载的`ssd_mobilenet_v1_coco, faster_rcnn_inception_v2_coco_2017_11_08``faster_rcnn_resnet101_coco_2017_11_08`文件的大小分别为 76MB,149MB 和 593MB。 稍后我们将看到,在移动设备上,基于 MobileNet 的模型(例如`ssd_mobilenet_v1_coco`)运行速度要快得多,有时,大型模型(例如`faster_rcnn_resnet101_coco_2017_11_08`)只会在较旧的 iPhone 上崩溃。 希望您可以使用基于 MobileNet 的模型,经过重新训练的 MobileNet 模型或将来可以提供更高准确性的`ssd_mobilenet`的将来版本解决问题,尽管`ssd_mobilenet`的 v1 已经足够好 许多用例。
......
......@@ -77,7 +77,7 @@ python evaluate.py --checkpoint checkpoints \
--out-path examples/content/dog-output.jpg
```
6. 运行以下命令以构建一个 TensorFlow 图形文件,该文件将图形定义和检查点中的权重结合在一起。 这将创建一个大约 6.7 MB 的`.pb`文件:
6. 运行以下命令以构建一个 TensorFlow 图形文件,该文件将图形定义和检查点中的权重结合在一起。 这将创建一个大约 6.7MB 的`.pb`文件:
```py
python freeze.py --model_folder=checkpoints_ios --output_graph fst_frozen.pb
......@@ -426,7 +426,7 @@ mHandler.sendMessage(msg);
[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`模型启用的炫酷样式转换效果感到满意。
如果您确实想训练自己的模型,则可以按照前面的 image_stylization 链接中的训练模型下的步骤进行。 但是请注意,您至少需要 500GB 的可用磁盘空间才能下载 ImageNet 数据集,并需要强大的 GPU 来完成训练。 在本节或下一节中看到代码和结果之后,您更有可能对预训练的`stylize_quantized.pb`模型启用的炫酷样式转换效果感到满意。
在本章前面创建的 iOS 应用中,执行以下步骤来使用和运行多样式模型:
......
......@@ -72,7 +72,7 @@ python tensorflow/examples/speech_commands/train.py
您可以使用许多参数:`--wanted_words`默认为以“ yes”开头的 10 个核心词; 您可以使用此参数添加更多可以被模型识别的单词。 要训​​练自己的语音命令数据集,请使用`--data_url --data_dir=<path_to_your_dataset>`禁用语音命令数据集的下载并访问您自己的数据集,其中每个命令应命名为自己的文件夹,其中应包含 1000-2000 个音频剪辑,大约需要 1 秒钟 长; 如果音频片段更长,则可以相应地更改`--clip_duration_ms`参数值。 有关更多详细信息,请参见`train.py`源代码和 TensorFlow 简单音频识别教程。
3. 如果您接受`train.py`的所有默认参数,则在下载 1.48 GB 语音命令数据集之后,在 GTX-1070 GPU 驱动的 Ubuntu 上,完成 18,000 个步骤的整个训练大约需要 90 分钟。 训练完成后,您应该在`/tmp/speech_commands_train`文件夹内看到检查点文件的列表,以及`conv.pbtxt`图形定义文件和名为`conv_labels.txt`的标签文件,其中包含命令列表(与命令列表相同)。 `--wanted_words`参数是默认值或设置为,在文件的开头加上两个附加词“ _silence”和“ _unknown”):
3. 如果您接受`train.py`的所有默认参数,则在下载 1.48GB 语音命令数据集之后,在 GTX-1070 GPU 驱动的 Ubuntu 上,完成 18,000 个步骤的整个训练大约需要 90 分钟。 训练完成后,您应该在`/tmp/speech_commands_train`文件夹内看到检查点文件的列表,以及`conv.pbtxt`图形定义文件和名为`conv_labels.txt`的标签文件,其中包含命令列表(与命令列表相同)。 `--wanted_words`参数是默认值或设置为,在文件的开头加上两个附加词“ _silence”和“ _unknown”):
```py
-rw-rw-r-- 1 jeff jeff 75437 Dec 9 21:08 conv.ckpt-18000.meta
......@@ -396,7 +396,7 @@ runOnUiThread(new Runnable() {
![](img/bc4d09f3-f7d6-47fa-91f5-d0130635da7c.png)Figure 5.3 Showing the recognized speech commands
整个识别过程几乎立即完成,用于识别的`speech_commands_graph.pb`模型仅为 3.7 MB。 当然,它仅支持 10 条语音命令,但是即使使用`train.py`脚本的 `--wanted_words`参数或您自己的数据集支持数十个命令,大小也不会发生太大变化,正如我们在训练部分中讨论的那样。
整个识别过程几乎立即完成,用于识别的`speech_commands_graph.pb`模型仅为 3.7MB。 当然,它仅支持 10 条语音命令,但是即使使用`train.py`脚本的 `--wanted_words`参数或您自己的数据集支持数十个命令,大小也不会发生太大变化,正如我们在训练部分中讨论的那样。
诚然,此处的应用屏幕截图并不像上一章中那样生动有趣(一张图片价值一千个单词),但是语音识别当然可以做艺术家不能做的事情,例如发出语音命令来控制 机器人的运动。
......
......@@ -72,7 +72,7 @@ The gradient concept is used in the back propagation process to update network w
MSCOCO_DIR="${HOME}/im2txt/data/mscoco"
```
请注意,尽管 2014 年要下载和保存的原始数据集约为 20 GB,但该数据集将转换为 TFRecord 格式(,我们还在 第 3 章 “检测对象及其位置”来转换对象检测数据集,这是运行以下训练脚本所需的,并添加了大约 100 GB 数据。 因此,使用 TensorFlow im2txt 项目总共需要约 140 GB 的训练自己的图像字幕模型。
请注意,尽管 2014 年要下载和保存的原始数据集约为 20GB,但该数据集将转换为 TFRecord 格式(,我们还在 第 3 章 “检测对象及其位置”来转换对象检测数据集,这是运行以下训练脚本所需的,并添加了大约 100GB 数据。 因此,使用 TensorFlow im2txt 项目总共需要约 140GB 的训练自己的图像字幕模型。
2. 转到您的 im2txt 源代码所在的位置,然后下载并处理 MSCOCO 数据集:
......@@ -138,7 +138,7 @@ ls -lt $MODEL_DIR/train
-rw-rw-r-- 1 jeff jeff 4812699 Feb 6 14:27 graph.pbtxt
```
您可以告诉每 10 分钟生成一组检查点文件(`model.ckpt-109068.*``model.ckpt-109332.*``model.ckpt-109587.*`)。 `graph.pbtxt`是模型的图形定义文件(以文本格式),`model.ckpt-??????.meta`文件还包含模型的图形定义,以及特定检查点的其他一些元数据,例如`model.ckpt-109587.data-00000-of-00001`(请注意, 大小几乎为 150 MB,因为所有网络参数都保存在此处)。
您可以告诉每 10 分钟生成一组检查点文件(`model.ckpt-109068.*``model.ckpt-109332.*``model.ckpt-109587.*`)。 `graph.pbtxt`是模型的图形定义文件(以文本格式),`model.ckpt-??????.meta`文件还包含模型的图形定义,以及特定检查点的其他一些元数据,例如`model.ckpt-109587.data-00000-of-00001`(请注意, 大小几乎为 150MB,因为所有网络参数都保存在此处)。
5. 测试字幕生成,如下所示:
......
......@@ -48,7 +48,7 @@ If you don't have a good understanding of all these details, don't worry; to dev
训练模型非常简单,但为移动部署准备模型则有些棘手。 在我们开始训练之前,请首先确保您已经在 TensorFlow 根目录中克隆了 [TensorFlow 模型库](https://github.com/tensorflow/models),就像我们在前两章中所做的一样。 然后从[这里](http://download.tensorflow.org/data/quickdraw_tutorial_dataset_v1.tar.gz)下载图纸分类训练数据集,大约 1.1 GB,创建一个名为`rnn_tutorial_data`的新文件夹, 并解压缩`dataset tar.gz`文件。 您将看到 10 个训练 TFRecord 文件和 10 个评估 TFRecord 文件,以及两个带有`.classes`扩展名的文件,它们具有相同的内容,并且只是该数据集可用于分类的 345 个类别的纯文本,例如 如“绵羊”,“头骨”,“甜甜圈”和“苹果”。
训练模型非常简单,但为移动部署准备模型则有些棘手。 在我们开始训练之前,请首先确保您已经在 TensorFlow 根目录中克隆了 [TensorFlow 模型库](https://github.com/tensorflow/models),就像我们在前两章中所做的一样。 然后从[这里](http://download.tensorflow.org/data/quickdraw_tutorial_dataset_v1.tar.gz)下载图纸分类训练数据集,大约 1.1GB,创建一个名为`rnn_tutorial_data`的新文件夹, 并解压缩`dataset tar.gz`文件。 您将看到 10 个训练 TFRecord 文件和 10 个评估 TFRecord 文件,以及两个带有`.classes`扩展名的文件,它们具有相同的内容,并且只是该数据集可用于分类的 345 个类别的纯文本,例如 如“绵羊”,“头骨”,“甜甜圈”和“苹果”。
......@@ -282,7 +282,7 @@ bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
`tensorflow/contrib/makefile/Makefile`打开 Makefile,然后,如果您使用 TensorFlow 1.4,则搜索`IOS_ARCH`。 对于每种架构(总共 5 种:ARMV7,ARMV7S,ARM64,I386,X86_64),将`-D__ANDROID_TYPES_SLIM__` 更改为
`-D__ANDROID_TYPES_FULL__`。 TensorFlow 1.5(或 1.6 / 1.7)中的`Makefile`稍有不同,尽管它仍位于同一文件夹中。 对于 1.5 / 1.6 / 1.7,搜索`ANDROID_TYPES_SLIM`并将其更改为 `ANDROID_TYPES_FULL`。 现在,通过运行`tensorflow/contrib/makefile/build_all_ios.sh`重建 TensorFlow 库。 此后,在加载模型文件时,`RefSwitch`错误将消失。 使用 TensorFlow 库构建并具有完整数据类型支持的应用程序大小约为 70 MB,而使用默认的细长数据类型构建的应用程序大小为 37 MB。
`-D__ANDROID_TYPES_FULL__`。 TensorFlow 1.5(或 1.6 / 1.7)中的`Makefile`稍有不同,尽管它仍位于同一文件夹中。 对于 1.5 / 1.6 / 1.7,搜索`ANDROID_TYPES_SLIM`并将其更改为 `ANDROID_TYPES_FULL`。 现在,通过运行`tensorflow/contrib/makefile/build_all_ios.sh`重建 TensorFlow 库。 此后,在加载模型文件时,`RefSwitch`错误将消失。 使用 TensorFlow 库构建并具有完整数据类型支持的应用程序大小约为 70MB,而使用默认的细长数据类型构建的应用程序大小为 37MB。
好像还不够,仍然发生另一个模型加载错误:
......
......@@ -264,7 +264,7 @@ python tensorflow/python/tools/freeze_graph.py \
--input_binary=true
```
11. 生成的`pix2pix.pb`模型文件很大,约为 217 MB,将其加载到 iOS 或 Android 设备上时会崩溃或导致**内存不足****OOM**)错误。 我们必须像在第 6 章,“使用自然语言描述图像”的复杂 im2txt 模型中所做的那样,将其转换为 iOS 的映射格式。
11. 生成的`pix2pix.pb`模型文件很大,约为 217MB,将其加载到 iOS 或 Android 设备上时会崩溃或导致**内存不足****OOM**)错误。 我们必须像在第 6 章,“使用自然语言描述图像”的复杂 im2txt 模型中所做的那样,将其转换为 iOS 的映射格式。
```py
bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
......@@ -284,7 +284,7 @@ bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
`pix2pix_transformed_memmapped.pb`模型文件现在可以在 iOS 中使用。
12. 要为 Android 构建模型,我们需要量化冻结的模型,以将模型大小从 217 MB 减少到约 54 MB:
12. 要为 Android 构建模型,我们需要量化冻结的模型,以将模型大小从 217MB 减少到约 54MB:
```py
bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
......
......@@ -78,16 +78,16 @@ open simple.xcworkspace
您可以查看 Xcode `tflite_camera_example`项目的`CameraExampleViewController.mm`文件和`tflite_simple_example` `RunModelViewController.mm`文件中的源代码,以了解如何使用 TensorFlow Lite API 加载和运行 TensorFlow Lite 模型。 在逐步指导您如何创建新的 iOS 应用并向其添加 TensorFlow Lite 支持以运行预先构建的 TensorFlow Lite 模型的逐步教程之前,我们将快速以具体数字向您展示的好处之一 如前所述,使用 TensorFlow Lite-应用程序二进制大小:
位于`tensorflow/examples/ios/camera`文件夹中的`tf_camera_example` TensorFlow Mobile 示例应用程序中使用的`tensorflow_inception.graph.pb`模型文件为 95.7 MB,而`mobilenet_quant_v1_224.tflite` TensorFlow Lite 模型文件 位于`tensorflow/contrib/lite/examples/ios/camera` 文件夹中的 `tflite_camera_example` TensorFlow Lite 示例应用程序中使用的仅 4.3 MB。 TensorFlow Mobile 重新训练的 Inception 3 模型文件的量化版本,如我们在第 2 章,“通过迁移学习对图像进行分类”的 HelloTensorFlow 应用中所见,约为 22.4 MB,并且 重新训练的 MobileNet TensorFlow Mobile 模型文件为 17.6 MB。 总之,以下列出了四种不同类型的模型的大小:
位于`tensorflow/examples/ios/camera`文件夹中的`tf_camera_example` TensorFlow Mobile 示例应用程序中使用的`tensorflow_inception.graph.pb`模型文件为 95.7MB,而`mobilenet_quant_v1_224.tflite` TensorFlow Lite 模型文件 位于`tensorflow/contrib/lite/examples/ios/camera` 文件夹中的 `tflite_camera_example` TensorFlow Lite 示例应用程序中使用的仅 4.3MB。 TensorFlow Mobile 重新训练的 Inception 3 模型文件的量化版本,如我们在第 2 章,“通过迁移学习对图像进行分类”的 HelloTensorFlow 应用中所见,约为 22.4MB,并且 重新训练的 MobileNet TensorFlow Mobile 模型文件为 17.6MB。 总之,以下列出了四种不同类型的模型的大小:
* TensorFlow Mobile Inception 3 模型:95.7 MB
* 量化和重新训练的 TensorFlow Mobile Inception 3 模型:22.4 MB
* 训练有素的 TensorFlow Mobile MobileNet 1.0 224 模型:17.6 MB
* TensorFlow Lite MobileNet 1.0 224 型号:4.3 MB
* TensorFlow Mobile Inception 3 模型:95.7MB
* 量化和重新训练的 TensorFlow Mobile Inception 3 模型:22.4MB
* 训练有素的 TensorFlow Mobile MobileNet 1.0 224 模型:17.6MB
* TensorFlow Lite MobileNet 1.0 224 型号:4.3MB
如果在 iPhone 上安装并运行这两个应用程序,则从 iPhone 的设置中将看到 `tflite_camera_example`的应用程序大小约为 18.7 MB,`tf_camera_example`的大小约为 44.2 MB。
如果在 iPhone 上安装并运行这两个应用程序,则从 iPhone 的设置中将看到 `tflite_camera_example`的应用程序大小约为 18.7MB,`tf_camera_example`的大小约为 44.2MB。
的确,Inception 3 模型的准确性比 MobileNet 模型要高,但是在许多使用情况下,可以忽略很小的准确性差异。 另外,不可否认,如今的移动应用程序很容易占用数十 MB 的空间,在某些用例中,应用程序大小相差 20 或 30 MB 听起来并不大,但是在较小的嵌入式设备中,大小会更加敏感,如果 我们可以以更快的速度和更小的尺寸获得几乎相同的精度,而不会遇到太多麻烦,对于用户而言,这永远是一件好事。
的确,Inception 3 模型的准确性比 MobileNet 模型要高,但是在许多使用情况下,可以忽略很小的准确性差异。 另外,不可否认,如今的移动应用程序很容易占用数十 MB 的空间,在某些用例中,应用程序大小相差 20 或 30MB 听起来并不大,但是在较小的嵌入式设备中,大小会更加敏感,如果 我们可以以更快的速度和更小的尺寸获得几乎相同的精度,而不会遇到太多麻烦,对于用户而言,这永远是一件好事。
......
......@@ -35,7 +35,7 @@
* [USHONK USB 微型扬声器](https://www.amazon.com/gp/product/B075M7FHM1)约合 12 美元,可以播放合成声音。
* [Arducam 5 Megapixels 1080p 传感器 OV5647 微型相机](https://www.amazon.com/gp/product/B012V1HEP4)约合 14 美元,以支持图像分类。
* [16 GB MicroSD 和适配器](https://www.amazon.com/gp/product/B00TDBLTWK),价格约为 10 美元,用于存储 Raspbian(Raspberry Pi 的官方操作系统)的安装文件,并用作 安装后的硬盘驱动器。
* [16GB MicroSD 和适配器](https://www.amazon.com/gp/product/B00TDBLTWK),价格约为 10 美元,用于存储 Raspbian(Raspberry Pi 的官方操作系统)的安装文件,并用作 安装后的硬盘驱动器。
* 一个 USB 磁盘,例如 [SanDisk 32GB USB Drive](https://www.amazon.com/gp/product/B008AF380Q),售价 9 美元,将用作交换分区(有关详细信息,请参阅下一节) 因此我们可以手动构建 TensorFlow 库,这是构建和运行 TensorFlow C++ 代码所必需的。
* 售价 110 美元的 [GoPiGo 机器人基础套件](https://www.amazon.com/gp/product/B00NYB3J0A)[官方网站](https://www.dexterindustries.com/shop),将 Raspberry Pi 板变成可以移动的机器人。
......@@ -237,7 +237,7 @@ make -f tensorflow/contrib/makefile/Makefile HOST_OS=PI TARGET=PI \
OPTFLAGS="-Os -mfpu=neon-vfpv4 -funsafe-math-optimizations -ftree-vectorize" CXX=g++-4.8
```
经过几个小时的构建,您可能会收到诸如“虚拟内存耗尽:无法分配内存”之类的错误,否则 Pi 板将由于内存不足而冻结。 要解决此问题,我们需要设置一个交换,因为没有交换,当应用程序用尽内存时,由于内核崩溃,该应用程序将被杀死。 设置交换的方法有两种:交换文件和交换分区。 Raspbian 在 SD 卡上使用默认的 100 MB 交换文件,如下所示,使用`free`命令:
经过几个小时的构建,您可能会收到诸如“虚拟内存耗尽:无法分配内存”之类的错误,否则 Pi 板将由于内存不足而冻结。 要解决此问题,我们需要设置一个交换,因为没有交换,当应用程序用尽内存时,由于内核崩溃,该应用程序将被杀死。 设置交换的方法有两种:交换文件和交换分区。 Raspbian 在 SD 卡上使用默认的 100MB 交换文件,如下所示,使用`free`命令:
```py
pi@raspberrypi:~/tensorflow-1.6.0 $ free -h
......@@ -246,14 +246,14 @@ Mem: 927M 45M 843M 660K 38M 838M
Swap: 99M 74M 25M
```
要将交换文件大小提高到 1 GB,请通过 `sudo vi /etc/dphys-swapfile`修改 `/etc/dphys-swapfile`文件,将`CONF_SWAPSIZE=100`更改为`CONF_SWAPSIZE=1024`,然后重新启动交换文件服务:
要将交换文件大小提高到 1GB,请通过 `sudo vi /etc/dphys-swapfile`修改 `/etc/dphys-swapfile`文件,将`CONF_SWAPSIZE=100`更改为`CONF_SWAPSIZE=1024`,然后重新启动交换文件服务:
```py
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
```
此后,`free -h`将显示交换总量为 1.0 GB。
此后,`free -h`将显示交换总量为 1.0GB。
交换分区是在单独的 USB 磁盘上创建的,因此首选交换分区,因为交换分区不会碎片化,但 SD 卡上的交换文件很容易碎片化,从而导致访问速度变慢。 要设置交换分区,请将没有所需数据的 USB 闪存盘插入 Pi 板上,然后运行`sudo blkid`,您将看到类似以下内容:
......@@ -278,7 +278,7 @@ no label, UUID=23443cde-9483-4ed7-b151-0e6899eba9de
UUID=<UUID value> none swap sw,pri=5 0 0
```
保存并退出 fstab 文件,然后运行`sudo swapon -a`。 现在,如果再次运行`free -h`,将会看到“交换总数”接近 USB 存储设备的大小。 我们绝对不需要所有大小的交换空间—实际上,具有 1 GB 内存的 Raspberry Pi 3 板的建议最大交换大小为 2 GB,但是我们将其保留原样,因为我们只是想成功地构建内存。 TensorFlow 库。
保存并退出 fstab 文件,然后运行`sudo swapon -a`。 现在,如果再次运行`free -h`,将会看到“交换总数”接近 USB 存储设备的大小。 我们绝对不需要所有大小的交换空间—实际上,具有 1GB 内存的 Raspberry Pi 3 板的建议最大交换大小为 2GB,但是我们将其保留原样,因为我们只是想成功地构建内存。 TensorFlow 库。
更改任一交换设置后,我们可以重新运行`make`命令:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册