Open kyakuno opened 1 year ago
作業手順は下記を参考にしてください。 https://github.com/axinc-ai/ailia-models-tflite/issues/30
・saved_model (float32) 生成 ・画像推論部分のスクリプト作成 ・動画推論部分のスクリプト作成 ・量子化モデル生成
@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モデルは出力できたので、 とりあえずサンプルスクリプトの作成を進めたいと思います。
このモデルは、もともと、openvino2tensorflow -> onnxというフローで変換されています。 ということで、下記のbinとprototxtを直接、openvino2tensorflowに入れるとsaved_modelが作れるのではないかと思います。 https://github.com/openvinotoolkit/open_model_zoo/tree/master/models/intel/road-segmentation-adas-0001
@kyakuno
.prototxtファイルはopenvino2tensorflowの入力として不適切?のようです。 コマンドが通りません。
openvino2tensorflowを使ってsaved_modelを出力するには、2枚目のスライドのように、 「.xml」「.bin」「.mapping」の3つのファイルが必要だと思われるのですが、 model-zoo で公開されているモデル内には見当たりません。
つまり、model-zoo で公開されているモデルを元に、 何らかの方法で「.xml」「.bin」「.mapping」を生成する作業が別途必要なのでしょうか。
・画像推論部分完成 ~・float32モデル+公式TFを用いた推論結果について、 「縁石」の検出が甘いことを除けば良好~
入力画像の前処理を調整すると、先の問題解消しました。 精度良好です。
・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.
@kyakuno
量子化モデルについて
openvino2tensorflowで生成した4種類の量子化モデルの推論結果を、1枚目のスライドに示します。 「full_integer_quant」モデルの推論精度が良くありません。 オプションで試行錯誤したのですが、結果的に良い結果が得られませんでした。 このため、代替として、精度の良い「dynamic_range_quant」もしくは「weight_quant」モデルを 量子化モデルとして採用しても良いでしょうか。 ※「dynamic_range_quant」モデルは、float32モデルに比べて、モデルサイズが半分に削減されています。
なお、TFlite Converterを用いた量子化については、 スライド2枚目に示すようなエラーに阻まれています。 現時点で対処方法は見つけられていません。
「dynamic_range_quant」もしくは「weight_quant」については、floatを併用して推論するモードであり、ailia TFLite Runtimeでは使用できません。 TFLiteConverterで量子化を行うことが望ましいと考えていまして、該当のエラーは入力画像の解像度がモデルのInput Shapeと異なるのではないかと考えています。 キャリブレーション画像の解像度を確認いただいても良いでしょうか。
キャリブレーション用の画像をリサイズするために、 img = cv2.resize() で指定する幅と高さの順番が逆になっていました。
間違い:img = cv2.resize(img,(512, 896)) 正解:img = cv2.resize(img,(896, 512))
お騒がせしました。
以下はval2017 データセット 100枚でキャリブレーションした量子化モデルの推論結果です。 良好な推論精度が得られました。
RoadSegmentationAdasのONNXを登録する。 https://github.com/axinc-ai/ailia-models/tree/master/road_detection/road-segmentation-adas