在Android上将ONNX神经网络模型与TensorFlow Lite结合使用(译文)
By S.F.
本文链接 https://www.kyfws.com/news/using-an-onnx-neural-network-model-with-tensorflow/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 5 分钟阅读 - 2120 个词 阅读量 0在Android上将ONNX神经网络模型与TensorFlow Lite结合使用(译文)
原文地址:https://www.codeproject.com/Articles/5279603/Using-an-ONNX-Neural-Network-Model-with-TensorFlow
原文作者:Joel Ivory Johnson
译文由本站翻译
前言
在本文中,我们将采用预训练的神经网络并将其调整为可在TensorFlow Lite中使用. 在这里,我们从预先训练的模型中制作TensorFlow Lite模型. 这是有关在Android上使用TensorFlow Lite的系列文章中的第二篇.在上一节中,设置了开发环境以使用TensorFlow模型和Android开发.我们在这里继续为TensorFlow Lite调整网络. 在移动设备上使用TensorFlow Lite时,您可能希望使用已经经过培训的网络.预先训练的网络使您摆脱了收集和准备训练视觉识别器所需的大量数据的过程,并且可以更快地达到生产效率.可以使用多种不同的技术来构建预训练的网络. 为了支持可以保存神经网络模型的格式之间的互操作性,有一种中间格式.该格式称为开放式神经网络交换格式(ONNX). ONNX得到了包括微软,Facebook,AMD,IBM,ARM,NVIDIA,Qualcomm等许多公司的支持. 借助ONNX,开发人员可以使用其首选的软件和框架来生成其神经网络模型,并与可能使用其他AI技术的人们共享它们.这意味着TensorFlow Lite不限于仅使用通过TensorFlow实现的模型.可以使用ONNX在ML技术之间共享使用机器学习框架共有的操作的网络.请注意,使用实验性或较不常见的操作的网络可能无法移植到其他框架. 对于本文,我将使用从ONNX Model Zoo中获取的模型.在此存储库中,您将找到用于视觉识别,语音识别,手势分析等的模型.我将下载视觉分类模型YOLO(仅查看一次)模型之一.我正在使用YOLO4实施.在存储库中,您可以在/vision/object_detection_segmentation/yolo4/models中找到它. 如果要使用此存储库中的模型,则需要使用GIT LFS(大文件系统).使用GIT LFS,您可以克隆存储库,然后仅下载感兴趣的文件,而无需下载所有大文件.克隆此存储库之前,请使用以下命令激活GIT LFS:
git lfs install
GIT显示启用LFS的确认.接下来,克隆ONNX Model Zoo存储库:
git clone https://github.com/onnx/models
克隆的存储库将具有较大的.onnx文件的占位符文件.要下载文件的实际数据,请使用git lfs pull命令,并传递相对于要下载的文件或文件夹的存储库的路径:
git lfs pull --include="vision/object_detection_segmentation/yolov4/model" --exclude=""
或者,如果您有足够的空间,网络带宽和时间,并且希望下载模型中的所有文件,则可以传递通配符作为下载文件的名称:
git lfs pull --include="*" --exclude=""
在选择网络时,您还将需要检查网络处理的数据的前提条件和后置条件的信息.对于某些网络,您可以在自述文件中的模型旁边找到此信息.对于某些其他网络,您可能需要查看其原始来源才能找到此信息.用于视觉识别的网络可能需要将图像调整大小到特定范围,或者需要以某种方式编码的像素值(例如,整数值,浮点值,范围为0.0-1.0或0.0-255.0,或其他某个范围).从网络输出的数据将以数字数组的形式出现.请查阅模型的文档,以了解数字代表什么以及如何排列.对于我选择的网络,在其readme.md文件中有一条声明,要求图像必须为416x416像素作为浮点值. Netron实用程序虽然不能代替模型文档,但可用于从模型中提取信息. Netron显示了神经元在网络中的排列以及其他一些信息.目前,我们感兴趣的信息是网络的输入和输出.使用Netron打开一种YOLO网络模型,然后选择输入节点,将产生如下屏幕:
从该屏幕上,我可以看到该模型的输入是针对已调整为416x416像素的RGB图像的.像素被编码为浮点值.该图像是NCHW图像.有许多可能的方法来组织图像数据.
- ñ
- C
- H
- w ^
Netron的此屏幕还显示,此神经网络模型的输出是一个张量,该张量包含传递给该批次的每个批处理([Nonex125x13x13])的浮点值125x13x13.该工具并未指定这些值的分别含义,但我们需要了解它来配置输入和输出值.
要将这些ONNX模型之一转换为TensorFlow冻结图,请在终端上使用
onnx-tf
,其参数与以下模式匹配:
onnx-tf convert -i source_model.onnx -o output_model.pb
片刻之后,您将获得转换后的TensorFlow冻结图.我们真正想要的是TensorFlow Lite文件.要将文件从TensorFlow转换为TensorFlow Lite,我使用Python脚本.存在命令行工具,但是我发现使用Python脚本更加灵活.
import tensorflow as tf
saved_model_dir='/dev/projects/models'
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tf_lite_model = converter.convert()
open('output.tflite', 'wb').write(tf_lite_model)
只要输出具有.tflite扩展名,就可以将其命名为任意名称.确保正确设置扩展名,因为稍后将很重要.
下一步
既然我们已经将ONNX模型转换为Tensorflow Lite,我们就可以在Android应用程序中使用它了.这就是我们将在下一篇文章中介绍的内容.
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
Python AI neural tensorflow 新闻 翻译