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 GoogleNet #57

Closed
kyakuno opened this issue Mar 24, 2023 · 14 comments
Closed

ADD GoogleNet #57

kyakuno opened this issue Mar 24, 2023 · 14 comments
Assignees

Comments

@kyakuno
Copy link
Contributor

kyakuno commented Mar 24, 2023

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

@craft-c craft-c self-assigned this Mar 30, 2023
@craft-c
Copy link
Contributor

craft-c commented Mar 30, 2023

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

@craft-c
Copy link
Contributor

craft-c commented Mar 31, 2023

@kyakuno

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

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

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

image
image

@craft-c
Copy link
Contributor

craft-c commented Mar 31, 2023

@kyakuno

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

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

@kyakuno
Copy link
Contributor Author

kyakuno commented Apr 3, 2023

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

@craft-c
Copy link
Contributor

craft-c commented Apr 3, 2023

メモ

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

@kyakuno
Copy link
Contributor Author

kyakuno commented Apr 3, 2023

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

kyakuno commented Apr 3, 2023

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

@craft-c
Copy link
Contributor

craft-c commented Apr 3, 2023

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

  • idx=0
    category=599[honeycomb ]
    prob=8.43918514251709
    value=54
  • idx=1
    category=737[pop bottle, soda bottle ]
    prob=5.5038161277771
    value=14
  • idx=2
    category=898[water bottle ]
    prob=5.283663749694824
    value=11
    INFO googlenet_memo.py (166) : Script finished successfully.`

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

@craft-c
Copy link
Contributor

craft-c commented Apr 3, 2023

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

@kyakuno
Copy link
Contributor Author

kyakuno commented Apr 3, 2023

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

@craft-c
Copy link
Contributor

craft-c commented Apr 3, 2023

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

`class_count=3

  • idx=0
    category=599[honeycomb ]
    prob=8.43918514251709
    value=54
  • idx=1
    category=737[pop bottle, soda bottle ]
    prob=5.5038161277771
    value=14
  • idx=2
    category=898[water bottle ]
    prob=5.283663749694824
    value=11
    INFO googlenet_memo.py (166) : Script finished successfully.`

@craft-c
Copy link
Contributor

craft-c commented Apr 12, 2023

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

craft-c commented Apr 19, 2023

@kyakuno

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

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

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

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

image

@kyakuno
Copy link
Contributor Author

kyakuno commented Apr 20, 2023

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

@kyakuno kyakuno closed this as completed Nov 30, 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