【ATU Book-i.MX8系列 - TFLite 进阶】 模组转换(一)

一.   概述

边缘运算的重点技术之中,除了 模组轻量化网路架构模组量化 技术之外。另一项技术就是将各家神经网路框架 进行所谓的 模组转换 技术,能帮助开发者快速部属至不同的神经网路框架中。故这里想跟各位读者探讨关于各种模型格式转换为 TensorFlow Lite 的方式,依序分为 TensorFlow 各模组格式转换、 Pytorch 与 ONNX 格式转换、以及 逆转换 TensorFlow Lite 三个章节。

本篇章将介绍 TensorFlow 各模组格式 (ckpt/savedmodel/pb/h5/TF Slim/TF Hub 等等)  转换成 TensorFlow Lite 模组的方式,如图下所示。此外模组来源可以至官方提供的 TensorFlow Model Garden范例应用程式

 

各模组转换至 TensorFlow Lite 格式示意图

 

如下图所示,本系列是隶属于 机器学习开发环境 eIQ 推理引擎层 (Inference Engines Layer) 中的 TensorFlow Lite 进阶系列,故后续将向读者介绍 模组转换()
若新读者欲理解更多人工智能、机器学习以及深度学习的资讯,可点选查阅下方博文。

 大大通精彩博文   【ATU Book-i.MX8系列】博文索引

 

TensorFlow Lite 进阶系列博文-文章架构示意图

 

二.  模组转换

 Check Point -> TensorFlow Lite 

Check Point (.ckpt) 档案为 TensorFlow 1.x 主要存取模组的格式之一,包含储存计算图结构的 .meta 格式、记录变数索引的 .index 格式以及储存权重资料 .deta 格式组成,或是合并为一个 .ckpt 的档案。其核心用途就是为了方便快速回到重新训练阶段,故须搭配原生的模组架构才能进行模组转换。

代码  :

# TensorFlow Lite Converter ( .ckpt to .tflite )
import tensorflow as tf
from src import transform # 读取模组架构
g = tf.compat.v1.Graph()
soft_config = tf.compat.v1.ConfigProto(allow_soft_placement=True)
soft_config.gpu_options.allow_growth = True
with g.as_default(), tf.compat.v1.Session(config=soft_config) as sess:
img_placeholder = tf.compat.v1.placeholder(tf.float32, shape=[1, 474, 712, 3], name='img_placeholder')
preds = transform.net(img_placeholder)
saver = tf.compat.v1.train.Saver()
saver.restore(sess, "model.ckpt" )
converter = tf.compat.v1.lite.TFLiteConverter.from_session(sess, [img_placeholder], [preds])
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!!")

 

  Frozen Graph -> TensorFlow Lite 

Frozen Graph (.pb) 档案为 TensorFlow 1.x 主要存取模组的格式之一,与上述的 ckpt 格式最大的不同就是其核心用途为模组训练完所生成的格式。故模组其包含了模组架构的资讯,以及整合输出训练中的权重。故此格式无法回到重新训练的阶段,称作冻结图(Frozen Graph)。

代码 :

# TensorFlow Lite Converter ( .pb to .tflite )
import tensorflow as tf
tf.compat.v1.enable_eager_execution()
# Weight Quantization - Input/Output=float32
input_arrays=["normalized_input_image_tensor"]
output_arrays=['TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1',
'TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3']
input_tensor={"normalized_input_image_tensor":[1,300,300,3]}
converter = tf.compat.v1.lite.TFLiteConverter.from_frozen_graph("model.pb", input_arrays,output_arrays,input_tensor)
converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
converter.allow_custom_ops = True
tflite_quant_model = converter.convert()
with open('model.tflite', 'wb') as w:
w.write(tflite_quant_model)
print("tranfer done!!")

 

  SavedModel -> TensorFlow Lite 

SavedModel 格式为 TensorFlow 2.x 主要存取模组的格式之一,可以很好的解决上述两种格式的问题,使用者更能轻松的部属与调用。其组成为保存网路架构的 saved_model.pb 以及 variables 资料夹内的权重与参数而构成。目前以成为 TensorFlow 的主流格式,能够轻易于 TensorFlow Lite / TensorFlow JS / TensorFlow Serving / TensorFlow Hub 应用。

代码  :

# TensorFlow Lite Converter ( savemodel to .tflite )
import tensorflow as tf
import numpy as np
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!!")

 

  Check Point -> SavedModel -> TensorFlow Lite 

Check Point (.ckpt) 格式属于 TensorFlow 较早期的格式,若欲转换 TensorFlow Lite 的形式,则可能会遇到比较多问题,因此这里提出另一种转换方案,就是先转成 SavedModel 的形式,随后再量化成 TensorFlow Lite 模组。

代码  :

# TensorFlow Lite Converter ( .ckpt -> savemodel -> .tflite )
import tensorflow as tf
import tf_slim as slim
import numpy as np
from magenta.models.arbitrary_image_stylization import arbitrary_image_stylization_build_model as build_model
from magenta.models.image_stylization import image_utils
with tf.Graph().as_default(), tf.Session() as sess:
style_image_tensor = tf.placeholder(tf.float32, shape=[1, 256, 256, 3], name='style_image')

#load_checkpoint
model_saver = tf.train.Saver(tf.global_variables())
model_saver.restore(sess, "model.ckpt")

# checkpoint to SavedModel
tf.saved_model.simple_save(sess,
"arbitrary_style_transfer/predict",
inputs={style_image_tensor.name: style_image_tensor},
outputs={'style_bottleneck': bottleneck_feat})

# TensorFlow Lite Converter ( savemodel to .tflite )
converter = tf.lite.TFLiteConverter.from_saved_model("arbitrary_style_transfer/predict")
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!!")

 

 Keras -> TensorFlow Lite 

Keras 为一套 Machine Learning上层的 API ,目前以合并至 TensorFlow 2.x 的系列中。其储存格是为层级资料格式( Hierarchical Data Format, HDF5 (.h5) ),适合储存大量资料的一种格式。

代码  :

# TensorFlow Lite Converter ( .h5 to .tflite )
import tensorflow as tf
converter = tf.compat.v1.lite.TFLiteConverter.from_keras_model_file( 'model.h5' )
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!!")

 

 TensorFlow Hub 

TensorFlow Hub 是官方提供的已训练完成模型数据库与范例,其模组皆可已进行微调。
官方网站 : https://www.tensorflow.org/hub?hl=zh-tw

安装方式  :

$ pip install --upgrade tensorflow-hub

代码  :

# TensorFlow Lite Converter ( .h5 to .tflite )
# Load the model.
import tensorflow_hub as hub
hub_model = hub.load('https://tfhub.dev/tensorflow/faster_rcnn/inception_resnet_v2_640x640/1')
model = hub.load('https://tfhub.dev/google/yamnet/1')

# Tensorlfow Hub to TFLite
import tensorflow as tf
run_model = tf.function(lambda x : model(x))
concrete_func = run_model.get_concrete_function(tf.TensorSpec(shape=[None], dtype=tf.float32))

# Convert the model
converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]
tflite_quant_model = converter.convert()
with open('/root/yamnet.tflite', 'wb') as w:
w.write(tflite_quant_model)
print("tranfer done!!")

 

  TensorFlow JS 

TensorFlow JavaScript 是官方提供的已训练完成模型数据库与范例,专用于网页。简称 TensorFlow.js。这里将告诉各位该如何利用 Google APIs 所发布的 TensorFlow.js 模组来转换为 TensorFlow Lite 的形式。


模组资源 :  https://storage.googleapis.com/tfjs-models/

安装方式  :

$ pip install tfjs-graph-converter

代码  :

# TensorFlow Lite Converter ( .json to .tflite )
# Load the model.
import tensorflow_hub as hub
hub_model = hub.load('https://tfhub.dev/tensorflow/faster_rcnn/inception_resnet_v2_640x640/1')
model = hub.load('https://tfhub.dev/google/yamnet/1')

# Convert the model of savedmodel
import tfjs_graph_converter.api as tfjs
tfjs.graph_model_to_saved_model( "model.json" , "savedmodel_path" )

# Convert the model
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!!")

 

 TensorFlow Slim 

TensorFlow Sim 是一套官方定义与训练神经网路架构、以及评估模型的高级资料库,简称 TF-Slim。此资料库的 API 能够高度相容于原生的 TensorFlow 1.x 框架并轻易进行整合 ! 提供开发者大量模组架构之函数资源 !! TF-Slim 函式库包含建立神经网路阶层 layers 、 评估模型 evaluation、常用损失函数 loss 与评估指标 metrics、或是热门的模组 nets 等等模组化函式,其中亦有 微调(Fine-Tuning) 现有模型的方式。

第一步,安装必要套件

(1) TensorFlow Model Zoo下载 : https://github.com/tensorflow/models.git

$ git clone https://github.com/tensorflow/models.git # download Model Garden for TensorFlow
$ cd /root/models/research/
$ protoc object_detection/protos/*.proto --python_out=. # gernate *.proto
$ python setup.py build

(2) TensorFlow Slim 安装 :

$ pip install tf_slim

(3) Mask RCNN模组下载 : https://github.com/tensorflow/models.git

$ git clone https://github.com/matterport/Mask_RCNN/
$ wget http://download.tensorflow.org/models/object_detection/mask_rcnn_inception_v2_coco_2018_01_28.tar.gz
$ tar -zxvf mask_rcnn_inception_v2_coco_2018_01_28.tar.gz
$ rm mask_rcnn_inception_v2_coco_2018_01_28.tar.gz
$ mkdir -p /root/mask_rcnn_inception_v2_coco_2018_01_28/export

第二步,设定环境变数

import os
os.environ['PYTHONPATH'] +=\
':/root/models/research/:/root/models/research/slim/:/root/models/research/object_detection/utils/:/root/models/research/object_detection'
!export PYTHONPATH=`pwd`:`pwd`/slim:$PYTHONPATH

第三步,TensorFlow Slim 使用测试

$ python object_detection/builders/model_builder_test.py

※ tips 分享 : 若测试失败则表示环境变数未设置成功

第四步,ckpt 转换 SavedModel

# ckpt to SavedModel 指令方式
# 此处可以任意调用输入尺寸
$ python3 /root/models/research/object_detection/export_inference_graph.py \
--input_type=image_tensor \
--pipeline_config_path=/root/mask_rcnn_inception_v2_coco_2018_01_28/pipeline.config \
--trained_checkpoint_prefix=/root/mask_rcnn_inception_v2_coco_2018_01_28/model.ckpt \
--output_directory=/root/mask_rcnn_inception_v2_coco_2018_01_28/test \
--input_shape=1,256,256,3 \
--write_inference_graph=True

第五步,SavedModel转换 TensorFlow Lite

# TensorFlow Lite Converter ( SavedModel to .tflite )
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model("/root/mask_rcnn_inception_v2_coco_2018_01_28/test/saved_model ")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with tf.io.gfile.GFile("mask_rcnn_inception_v2_coco_weight_quant.tflite ", 'wb') as f:
f.write(tflite_model)
print("Quantization complete! ")

※ tips 分享 : 目前实测成功,TF-Slim 转成能够全整数的 TensorFlow Lite 模组

 

 TensorFlow Convert Tool 

官方也提供一套 Command Line Tool 让使用者可以快速转换模组,或可以直接参考此网站

(1) Convert a TensorFlow Frozen Graph

$ tflite_convert \
--output_file=model.tflite \
--graph_def_file=frozen_graph.pb \
--input_arrays=input \
--output_arrays=MobilenetV1/Predictions/Reshape_1

(2) Convert a TensorFlow SavedModel

$ tflite_convert \
--output_file= model.tflite \
--saved_model_dir=saved_model

(3) Convert a TensorFlow SavedModel

$ tflite_convert \
--output_file= model.tflite \
--keras_model_file=keras_model.h5

 

三.  结语

模组转换是一项相当实用的技术,但取决于各家神经网路框架的版本不同,仍会出现无法转换成功的问题。况且各家神经网路都是不断再优化自身的框架,就如同最传统的 Check Point格式而言,部分的运算元(Operator),可能就无法顺利转换为 TensorFlow Lite 的格式。因此这项技术是需要一些经验累加与除错能力,以及各家神经网路版本所对应的资讯才能顺利转换完成。网路上也有许多工程师一起分享如何解决相似的问题,此外若有任何模组转换的问题,可以至下方留言所遇到的问题,让我们一起互相切磋,一起成长!! 下一篇文章,将会以 Pytorh 与 ONNX 转换至 TensorFlow Lite 的模组为主,敬启期待 !!

 

四.  参考文件

[1] 官方文件 - i.MX Machine Learning User's Guide pd
[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


如有任何相关
TensorFlow Lite 进阶技术问题,欢迎至博文底下留言提问 !!
接下来还会分享更多 TensorFlow Lite 进阶的技术文章 !!敬请期待 ATU Book-i.MX8系列 – TFLite 进阶 !!

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论