axinc-ai / ailia-models-tflite

Quantized version of model library
21 stars 1 forks source link

ADD GoogleNet #57

Closed kyakuno closed 8 months ago

kyakuno commented 1 year ago

https://github.com/axinc-ai/ailia-models/tree/master/image_classification/googlenet

craft-c commented 1 year ago

作業内容 ・.onnx → .tflite (float32) (int8) 変換作業 ・ailia-models-tflite版 GoogleNetサンプル 作成

craft-c commented 1 year ago

@kyakuno

googleNet 量子化(int8)モデルの生成で詰まっています。 ご教示お願いしたいです。

googlenetは画像分類を行うスクリプトです。 スライド1枚目のように、float32モデルの精度は良いのですが、int8モデルの精度が良くありません。 int8モデルへ至る変換フローを、スライド2枚目 に示します。

キャリブレーション画像の問題なのでしょうか? 試しに pizza の画像1枚だけで キャリブレーションを行ったのですが、精度は良くありませんでした。 なにか注意点などございましたら、教えていただきたいです。

image image

craft-c commented 1 year ago

@kyakuno

※現時点でのサンプルの内容は、GoogleNetブランチから確認できます。こちら ※量子化に使用したスクリプト(quantize.py) 、及びfloat32のモデルは こちら からダウンロードできます。

現状メモ (23/03/31) 量子化モデル以外の部分は完成しています。

kyakuno commented 1 year ago

キャリブレーションに与える画像の入力値のレンジを確認いただければと思います。-1.0 - 1.0か、0 - 255かなどです。また、onnx2tfで量子化時にどのようなレンジを与えるかのオプションを探してみてください。

craft-c commented 1 year ago

メモ

試しにresnet50 の onnxモデルを、上記の手順で量子化したところ、上手く変換できました。 この量子化モデルを用いて推論した精度も良好でした。

kyakuno commented 1 year ago

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

kyakuno commented 1 year ago

そもそも、テスト画像が微妙な気がしてきましたので、clock.pngを入れてみて、clockが出力されるか確認いただいても良いでしょうか?このpizza画像は、判定が難しい画像な気がします。 https://github.com/axinc-ai/ailia-models-tflite/blob/main/image_classification/resnet50/clock.jpg

craft-c commented 1 year ago

clock.jpg を入力した結果です。 結果は honeycomb になってしまいます。 `class_count=3

先ほど気づいたのですが、どんな画像を入れても、毎回結果が honeycomb になってしまいます。 prob と value の値も まったく同じです。

craft-c commented 1 year ago

~なお、floatのモデルでは pizzaの画像もきちんと推論できるので、私が作成した推論スクリプト[こちら]の問題ではないと思います。~

kyakuno commented 1 year ago

サンプルの、dtype = np.int8を、dtype = np.floatにしないといけない気がします。/255すると、全て0になってしまいそうです。resnetだと/1なので問題が起きません。

craft-c commented 1 year ago

dtype = np.float に変更して、 clock.jpg を入力した結果です。 やはり、結果は honeycomb になってしまいます。

`class_count=3

craft-c commented 1 year ago

@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 は、こちら から入手できます。

craft-c commented 1 year ago

@kyakuno

[量子化モデルについて]

[こちら]の記事で紹介されていた、onnx2tflite[こちら] という onnx2tfの類似ツールを用いて量子化モデルを生成した結果、精度が良くなりました。 この変換ツールを使用するのは問題ないでしょうか? onnx2tfliteの仕様の不足点については、記事中でいくつか言及されていましたが、googlenetのモデルに関しては良い精度が得られました。

問題ないようでしたら、PRしたいと思います。

float32 及び、int8 モデルは[こちら]からDLできます。 また、作成したサンプルはgooglenetブランチ[こちら]から確認できます。

image

kyakuno commented 1 year ago

はい、onnx2tfliteを使用いただいて問題ありません。 PRをお願いします。