一. 概述
在邊緣運算的重點技術之中,除了 模組輕量化網路架構 與 模組量化 技術之外。另一項技術就是將各家神經網路框架 進行所謂的 模組轉換 技術,能幫助開發者快速部屬至不同的神經網路框架中。故這裡想跟各位讀者探討關於各種模型格式轉換為 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 進階】 !!
評論