AIモデル変換ツール:ONNX(PyTorch)編

環境構築


環境構築手順はこちらをご参照ください。

 

サンプルモデルの変換


mobilenetv2

ディレクトリを移動します。

$ cd /home/cvtool/conversion/onnx/mobilenetv2

モデル変換を実行します。

$ ./onnx_conversion.sh setting.conf

yolov5 / yolov8

サンプルモデルをダウンロードします。

(yolov5) $ cd /home/cvtool/conversion/onnx/yolov5 $ ./setup_yolov5.sh (yolov8) $ cd /home/cvtool/conversion/onnx/yolov8 $ ./setup_yolov8.sh

ダウンロードするファイルサイズは数GBになります。十分な容量を確保して行ってください。

モデル変換を実行します。

PCの環境によっては、メモリ(RAM)は8GBほど必要になります。失敗する場合はメモリ容量を確認ください。

 

変換後のモデルは以下のディレクトリに出力されます。

  • ambaCV2Xカメラ用のモデル

${OUTPUT_DIR}/${NET_NAME}/${PARSER_OPTION}/[モデル名]

  • ambaCV5Xカメラ用のモデル

${OUTPUT_DIR}/${NET_NAME}_ambaCV5X/${PARSER_OPTION}/[モデル名]

 

モデルを変換する


PyTorchのモデルは事前にONNXに変換が必要です。

  1. /home/cvtool/conversion/onnxのどちらかのディレクトリをコピーしてください。

  1. setting.conf を、変換するモデルに合わせて変更してください。

  2. モデル変換を行います。

 

setting.conf仕様


  • NET_NAME:ネットワーク名

    • 任意の名前を設定できます。

  • MODEL_DIR:onnxファイルが格納されたディレクトリ

    • ディレクトリ下の全てのモデルに対して、変換処理を実行します。

  • IMAGE_DIR:量子化の最適化処理で使用する、画像ファイルが格納されたディレクトリ

    • 学習に使った画像を格納してください。100~200枚が推奨枚数です。

    • 画像フォーマットはJPEGやPNGなど、OpenCVで対応しているものです。

    • 任意サイズの画像を使用可能です。

  • OUTPUT_DIR:変換後のデータ出力先ディレクトリ

  • PARSER_OPTION:量子化モード

    • FIX8/FIX16/MIX(FIX8/FIX16混合)から選択します。

  • IN_DATA_CHANNEL:モデルの入力画像チャネル数

  • N_DATA_WIDTH:モデルの入力画像サイズ(幅)

  • IN_DATA_HEIGHT:モデルの入力画像サイズ(高さ)

  • IN_MEAN:入力画像の正規化パラメータ(平均値)

    • 以下のように”,”の間に空白を入れないようにしてください。
      IN_MEAN=127.5,127.5,127.5

  • IN_SCALE:入力画像の正規化パラメータ(スケール)

    • チャネルごとに異なる設定値にする場合は、”,”で値を区切ってください。”,”の間には空白を入れないようにしてください。

  • IS_BGR:入力画像のフォーマット(RGB or BGR)

  • OUT_LAYER:ネットワークの出力ノード名

    • 複数指定する場合は”,”で区切ってください。

    • 以下の記号が入出力ノード名に含まれている場合、正常に変換できない可能性があります。
      : | ; , ‘

  • PREPRO:前処理スクリプトパス(python)

    • スクリプトの作り方は“/home/cvtool/common/prepro.py”を参照してください。

  • PREPRO_ARG:前処理スクリプトの引数

  • IN_DATA_FILEFORMAT:入力データのフォーマット

    • 例:uint8->0,0,0,0, float32->1,2,0,7, float16->1,1,0,4

    • IN_DATA_FILEFORMAT を”0,0,0,0”から変更した場合はPREPROの設定が必要になります。

  • IN_DATA_TRANSPOSE:入力データに対してTRANSPOSE を行う場合指定する

 

変換エラーが出る場合には

cvtool に入っている graph_surgery コマンドでモデルを修正することで、解決する可能性があります。graph_surgeryの詳細はこちらをご覧ください。

  • モデルの中に、cvtool でサポートしていないノードがある場合
    以下のコマンドで修正してください。

    cvtool がサポートするノードについてはこちらをご覧ください。

    また、モデルの中にサポートしていないノードがあるかは、onnx_print_graph_summary.py コマンドで確認することができます。

     

  • 入力の形状(shape)に可変値がある場合

    image-20240416-002601.png

    以下のコマンドで固定値に置き換えます。

     

  • 入力の形状が NHWC、かつモデルの最初に NCHWに transpose している場合

    cutInput.jpg

    モデルの先頭からTransposeノードまでを切り離します。

     

  • OUT_LAYER で指定したノードに、特定の記号( : | ; , ‘ )が含まれている場合

    特定の記号を含まないように、ノード名を変更します。


    複数のノード名を変更する場合は、','で区切ってください。

     

  • モデルに rank > 4 のノードがある場合
    SoCの制約のため、変換できない可能性があります。

    モデルの中に該当するノードがあるかは、onnx_print_graph_summary.py コマンドで確認することができます。該当するノードがある場合には以下のようなメッセージが出力されます。


    以下の何れかの方法で、モデルを修正してください。
    ・onnx にエキスポートする前に、該当するノードを修正する
    ・該当するノードから後ろを、モデルから切り離す


    ・該当するノードを rank=4以下のノードに置き換える

    ※ReplaceSubgraph のご使用を希望される際はお問合せください。