環境構築
環境構築手順はこちらをご参照ください。
サンプルモデルの変換
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になります。十分な容量を確保して行ってください。
モデル変換を実行します。
$ ./onnx_conversion.sh setting.conf
PCの環境によっては、メモリ(RAM)は8GBほど必要になります。失敗する場合はメモリ容量を確認ください。
変換後のモデルは以下のディレクトリに出力されます。
ambaCV2Xカメラ用のモデル
${OUTPUT_DIR}/${NET_NAME}/${PARSER_OPTION}/[モデル名]
ambaCV5Xカメラ用のモデル
${OUTPUT_DIR}/${NET_NAME}_ambaCV5X/${PARSER_OPTION}/[モデル名]
モデルを変換する
PyTorchのモデルは事前にONNXに変換が必要です。
/home/cvtool/conversion/onnx
のどちらかのディレクトリをコピーしてください。
$ cd /home/cvtool/conversion/onnx $ cp -r mobilenetv2 foo $ cd foo
setting.conf を、変換するモデルに合わせて変更してください。
モデル変換を行います。
$ ./onnx_conversion.sh setting.conf
setting.conf仕様
v1.19 まで setting.conf にあった CAVALRY_VERを、v1.20 から削除しています。
v1.19 以前の setting.conf を v1.20以降の cvtool で使用する際は、setting.conf から CAVALRY_VER を削除してください。
# Network Name NET_NAME=mobilenet_v2 # Path to Directory for ONNX Models MODEL_DIR=./sample/mobilenet_v2/models # Path to Directory for DRA Images DRA_IMAGE_DIR=../../dra_img # Path to Directory for Output Data OUTPUT_DIR=./out # Quantization Mode # FIX8 : Fixed-point 8bit # FIX16 : Fixed-point 16bit # MIX : FIX8/FIX16 mixed PARSER_OPTION=MIX # Input Data Format (0:NHWC, 1:NCHW) IN_DATA_FORMAT=1 # Input Data Channel IN_DATA_CHANNEL=3 # Input Data Width IN_DATA_WIDTH=224 # Input Data Height IN_DATA_HEIGHT=224 # Input Data Mean Vector IN_MEAN=103.94,116.78,123.68 # Input Data Scale # IN_SCALE=1/Scale IN_SCALE=58.823529411 # RGB or BGR (0:RGB, 1:BGR) IS_BGR=1 # Output Layers Name OUT_LAYER=mobilenetv20_output_flatten0_reshape0 # Unique preprocess # if use im2bin -> NONE # if use unique preprocess -> script path PREPRO=NONE PREPRO_ARG="" # Input file data format IN_DATA_FILEFORMAT=0,0,0,0 # Transpose indices(NONE:without transpose , 0,3,1,2:transpose (EX)) IN_DATA_TRANSPOSE=NONE
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)
N_DATA_FILEFORMAT を”0,0,0,0”から変更した場合はPREPROの設定が必要になります。
IN_DATA_TRANSPOSE:入力データに対してTRANSPOSE を行う場合指定する
変換エラーが出る場合には
cvtool に入っている graph_surgery コマンドでモデルを修正することで、解決する可能性があります。graph_surgeryの詳細はこちらをご覧ください。
モデルの中に、cvtool でサポートしていないノードがある場合
以下のコマンドで修正してください。$ graph_surgery.py onnx -m (修正前のモデル名) -o (修正後のモデル名) -t CVFlow
cvtool がサポートするノードについてはこちらをご覧ください。
また、モデルの中にサポートしていないノードがあるかは、onnx_print_graph_summary.py コマンドで確認することができます。$ onnx_print_graph_summary.py -p (モデル名)
入力の形状(shape)に可変値がある場合
以下のコマンドで固定値に置き換えます。
$ graph_surgery.py onnx -m (修正前のモデル名) -o (修正後のモデル名) -isrc "i:input|is:1,3,960,960" -t SetIOShapes
入力の形状が NHWC、かつモデルの最初に NCHWに transpose している場合
モデルの先頭からTransposeノードまでを切り離します。
$ graph_surgery.py onnx -m (修正前のモデル名) -o (修正後のモデル名) -isrc "i:(Transposeノードの出力名)|is:1,3,224,224" -t CutGraph
OUT_LAYER で指定したノードに、特定の記号( : | ; , ‘ )が含まれている場合
特定の記号を含まないように、ノード名を変更します。
$ graph_surgery.py onnx -m (修正前のモデル名) -o (修正後のモデル名) -t "RenameTensors(変更前のノード名=変更後のノード名)"
複数のノード名を変更する場合は、','で区切ってください。-t "RenameTensors(node::1=node1,node::2=node2)"