axinc-ai / ailia-models-tflite

Quantized version of model library
21 stars 1 forks source link

ADD U2Net #47

Closed kyakuno closed 1 year ago

kyakuno commented 1 year ago

u2net (opset11)とu2netp (opset11)をonnxからtflite (float / int8) に変換してサンプルを作成する。 https://github.com/axinc-ai/ailia-models/tree/master/background_removal/u2net

kyakuno commented 1 year ago

作業手順は下記を参考にしてください。 https://github.com/axinc-ai/ailia-models-tflite/issues/30

kyakuno commented 1 year ago

openvino2tensorflowでエラーが発生した場合は教えてください。

kokuno1122 commented 1 year ago

@kyakuno 現状の報告です。 量子化int8モデルファイルの作成、推論サンプルでの実行まで一通りできたのですが、 精度の劣化幅が大きいです。

前処理の部分などでずれがないかどうか確認していますが、 今のところ原因を特定できていない状況です。

キャリブレーションに使う画像ですが、tfliteのドキュメントをみると100-500枚と合ったため cocoの画像300枚でやっていますが少ないでしょうか? 量子化を初めて実施するためそのあたりの勘所がなく。。

image

kyakuno commented 1 year ago

onnx2tfだとレイヤーごとに誤差を表示する機能があるため、onnx2tfを試してみても良いかもしれません。キャリブレーション画像は私は5000枚ぐらいでやっていますが、テンソルのminmaxを計算するだけなので、500枚ぐらいでも問題ない気はします。 https://cyberagent.ai/blog/tech/18523/

kyakuno commented 1 year ago

onnx2tfでもNGでしたら、一旦、floatのtfliteでサンプルを作成頂いてPRをいただければと思います。

kokuno1122 commented 1 year ago

一度onnx2tfを試してみます!

kokuno1122 commented 1 year ago

@kyakuno すみません、確認したところ、tfliteのfloat32に変換した次点で上記図の劣化をしていることが判明しました。 openvinoの段階では劣化ないことを確認できています。 openvino → tflite float32は、ドキュメント通りコマンドを打っただけでして、 おそらくミスはないと思うのですが。。 性能が劣化したものでも、PRしたほうがよいでしょうか?

公式のツール等を使って、劣化なく変換できるか試してみたほうがよいでしょうか?

kyakuno commented 1 year ago

floatでも劣化しているということですと、onnx2tfを試してみて頂くのが良いと思います。 他のツールはchannel firstとchannel lastでtransposeが大量に挿入されるので非推奨です。

kyakuno commented 1 year ago

後は、openvino2tensorflowのissueを読んで同様の報告がないかも確認ください。

kokuno1122 commented 1 year ago

onnx2tfですとint8でも劣化を抑えて変換できました。 サンプルの整理を終えましたらPRを提出します。

kokuno1122 commented 1 year ago

PRのやり方ですが、ブランチを作ってpushでよかったでしょうか? pushを試みたところ、権限がないようでした。

kyakuno commented 1 year ago

はい、その手順で問題ありません。権限設定がうまくできていなかったので、修正しました。

kyakuno commented 1 year ago

@craft-c Midasのexport、ありがとうございました。次のステップとして、こちらのIssueを引き継いでエクスポートをお願いできればと考えています。

craft-c commented 1 year ago

了解しました

craft-c commented 1 year ago

現状報告

u2netには変換対象の.onnxモデルが4種類あります。

変換した結果、4種類とも、float32モデルの変換精度は良好でした。 しかし、int8モデルに関しては、u2net_opset11.onnx 以外のモデルの精度が良くありません。

モデル変換の手法をもう一度確認してみます。

image

craft-c commented 1 year ago

@kyakuno

現状報告

量子化モデル全4種類の内、2種類で精度が出ました。

u2net.onnx  キャリブレーションしていないモデルの精度が良い

u2net_opset11.onnx  キャリブレーションの有無を問わず精度良し

u2netp.onnx  精度が良くない

u2netp_opset11.onnx  精度が良くない

残りのu2netp.onnx と u2netp_opset11.onnx の量子化モデル生成について、 もう少し粘ってみようとは思うのですが、正直なところ、試せる方法は試し切った感があります。

なお、TFLiteConverterを用いずに、onnx2tfでキャリブレーションして、量子化モデル出力まで行う方法も試そうとしているのですが、ちょくちょく出るエラーに随時対応しており、まだ結果が得られていません。

image

craft-c commented 1 year ago

@kyakuno

キャリブレーション なし の量子化モデルはこちらから入手できます https://drive.google.com/drive/folders/120DMBBgVDnmfSHE-jQptXeC73MguUQ7a?usp=sharing

なお、「キャリブレーションなしの量子化モデル」とは、onnx2tf で出力された saved_model ディレクトリ内に生成された、○○_full_integer_quant.tflite モデルのことです。

craft-c commented 1 year ago

@kyakuno

推論結果の一覧を示します。

u2netp.onnx と u2netp_opset11.onnx の量子化モデルの精度が良くないと思います。 粗い画像が出力されてしまいます。 しかし、試せる手法は試し切った感があります。

一旦現状でPRでも良いでしょうか?

全8種類のモデルは[こちら]からDLできます。 また、作成したサンプルはu2netブランチ[こちら]から確認できます。

image

kyakuno commented 1 year ago

u2netpは小さいので、量子化できるだけの冗長性がないのかもしれないですね。 一旦、現状でPRをいただければと思います。