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のコンソールに以下のコマンドを入力します。
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ファイルをダウンロードします。
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と同様です。
ディレクトリを移動します。
(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
等に変更しておくといいでしょう。
ファイルのある場所に移動するコマンド
cd ~/Vitis-AI/yolov3-dlab/scripts_tf2
元のファイルをコピーして、ファイル名を変更するコマンド
cp convert_yolov3.sh convert_yolov3_608.sh
convert_yolov3.sh
をVSCodeで開いて、ソースコードを修正します。
Ubuntuコンソールに以下のコマンドを入力すると、現在のディレクトリでVSCodeが開きます。
code .
もしくは、GUIのVSCodeで左下の青い><をクリックし、WSLへの接続をクリックし、フォルダーを開くボタンでも開けます。
左のエクスプローラーから~/Vitis-AI/yolov3-dlab/scripts_tf2
ディレクトリを開きます。
convert_yolov3.sh
を開き、14行目、15行目を以下のように変更します。
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
を実行します。
(Docker)
./convert_yolov3.sh
/workspace/yolov3-dlab/keras_model
にdpu_yolov3-tiny.h5
というファイルが生成されます。
4.quantize keras model
ファイルのある場所に移動するコマンド
cd yolov3-dlab/scripts_tf2
元のファイルをコピーして、ファイル名を変更するコマンド
cp my_quantizer.py my_quantizer_608.py
my_quantizer.py
をVSCodeで開いて、ソースコードを修正します。
8行目
KERAS_MODEL = 'dpu_yolov3-tiny.h5'
63行目
quantized_model.save(os.path.join(quantized_dir, 'quantized_dpu_yolov3-tiny.h5'))
my_quantizer.py
を保存します。
Dockerのコンソールでmy_quantizer.py
を実行します。
(Docker)
python my_quantizer.py -i
/workspace/yolov3-dlab/yolov3_quantized2
にdpu_yolov3-tiny.h5
というファイルが生成されます。
5.compile model for fpga
ファイルのある場所に移動するコマンド
cd yolov3-dlab/scripts_tf2
元のファイルをコピーして、ファイル名を変更するコマンド
cp compile_yolov3.sh compile_yolov3_608.sh
compile_yolov3.sh
をVSCodeで開いて、ソースコードを修正します。my_quantizer.py
と同様にファイル名を変更します。
17行目
NET_NAME=dpu_yolov3-tiny
20行目
vai_c_tensorflow2 -m ../yolov3_quantized2/quantized_dpu_yolov3-tiny.h5 \
24行目
tinyは画像サイズが416×416のため、画像サイズを変更します。
-e "{'mode':'normal','save_kernel':'', 'input_shape':'1,416,416,3'}"
compile_yolov3.sh
を保存します。
Dockerのコンソールでcompile_yolov3.sh
を実行します。
(Docker)
./compile_yolov3.sh
3.FPGAボード(KV260)での推論
MobaXtermでSerial接続し、tinyのdpu_yolov3-tiny.xmodel
, md5sum.txt
, meta.json
の3つを転送しましょう。
source ./init260.sh
ifconfigとタイプして次のipが表示されることを確認する。 eth0の下にinet 192.168.1.100 もし含まれていない場合、イーサネットケーブル(水色)の接続を確認して、もう一度kv260を立ち上げる(電源の抜き差し)。その後、もう一度source ./init260.shを実行する。
SSH接続してディレクトリを作成する
cd /usr/share/vitis_ai_library/models
mkdir dpu_yolov3-tiny
ファイルをFPGAに送る。
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
も同様に転送します。
scp md5sum.txt [email protected]:/usr/share/vitis_ai_library/models/dpu_yolov3-tiny
scp meta.json [email protected]:/usr/share/vitis_ai_library/models/dpu_yolov3-tiny
次に、FPGA上で、prototxtをコピーします。
cd ./dpu_yolov3-tiny
cp ../yolov3_coco_416_tf2/yolov3_coco_416_tf2.prototxt dpu_yolov3-tiny.prototxt
KV260に接続したVSCodeでdpu_yolov3-tiny.prototxtを編集します。
(ターミナル)
code /usr/share/vitis_ai_library/models/dpu_yolov3-tiny
yolov3-tinyは特徴マップが3→2個に変更になっています。 そのため、VSCodeでdpu_yolov3-tiny.prototxtを以下のように変更します。
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#
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
動画推論を実行します。
./yolov3 dpu_yolov3-tiny.xmodel ./video/adas.webm
tinyはqボタンで動画を閉じます。
5.精度検証
以下でmAPを計算します。
cd ~/Vitis-AI/examples/Vitis-AI-Library/samples/yolov3
./test_file_yolov3 dpu_yolov3-tiny val2017.txt
cd mAP
python3 main.py -na