axinc-ai / ailia-models-tflite

Quantized version of model library
21 stars 1 forks source link

ADD hrnet #43

Closed kyakuno closed 1 year ago

kyakuno commented 1 year ago

下記のonnxからfloatとint8のtfliteを生成する。 https://github.com/axinc-ai/ailia-models/tree/master/image_segmentation/hrnet_segmentation

kyakuno commented 1 year ago

作業手順は下記を参考にしてください。 https://github.com/axinc-ai/ailia-models-tflite/issues/30

Akasan commented 1 year ago

作業手順

基本的に #30 を参考に実施

  1. ONNXモデルをtflite(float)に変換
    • OpenVINOにあるmo.pyを用いてIR形式へ変換
    • openvino2tensorflowを用いてtfliteへ変換
  2. サンプルコードの作成
    • ブランチはfeature/add_hrnetで作業中
  3. COCODatasetsのval2017を使ってtfliteのfloatモデルをint8モデルに変換(2023/3/12開始)
Akasan commented 1 year ago

@kyakuno 現状の報告です。

こちらの流れで作業をしており、現在、サンプルプログラムの調整とtfliteモデルの精度検証を行なっているところです。

HRNetの3つのモデルについてそれぞれこちらを参考にONNXからtfliteに変換した結果を使って現在結果確認していますが、一部推論結果が変換前と比べて荒れている部分があります(全体としては良好にも見えます)

int8で変換した結果のサンプルを添付します(HRNetV2-W48をint8にした結果です)

result_new_int8

進捗あり次第、追って連絡させていただきます。

Akasan commented 1 year ago

@kyakuno もし同じ経験がありましたらご教授いただけますと幸いなのですが、openvino2tensorflowを使うときに、以下のようなエラーが途中で表示されます(結果としてファイルは生成されていますが)

cannot pickle 'module' object

このエラーが発生することによる推論結果への影響があり、それを過去にご経験されている場合は共有いただけますと幸いです

Akasan commented 1 year ago

saved_modelからint8に変換するときの前処理で、/255.0のところを/127.5になっていたので、前者に修正して再度int8への変換を行なっています。

なお、後者の方で前処理を行いできたモデルについて、hrnet_segmentationで/255.0の前処理に修正したところ、画面中部の荒れ方が治りました。 result_new_int8_oneimage_int8

まずはint8にする際に前処理を/255に変更したのちに、再度モデルの評価をしようと思います

kyakuno commented 1 year ago

いい感じの出力が得られていますね!

Akasan commented 1 year ago

@kyakuno 前処理を/255にし、COCO2017のvalデータでキャリブレーションしたモデルそれぞれを使った結果を添付します。 キャリブレーションについては50枚を使いました(全てで5000枚ありましたが、特にHRNet-W48について処理時間がとてもかかりそうだったので枚数は減らして実施しました)

HRNetV2-W48

HRNetV2-W48

HRNetV2-W18-Small-v1

HRNetV2-W18-Small-v1

HRNetV2-W18-Small-v2

HRNetV2-W18-Small-v2

Akasan commented 1 year ago

この先のTODOについて

Akasan commented 1 year ago

@kyakuno 前処理を/255にし、COCO2017のvalデータでキャリブレーションしたモデルそれぞれを使った結果を添付します。 以下の例では5000枚全てを使ってキャリブレーションしました

全てのデータでキャリブレーションを行なったため、部分的に推論結果が改善していることが確認されます

HRNetV2-W48

HRNetV2-W48_all

HRNetV2-W18-Small-v1

HRNetV2-W18-Small-v1_all

HRNetV2-W18-Small-v2

HRNetV2-W18-Small-v2_all

Akasan commented 1 year ago

@kyakuno 現在、動画対応させるためのコードを作成しております。 ailia-modelsの実装で試していたのですが、動作がうまくいかなかったので、一旦は以下の流れで行っています

  1. NumPy → PILにして、putpalette関数によってパレットを適用
  2. PIL.Image.saveでテンプ画像に保存
  3. opencvで読み込む

ただしこれはかなり冗長な内容なので、修正途中です。 こちらが完了次第、ailia-sdkを用いた最終検証をして、問題なければPRを投げて次のモデルを対応するといった流れになる想定です

Akasan commented 1 year ago

上記動画表示の件、NumPyで問題なく対応できるようになりました

Akasan commented 1 year ago

ailia-tfliteを利用して、tfliteと結果を比較しました。 その結果、以下のように同じような結果が得られました。 見比べたところ、ほとんど一致していることが確認されました(ごく僅かにセグメンテーションの範囲が広くなったり狭くなったりしている部分がありますが、よく見ないとわからない範囲です)

モデル名 tflite ailia-tflite
HRNetV2-W48(float) tflite-w48-float ailia-w48-float
HRNetV2-W48(int8) tflite-w48-int8 ailia-w48-int8
HRNetV2-W18-Small-v1(float) tflite-w18-v1-float ailia-w18-v1-float
HRNetV2-W18-Small-v1(int8) tflite-w18-v1-int8 ailia-w18-v1-int8
HRNetV2-W18-Small-v2(float) tflite-w18-v2-float ailia-w18-v2-float
HRNetV2-W18-Small-v2(int8) tflite-w18-v2-int8 ailia-w18-v2-int8