darknetによるyolov3の学習 - takgto/utokyo-chipathon2023 GitHub Wiki
授業では学習済みのモデルを使います。自分でyolov3の学習を行う場合は以下の手順を参考にしてください。
かなり時間が掛かります。
この手順を行うにはUSB Wi-Fiアダプターが必要です。TAから借りてください。1台しかないので譲り合って使用してください。
このアイコンのついているコマンドはPowerShellコンソールに一行ずつ入力してください。
TAから受け取ったUSB Wi-FiアダプターをPCに挿します。
PCの右下のWi-Fiマークの>を押して、上のプルダウンメニューからWi-Fi2を選択し、eng.utを選んで接続します。
または、歯車アイコンの設定から、ネットワークとインターネットを選び、Wi-Fi2の下の利用できるネットワークからeng.utを選んで接続します。
パスワードを聞かれるのでTAを呼んでください。
タスクバーかスタートメニューから以下のアイコンをクリックします。

PowerShellのコンソールに以下のコマンドを入力します。

ログインパスワードはTAに聞いてください。
画面に(base) guest@nedo2021dec:~$と表示されれば、ログイン成功です。
自分の作業ディレクトリを/data2/goto_data/darknet/dnet-workに作ります。
元となる環境/data2/goto_data/darknet/dnet-work/work_dirをコピーして、自分専用の作業ディレクトリを作ってください。
以下のコマンドの <名前> の部分を自分のローマ字(小文字)に書き換えて実行し、ディレクトリを作成します。

cp -r /data2/goto_data/darknet/dnet-work/work_dir /data2/goto_data/darknet/dnet-work/<名前>_dir(ディレクトリ名の例:nitami_dir)
まずディレクトリを移動します。

cd /data2/goto_data/darknetconda環境を有効にします。

conda activate darknet以下のコマンドを実行して学習を開始します。-w の後ろには、必ず先ほど作成した「自分の作業ディレクトリ(例: dnet-work/nitami_dir)」を指定してください。

python dnet-work/scripts/train_yolo.py -r 512 -m yolov3-tiny -w dnet-work/<名前>_dir --gpus-train 0 --gpus-map 0- -r: 入力画像の解像度を指定します(上の例では 512x512)。
- -m: YOLOv3のタイプを指定します。上の例では軽量版の yolov3-tiny を指定しています。-tiny を付けずに -m yolov3 とすると、通常のYOLOv3で学習を行います。
- --gpus-train / --gpus-map: 学習用およびmAP計算用のGPU番号です。今回はどちらも 0 としてください。 AIの「学習(Train)」と、現在の賢さを測る「精度計算(mAP)」が裏で交互に自動実行されます。(そのため、引数に --gpus-train と --gpus-map の両方が指定されています)
設定ファイル(.cfg)を書き換えた場合や、途中で学習が失敗して最初からやり直したい場合は、コマンドの末尾に --clear をつけて実行します。

python dnet-work/scripts/train_yolo.py -r 512 -m yolov3-tiny -w dnet-work/<名前>_dir --clear--clear: 過去の学習途中のバックアップデータをすべて無視し、完全に最初(0から)学習をやり直すオプションです。
途中で学習が止まってしまった場合や、保存された特定の重みデータから続きを学習させたい場合は、コマンドの末尾に --resume をつけて実行します。

python dnet-work/scripts/train_yolo.py -r 512 -m yolov3-tiny -w dnet-work/<名前>_dir --resume work/backup/yolov3-tiny-512_10000.weights--resume <ファイルのパス>: 指定した .weights ファイル(学習済みの重み)を読み込み、その続きから学習を再開するオプションです。
これを使う時は、先ほどの --clear は絶対に付けないでください。

python dnet-work/scripts/train_yolo.py -r 512 -m yolov3-tiny -w dnet-work/<名前>_dir --skip-train
python dnet-work/scripts/train_yolo.py -r 512 -m yolov3-tiny -w dnet-work/<名前>_dir --gpus-train 0,1,2,3 --gpus-map 0,1オプション一覧
| オプション | 短縮形 | 説明 |
|---|---|---|
| --resolution | -r | 入力解像度(32の倍数) |
| --model | -m | モデルタイプ(yolov3/yolov3-tiny) |
| --work-dir | -w | 作業ディレクトリ(work/の位置) |
| --batch | なし | バッチモードで実行 |
| --config | なしc | 設定ファイルパス |
| --clear | なし | 最初から学習し直す |
| --resume | なし | 指定weightsから再開 |
| --skip-train | なし | 学習スキップ(mAP計算のみ) |
| --gpus-train | なし | 学習用GPU |
| --gpus-map | なし | mAP計算用GPU |
| --docker-image | なし | Docker環境を指定して学習する |
学習回数(iterations)などの詳細な設定を変更したい場合は、大元のひな形であるdnet-work/<名前>_dir/work/yolov3-tiny-416.cfgファイルまたはdnet-work/<名前>_dir/work/yolov3-416.cfgファイルを編集してください。
実行時にyolov3-tiny-416.cfgまたはyolov3-416.cfgを元にして、Pythonが自動でwidth/heightを変更して実行用の.cfgファイルを生成する仕組みになっています。そのため、変更を反映させたい場合は、前の実行で作られたyolov3-tiny-512.cfgではなく元のファイルの方を書き換えるようにしてください。
学習回数(max_batches)を変更する場合は、2行下にある steps(学習率を下げるタイミング)の数値も調整します。ちなみに定石は全体の8割の値と9割の値です。
初期設定(デフォルト)では、最大学習回数は 24000 iterations に設定されています。変更せずに実行した場合、24000回の反復学習が終了した時点で自動的にプログラムが停止します。かなり時間が掛かるので気長に待ってください。ログが出ていれば正常に進んでいます。ログの行の最初に、何回目の反復を行っているか回数が表示されています。
先程作ったdnet-work/<名前>_dirディレクトリの下に
- chart.png
- chart_yolov3-tiny-512.png
ができて、途中経過のグラフ(Loss vs iteration)を見ることができます。

また、重みファイルはdnet-work/<名前>_dir/work/backupに1万回毎に生成されます。例えば、1万回目にyolov3-tiny-512_10000.weightsという名前のファイルができます。もし途中で止まってしまった場合、途中の重みファイルの続きから学習を再開できます。
最終的なLossのカーブは次のようになります。

結果の重みファイルは、dnet-work/<名前>_dir/work/backupに以下のように生成されます。
yolov3-tiny-512_10000.weights
yolov3-tiny-512_20000.weights
yolov3-tiny-512_last.weights
yolov3-tiny-512_final.weights
10000回毎にバックアップを取るため、途中の10000 iterationsの時と20000 iterationsの時の反復結果が保存されています。
*_last.weightsは最終24000 iterations後のweights結果であり、*_final.weightsは全体を通して一番Lossが低かった時のweightsです。
mAPはdnet-work/<名前>_dir/log/yolov3-tiny-512_########_######_results.txtにあります。「#」の部分は実行した日付や時刻の数字になっています。
ファイルには、各クラスごとの「ap」(Average Precision:平均適合率)と3つのapの数値を全部足して3で割った値「mAP」(Mean Average Precision:総合平均適合率)が書かれています。
class_id = 0, name = person, ap = 46.92% (TP = 2200, FP = 1381)
class_id = 1, name = bicycle, ap = 53.56% (TP = 269, FP = 169)
class_id = 2, name = car, ap = 50.74% (TP = 1573, FP = 991)
for conf_thresh = 0.25, precision = 0.61, recall = 0.46, F1-score = 0.53
for conf_thresh = 0.25, TP = 4042, FP = 2541, FN = 4656, average IoU = 43.35 %
IoU threshold = 50 %, used Area-Under-Curve for each unique Recall
mean average precision ([email protected]) = 0.504069, or 50.41 %
出来上がったファイルを自分のPCにコピーします。
Windows PowerShellの+タブをクリックして新しいコンソールを開くか、Exitコマンドでサーバーから抜けてから、以下のコマンドを使って転送します。
まずは、cdコマンドでコピーしたいディレクトリに移動します。例えば、以下のコマンドはダウンロードディレクトリへの移動コマンドです。

cd Downloads以下のコマンドで、重みファイル、グラフ、mAPの結果を自PCの現在のディレクトリへ転送します。
ディレクトリ名は自分のディレクトリ名に変更してください。

scp -r [email protected]:/data2/goto_data/darknet/dnet-work/<名前>_dir/work/backup/yolov3-tiny-512_final.weights .
scp -r [email protected]:/data2/goto_data/darknet/dnet-work/<名前>_dir/chart.png .mAPの結果は、日付を含んだファイル名で保存されています。自分のディレクトリの下のlogディレクトリにできています。ファイル名を確認して、コマンドの「#」の部分をそのファイル名に変更してください。

scp -r [email protected]:/data2/goto_data/darknet/dnet-work/<名前>_dir/log/yolov3-tiny-512_########_######_results.txt .次はFPGA接続に進みます。次のページへはここをクリック。
学習はGoogle Colaboratoryを用いて行うこともできます。ただ、無料版では十分に学習できず、有料版を使う必要があります。
darknetフォルダが必要です。TAから受け取ってください。
受け取ったdarknetフォルダをマイドライブへアップしましょう。 ※ 40分ほど時間が掛かります。
Googleアカウントにログインした状態で以下のサイトにアクセスします。
https://colab.research.google.com/notebooks/intro.ipynb
(別タブで開きたい場合はCtrlを押しながらクリックしてください)
『ファイル』から『ノートブックを新規作成』をクリックします。
![]() |
|---|
以下のような画面が開きます。
![]() |
|---|
コードセルはPythonでソースコードを記述して実行する場所です。テキストセルはメモ等を記入する場所です。
コードセルにソースコードのコメントを記入することもできます。
をクリックすると該当セルのコードを実行します。
作成したノートブックは「My Drive」の「Colab Notebooks」から確認できます。

※ 今回のNotebookは以下のgithubを参考にしました。
Yolo v4, v3 and v2 for Windows and Linux
https://github.com/AlexeyAB/darknet
Google Colaboratoryのセルでは右クリックができません。コピー&ペーストを実行する時、貼り付けをするには右クリックメニューではなくショートカットキーのペースト(ctrlとVを同時押し)で貼り付けてください。

ノートブックのコードセルに以下のコードを記載し実行します。
import os
from google.colab import drive
drive.mount('/content/drive')%cd '/content/drive/MyDrive/darknet'os.getcwd()ノートブックのコードセルに以下のコードを記載し実行します。
!make!chmod +x ./darknet!./darknet detector train work/obj.data work/yolov3-416.cfg darknet53.conv.74 -dont_show全ての学習を行うためには3時間ほどかかる。
/darknet/chart.png に学習結果がグラフ化されているので確認すること。

入力が416×416より大きいサイズ(32の倍数)の場合、colabではmAPの計算は別途行う必要があります。
!./darknet detector map work/obj.data work/yolov3-416.cfg work/backup/yolov3-416_1000.weights -dont_show -ext_output < work/val.txt出力の最後の方にmAPが表示されます。
calculation mAP (mean average precision)...
detections_count = 107068, unique_truth_count = 8698
class_id = 0, name = person, ap = 10.20% (TP = 151, FP = 199)
class_id = 1, name = bicycle, ap = 2.85% (TP = 0, FP = 0)
class_id = 2, name = car, ap = 16.41% (TP = 246, FP = 179)
for conf_thresh = 0.25, precision = 0.51, recall = 0.05, F1-score = 0.08
for conf_thresh = 0.25, TP = 397, FP = 378, FN = 8301, average IoU = 32.82 %
IoU threshold = 50 %, used Area-Under-Curve for each unique Recall
**mean average precision ([email protected]) = 0.098192, or 9.82 %**
Total Detection Time: 266 Seconds

