一. 概述
在边缘运算的重点技术之中,除了 模组轻量化网路架构 与 模组量化 技术之外。另一项技术就是将各家神经网路框架 进行所谓的 模组转换 技术,能帮助开发者快速部属至不同的神经网路框架中。故这里想跟各位读者探讨关于各种模型格式转换为 TensorFlow Lite 的方式,依序分为 TensorFlow 各模组格式转换、 Pytorch 与 ONNX 格式转换、以及 逆转换 TensorFlow Lite 三个章节。
本篇章将介绍 Pytorch 与 ONNX 转换成 TensorFlow Lite 模组的方式,如图下所示。此外模组来源可以至官方提供的 ONNX Model Zoo 与 OpenVINO Model Zoo 。
各模组转换至 TensorFlow Lite 格式示意图
如下图所示,本系列是隶属于 机器学习开发环境 eIQ 之 推理引擎层 (Inference Engines Layer) 中的 TensorFlow Lite 进阶系列,故后续将向读者介绍 “模组转换(二)”
若新读者欲理解更多人工智能、机器学习以及深度学习的资讯,可点选查阅下方博文
大大通精彩博文 【ATU Book-i.MX8系列】博文索引
TensorFlow Lite 进阶系列博文-文章架构示意图
二. 模组转换
Pytorch (.pth) -> ONNX -> TensorFlow Lite
PyTorch 是当今最热门的开源机器学习库。 由 Facebook 的人工智能研究团队于 2017 年开发完成,因语法简洁优雅、概念直观和易上手的等特性,故曾经打败 TensorFlow 成为热门的深度学习框架之一。 但此框架并无对硬体加速层的描述与支持,故须配合 ONNX 进行模组优化 。
官方网站 : https://pytorch.org/
ONNX 转换套件 :
$ pip install onnx
$ pip install onnx-tf
代码 :
# (1) Pytorch Model
import torch
import torchvision.models as models
mobilenet = models.mobilenet_v2()
# --- save model
torch.save(mobilenet,"mobilenet_v2.pt")
torch.save(mobilenet,"mobilenet_v2.pth")
torch.save(mobilenet,"mobilenet_v2.pkl")
# --- load model
model = torch.load("mobilenet_v2.pth")
# (2) Pytorch From torchvision -> ONNX
torch.onnx.export(model, torch.randn(1,3,224,224), "mobilenet_v2.onnx")
# (3) ONNX -> Tensorflow
!onnx-tf convert -i mobilenet_v2.onnx -o /root/mobilenetv2
# (4) Tensorflow -> TF Lite
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model("/root/mobilenetv2")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with tf.io.gfile.GFile( "mobilenetv2.tflite" , 'wb') as f:
f.write(tflite_model)
print("tranfer done!!")
Darknet (.weights) with Pytorch -> ONNX -> TensorFlow Lite
Darknet 是一套运用在 Pytorch 开源机器学习库的深度学习框架。其属于知名 YOLO (You only look once) 架构的原生底层,故这里也介绍如何将其转换为 TensorFlow Lite 的形式。
官方网站 : https://github.com/Tianxiaomo/pytorch-YOLOv4
下载来源 :
$ git clone https://github.com/Tianxiaomo/pytorch-YOLOv4
$ pip install onnx-tf
$ ln -fs /content/drive/MyDrive/Colab_Model_ZOO/YOLOv4_TINY_Training/darknet /app
代码 :
# TensorFlow Lite Converter ( . weights to .tflite )
# (1) Pytorch From torchvision -> ONNX
import torch
from tool.darknet2pytorch import Darknet
model_weight = "/app/backup_relu/my_yolov4-tiny-custom_final.weights" #@param["/app/backup_relu/yolov4-tiny_10000.weights","/app/backup_relu/my_yolov4-tiny-custom_final.weights"]
model_cfg = "/app/cfg/my_yolov4-tiny-custom.cfg" #@param["/app/cfg/my_yolov4-tiny-custom.cfg"]
model = Darknet(model_cfg)
model.print_network()
model.load_weights(model_weight)
torch.onnx.export(model, torch.randn(1,3,416,416), "/content/yolov4-tiny.onnx")
# (2) ONNX -> Tensorflow
!rm -r /content/checkpoints
!onnx-tf convert -i /content/yolov4-tiny.onnx -o /content/yolov4-tiny
# (3) Tensorflow -> TF Lite
converter = tf.lite.TFLiteConverter.from_saved_model("/content/yolov4-tiny")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
tflite_model = converter.convert()
with tf.io.gfile.GFile( "yolov4-tiny-quant.tflite" , 'wb') as f:
f.write(tflite_model)
print("tranfer done!!")
ONNX -> TensorFlow Lite
ONNX 开放神经网路交换格式 (Open Neural Network Exchange) 是针对深度学习神经网路推理框架所设计的一种通用开放的文件格式,衍生出多元机器学习网路推理框架的支持。如下图所示,能将各 模型框架(framework) 转换为 ONNX 格式,并由 ONNX Runtime 推理引擎运行于各种硬体 (CPU/GPU/NPU),即可达到硬体最佳化之作用。
ONNX 转换套件 :
$ pip install onnx-tf
代码 :
ONNX to SavedModel 转换储存格式 :
onnx-tf convert -i /root/facemesh.onnx -o /root/facemesh
TensorFlow Lite 转换 :
# TensorFlow Lite Converter ( SavedModel to .tflite )
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model( "savedmodel_path" )
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with tf.io.gfile.GFile( "model.tflite” , 'wb') as f:
f.write(tflite_model)
print("tranfer done!!")
※ tips 分享 : 该代码仅适用于 TensorFlow 2.5 版本,版本切换方式请查照后续 Google Colab 章节
※ tips 分享 : 安装 onnx-tf 1.9.0 与 onnx.1.8.0 版本 将转换成 SavedModel 形式
※ tips 分享 : 安装 onnx-tf 1.8.0 与 onnx.1.7.0 版本(含之前) 将转换成 Protocol Buffers 形式
OpenVINO Model -> TensorFlow Lite
开放式视觉推理与神经网路优化的资料库(Open Visual Inference and Neural network Optimization, OpenVINO ) 属于 Intel 的深度学习框。可借由此工具促进深度学习框架优化,并用推理引擎将其部署至 Intel 硬体来达到最佳化。
OpenVINO Model (ONNX) -> TensorFlow Lite
这里,将探讨 OpenVINO 提供的 ONNX 与 IR 模型是如何转换为 TensorFlow Lite 资料结构。首先介绍 如何从 OpenVINO 所部属的资源内取得 ONNX 模组 !! 并转换为 tflite 格式!!
第一步,安装必要套件
OpenVINO Model Zoo 下载 : https://github.com/opencv/open_model_zoo.git
$ cd /root
$ git clone https://github.com/opencv/open_model_zoo.git
$ cd /root/open_model_zoo/tools/downloader
$ python -mpip install --user -r ./requirements.in
$ python -mpip install --user -r ./requirements-tensorflow.in
OpenVINO Tool Kit 下载 : https://github.com/openvinotoolkit/openvino
$ cd /root
$ git clone https://github.com/openvinotoolkit/openvino
OpenVINO 开发套件安装 :
$ pip install openvino-dev
ONNX 转换套件 : https://github.com/onnx/onnx-tensorflow.git
$ pip install onnx-tf
ONNX 转换套件 :
$ pip install onnx2keras
第二步,下载欲实现之 ONNX 模组
$ cd /root/open_model_zoo/tools/downloader
$ python downloader.py --name human-pose-estimation-3d-0001 --precisions FP32
$ ./converter.py --mo /root/openvino_env/openvino/model-optimizer/mo.py --name human-pose-estimation-3d-0001
第三步,ONNX 转换 SavedModel
# ONNX转换为 SavedModel 的储存格式
import onnx
from onnx2keras import onnx_to_keras
import tensorflow as tf
import shutil
onnx_model = onnx.load( 'human-pose-estimation-3d-0001/human-pose-estimation-3d-0001.onnx' )
k_model = onnx_to_keras(onnx_model=onnx_model, input_names=['data'], change_ordering=True)
shutil.rmtree( 'root/human-pose-estimation-3d-0001/model/saved_model' , ignore_errors=True)
tf.saved_model.save(k_model, ' /root/human-pose-estimation-3d-0001/model/saved_model')
第四步,SavedModel 转换 TensorFlow Lite
# TensorFlow Lite Converter ( .json to .tflite )
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model( "savedmodel_path" )
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with tf.io.gfile.GFile( "model.tflite” , 'wb') as f:
f.write(tflite_model)
print("tranfer done!!")
OpenVINO Model (IR) -> TensorFlow Lite
接着介绍 如何从 OpenVINO 所部属的资源内取得 IR 模组 !! 并转换为 tflite 格式!!
第一步,安装必要套件
OpenVINO Model Zoo 下载 : https://github.com/opencv/open_model_zoo.git
$ cd /root
$ git clone https://github.com/opencv/open_model_zoo.git
$ cd /root/open_model_zoo/tools/downloader
$ python -mpip install --user -r ./requirements.in
$ python -mpip install --user -r ./requirements-tensorflow.in
OpenVINO Tool Kit 下载 : https://github.com/openvinotoolkit/openvino
$ cd /root
$ git clone https://github.com/openvinotoolkit/openvino
OpenVINO 开发套件安装 :
$ pip install openvino-dev
ONNX 转换套件 : https://github.com/PINTO0309/openvino2tensorflow
$ pip install openvino2tensorflow
第二步,下载欲实现之 IR 模组
$ cd /root/open_model_zoo/tools/downloader
$ python downloader.py --name age-gender-recognition-retail-0013 --precisions FP32
第三步,ONNX 转换 SavedModel
$ openvino2tensorflow --model_path /root/open_model_zoo/tools/downloader/intel/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013.xml --output_saved_model
※ tips 分享 : 此套件为 @PINTO0309 撰写但尚未实现完全,比如 yolo 架构就无法进行转换。
第四步,SavedModel 转换 TensorFlow Lite
# TensorFlow Lite Converter ( SavedModel to .tflite )
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model( "savedmodel_path" )
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with tf.io.gfile.GFile( "model.tflite” , 'wb') as f:
f.write(tflite_model)
print("tranfer done!!")
三. 结语
模组转换是一项相当实用的技术,但取决于各家神经网路框架的版本不同,仍会出现无法转换成功的问题。此章节提供给读者一些 Pytorch、Darknet、OpenVINO、ONNX 转换成 TensorFlow Lite 的方法,但由于各家神经网路都是不断再优化自身框架,故些许代码可能会无法顺利转换成功。若有任何模组转换的问题,可以至下方留言所遇到的问题,让我们一起互相切磋,一起成长!! 下一篇文章,将会介绍如何把 TensorFlow Lite 的格式重新拆解回 Savedmodel 的格式,并再次使用全整数量化来用于纯整数的 AI 芯片上 ,敬启期待 !!
四. 参考文件
[1] 官方文件 - i.MX Machine Learning User's Guide pdf
[2] 官方文件 - TensorFlow Lite 转换工具
[3] 官方文件 - Post-training quantization
[4] 官方文件 - TensorFlow API
[5] 第三方文件 - Tensorflow模型量化(Quantization)原理及其实现方法
[6] 官方文件 - TensorFlow Lite 现有应用资源
[7] 官方文件 - TensorFlow Lite Hub
[8] 官方文件 - TensorFlow Lite Slim
[9] 官方文件 - TensorFlow Model Garden
[10] 官方文件 - TensorFlow Model JS
[11] 官方文件 - Keras
[12] 官方文件 - TensorFlow - Using the SavedModel Format
[13] 第三方文件 - TensorFlow 模型导出总结
[14] 官方文件 - TensorFlow Model Garden
[15] 官方文件 -Megnta github
[16] 官方文件 - Pytorch
[17] 官方文件 - ONNX
[18] 官方文件 - OpenVINO
[19] 官方文件 - ONNX Model Zoo
[20] 官方文件 - OpenVINO Model Zoo
[21] 官方文件 - YOLO : Real-Time Object Detection
如有任何相关 TensorFlow Lite 进阶技术问题,欢迎至博文底下留言提问 !!
接下来还会分享更多 TensorFlow Lite 进阶的技术文章 !!敬请期待 【ATU Book-i.MX8系列 – TFLite 进阶】 !!
评论