YOLOv3‐tinyを使う方法について - takgto/utokyo-chipathon2023 GitHub Wiki

YOLOv3には認識精度が落ちる代わりに高速で動作するYOLOv3-tinyというモデルがあります。
以下にyolov3-tinyを用いる場合について示します。608と同じ環境にtinyのファイルもあるので、コマンドやコードを変更することでtinyを動かすことができます。

1.darknetによるyolov3の学習(tinyを用いる場合)

マイドライブにアップロードしたdarknetにtinyの環境も含まれています。
学習の実行として、以下のコードをGoogle Colaboratoryで実行すると、tinyのための学習が開始されます。

!./darknet detector train work/obj.data work/yolov3-tiny.cfg darknet53.conv.74 -dont_show

学習結果の確認では以下のコードを使用します。

!./darknet detector map work/obj.data work/yolov3-tiny.cfg work/backup/yolov3-tiny_1000.weights -dont_show -ext_output < work/val.txt

2.モデル変換(tinyを用いる場合)

1.学習済みweight

学習済みweightをコピーします。
用意されたyolov3-tiny_best.weightを使用する場合、WSL2のコンソールに以下のコマンドを入力します。

ubuntu小

cp /mnt/c/Users/x-nics-kuroda/Downloads/work_best_weights/yolov3-tiny_best.weights /home/x-nics-kuroda/Vitis-AI/yolov3-dlab/work/backup

自分で学習を行ったweightを使用する場合はGoogle Colaboratoryから学習済みweightファイルをダウンロードします。

ubuntu小

cp /mnt/c/Users/x-nics-kuroda/Downloads/work/yolov3-tiny_best_weights/yolov3-tiny_best.weights /home/x-nics-kuroda/Vitis-AI/yolov3-dlab/work/backup

2.Docker起動

次にDockerを起動してConda環境を立ち上げます。これは608と同様です。

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

ubuntu小(Docker)

cd /workspace/yolov3-dlab/scripts_tf2

3.darknet2keras

以下のコマンドはUbuntuコンソールに入力します。
darknet2kerasで実行するyolov3-dlab/scripts_tf2/convert_yolov3.shを編集して、読み込みファイルと保存ファイル名を変更します。元のconvert_yolov3.shはコピーしてファイル名をconvert_yolov3_608.sh等に変更しておくといいでしょう。

ファイルのある場所に移動するコマンド

ubuntu小

cd ~/Vitis-AI/yolov3-dlab/scripts_tf2

元のファイルをコピーして、ファイル名を変更するコマンド

ubuntu小

cp convert_yolov3.sh convert_yolov3_608.sh

convert_yolov3.shをVSCodeで開いて、ソースコードを修正します。
Ubuntuコンソールに以下のコマンドを入力すると、現在のディレクトリでVSCodeが開きます。

ubuntu小

code .

もしくは、GUIのVSCodeで左下の青い><をクリックし、WSLへの接続をクリックし、フォルダーを開くボタンでも開けます。

左のエクスプローラーから~/Vitis-AI/yolov3-dlab/scripts_tf2ディレクトリを開きます。 convert_yolov3.shを開き、14行目、15行目を以下のように変更します。

VSCode

python ../keras-YOLOv3-model-set/tools/model_converter/convert.py ../work/yolov3-tiny.cfg ../work/backup/yolov3-tiny_best.weights ../keras_model/dpu_yolov3-tiny.h5
python ../keras-YOLOv3-model-set/tools/model_converter/keras_to_tensorflow.py --input_model ../keras_model/dpu_yolov3-tiny.h5 --output_model=../tf_model/dpu_yolov3-tiny.pb

convert_yolov3.shを保存します。

Dockerのコンソールでconvert_yolov3.shを実行します。

ubuntu小(Docker)

./convert_yolov3.sh

/workspace/yolov3-dlab/keras_modeldpu_yolov3-tiny.h5というファイルが生成されます。

4.quantize keras model

ファイルのある場所に移動するコマンド

ubuntu小

cd yolov3-dlab/scripts_tf2

元のファイルをコピーして、ファイル名を変更するコマンド

ubuntu小

cp my_quantizer.py my_quantizer_608.py 

my_quantizer.pyをVSCodeで開いて、ソースコードを修正します。
8行目

VSCode

KERAS_MODEL = 'dpu_yolov3-tiny.h5'

63行目

VSCode

    quantized_model.save(os.path.join(quantized_dir, 'quantized_dpu_yolov3-tiny.h5'))

my_quantizer.pyを保存します。

Dockerのコンソールでmy_quantizer.pyを実行します。

ubuntu小(Docker)

python my_quantizer.py -i

/workspace/yolov3-dlab/yolov3_quantized2dpu_yolov3-tiny.h5というファイルが生成されます。

5.compile model for fpga

ファイルのある場所に移動するコマンド

ubuntu小

cd yolov3-dlab/scripts_tf2

元のファイルをコピーして、ファイル名を変更するコマンド

ubuntu小

cp compile_yolov3.sh compile_yolov3_608.sh

compile_yolov3.shをVSCodeで開いて、ソースコードを修正します。my_quantizer.pyと同様にファイル名を変更します。
17行目

VSCode

NET_NAME=dpu_yolov3-tiny

20行目

VSCode

vai_c_tensorflow2 -m ../yolov3_quantized2/quantized_dpu_yolov3-tiny.h5 \

24行目
tinyは画像サイズが416×416のため、画像サイズを変更します。

VSCode

-e "{'mode':'normal','save_kernel':'', 'input_shape':'1,416,416,3'}"

compile_yolov3.shを保存します。

Dockerのコンソールでcompile_yolov3.shを実行します。

ubuntu小(Docker)

./compile_yolov3.sh

3.FPGAボード(KV260)での推論

MobaXtermでSerial接続し、tinyのdpu_yolov3-tiny.xmodel, md5sum.txt, meta.jsonの3つを転送しましょう。

serial小

source ./init260.sh

ifconfigとタイプして次のipが表示されることを確認する。 eth0の下にinet 192.168.1.100 もし含まれていない場合、イーサネットケーブル(水色)の接続を確認して、もう一度kv260を立ち上げる(電源の抜き差し)。その後、もう一度source ./init260.shを実行する。

SSH接続してディレクトリを作成する

SSH

cd /usr/share/vitis_ai_library/models
mkdir dpu_yolov3-tiny

ファイルをFPGAに送る。

Ubuntuコンソールで以下のコマンドを実行。

ubuntu小

cd /workspace/yolov3-dlab/yolov3_quantized2
scp dpu_yolov3-tiny.xmodel [email protected]:/usr/share/vitis_ai_library/models/dpu_yolov3-tiny

パスワードを聞かれるので入力してください。 md5sum.txt, meta.jsonも同様に転送します。

ubuntu小

scp md5sum.txt [email protected]:/usr/share/vitis_ai_library/models/dpu_yolov3-tiny

ubuntu小

scp meta.json [email protected]:/usr/share/vitis_ai_library/models/dpu_yolov3-tiny

次に、FPGA上で、prototxtをコピーします。

SSH

cd ./dpu_yolov3-tiny
cp ../yolov3_coco_416_tf2/yolov3_coco_416_tf2.prototxt dpu_yolov3-tiny.prototxt

KV260に接続したVSCodeでdpu_yolov3-tiny.prototxtを編集します。

VSCode(ターミナル)

code /usr/share/vitis_ai_library/models/dpu_yolov3-tiny

yolov3-tinyは特徴マップが3→2個に変更になっています。 そのため、VSCodeでdpu_yolov3-tiny.prototxtを以下のように変更します。

VSCode

model {
  name: "yolov3_tiny"
  kernel {
     name: "yolov3_tiny"
     mean: 0.0
     mean: 0.0
     mean: 0.0
     scale: 0.00390625
     scale: 0.00390625
     scale: 0.00390625
  }
  model_type : YOLOv3
  yolo_v3_param {
    num_classes: 3
    anchorCnt: 3
    layer_name: "9"
    layer_name: "12"
    conf_threshold: 0.3
    nms_threshold: 0.45
    biases: 10
    biases: 14
    biases: 23
    biases: 27
    biases: 37
    biases: 58
    biases: 81
    biases: 82
    biases: 135
    biases: 169
    biases: 344
    biases: 319
    test_mAP: false
  }
}

4.動画推論

コードをコンパイルします。
/usr/share/vitis_ai_library/models/dpu_yolov3-tiny# SSH

cd ~/Vitis-AI/examples/VART/yolov3
ln -s /usr/share/vitis_ai_library/models/dpu_yolov3-tiny/dpu_yolov3-tiny.xmodel dpu_yolov3-tiny.xmodel
./make.sh yolov3_video_subject1_tiny.cpp

動画推論を実行します。

SSH

./yolov3 dpu_yolov3-tiny.xmodel ./video/adas.webm

tinyはqボタンで動画を閉じます。

5.精度検証

以下でmAPを計算します。

SSH

cd ~/Vitis-AI/examples/Vitis-AI-Library/samples/yolov3
./test_file_yolov3 dpu_yolov3-tiny val2017.txt
cd mAP
python3 main.py -na