Closed kyakuno closed 8 months ago
作業内容 ・.onnx → .tflite (float32) (int8) 変換作業 ・ailia-models-tflite版 GoogleNetサンプル 作成
@kyakuno
googleNet 量子化(int8)モデルの生成で詰まっています。 ご教示お願いしたいです。
googlenetは画像分類を行うスクリプトです。 スライド1枚目のように、float32モデルの精度は良いのですが、int8モデルの精度が良くありません。 int8モデルへ至る変換フローを、スライド2枚目 に示します。
キャリブレーション画像の問題なのでしょうか? 試しに pizza の画像1枚だけで キャリブレーションを行ったのですが、精度は良くありませんでした。 なにか注意点などございましたら、教えていただきたいです。
キャリブレーションに与える画像の入力値のレンジを確認いただければと思います。-1.0 - 1.0か、0 - 255かなどです。また、onnx2tfで量子化時にどのようなレンジを与えるかのオプションを探してみてください。
メモ
試しにresnet50 の onnxモデルを、上記の手順で量子化したところ、上手く変換できました。 この量子化モデルを用いて推論した精度も良好でした。
resnet50は0-255かつbgr順、googlenetはnormalize_type=Noneで0-255かつbgr順なので、量子化は問題なさそうな気がしますね。 https://github.com/axinc-ai/ailia-models/blob/master/image_classification/resnet50/resnet50.py https://github.com/axinc-ai/ailia-models/blob/master/image_classification/googlenet/googlenet.py
そもそも、テスト画像が微妙な気がしてきましたので、clock.pngを入れてみて、clockが出力されるか確認いただいても良いでしょうか?このpizza画像は、判定が難しい画像な気がします。 https://github.com/axinc-ai/ailia-models-tflite/blob/main/image_classification/resnet50/clock.jpg
clock.jpg を入力した結果です。 結果は honeycomb になってしまいます。 `class_count=3
先ほど気づいたのですが、どんな画像を入れても、毎回結果が honeycomb になってしまいます。 prob と value の値も まったく同じです。
サンプルの、dtype = np.int8を、dtype = np.floatにしないといけない気がします。/255すると、全て0になってしまいそうです。resnetだと/1なので問題が起きません。
dtype = np.float に変更して、 clock.jpg を入力した結果です。 やはり、結果は honeycomb になってしまいます。
`class_count=3
@kyakuno
int8モデルで精度出ない問題について、 おそらくモデルが原因なので、再度モデル変換を試みているのですが、 現在、以下の状況で詰まっています。 お目通しお願いしたいです。
onnx2tfを用いてモデル変換する方法 → float32モデルは推論精度良好 → quantize.pyで量子化したモデルは、どの画像を入力しても、毎回出力が "honeycomb" になってしまう (推論スクリプトの、dtype = np.int8は、dtype = floatに変更済みです)
openvino2tensorflowを用いてモデル変換する方法
→ openvinoからsaved_mmodelへ変換するときにエラーが出る
ValueError: Input 0 of layer "zero_padding2d" is incompatible with the layer: expected ndim=4, found ndim=5. Full shape received: (1, 3, 1, 224, 3)
ERROR: Please refer to 6-7 in the README first. https://github.com/PINTO0309/openvino2tensorflow
エラーで示されたURL先(こちら) によると、JSONファイルを用いて強制的にConstの内容を変更できるとのこと。
つまり、変換前の.onnxモデルで、次元の要素数が5になっている部分を強制的に4に変更すれば良いのでしょうか?
しかし、googlenet.onnx を Netronで開いて確認してみたが、5次元になっている部分を見つけられません。
なお、googlenet.onnx は、こちら から入手できます。
はい、onnx2tfliteを使用いただいて問題ありません。 PRをお願いします。
https://github.com/axinc-ai/ailia-models/tree/master/image_classification/googlenet