一、概述

TensorFlow 是 Google 开源深度学习框架,可以用于机器学习、语音识别、目标检测等多种人工智能算法的开发。TensorFlow Object Detection API 是 TensorFlow 框架中专门用于目标检测应用的深度学习框架,使用该框架可以快速训练出不同种类的深度学习目标检测模型。如图 1 所示。

opencv TensorFlow 比较 tensorflow openvino_API


本文基于 TensorFlow Object Detection API 框架搭建基于深度学习的目标检测应用的开发环境,OpenVINO™工具套件为目标检测模型优化部署的框架,介绍了 TensorFlow ObjectDetection API 框架和 OpenVINO™工具套件的安装和使用,以及 FasterRCNN 目标检测模型训练的全部流程。并详细介绍了 OpenVINO™ Inference Engine 应用程序典型开发流程,以及怎样使用 C++ 编程语言开发 AI 推理应用程序。

训练目标检测模型需要极大的算力,本文的硬件平台选择为为英特尔®NUC(N ext Unit of Computer) 产品线系列的幻影峡谷,英特尔®NUC 是英特尔® 公司设计制造的功能强大的迷你计算机 (Mini PC),而该系列中的幻影峡谷是一款具备 AI 训练能力的迷你计算机。
使用的幻影峡谷与深度学习模型训练相关的参数如下。
● 11th Gen Intel® Core™ i7-1165G7
● Intel® Iris® Xe Graphics
● NVIDIA GeForce RTX 2060
本文需要的软件运行环境及其对应版本如下。
● TensorFlow 2.4.0
● OpenVINO 2021.4 LTS
● Python 3.8.10

二 、使用 TensorFlow Object Detection API 进行模型训练

第一步,标注数据集并生成 TFRecord 文件

首先从 Kaggle 直接下载猫狗数据集,使用 LabelImg 进行标注,讲标注后的 .xml 文件和 .jpg 格式的原文件一齐放进数据训练集所对应的文件夹,再按照比例依次划分验证集和测试机的比例并分别放入相应文件夹。标注图片完毕后,根据标注文件的标签类型创建标签映射文件:label_map.pbtxt,在标签文件中,每个标注类型对应一个 item 项,每个项有两个属性,id 和 name。id 是整形数据本文标签有猫和狗两个类型,id 的编号便从 1 到 2,如代码清单 1 所示:

opencv TensorFlow 比较 tensorflow openvino_API_02

最后创建 TFRecord 文件,TFRecord 格式文件是向 TensorFlow模型输入数据速度最快,效率最高的格式文件。标注完数据集,创建标签映射文件后,根据如图 2 所示相应命令,创建 train.tfrecord 和 eval.tfrecord 文件。

opencv TensorFlow 比较 tensorflow openvino_openvino_03

第二步,修改预训练模型配置文件,启动模型训练

TensorFlow Model Zoo 提供多个在 coco 数据集上完成训练 的 目 标 检 测 模 型, 本 文 以 下 载 faster_rcnn_resnet50_v1_640*640_coco17_tpu-8 模型为例,模型下载解压后,得到“checkpoint”、“saved_model”和“pipeline.config”三个文件,在进行迁移学习配置模型文件是需要修改“pipeline,config”文件的内部参数。

根据模型训练的需要分别修改配置文件“pipeline.config”中num_classes、batch_size、num_steps 等参数值,以及配置标签映射文件和 TFRecord 文件的路径。Pipeline.config 文件配置完毕后,即可根据本文提供的模型训练脚本启动训练,如图 3 所示。

opencv TensorFlow 比较 tensorflow openvino_openvino_04

第三步,导出模型推理预测

在模型训练过程中会产生一系列的 checkpoint 检查点文件,模型训练过程中,所涉及到的参数和权重值全部记录在检查点文件中,但是检查点文件没有关于模型计算的源代码。所

以在模型推理计算阶段,需要将 checkpoint 文件和模型计算的描述一起打包成可以部署的 SavedModel 格式。生成的SavedModel 格式文件夹如图 4 所示。

opencv TensorFlow 比较 tensorflow openvino_API_05


生成 SavedModel 后即可执行推理计算,首先将本文附带object_detection_example_2.py 模型推理计算的脚本下载到本地,打开 object_detection_example_2.py 文件,根据实

际路径情况修改 PATH_TO_IMAGES_DIR,PATH_TO_SAVED_MODEL,PATH_TO_LABELS 三处,修改完毕运行该 Python脚本,即可得到模型推理计算的结果,如图 5 所示。

opencv TensorFlow 比较 tensorflow openvino_目标检测_06

三、使用 OpenVINO™工具套件部署

TensorFlow 支持将训练好的深度学习模型通过 OpenVINO™工具套件对模型进行优化部署,在初始化 OpenVINO™工具套件使用环境,安装完毕 OpenVINO™工具套件相关依赖后即可进行加速部署。

第一步,使用 Model—Optimizer 优化模型

Model_Optimizer 工具是 OpenVINO™工具套件中用于深度学习优化的 Python 脚本,支持从各种深度学习框架导入训练后的模型,并将其转换为 IR 格式文件。启 动 tensorflow 虚 拟 环 境, 首 先 输 入 命 令 <pip install -rrequirements_tf2.txt> 安装 mo_tf.py 运行时依赖的 python 软件包,再输入命令:<python mo_tf.py --saved_model_dird:\tf_train\workspaces\cats_dogs\exported_model\my_faster_rcnn\saved_model --tensorflow_object_detection_api_pipeline_config d:\tf_train\workspaces\cats_

dogs\exported_model\my_faster_rcnn\pipeline.config–output_dird:\tf_train\workspaces\cats_dogs\IR_model–data_type FP16 --transformations_config extensions\front\tf\faster_rcnn_support_api_v2.0.json>, 执 行TensorFlow 模型并优化成 IR 文件,运行结果如图 6 所示:

opencv TensorFlow 比较 tensorflow openvino_tensorflow_07

第二步,Inference Engine 应用程序典型开发流程

Inference Engine 典型的开发流程一共有八步,每一步都对应着相应的 C++ API,每一步都对应着相应的 C++ API,如图 7所示。

opencv TensorFlow 比较 tensorflow openvino_目标检测_08

第三步,编写 OpenVINO™ AI 推理计算 C++范例

根据第二步的八个 Inference Engine 典型开发程序所对应的C++ API 即可编写 AI 推理计算程序。首先完成 Visual Studio 项目属性和环境变量的配置,然后使用 C++ 编程语言开发 OpenVINO™推理应用程序,在执行main() 函数之前引入相应库函数,配置推理计算设备,IR 文件路径,媒体文件路径,部分代码如代码清单 2 所示:代码清单 2 AI 推理范例部分代码

// ----- Step 3. 配置模型输入 & 输出 ----------------
 // ------------------------------------------------
 // 参考资料:https://docs.openvinotoolkit.org/latest/openvino_docs_IE_DG_Integrate_with_customer_application_new_API.html
 std::cout << “Step 3. Configure input & output.” <<
 std::endl;
 // 获得网络输入信息 ( 键值对 )
 InferenceEngine::InputsDataMap inputs_info = network.getInputsInfo();
 // 获得网络输出信息 ( 键值对 )
 InferenceEngine::OutputsDataMap output_info = network.getOutputsInfo();
 std::string image_info_name = “”;
 // 存储 image_info 的名字
 std::string input_tensor_name = “”;
 // 存储 input_tensor 的名字
 auto item = inputs_info.begin();image_info_name = item->first;
 // 获取 image_info 输入的名字
 auto image_info_ptr = item->second;
 // 获取 image_info 输入的指针
 item++;
 input_tensor_name = item->first;
 // 获取 input_tensor 输入的名字
 auto input_tensor_ptr = item->second;
 // 获取 input_tensor 输入的指针
 std::cout << “image_info_name:” << image_info_name << “;
 input_tensor_name:” << input_tensor_name << std::endl;
 // 配置 input_tensor 输入:U8,NCHW, 保持默认的禁止自动放缩输入图像和禁止自动转换颜色通道
 input_tensor_ptr->setPrecision(InferenceEngine::Precision::U8);
 // U8 最通用 , 参考资料:https://docs.openvinotoolkit.org/latest/openvino_docs_IE_DG_supported_plugins_Supported_Devices.html
 input_tensor_ptr->setLayout(InferenceEngine::Layout::NCHW);

编译好程序后,讲解决方案配置设置为 Release 和 X64,单击“本地 windows 调试器”编译并运行 cats_dogs 程序,编译结果如图 8 所示:

opencv TensorFlow 比较 tensorflow openvino_深度学习_09

四、总结

本文通过从零开始训练猫狗数据集目标检测模型,详细介绍了基于 TensorFlow Object Detection API 框架和预训练模型,使用 Python 编程语言训练猫狗 FasterRCNN 目标检测模型的完整流程,在模型部署模块中,详细介绍了 OpenVINO™工具套件及其两个重要组件:Model Optimizer 和 InferenceEngine 的安装和使用,将训练完毕的 FasterRCNN 模型转换为 IR 格式文件后,使用 C++ 编程语言进行 AI 应用程序的开发方法。在使用 Inference Engine 进行模型推理部署是,OpenVINO™工具套件提供了八个统一的 API 接口,流程化的开发方式极大降低了 AI 应用程序开发的难度,对于不同模型的不同输入输出节点,只需少量改动应用程序,便可快速独立开发属于自己的 AI 应用程序。