在Android上将ONNX神经网络模型与TensorFlow Lite结合使用

257 篇文章 9 订阅
37 篇文章 1 订阅

目录

下一步


在这里,我们从预先训练的模型中制作TensorFlow Lite模型。

这是有关在Android上使用TensorFlow Lite的系列文章中的第二篇。在上一节中,设置了开发环境以使用TensorFlow模型和Android开发。我们在这里继续为TensorFlow Lite调整网络。

在移动设备上使用TensorFlow Lite时,您可能希望使用已经经过培训的网络。预先训练的网络可让您完成收集和准备训练视觉识别器所需的大量数据的过程,从而更快地达到生产效率。可以使用多种不同的技术来构建预训练网络。

为了支持可以保存神经网络模型的格式之间的互操作性,有一种中间格式。这种格式称为开放式神经网络交换格式(ONNX)。ONNX得到了包括微软、FacebookAMDIBMARMNVIDIAQualcomm等许多公司的支持。

借助ONNX,开发人员可以使用其首选的软件和框架来生成其神经网络模型,并与可能使用其他AI技术的人们共享它们。这意味着TensorFlow Lite不限于仅使用通过TensorFlow实现的模型。可以使用ONNXML技术之间共享使用机器学习框架共有的操作的网络。请注意,使用实验性操作或较不常见的操作的网络可能无法移植到其他框架。

对于本文,我将使用从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.00.0-255.0,或其他某个范围)。网络输出的数据将以数字数组的形式出现。请查阅模型的文档,以了解数字代表什么以及如何排列。对于我选择的网络,请参见其自述文件。

Netron实用程序虽然不能代替模型文档,但可用于从模型中提取信息。Netron显示了神经元在网络中的排列以及其他一些信息。现在,我们感兴趣的信息是网络的输入和输出。使用Netron打开一个YOLO网络模型,然后选择输入节点,将显示如下截图:

从该截图上,我可以看到该模型的输入是针对已调整为416x416像素的RGB图像的。像素被编码为浮点值。该图像是NCHW图像。有许多可能的方法来组织图像数据。

  • N——传入的图像批数。通常对于一个批数为1,或者为None(无),表示批数是动态的,并且可能会变化。
  • C——图像通道。在这种情况下,通道用于红色、绿色和蓝色
  • H——图像的高度。沿这个维度移动将使我们从图像中的一行移到另一行。
  • W——图像的宽度。沿这个维度遍历可以使我们在彼此相邻的像素之间移动。

Netron的此截图还显示,此神经网络模型的输出是一个张量,该张量包含传递给该批次的每个批处理([Nonex125x13x13])的125x13x13浮点值。该工具没有指定这些值分别意味着什么,但是我们需要知道它用于配置输入和输出值。

要将这些ONNX模型之一转换为TensorFlow freeze图,请从终端使用onnx-tf与以下模式匹配的参数:

onnx-tf convert -i source_model.onnx -o output_model.pb

片刻之后,您将获得转换后的TensorFlow freeze图。我们真正想要的是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应用程序中使用它。这就是我们将在下一篇文章中讨论的内容

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值