😇

PyTorchで学習したモデルをOpenVINO用に変換したら全然精度が出なかったときの対処法

2021/09/19に公開

はじめに

  • OpenVINOはintel CPU上で爆速で推論できる環境であり、GPUなしでも十分にリアルタイム処理できるのでよくEC2のc5インスタンスで使っています
  • OpenVINOのモデルZooにたくさんの学習済みモデルがあり、かなり精度が高いのでそれらを使うだけで色々なアプリが作れたりします
  • が、ちょっと違うカテゴリで推論したいな、といった場合に自前で学習させますが、PyTorchで学習させたモデルをOpenVINO用のIR形式に変換する際に、正しく変換しないと全然精度が出ませんでした、という話

やりたいこと

  • PyTorchで学習しONNX形式で出力
    • 今回はPyTorchのMobileNetV2の学習済みモデルをベースにファインチューニングを実施しました
  • OpenVINOのmodel optimizerでONNX形式からIR形式に変換

結論

  • OpenVINOのmodel optimizerで変換する際に、ベースのモデルに応じたパラメータを必ず指定する必要があります(例えば、MobileNetV2の場合は以下のとおり)
python3 /opt/intel/openvino/deployment_tools/model_optimizer/mo.py --input_model <onnxファイル> --reverse_input_channels --mean_values=[123.675,116.28,103.53] --scale_values=[58.624,57.12,57.375] 
  • パラメータの参照先
  • 特にreverse_input_channelsmean_valuesscale_values を指定しない場合は全くもって変換できておらず、PyTorch上では90%以上の正答率だったモデルが変換後はでたらめな推論をするようになっていました。。
    • さすがに学習に使ったデータで推論させて結果が違っていたのでおかしいと思っていましたが;

補足

  • intelにMobileNetV2で精度が出ないという問い合わせをしている方がいて、こちらのお陰で解決できました。

Discussion