Closed kyakuno closed 1 year ago
作業手順は下記を参考にしてください。 https://github.com/axinc-ai/ailia-models-tflite/issues/30
openvino2tensorflowでエラーが発生した場合は教えてください。
@kyakuno 現状の報告です。 量子化int8モデルファイルの作成、推論サンプルでの実行まで一通りできたのですが、 精度の劣化幅が大きいです。
前処理の部分などでずれがないかどうか確認していますが、 今のところ原因を特定できていない状況です。
キャリブレーションに使う画像ですが、tfliteのドキュメントをみると100-500枚と合ったため cocoの画像300枚でやっていますが少ないでしょうか? 量子化を初めて実施するためそのあたりの勘所がなく。。
onnx2tfだとレイヤーごとに誤差を表示する機能があるため、onnx2tfを試してみても良いかもしれません。キャリブレーション画像は私は5000枚ぐらいでやっていますが、テンソルのminmaxを計算するだけなので、500枚ぐらいでも問題ない気はします。 https://cyberagent.ai/blog/tech/18523/
onnx2tfでもNGでしたら、一旦、floatのtfliteでサンプルを作成頂いてPRをいただければと思います。
一度onnx2tfを試してみます!
@kyakuno すみません、確認したところ、tfliteのfloat32に変換した次点で上記図の劣化をしていることが判明しました。 openvinoの段階では劣化ないことを確認できています。 openvino → tflite float32は、ドキュメント通りコマンドを打っただけでして、 おそらくミスはないと思うのですが。。 性能が劣化したものでも、PRしたほうがよいでしょうか?
公式のツール等を使って、劣化なく変換できるか試してみたほうがよいでしょうか?
floatでも劣化しているということですと、onnx2tfを試してみて頂くのが良いと思います。 他のツールはchannel firstとchannel lastでtransposeが大量に挿入されるので非推奨です。
後は、openvino2tensorflowのissueを読んで同様の報告がないかも確認ください。
onnx2tfですとint8でも劣化を抑えて変換できました。 サンプルの整理を終えましたらPRを提出します。
PRのやり方ですが、ブランチを作ってpushでよかったでしょうか? pushを試みたところ、権限がないようでした。
はい、その手順で問題ありません。権限設定がうまくできていなかったので、修正しました。
@craft-c Midasのexport、ありがとうございました。次のステップとして、こちらのIssueを引き継いでエクスポートをお願いできればと考えています。
了解しました
u2netには変換対象の.onnxモデルが4種類あります。
変換した結果、4種類とも、float32モデルの変換精度は良好でした。 しかし、int8モデルに関しては、u2net_opset11.onnx 以外のモデルの精度が良くありません。
モデル変換の手法をもう一度確認してみます。
@kyakuno
量子化モデル全4種類の内、2種類で精度が出ました。
u2net.onnx キャリブレーションしていないモデルの精度が良い
u2net_opset11.onnx キャリブレーションの有無を問わず精度良し
u2netp.onnx 精度が良くない
u2netp_opset11.onnx 精度が良くない
残りのu2netp.onnx と u2netp_opset11.onnx の量子化モデル生成について、 もう少し粘ってみようとは思うのですが、正直なところ、試せる方法は試し切った感があります。
なお、TFLiteConverterを用いずに、onnx2tfでキャリブレーションして、量子化モデル出力まで行う方法も試そうとしているのですが、ちょくちょく出るエラーに随時対応しており、まだ結果が得られていません。
@kyakuno
キャリブレーション なし の量子化モデルはこちらから入手できます https://drive.google.com/drive/folders/120DMBBgVDnmfSHE-jQptXeC73MguUQ7a?usp=sharing
なお、「キャリブレーションなしの量子化モデル」とは、onnx2tf で出力された saved_model ディレクトリ内に生成された、○○_full_integer_quant.tflite モデルのことです。
u2netpは小さいので、量子化できるだけの冗長性がないのかもしれないですね。 一旦、現状でPRをいただければと思います。
u2net (opset11)とu2netp (opset11)をonnxからtflite (float / int8) に変換してサンプルを作成する。 https://github.com/axinc-ai/ailia-models/tree/master/background_removal/u2net