axinc-ai / ailia-models-tflite

Quantized version of model library
21 stars 1 forks source link

Implement U2net #54

Closed kokuno1122 closed 1 year ago

kokuno1122 commented 1 year ago

closes #47

kyakuno commented 1 year ago

モデルアップロード済み。 https://storage.googleapis.com/ailia-models-tflite/u2net/u2netp_full_integer_quant.tflite

kyakuno commented 1 year ago

実装、ありがとうございます。WEBカメラで試したところ、動きとしては良好そうです。

kyakuno commented 1 year ago

ライセンスファイルのリポジトリへの追加と、トップページのREADME.mdへの記載もお願いします。

kokuno1122 commented 1 year ago

@kyakuno ご確認ありがとうございます。 ご指摘の点は全てcommit 8224e2bにて対応したつもりです。 不足がないか、ご確認をよろしくお願いいたします。

kyakuno commented 1 year ago

macOSだとcv2.waitKey(1)がないと画面に表示されないようなので修正します。

kyakuno commented 1 year ago

TODO : floatのtfliteのupload

kyakuno commented 1 year ago

@kokuno1122 floatで推論すると下記のエラーになるようです。

kyakuno@KazukinoMacBook-Pro u2net % python3 u2net.py --float -v 0         
 INFO utils.py (13) : Start!
TFLite file is prepared!
/Users/kyakuno/Desktop/repos/ailia-models-tflite/image_segmentation/u2net/u2net_utils.py:29: RuntimeWarning: invalid value encountered in true_divide
  image = image/np.max(image)
Traceback (most recent call last):
  File "/Users/kyakuno/Desktop/repos/ailia-models-tflite/image_segmentation/u2net/u2net.py", line 236, in <module>
    main()
  File "/Users/kyakuno/Desktop/repos/ailia-models-tflite/image_segmentation/u2net/u2net.py", line 229, in main
    recognize_from_video(interpreter)
  File "/Users/kyakuno/Desktop/repos/ailia-models-tflite/image_segmentation/u2net/u2net.py", line 141, in recognize_from_video
    quant_params = details['quantization_parameters']
KeyError: 'quantization_parameters'
kokuno1122 commented 1 year ago

@kyakuno 動画モードの方でfloatモデル対応ができていませんでしたので、 64be4faで対応しました。

kyakuno commented 1 year ago

@kokuno1122 サンプルの更新、ありがとうございます。サンプルはこれで問題なさそうです。一点、u2netのint8の場合の精度(馬が消える)ところが気になっています。

試しに、テストに使用している馬の画像1枚を使用してキャリブレーションして、この問題が解決するか試してみていただくことは可能でしょうか。解決するようですと、キャリブレーションに使用するデータセットをCOCOデータセットから、U2NETの学習に使用しているデータセットに変更した方が良いかもしれません。

kyakuno commented 1 year ago

キャリブレーションは各テンソルの出現値のmin/max値を計算する仕組みになっていますので、馬の画像に対応する多様性がCOCOデータセットに不足している可能性があると考えています。

同様に、WEBカメラで人物を認識した場合、顔はうまく認識されるのですが、服は認識されないので、こちらもキャリブレーションの多様性不足かなと考えています。

floatモデルでは正常に動作するので、tfliteフォーマットとしては問題なさそうです。

kyakuno commented 1 year ago

u2netの概要です。 https://medium.com/axinc/u2net-%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%81%A7%E7%89%A9%E4%BD%93%E3%81%AE%E5%88%87%E3%82%8A%E6%8A%9C%E3%81%8D%E3%82%92%E8%A1%8C%E3%81%86%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%87%E3%83%AB-e346f2787cdb u2netのデータセットです。 https://www.elderlab.yorku.ca/resources/salient-objects-dataset-sod/

kokuno1122 commented 1 year ago

@kyakuno 1枚だけ量子化する、という方法ですが、 下記リンクのようなサンプルを使うイメージでしょうか? https://github.com/axinc-ai/ailia-models-tflite/issues/41#issuecomment-1414698748

最初にそのようにkerasのモデルを量子化した際は、精度が今以上に出ていなくて、 前処理を合わせるなど諸々試行しましたが原因が分からなかったので onnx2tfを使用することにした経緯がありました。 onnx2tfのほうはマニュアル読みましたが、キャリブレーションの手順が理解できていない状態です。 現状のモデルは、マニュアル内の下記コマンドで量子化したものです。

onnx2tf -i emotion-ferplus-8.onnx -oiqt

なので、量子化のやり方でオススメの方法あればご教示いただきたいです。

kyakuno commented 1 year ago

-osdオプションを付与してsaved_modelを出力した後、TFLiteConverterで量子化ではどうでしょうか?

# saved_model with signaturedefs added.
# Output in the form of saved_model that can be used for serving
# or conversion to other frameworks.
$ wget https://github.com/PINTO0309/onnx2tf/releases/download/0.0.2/resnet18-v1-7.onnx
$ onnx2tf -i resnet18-v1-7.onnx -osd

https://github.com/PINTO0309/onnx2tf

kokuno1122 commented 1 year ago

ご助言ありがとうございます。

途中でkilledで落ちるので、原因調べてみます。

kokuno1122 commented 1 year ago

@kyakuno 手元のWSLの仮想マシンでメモリが不足して落ちているようです。 こちらでキャリブレーションにトライしますので、-osdオプションでsaved_modelを作っていただくことは可能でしょうか? (-osdオプションを付けなければ実行できますが、変換でsignitureがないとエラーが出てしまいます)

craft-c commented 1 year ago

@kyakuno

既にPRされているので、コメント追記します。

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

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

image