Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ADD pose_resnet #30

Closed
kyakuno opened this issue Sep 22, 2022 · 13 comments
Closed

ADD pose_resnet #30

kyakuno opened this issue Sep 22, 2022 · 13 comments
Assignees

Comments

@kyakuno
Copy link
Contributor

kyakuno commented Sep 22, 2022

下記の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
Copy link
Contributor Author

kyakuno commented Feb 24, 2023

ONNXからtfliteへの変換は、openvino2tensorFlowもしくはonnx2tfを使用します。
OpenVino2TensorFlowのインストールと使用方法は下記のIssueも参考にしてください。
#41

@kyakuno
Copy link
Contributor Author

kyakuno commented Feb 24, 2023

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

  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
Copy link
Contributor Author

kyakuno commented Feb 24, 2023

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

@kyakuno
Copy link
Contributor Author

kyakuno commented Feb 24, 2023

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
Copy link
Contributor Author

kyakuno commented Feb 24, 2023

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

@kyakuno
Copy link
Contributor Author

kyakuno commented Feb 28, 2023

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

@kyakuno kyakuno assigned kyakuno and craft-c and unassigned kyakuno Feb 28, 2023
@kyakuno
Copy link
Contributor Author

kyakuno commented Feb 28, 2023

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

This was referenced Feb 28, 2023
@craft-c
Copy link
Contributor

craft-c commented Mar 22, 2023

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

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

@craft-c
Copy link
Contributor

craft-c commented Apr 20, 2023

サンプル作成指針

@craft-c
Copy link
Contributor

craft-c commented Apr 26, 2023

進捗報告

  • 置き換え完了
  • 人を検出する部分の動作は良好
  • 骨格推定が上手くいかない
    モデルの問題か、画像の前後処理の問題かの切り分けが必要
    output

@craft-c
Copy link
Contributor

craft-c commented Apr 27, 2023

進捗報告

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

次:量子化モデル対応

output

@craft-c
Copy link
Contributor

craft-c commented Apr 28, 2023

@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
Copy link
Contributor Author

kyakuno commented May 2, 2023

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

@kyakuno kyakuno closed this as completed May 2, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants