axinc-ai / ailia-models-tflite

Quantized version of model library
23 stars 1 forks source link

ADD pose_resnet #30

Closed kyakuno closed 1 year ago

kyakuno commented 1 year ago

下記のONNXモデルから、tflite (float)とtflite (int8)を生成してサンプルを作成する。 https://github.com/axinc-ai/ailia-models/tree/master/pose_estimation/pose_resnet

最終目的はtflite版のmodel-zooを作成することです。

2

そのために、onnxをtfliteに変換します。

3

kyakuno commented 1 year ago

ONNXからtfliteへの変換は、openvino2tensorFlowもしくはonnx2tfを使用します。 OpenVino2TensorFlowのインストールと使用方法は下記のIssueも参考にしてください。 https://github.com/axinc-ai/ailia-models-tflite/issues/41

kyakuno commented 1 year ago

全体の作業手順は下記となります。

  1. onnx (float)をtflite (float)に変換 (onnx -> openvino2tensorflow -> keras saved model -> tflite float)
  2. onnx版のailia-modelsのサンプルをコピペしてサンプル作成(poseresnetの場合は https://github.com/axinc-ai/ailia-models/tree/master/pose_estimation/pose_resnet
  3. TFLiteConverterで量子化してtflite (int8)を作成 (keras saved model -> tflite int8)
  4. サンプルのint8対応

AIモデルの推論には、適切な前処理と後処理が必要なので、ailia-modelsを参考に、前処理と後処理を書く必要があります。 サンプルの最終目的は、下記のように、モデルをリポジトリに登録することです。 https://github.com/axinc-ai/ailia-models-tflite/tree/main/object_detection/yolov3-tiny

登録するためにやらないといけないことは下記です。 ・tflite (float)への変換 ・tflite (int8)への変換 ・推論用のPythonスクリプトの作成 ・READMEの作成

onnx版のposeresnetのサンプルをコピーしてきて、推論部分を、ailiaからtensorflowに置き換えるのが、一番、楽だと思います。tensorflowの使い方は、ailia-models-tfliteの既存コードを確認するといいと思います。

poseresnetの前処理のyoloはこのリポジトリにある変換済みのモデルを使ってください。変換は骨格推定モデルだけで問題ありません。

kyakuno commented 1 year ago

サンプルの作成ではとりあえず、ailia_tfliteではなく、公式のtensorflow.liteを使ってください。既存のサンプルの実行時に—tfliteオプションを付与すると、ailiaではなく公式のapiで推論します。

kyakuno commented 1 year ago

keras saved model -> tflite (int8)の量子化のサンプルは下記となります。 https://github.com/axinc-ai/export-to-tflite

saved modelを読み込み、TFLiteConverterを使用して量子化を行います。量子化は、キャリブレーション画像を供給することで、各テンソルのMin/Max値を計算し、その値をもとに、Float -> Int8変換が行われます。そのため、精度を出すには、十分な量のキャリブレーション画像を供給する必要があります。

キャリブレーション画像はCOCO2017データセットのval imagesをダウンロードして使ってください。 pbを含むフォルダ全体がsaved_modelになります。 量子化を行うには、適切な画像の前処理をquantize.pyのrepresentative_dataset_gen()で行う必要があります。ailia-modelsのサンプルを参考に、前処理(RGB/BGRや0-255 -> 0-1.0など)を実装してください。 画像のRGB順、レンジ、解像度を合わせないと量子化後に精度が出ません。

kyakuno commented 1 year ago

公式のTensorFlowで動作確認後、ailia TFLite Runtimeに対応してください。ailia TFLite Runtimeは下記のURLから入手してください。 https://axip-console.appspot.com/trial/terms/AILIA-TFLITE

kyakuno commented 1 year ago

openvino2tensorflowの解説記事です。事前にこちらを読んでおくと良いかと思います。 https://qiita.com/PINTO/items/7a0bcaacc77bb5d6abb1

kyakuno commented 1 year ago

poreresnetはsavedmodelの作成時に、tensorflow.SavedModel exceeds maximum protobuf size of 2GBというエラーが出るとのことなので、Midasから進めてください。将来的に、onnx2tfも試してみてください。

craft-c commented 1 year ago

openvino2tensorflow を用いる方法で、再度 .onnx → openvino → saved_model の変換を試したところ、エラーは出ませんでした。("○○は非推奨です" のようなWarningはいくつか出ましたが) saved_modelを出力できました。

~詰まっているmidas #31 のint8変換はいったん保留にして、pose_resnetのサンプル作成を進めてみたいと思います。~

craft-c commented 1 year ago

サンプル作成指針

craft-c commented 1 year ago

進捗報告

craft-c commented 1 year ago

進捗報告

サンプルスクリプト完成 (画像・動画 共に floatモデルでの動作確認完了)

次:量子化モデル対応

output

craft-c commented 1 year ago

@kyakuno

サンプルはほぼ完成しました。 残りの問題は以下の1点です。 ・float32モデル と ailia-tflite runtime の組み合わせで 精度が出ない

[float32モデル] 表に示すように、公式TFlite だと精度良く推論できますが、 ailia-tflite runtime だと精度が出ません。 また、onnx2tfで変換したモデルの方は、PADV2エラーが出ます。 公式TFliteでは上手く推論できるので、ailia側の問題でしょうか?

[int8モデル] openvino2tensorflowで変換したモデルの精度は良好です。 onnx2tfで変換したモデルの精度は良くない & PADV2 エラーが出ます。

とりあえず現状でPRで良いでしょうか?

pose_resnetブランチは こちら

現時点で公開するとすれば、 float32は onnx2tf で変換したモデルを int8は openvino2tensorflow で変換したモデルを参照してもらいたいです。 DLはこちらから ※なお、物体検出は yolov3-tiny のモデルを使用しています。

image

image

kyakuno commented 1 year ago

@craft-c エクスポート、ありがとうございます。PADV2は次回のailia TFLite Runtimeで対応しますので、公式のtensorflowで動いていれば問題ありません。PRいただければと思います。