提交 cdcf9fb5 编写于 作者: W wizardforcel

2020-12-09 10:40:08

上级 85c90515
......@@ -34,13 +34,13 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应
第 1 章, “移动 TensorFlow 入门”,讨论如何在 Mac 和 Ubuntu 上设置 TensorFlow 以及在 Ubuntu 上设置 NVIDIA GPU,以及如何设置 Xcode 和 Android 工作室。 我们还将讨论 TensorFlow Mobile 和 TensorFlow Lite 之间的区别以及何时使用它们。 最后,我们将向您展示如何运行示例 TensorFlow iOS 和 Android 应用程序。
第 1 章,“移动 TensorFlow 入门”,讨论如何在 Mac 和 Ubuntu 上设置 TensorFlow 以及在 Ubuntu 上设置 NVIDIA GPU,以及如何设置 Xcode 和 Android 工作室。 我们还将讨论 TensorFlow Mobile 和 TensorFlow Lite 之间的区别以及何时使用它们。 最后,我们将向您展示如何运行示例 TensorFlow iOS 和 Android 应用程序。
第 2 章, “通过迁移学习对图像进行分类” ,介绍了什么是迁移学习以及为什么要使用迁移学习,如何使用它 重新训练 Inception v3 和 MobileNet 模型,以更准确,更快地识别犬种,以及如何在示例 iOS 和 Android 应用程序中使用经过重新训练的模型。 然后,我们将向您展示如何在 Tensor-C 和 Swift 中将 TensorFlow 添加到自己的 iOS 应用中,以及如何将自己的 Android 应用添加到狗品种识别中。
第 2 章,“通过迁移学习对图像进行分类” ,介绍了什么是迁移学习以及为什么要使用迁移学习,如何使用它 重新训练 Inception v3 和 MobileNet 模型,以更准确,更快地识别犬种,以及如何在示例 iOS 和 Android 应用程序中使用经过重新训练的模型。 然后,我们将向您展示如何在 Tensor-C 和 Swift 中将 TensorFlow 添加到自己的 iOS 应用中,以及如何将自己的 Android 应用添加到狗品种识别中。
第 3 章,“检测对象及其位置”,快速概述了对象检测,然后向您展示如何设置 TensorFlow 对象检测 API 并使用 它可以重新训练 SSD-MobileNet 和 Faster RCNN 模型。 我们还将通过手动构建 TensorFlow iOS 库以支持非默认 TensorFlow 操作的方式,向您展示如何在 iOS 应用中使用示例 TensorFlow Android 应用 中使用的模型。 最后,我们将向您展示如何训练 YOLO2(另一个流行的对象检测模型),该模型也在示例 TensorFlow Android 应用程序中使用,以及如何在 iOS 应用程序中使用它。
第 3 章,“检测对象及其位置”,快速概述了对象检测,然后向您展示如何设置 TensorFlow 对象检测 API 并使用 它可以重新训练 SSD-MobileNet 和 Faster RCNN 模型。 我们还将通过手动构建 TensorFlow iOS 库以支持非默认 TensorFlow 操作的方式,向您展示如何在 iOS 应用中使用示例 TensorFlow Android 应用 中使用的模型。 最后,我们将向您展示如何训练 YOLO2(另一个流行的对象检测模型),该模型也在示例 TensorFlow Android 应用程序中使用,以及如何在 iOS 应用程序中使用它。
第 4 章, “变换具有惊人艺术风格的图片” 首先概述了神经样式转换在过去几年中的快速发展。 然后,它向您展示了如何训练快速的神经样式转换模型,以及如何在 iOS 和 Android 应用中使用它们。 之后,我们将介绍如何在您自己的 iOS 和 Android 应用程序中使用 TensorFlow Magenta 多样式模型轻松创建令人惊叹的艺术风格。
第 4 章,“变换具有惊人艺术风格的图片” 首先概述了神经样式转换在过去几年中的快速发展。 然后,它向您展示了如何训练快速的神经样式转换模型,以及如何在 iOS 和 Android 应用中使用它们。 之后,我们将介绍如何在您自己的 iOS 和 Android 应用程序中使用 TensorFlow Magenta 多样式模型轻松创建令人惊叹的艺术风格。
第 5 章,“了解简单语音命令”概述了语音识别,并向您展示了如何训练简单语音命令识别模型。 然后,我们将向您展示如何使用 Objective-C 和 Swift 在 Android 和 iOS 中使用该模型。 我们还将介绍有关如何解决移动设备上可能出现的模型加载和运行错误的更多提示。
......@@ -68,7 +68,7 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应
我们建议您先按顺序阅读前四章,然后运行[这里](http://github.com/jeffxtang/mobiletfbook)。 这将帮助您确保已为 TensorFlow 移动应用程序开发设置了全部开发环境,并且知道如何将 TensorFlow 集成到自己的 iOS 和/或 Android 应用程序中。 如果您是 iOS 开发人员,还将学习如何在 TensorFlow 中使用 Objective-C 或 Swift,以及何时以及如何使用 TensorFlow pod 或手动 TensorFlow iOS 库。
然后,如果您需要构建自定义的 TensorFlow Android 库,请转到第 7 章,“使用 CNN 和 LSTM 识别图形”,以及如果您想学习如何在 您的移动应用程序,请查看第 8 章, *使用 RNN 预测股价*和第 10 章, “构建类似 AlphaZero 的手机游戏应用程序” 。
然后,如果您需要构建自定义的 TensorFlow Android 库,请转到第 7 章,“使用 CNN 和 LSTM 识别图形”,以及如果您想学习如何在 您的移动应用程序,请查看第 8 章,“使用 RNN 预测股价”,和第 10 章, “构建类似 AlphaZero 的手机游戏应用程序” 。
如果您对 TensorFlow Lite 或 Core ML 更感兴趣,请阅读第 11 章,“在移动设备上使用 TensorFlow Lite 和 Core ML”,以及您对 Raspberry Pi 上的 TensorFlow 或 TensorFlow 中的强化学习最感兴趣,请跳至第 12 章,“在 Raspberry Pi 上开发 TensorFlow 应用程序”。
......
此差异已折叠。
......@@ -4,7 +4,7 @@
上一章中描述的示例 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%,因为模型经过训练可以识别大量对象,而不是像狗品种之类的特定对象。
上一章中描述的示例 TensorFlow iOS 应用程序,Simple 和 Camera 以及 Android 应用程序“TF 分类”都使用了 Inception v1 模型,该模型是 Google 公开提供的预先训练的图像分类深度神经网络模型。 该模型针对 [ImageNet](http://image-net.org) 进行了训练,ImageNet 是最大和最知名的图像数据库之一,其中有超过一千万个图像被标注为对象类别。 Inception 模型可用于将图像分类为[列出的 1,000 个类别之一](http://image-net.org/challenges/LSVRC/2014/browse-synsets)。 这 1000 个对象类别包括很多对象中的很多犬种。 但是,识别狗品种的准确性不是很高,约为 70%,因为模型经过训练可以识别大量对象,而不是像狗品种之类的特定对象。
如果我们想提高准确性并在使用改进模型的智能手机上构建移动应用程序怎么办,那么当我们四处走走并看到一只有趣的狗时,我们可以使用该应用程序告诉我们它是哪种狗。
......@@ -159,11 +159,11 @@ bazel-bin/tensorboard/tensorboard --logdir /tmp/retrain_logs
![](img/3ae39776-c298-4b42-9125-f25ca84c9ed2.png)Figure 2.2 Train and validation accuracy of the Inception v3 retrained model
在下面的屏幕截图中,的 cross_entropy 图为 ,正如我们之前关于运行`retrain.py`的输出所描述的
在下面的屏幕截图中的交叉熵图,和我们之前对于运行`retrain.py`的输出所描述的一样
![](img/cd4cea6a-8847-40bd-9ec4-3d9696972a5f.png)Figure 2.3 Train and validation cross entropy of the Inception v3 retrained model
现在单击 GRAPHS 选项卡,您将看到一个名为 Mul 的操作,另一个名为 final_result 的操作 ,如下所示:
现在单击`GRAPHS`选项卡,您将看到一个名为`Mul`的操作,另一个名为`final_result`的操作 ,如下所示:
![](img/18aa75d8-28e3-497c-ba8f-145baa6cee37.png)Figure 2.4 The Mul and final_result nodes in the retrained model
......@@ -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.1 MB。 非量化模型的大小约为 17 MB。
您可以按以下步骤测试先前使用`label_image`生成的模型:
......@@ -292,7 +292,7 @@ n02087394 rhodesian ridgeback (105): 0.00528782
n02090379 redbone (32): 0.0035457
```
请注意,在运行`label_image`时,input_layer 名为`input`。 我们可以使用交互式 iPython 代码或之前看到的摘要图形工具找到该名称:
请注意,在运行`label_image`时,`input_layer`名为`input`。 我们可以使用交互式 iPython 代码或之前看到的摘要图形工具找到该名称:
```py
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph
......@@ -327,9 +327,9 @@ bazel-bin/tensorflow/tools/benchmark/benchmark_model
--show_summary=true
```
您将获得相当长的输出,最后会有一行像 FLOPs 的估计值:11.42 B,这意味着它将使用基于 Inception v3 的重新训练模型约 11 B FLOPS(浮点运算)进行推断。 iPhone 6 运行大约 2 B FLOPS,因此在 iPhone 6 上运行模型大约需要 5–6 秒。 其他现代智能手机可以运行 10 B FLOPS。
您将获得相当长的输出,最后会有一行像 FLOPS 的估计值:11.42B,这意味着它将使用基于 Inception v3 的重新训练模型约 11B FLOPS(浮点运算)进行推断。 iPhone 6 运行大约 2 B FLOPS,因此在 iPhone 6 上运行模型大约需要 5–6 秒。 其他现代智能手机可以运行 10B FLOPS。
通过将图形文件替换为基于 MobileNet 模型的重新训练模型`dog_retrained_mobilenet10_224.pb`并重新运行基准测试工具,您将看到 FLOPS 估计值变为约 1.14 B,大约快了 10 倍。
通过将图形文件替换为基于 MobileNet 模型的重新训练模型`dog_retrained_mobilenet10_224.pb`并重新运行基准测试工具,您将看到 FLOPS 估计值变为约 1.14B,大约快了 10 倍。
......@@ -346,7 +346,7 @@ bazel-bin/tensorflow/tools/benchmark/benchmark_model
![](img/d2e25f9d-c88d-4fe5-918d-ba7e64420682.png)Figure 2.5 Adding the retrained model file and the label file to app
3. 单击 Xco​​de 中的`RunModelViewController.mm`文件,该文件使用 TensorFlow C++ API 处理输入图像,通过 Inception v1 模型运行它,并获得图像分类结果,并更改行:
3. 单击 Xco​​de 中的`RunModelViewController.mm`文件,该文件使用 TensorFlow C++ API 处理输入图像,通过 Inception v1 模型运行它,并获得图像分类结果,并更改行:
```py
NSString* network_path = FilePathForResourceName(@"tensorflow_inception_graph", @"pb");
......@@ -377,7 +377,7 @@ std::string input_layer = "Mul";
std::string output_layer = "final_result";
```
6. 最后,您可以编辑`dog_retrained_labels.txt`文件以删除每行中的前导 nxxxx 字符串(例如,删除`n02099712 labrador retriever`中的`n02099712`)–在 Mac 上,您可以通过按住 Option 键然后进行 选择和删除–从而使识别结果更具可读性
6. 最后,您可以编辑`dog_retrained_labels.txt`文件以删除每行中的前导`nxxxx`字符串(例如,删除`n02099712 labrador retriever`中的`n02099712`)– 在 Mac 上,您可以通过按住 Option 键然后进行 选择和删除–从而使识别结果更具可读性
立即运行应用程序,然后单击运行模型按钮,在 Xcode 的控制台窗口或应用程序的编辑框中,您将看到以下识别结果,与运行`label_image`脚本的结果非常一致:
......@@ -389,7 +389,7 @@ Predictions: 41 0.645 labrador retriever
20 0.0127 beagle
```
要使用 MobileNet(mobilenet_1.0_224_quantized)训练模型`dog_retrained_mobilenet10_224.pb`,请按照与之前类似的步骤进行操作,而在步骤 2 和 3 中,我们使用`dog_retrained_mobilenet10_224.pb`,但是在步骤 4 中,我们需要保留`const int wanted_width = 224;``const int wanted_height = 224;`,仅将`const float input_mean``const float input_std`更改为`128`。 最后,在步骤 5 中,我们必须使用`std::string input_layer = "input";``std::string output_layer = "final_result";`。 这些参数与`dog_retrained_mobilenet10_224.pb``label_image`脚本使用的参数相同。
要使用 MobileNet(`mobilenet_1.0_224_quantized`)训练模型`dog_retrained_mobilenet10_224.pb`,请按照与之前类似的步骤进行操作,而在步骤 2 和 3 中,我们使用`dog_retrained_mobilenet10_224.pb`,但是在步骤 4 中,我们需要保留`const int wanted_width = 224;``const int wanted_height = 224;`,仅将`const float input_mean``const float input_std`更改为`128`。 最后,在步骤 5 中,我们必须使用`std::string input_layer = "input";``std::string output_layer = "final_result";`。 这些参数与`dog_retrained_mobilenet10_224.pb``label_image`脚本使用的参数相同。
再次运行该应用程序,您将看到类似的最佳识别结果。
......@@ -401,7 +401,7 @@ Predictions: 41 0.645 labrador retriever
在 Android 的 TF Classify 应用程序中使用经过重新训练的 Inception v3 模型和 MobileNet 模型也非常简单。 请按照此处的步骤测试两个重新训练的模型:
在 Android 的“TF 分类”应用程序中使用经过重新训练的 Inception v3 模型和 MobileNet 模型也非常简单。 请按照此处的步骤测试两个重新训练的模型:
1. 使用 Android Studio 打开位于`tensorflow/examples/android`中的示例 TensorFlow Android 应用。
2. 将两个重新训练的模型`quantized_stripped_dogs_retrained .pb``dog_retrained_mobilenet10_224.pb`以及标签文件`dog_retrained_labels.txt`拖放到 android 应用程序的`assets`文件夹中。
......@@ -452,7 +452,7 @@ private static final String LABEL_FILE = "file:///android_asset/dog_retrained_la
在 TensorFlow 的早期版本中,将 TensorFlow 添加到您自己的应用程序非常繁琐,需要使用 TensorFlow 的手动构建过程和其他手动设置。 在 TensorFlow 1.4 中,该过程非常简单,但在 TensorFlow 网站上并未详细记录详细步骤。 缺少的另一件事是缺少有关如何在基于 Swift 的 iOS 应用中使用 TensorFlow 的文档; 示例 TensorFlow iOS 应用程序都在 Objective-C 中,它们调用了 TensorFlow 的 C++ API。 让我们看看我们如何做得更好。
在 TensorFlow 的早期版本中,将 TensorFlow 添加到您自己的应用程序非常繁琐,需要使用 TensorFlow 的手动构建过程和其他手动设置。 在 TensorFlow 1.4 中,该过程非常简单,但在 TensorFlow 网站上并未详细记录详细步骤。 缺少的另一件事是缺少有关如何在基于 Swift 的 iOS 应用中使用 TensorFlow 的文档; 示例 TensorFlow iOS 应用程序都在 Objective-C 中,它们调用了 TensorFlow 的 C++ API。 让我们看看我们如何做得更好。
......@@ -464,7 +464,7 @@ private static final String LABEL_FILE = "file:///android_asset/dog_retrained_la
首先,按照以下步骤将具有图像分类功能的 TensorFlow 添加到您的 Objective-C iOS 应用程序(我们将从一个新应用程序开始,但是如果需要将 TensorFlow 添加到现有应用程序,则可以跳过第一步):
1. 在您的 Xcode 中,单击文件 | 新增 | 项目 ...,选择 Single View App ,然后选择接下来的,输入`HelloTensorFlow`作为产品名称,选择目标 -C 作为语言,然后单击接下来并选择项目的位置,然后单击创建。 关闭 Xcode 中的项目窗口(因为我们稍后将使用 pod 来打开项目的工作区文件)。
1. 在您的 Xcode 中,单击“文件 | 新增 | 项目 ...”,选择“Single View App”,然后选择接下来的,输入`HelloTensorFlow`作为产品名称,选择 Obj-C 作为语言,然后单击接下来并选择项目的位置,然后单击创建。 关闭 Xcode 中的项目窗口(因为我们稍后将使用 Pod 来打开项目的工作区文件)。
2. 打开一个终端窗口,即`cd`到项目所在的位置,然后创建一个名为`Podfile`的新文件,其内容如下:
```py
......@@ -472,13 +472,13 @@ target 'HelloTensorFlow'
pod 'TensorFlow-experimental'
```
3. 运行命令`pod install`下载并安装 TensorFlow pod。
3. 运行命令`pod install`下载并安装 TensorFlow Pod。
4. 在 Xcode 中打开`HelloTensorFlow.xcworkspace`文件,然后将两个文件(`ios_image_load.mm``ios_image_load.h`)拖放到 TensorFlow iOS 示例目录`tensorflow/examples/ios/simple``HelloTensorFlow`项目文件夹中。
5. D 将两个模型`quantized_stripped_dogs_retrained.pb``dog_retrained_mobilenet10_224.pb``label file dog_retrained_labels.txt`以及几个测试图像文件拖放到项目文件夹中–之后,您应该看到类似以下的内容:
5. 将两个模型`quantized_stripped_dogs_retrained.pb``dog_retrained_mobilenet10_224.pb``label file dog_retrained_labels.txt`以及几个测试图像文件拖放到项目文件夹中,之后,您应该看到类似以下的内容:
![](img/b89b3444-a6a9-45b4-bb02-ddf8388a6992.png)Figure 2.6 Adding utility files, model files, label file and image files
6.`ViewController.m`重命名为`ViewController.mm`,因为我们将在该文件中混合使用 C++ 代码和 Objective-C 代码来调用 TensorFlow C++ API 并处理图像输入和推断结果。 然后,在`@interface ViewController`之前,添加以下`#include`和函数原型:
6.`ViewController.m`重命名为`ViewController.mm`,因为我们将在该文件中混合使用 C++ 代码和 Objective-C 代码来调用 TensorFlow C++ API 并处理图像输入和推断结果。 然后,在`@interface ViewController`之前,添加以下`#include`和函数原型:
```py
#include <fstream>
......@@ -604,7 +604,7 @@ for (int y = 0; y < wanted_height; ++y) {
}
```
最后,使用图像张量数据和输入层名称调用 TensorFlow 会话的 run 方法,获取返回的输出结果,并对其进行处理以获取置信度值大于阈值的前五个结果:
最后,使用图像张量数据和输入层名称调用 TensorFlow 会话的`run`方法,获取返回的输出结果,并对其进行处理以获取置信度值大于阈值的前五个结果:
```py
std::vector<tensorflow::Tensor> outputs;
......@@ -641,7 +641,7 @@ GetTopN(output->flat<float>(), kNumResults, kThreshold, &top_results);
自 2014 年 6 月诞生以来,Swift 已成为最优雅的现代编程语言之一。因此,对于某些开发人员而言,将现代 TensorFlow 集成到其基于 Swift 的现代 iOS 应用程序中既有趣又有用。 这样做的步骤与基于 Objective-C 的应用程序的步骤相似,但具有一些与 Swift 相关的技巧。 如果您已经按照 Objective-C 部分的步骤进行操作,则可能会发现这里的某些步骤是重复的,但是对于那些可能会跳过 Objective-C 部分并直接进入 Swift 的用户而言,仍然提供了完整的步骤:
1. 在您的 Xcode 中,单击文件 | 新增 | 项目... ,选择 Single View App ,然后接下来的,输入`HelloTensorFlow_Swift`作为产品名称,选择 Swift 将设置为语言,然后单击接下来并选择项目的位置,然后单击创建。 关闭 Xcode 中的项目窗口(因为稍后将使用 pod 来打开项目的工作区文件)。
1. 在您的 Xcode 中,单击“文件 | 新增 | 项目...”,选择“Single View App”,然后接下来的,输入`HelloTensorFlow_Swift`作为产品名称,选择 Swift 将设置为语言,然后单击接下来并选择项目的位置,然后单击创建。 关闭 Xcode 中的项目窗口(因为稍后将使用 Pod 来打开项目的工作区文件)。
2. 打开一个终端窗口,即`cd`到项目所在的位置,然后创建一个名为`Podfile`的新文件,其内容如下:
```py
......@@ -649,7 +649,7 @@ target 'HelloTensorFlow_Swift'
pod 'TensorFlow-experimental'
```
3. 运行命令`pod install`下载并安装 TensorFlow pod;
3. 运行命令`pod install`下载并安装 TensorFlow Pod;
4. 在 Xcode 中打开`HelloTensorFlow_Swift.xcworkspace`文件,然后将两个文件(`ios_image_load.mm``ios_image_load.h`)拖放到 TensorFlow iOS 示例目录`tensorflow/examples/ios/simple``HelloTensorFlow_Swift`项目文件夹中。 当将两个文件添加到项目中时,您将看到一个消息框,如以下屏幕截图所示,询问您是否要配置 Objective-C 桥接头,Swift 代码调用 C++ 头需要此头。 Objective-C 代码。 因此,单击创建桥接标题按钮:
......@@ -793,10 +793,10 @@ Figure 2.12 Inference results for different retrained models
事实证明,将 TensorFlow 添加到自己的 Android 应用程序比 iOS 容易。 让我们跳到步骤:
1. 如果您有现有的 Android 应用,请跳过此步骤。 否则,在 Android Studio 中,选择文件 | 新增 | New Project ... 并接受所有默认设置,然后单击完成。
1. 如果您有现有的 Android 应用,请跳过此步骤。 否则,在 Android Studio 中,选择“文件 | 新增 | 新项目...”并接受所有默认设置,然后单击完成。
2. 打开`build.gradle``Module: app`)文件,并在依赖项`{...};`内部和末尾添加编译`'org.tensorflow:tensorflow-android:+'`
3. 生成`gradle`文件,您将在`app`目录的位置`app/build/intermediates/transforms/mergeJniLibs/debug/0/lib`的子文件夹内看到`libtensorflow_inference.so`,这是 Java 代码与之对话的 TensorFlow 本机库。
4. 如果这是一个新项目,则可以通过首先切换到软件包,然后右键单击该应用程序并选择 New |来创建`assets`文件夹。 文件夹 | Assets 文件夹,如以下屏幕截图所示,然后从软件包切换回 Android:
4. 如果这是一个新项目,则可以通过首先切换到软件包,然后右键单击该应用程序并选择“新建 | 文件夹 | `assets`文件夹”来创建`assets`文件夹。 ,如以下屏幕截图所示,然后从软件包切换回 Android:
![](img/6cf6b889-8ecb-4837-9087-19b34d6e68ed.png)Figure 2.13 Adding Assets Folder to a new project
......@@ -836,7 +836,7 @@ Classifier classifier = TensorFlowImageClassifier.create(
OUTPUT_NAME);
```
然后从 assets 文件夹中读取我们的测试图像,根据模型指定的尺寸进行调整,然后调用推理方法`recognizeImage`
然后从`assets`文件夹中读取我们的测试图像,根据模型指定的尺寸进行调整,然后调用推理方法`recognizeImage`
```py
Bitmap bitmap = BitmapFactory.decodeStream(getAssets().open(IMG_FILE));
......
......@@ -566,7 +566,7 @@ LoadGraph 尝试加载三个用户选择的模型文件之一,并返回加载
Found 1 possible inputs: (name=image_tensor, type=uint8(4), shape=[?,?,?,3])
```
这就是为什么我们需要使用`uint8`创建一个图像张量,而不是`float`类型来加载到我们的模型,否则在运行模型时会出现错误。 另请注意,当我们使用 TensorFlow C++ API 的`Session``Run`方法将`image_data`转换为`Tensor`类型的`image_data`时,我们不使用`input_mean``input_std`就像我们在使用图像分类模型时所做的(有关详细比较,请参见第 2 章,“通过迁移学习对图像进行分类”的 HelloTensorFlow 应用程序的`RunInferenceOnImage`实现)。 我们知道有四个名为`detection_boxes``detection_scores``detection_classes``num_detections`的输出,因此`RunInferenceOnImage`具有以下代码来为模型输入图像输入并获得四个输出:
这就是为什么我们需要使用`uint8`创建一个图像张量,而不是`float`类型来加载到我们的模型,否则在运行模型时会出现错误。 另请注意,当我们使用 TensorFlow C++ API 的`Session``Run`方法将`image_data`转换为`Tensor`类型的`image_data`时,我们不使用`input_mean``input_std`就像我们在使用图像分类模型时所做的(有关详细比较,请参见第 2 章,“通过迁移学习对图像进行分类”的 HelloTensorFlow 应用程序的`RunInferenceOnImage`实现)。 我们知道有四个名为`detection_boxes``detection_scores``detection_classes``num_detections`的输出,因此`RunInferenceOnImage`具有以下代码来为模型输入图像输入并获得四个输出:
```py
tensorflow::Tensor image_tensor(tensorflow::DT_UINT8, tensorflow::TensorShape({1, image_height, image_width, wanted_channels}));
......
......@@ -520,7 +520,7 @@ dispatch_async(dispatch_get_global_queue(0, 0), ^{
});
```
6.`audioRecognition`方法内部,我们首先定义一个 C++ `string`数组,其中包含要识别的 10 个命令以及两个特殊值`"_silence_"``"_unknown_"`
6.`audioRecognition`方法内部,我们首先定义一个 C++ `string`数组,其中包含要识别的 10 个命令以及两个特殊值`"_silence_"``"_unknown_"`
```py
std::string commands[] = {"_silence_", "_unknown_", "yes", "no", "up", "down", "left", "right", "on", "off", "stop", "go"};
......@@ -548,7 +548,7 @@ std::string input_name2 = "decoded_sample_data:1";
std::string output_name = "labels_softmax";
```
7. 对于`"decoded_sample_data:0"`,我们需要将采样率值作为标量发送(否则在调用 TensorFlow Session 的`run`方法时会出错),并且在 TensorFlow C++ API 中定义了张量,如下所示:
7. 对于`"decoded_sample_data:0"`,我们需要将采样率值作为标量发送(否则在调用 TensorFlow Session 的`run`方法时会出错),并且在 TensorFlow C++ API 中定义了张量,如下所示:
```py
tensorflow::Tensor samplerate_tensor(tensorflow::DT_INT32, tensorflow::TensorShape());
......@@ -772,7 +772,7 @@ func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully f
}
```
如果您确实想将尽可能多的代码移植到 Swift,[则可以用 Swift 替换 C 中的音频文件转换代码](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 版本完全相同的结果。
......
......@@ -459,7 +459,7 @@ target 'Image2Text'
![](img/62be062e-39dc-4f0c-8a59-7e0e675bafaa.png)Figure 6.5: Setting up the Image2Text iOS app, also showing how LoadMemoryMappedModel is implemented
3. 打开`ViewController.mm`并添加一堆 Objective-C 和 C++ 常量,如下所示:
3. 打开`ViewController.mm`并添加一堆 Objective-C 和 C++ 常量,如下所示:
```py
static NSString* MODEL_FILE = @"image2text_frozen_transformed";
......
......@@ -34,7 +34,7 @@ You can also pick a prebuilt TensorFlow Lite model, such as the MobileNet models
2. 构建 TensorFlow Lite 转换器工具。 如果您从[这里](https://github.com/tensorflow/tensorflow/releases)下载 TensorFlow 1.5 或 1.6 版本,则可以从 TensorFlow 源根目录在终端上运行`bazel build tensorflow/contrib/lite/toco:toco`。 如果您使用更高版本或获取最新的 TensorFlow 仓库,您应该可以使用此`build`命令来执行此操作,但如果没有,请查看该新版本的文档。
3. 使用 TensorFlow Lite 转换器工具将 TensorFlow 模型转换为 TensorFlow Lite 模型。 在下一节中,您将看到一个详细的示例。
4. 在 iOS 或 Android 上部署 TensorFlow Lite 模型-对于 iOS,使用 C++ API 加载和运行模型; 对于 Android,请使用 Java API(围绕 C++ API 的包装器)加载和运行模型。 与我们之前在 TensorFlow Mobile 项目中使用的`Session`类不同,C++ 和 Java API 均使用 TensorFlow-lite 特定的`Interpreter`类来推断模型。 在接下来的两个部分中,我们将向您展示 iOS C++ 代码和 Android Java 代码以使用`Interpreter`
4. 在 iOS 或 Android 上部署 TensorFlow Lite 模型-对于 iOS,使用 C++ API 加载和运行模型; 对于 Android,请使用 Java API(围绕 C++ API 的包装器)加载和运行模型。 与我们之前在 TensorFlow Mobile 项目中使用的`Session`类不同,C++ 和 Java API 均使用 TensorFlow-lite 特定的`Interpreter`类来推断模型。 在接下来的两个部分中,我们将向您展示 iOS C++ 代码和 Android Java 代码以使用`Interpreter`
If you run a TensorFlow Lite model on Android, and if the Android device is Android 8.1 (API level 27) or above and supports hardware acceleration with a dedicated neural network hardware, a GPU, or some other digital signal processors, then the `Interpreter` will use the Android Neural Networks API ([https://developer.android.com/ndk/guides/neuralnetworks/index.html](https://developer.android.com/ndk/guides/neuralnetworks/index.html)) to speed up the model running. For example, Google's Pixel 2 phone has a custom chip optimized for image processing, which can be turned on with Android 8.1, and support hardware acceleration.
......
......@@ -415,7 +415,7 @@ run(softmax_tensor, {
在这里,将`softmax_tensor`定义为 TensorFlow 图的`get_tensor_by_name(self.output_name_)`,将`output_name_``input_samples_name_``input_rate_name_`分别定义为`labels_softmax``decoded_sample_data:0``decoded_sample_data:1`,与 我们在第 5 章,“了解简单语音命令”中的 iOS 和 Android 应用程序中使用过。
在之前的章节中,我们主要使用 Python 训练和测试 TensorFlow 模型,然后再使用本机 TensorFlow C++ 库的 Java 接口代码在使用 C++ 或 Android 的 iOS 中运行模型。 在 Raspberry Pi 上,您可以选择直接使用 TensorFlow Python API 或 C++ API 在 Pi 上运行 TensorFlow 模型,尽管通常仍会在功能更强大的模型上进行训练 电脑。 有关完整的 TensorFlow Python API 文档,请参见[这里](https://www.tensorflow.org/api_docs/python)
在之前的章节中,我们主要使用 Python 训练和测试 TensorFlow 模型,然后再使用本机 TensorFlow C++ 库的 Java 接口代码在使用 C++ 或 Android 的 iOS 中运行模型。 在 Raspberry Pi 上,您可以选择直接使用 TensorFlow Python API 或 C++ API 在 Pi 上运行 TensorFlow 模型,尽管通常仍会在功能更强大的模型上进行训练 电脑。 有关完整的 TensorFlow Python API 文档,请参见[这里](https://www.tensorflow.org/api_docs/python)
要使用 GoPiGo Python API 使机器人根据您的语音命令移动,请首先在`listen.py`中添加以下两行:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册