axinc-ai / ailia-models-tflite

Quantized version of model library
21 stars 1 forks source link

ADD RoadSegmentationAdas #44

Open kyakuno opened 1 year ago

kyakuno commented 1 year ago

RoadSegmentationAdasのONNXを登録する。 https://github.com/axinc-ai/ailia-models/tree/master/road_detection/road-segmentation-adas

kyakuno commented 1 year ago

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

craft-c commented 1 year ago

作業方針

・saved_model (float32) 生成 ・画像推論部分のスクリプト作成 ・動画推論部分のスクリプト作成 ・量子化モデル生成

craft-c commented 1 year ago

@kyakuno

.onnxモデルの変換において、詰まっています。 ご助言いただきたいです。

【やりたいこと】 ・.onnxモデルをsaved_model(及び float32.tfliteモデル) へ変換 ・saved_modelを元に量子化モデルを生成する

【問題点】 1枚目のスライドのように、 元の.onnxモデルの入力は NHWC形式なのですが、 onnx2tfで変換、出力したsaved_modelやfloat32モデルの入力形式が NCWH という、 あまり見かけない順序になってしまいます。

このため、2枚目のスライドのように、 チャンネル数が誤認識されてしまい、量子化が上手くいかないという問題が発生してしまいます。

【試したこと】 ・onnx2tfにおいて、 -ois オプションで入力形式をNHWCとして明記したにも関わらず、NWCH の順でモデルが出力される。 ・openvino2tensorflowのやり方で試した。  openvinoへの変換はできるが、その後saved_modelの出力でエラーが出る。  エラーの数が多くてどれが本質的な問題なのか見抜けなかった。

【質問 & これから取り組みたいこと】 ・元の入力形式(NHWC)を保ったまま、モデル変換を行うにはどうすれば良いか ・変換したモデルの入力形式が NCWH でも量子化する方法はあるのか

【その他連絡】 入力順序は変ですが、float32モデルは出力できたので、 とりあえずサンプルスクリプトの作成を進めたいと思います。

image

image

kyakuno commented 1 year ago

このモデルは、もともと、openvino2tensorflow -> onnxというフローで変換されています。 ということで、下記のbinとprototxtを直接、openvino2tensorflowに入れるとsaved_modelが作れるのではないかと思います。 https://github.com/openvinotoolkit/open_model_zoo/tree/master/models/intel/road-segmentation-adas-0001

craft-c commented 1 year ago

@kyakuno

.prototxtファイルはopenvino2tensorflowの入力として不適切?のようです。 コマンドが通りません。

openvino2tensorflowを使ってsaved_modelを出力するには、2枚目のスライドのように、 「.xml」「.bin」「.mapping」の3つのファイルが必要だと思われるのですが、 model-zoo で公開されているモデル内には見当たりません。

つまり、model-zoo で公開されているモデルを元に、 何らかの方法で「.xml」「.bin」「.mapping」を生成する作業が別途必要なのでしょうか。

image

image

kyakuno commented 1 year ago

こちらからダウンロードできるのではないかと思います。 https://github.com/openvinotoolkit/open_model_zoo/blob/master/models/intel/road-segmentation-adas-0001/model.yml

craft-c commented 1 year ago

現状報告

・画像推論部分完成 ~・float32モデル+公式TFを用いた推論結果について、  「縁石」の検出が甘いことを除けば良好~

image

craft-c commented 1 year ago

入力画像の前処理を調整すると、先の問題解消しました。 精度良好です。

image

craft-c commented 1 year ago

量子化モデル生成

・openvino2tensorflowで出力した量子化モデルの精度は良くない ・TFliteConverterを用いて量子化に取り組んでみる  エラーが出る。調査中。 File "C:\Users\~~~\lib\site-packages\tensorflow\lite\python\optimize\calibrator.py", line 129, in _feed_tensors self._calibrator.Prepare([list(s.shape) for s in input_array]) RuntimeError: Given shapes, [1,112,64,48] and [1,64,112,48], are not broadcastable.Node number 217 (ADD) failed to prepare.

craft-c commented 1 year ago

@kyakuno

量子化モデルについて

openvino2tensorflowで生成した4種類の量子化モデルの推論結果を、1枚目のスライドに示します。 「full_integer_quant」モデルの推論精度が良くありません。 オプションで試行錯誤したのですが、結果的に良い結果が得られませんでした。 このため、代替として、精度の良い「dynamic_range_quant」もしくは「weight_quant」モデルを 量子化モデルとして採用しても良いでしょうか。 ※「dynamic_range_quant」モデルは、float32モデルに比べて、モデルサイズが半分に削減されています。

なお、TFlite Converterを用いた量子化については、 スライド2枚目に示すようなエラーに阻まれています。 現時点で対処方法は見つけられていません。

image

image

kyakuno commented 1 year ago

「dynamic_range_quant」もしくは「weight_quant」については、floatを併用して推論するモードであり、ailia TFLite Runtimeでは使用できません。 TFLiteConverterで量子化を行うことが望ましいと考えていまして、該当のエラーは入力画像の解像度がモデルのInput Shapeと異なるのではないかと考えています。 キャリブレーション画像の解像度を確認いただいても良いでしょうか。

craft-c commented 1 year ago

キャリブレーション用の画像をリサイズするために、 img = cv2.resize() で指定する幅と高さの順番が逆になっていました。

間違い:img = cv2.resize(img,(512, 896)) 正解:img = cv2.resize(img,(896, 512))

お騒がせしました。

以下はval2017 データセット 100枚でキャリブレーションした量子化モデルの推論結果です。 良好な推論精度が得られました。

image