提交 c08d8f85 编写于 作者: W wizardforcel

2020-12-09 10:50:08

上级 78d6a186
......@@ -270,7 +270,7 @@ wget http://storage.googleapis.com/download.tensorflow.org/models/object_detecti
tar -xvf faster_rcnn_resnet101_coco_11_06_2017.tar.gz
```
4. 替换`object_detection/samples/configs/faster_rcnn_resnet101_pets.config`文件中出现的 PATH_TO_BE_CONFIGURED 五次,因此它们变为:
4. 替换`object_detection/samples/configs/faster_rcnn_resnet101_pets.config`文件中出现的`PATH_TO_BE_CONFIGURED`五次,因此它们变为:
```py
fine_tune_checkpoint: "faster_rcnn_resnet101_coco_11_06_2017/model.ckpt"
......@@ -304,7 +304,7 @@ name: 'yorkshire_terrier'
}
```
5. 同样,在`object_detection/samples/configs/ssd_mobilenet_v1_pets.config`文件中更改 PATH_TO_BE_CONFIGURED 的五次出现,因此它们变为:
5. 同样,在`object_detection/samples/configs/ssd_mobilenet_v1_pets.config`文件中更改`PATH_TO_BE_CONFIGURED`的五次出现,因此它们变为:
```py
fine_tune_checkpoint: "object_detection/ssd_mobilenet_v1_coco_2017_11_17/model.ckpt"
......@@ -348,7 +348,7 @@ tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with prope
INFO:tensorflow:global step 25450: loss = 0.1240 (0.386 sec/step)
```
7. 在大约 20,000 个步骤(大约 2 个小时)后,按 *Ctrl* +`C`结束上述重新训练脚本的运行。 创建一个新的`train_dir_ssd_mobilenet`目录,然后运行:
7. 在大约 20,000 个步骤(大约 2 个小时)后,按`Ctrl + C`结束上述重新训练脚本的运行。 创建一个新的`train_dir_ssd_mobilenet`目录,然后运行:
```py
python object_detection/train.py \
......@@ -433,7 +433,7 @@ python object_detection/export_inference_graph.py \
Could not create TensorFlow Graph: Not found: Op type not registered 'NonMaxSuppressionV2'
```
除非将 TensorFlow 实验 Pod 更新为包括未在此处注册的 **op** ,否则解决这些问题的唯一方法是通过从 TensorFlow 源构建自定义 TensorFlow iOS 库,这就是我们为什么向您展示第 1 章,“移动 TensorFlow 入门”中的内容,“如何从源代码获取和设置 TensorFlow”。 让我们看一下构建自己的 TensorFlow iOS 库并使用它来创建具有 TensorFlow 支持的新 iOS 应用的步骤。
除非将 TensorFlow 实验 Pod 更新为包括未在此处注册的 **op**,否则解决这些问题的唯一方法是通过从 TensorFlow 源构建自定义 TensorFlow iOS 库,这就是我们为什么向您展示第 1 章,“移动 TensorFlow 入门”中的内容,“如何从源代码获取和设置 TensorFlow”。 让我们看一下构建自己的 TensorFlow iOS 库并使用它来创建具有 TensorFlow 支持的新 iOS 应用的步骤。
......@@ -466,8 +466,8 @@ If you run the app, after completing the following steps, and encounter an error
要在您自己的应用程序中使用库,请执行以下操作:
1. 在 Xcode 中,单击文件 | 新增 | 项目…,选择 Single View App ,然后输入 TFObjectDetectionAPI 作为产品名称,然后选择 Objective-C 作为 语言(如果您想使用 Swift,请参阅上一章有关如何将 TensorFlow 添加到基于 Swift 的 iOS 应用并进行此处所示的必要更改),然后选择项目的位置并单击“创建”。
2.`TFObjectDetectionAPI`项目中,单击项目名称,然后在构建设置下,单击 + 和添加用户定义的设置,然后 输入`TENSORFLOW_ROOT`作为 TensorFlow 源根的路径(例如`$HOME/tensorflow-1.4`),如图 3.4 所示。 如果您要引用较新的 TensorFlow 来源,此用户定义的设置将在其他设置中使用,以便以后轻松更改项目设置:
1. 在 Xcode 中,单击“文件 | 新增 | 项目…”,选择“Single View App”,然后输入 TFObjectDetectionAPI 作为产品名称,然后选择 Objective-C 作为 语言(如果您想使用 Swift,请参阅上一章有关如何将 TensorFlow 添加到基于 Swift 的 iOS 应用并进行此处所示的必要更改),然后选择项目的位置并单击“创建”。
2.`TFObjectDetectionAPI`项目中,单击项目名称,然后在构建设置下,单击`+`并添加用户定义的设置,然后输入`TENSORFLOW_ROOT`作为 TensorFlow 源根的路径(例如`$HOME/tensorflow-1.4`),如图 3.4 所示。 如果您要引用较新的 TensorFlow 来源,此用户定义的设置将在其他设置中使用,以便以后轻松更改项目设置:
![](img/a8474e70-b35d-4585-a9f9-620aa6cff313.png)Figure 3.4 Adding a TENSORFLOW_ROOT user-defined setting
......@@ -477,9 +477,9 @@ If you run the app, after completing the following steps, and encounter an error
-force_load $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf-lite.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/nsync/builds/lipo.ios.c++11/nsync.a
```
需要第一个–force_load,因为它确保 TensorFlow 所需的 C++ 构造函数将被链接,否则,您仍可以构建和运行该应用程序,但会遇到有关未注册会话的错误。
需要第一个`–force_load`,因为它确保 TensorFlow 所需的 C++ 构造函数将被链接,否则,您仍可以构建和运行该应用程序,但会遇到有关未注册会话的错误。
最后一个库用于 nsync,这是一个 C 库,[可导出互斥量和其他同步方法](https://github.com/google/nsync)。 在新的 TensorFlow 版本中引入。
最后一个库用于`nsync`,这是一个 C 库,[可导出互斥量和其他同步方法](https://github.com/google/nsync)。 在新的 TensorFlow 版本中引入。
4. 搜索“标题搜索路径”,并添加以下值:
......@@ -532,7 +532,7 @@ cd <TENSORFLOW_ROOT>/models/research/object_detection/protos
~/Downloads/protoc-3.4.0-osx-x86_64/bin/protoc string_int_label_map.proto --cpp_out=<path_to_your_TFObjectDetectionAPI_project>, the same location as your code files and the three graph files.
```
5. protoc 编译器命令完成后,您将在项目的源目录中看到两个文件:`string_int_label_map.pb.cc``string_int_label_map.pb.h`。 将两个文件添加到 Xcode 项目中。
5. `protoc`编译器命令完成后,您将在项目的源目录中看到两个文件:`string_int_label_map.pb.cc``string_int_label_map.pb.h`。 将两个文件添加到 Xcode 项目中。
6. 在 Xcode 中,像在上一章中一样,将`ViewController.m`重命名为`ViewController.mm`,然后类似于第 2 章,“通过迁移学习对图像进行分类”的`HelloTensorFlow`应用的`ViewController.mm`,在点击的处理程序中为三个对象检测模型添加三个`UIAlertAction`,我们已将模型添加到项目中并将要测试。 现在,完整的项目文件应如图 3.7 所示:
![](img/7023289e-ae57-4518-920e-140985314d13.png)Figure 3.7 The TFObjectDetection API project files
......@@ -548,7 +548,7 @@ void DrawTopDetections(std::vector<Tensor>& outputs, int image_width, int image_
void RunInferenceOnImage(NSString *model)
```
下一步之后,我们将解释这些功能的实现,您可以在该书的源代码仓库的 ch3 / ios 文件夹中获取所有源代码。
下一步之后,我们将解释这些功能的实现,您可以在该书的源代码仓库的`ch3/ios`文件夹中获取所有源代码。
8. 在 iOS 模拟器或设备中运行该应用。 首先,您会在屏幕上看到一张图片。 点按任意位置,您将看到一个对话框,要求您选择模型。 选择`SSD MobileNet`型号,在模拟器中花费大约一秒钟,在 iPhone 6 上花费五秒钟,以在图像上绘制检测结果。 Faster RCNN Inception V2 需要更长的时间(在模拟器中大约需要 5 秒,在 iPhone 6 上大约需要 20 秒); 该模型也比`SSD MobileNet`更精确,可以捕获`SSD MobileNet`模型遗漏的一个狗物体。 最后一个型号,更快的 RCNN Resnet 101,在 iOS 模拟器中花费了将近 20 秒,但由于其尺寸而在 iPhone 6 上崩溃。 图 3.8 总结了运行结果:
......@@ -560,7 +560,7 @@ void RunInferenceOnImage(NSString *model)
LoadGraph 尝试加载三个用户选择的模型文件之一,并返回加载状态。
这两个关键功能是`RunInferenceOnImage``DrawTopDetections`。 正如我们在*设置 TensorFlow 对象检测 API* 部分中所看到的那样,summary_graph 工具显示了我们在应用程序中使用的三种预训练对象检测模型的以下信息(请注意 uint8 类型):
这两个关键功能是`RunInferenceOnImage``DrawTopDetections`。 正如我们在“设置 TensorFlow 对象检测 API”部分中所看到的那样,`summary_graph`工具显示了我们在应用程序中使用的三种预训练对象检测模型的以下信息(请注意`uint8`类型):
```py
Found 1 possible inputs: (name=image_tensor, type=uint8(4), shape=[?,?,?,3])
......@@ -627,7 +627,7 @@ num_detections: 100, detection_scores size: 100, detection_classes size: 100, de
2.`ViewController.mm`中,使用重新训练的模型调用`RunInferenceOnImage`
3. 仍在`ViewController.mm`中,在`DrawTopDetections`函数内调用`LoadLablesFile([FilePathForResourceName(@"pet_label_map", @"pbtxt") UTF8String], &imageLabels);`
而已。 运行该应用程序,您可以看到针对重新训练的模型对检测到的结果进行了更精细的调整。 例如,使用通过使用牛津宠物数据集进行重新训练而生成的前面的重新训练模型,我们希望看到边界框围绕头部区域而不是整个身体,而这正是我们在图 3.9 中所示的测试图像所看到的
而已。 运行该应用程序,您可以看到针对重新训练的模型对检测到的结果进行了更精细的调整。 例如,使用通过使用牛津宠物数据集进行重新训练而生成的前面的重新训练模型,我们希望看到边界框围绕头部区域而不是整个身体,而这正是我们在图 3.9 中所示的测试图像所看到的:
![](img/ced173a8-1b82-4868-a274-3cdf666556e1.png)Figure 3.9 Comparing detected results of pre-trained and retrained models
......@@ -692,9 +692,9 @@ std::vector<tensorflow::Tensor> outputs;
tensorflow::Status run_status = session->Run({{"input", image_tensor}}, {"output"}, {}, &outputs);
```
请注意,此处的`for-loop``session->Run`与上一章中用于图像分类的代码以及使用本章前面所示的其他模型进行对象检测的代码中存在细微但重要的区别(我们在..中未显示代码段。 。,因为与这两个示例中的相同)。 为了使图像数据转换正确,您需要了解模型的详细信息,或者从 Python,Android 或 iOS 的有效示例中学习,当然还要进行必要的调试。 为了正确设置输入和输出节点名称,可以使用`summarize_graph`工具或我们多次显示的 Python 代码段。
请注意,此处的`for-loop``session->Run`与上一章中用于图像分类的代码以及使用本章前面所示的其他模型进行对象检测的代码中存在细微但重要的区别(我们未显示`...`中的代码段,因为与这两个示例中的相同)。 为了使图像数据转换正确,您需要了解模型的详细信息,或者从 Python,Android 或 iOS 的有效示例中学习,当然还要进行必要的调试。 为了正确设置输入和输出节点名称,可以使用`summarize_graph`工具或我们多次显示的 Python 代码段。
4. 将输出结果传递给名为 YoloPostProcess 的函数,该函数类似于`tensorflow/examples/android/src/org/tensorflow/demo/TensorFlowYoloDetector.java` Android 示例文件中的后处理代码:
4. 将输出结果传递给名为`YoloPostProcess`的函数,该函数类似于`tensorflow/examples/android/src/org/tensorflow/demo/TensorFlowYoloDetector.java` Android 示例文件中的后处理代码:
```py
tensorflow::Tensor* output = &outputs[0];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册