darknetによるyolov3の学習 - takgto/utokyo-chipathon2023 GitHub Wiki

授業では学習済みのモデルを使います。自分でyolov3の学習を行う場合は以下の手順を参考にしてください。
かなり時間が掛かります。
この手順を行うにはUSB Wi-Fiアダプターが必要です。TAから借りてください。1台しかないので譲り合って使用してください。
PowerShellこのアイコンのついているコマンドはPowerShellコンソールに一行ずつ入力してください。

1. Wi-Fi接続

TAから受け取ったUSB Wi-FiアダプターをPCに挿します。
PCの右下のWi-Fiマークの>を押して、上のプルダウンメニューからWi-Fi2を選択し、eng.utを選んで接続します。
または、歯車アイコンの設定から、ネットワークとインターネットを選び、Wi-Fi2の下の利用できるネットワークからeng.utを選んで接続します。
パスワードを聞かれるのでTAを呼んでください。

2. サーバーへログイン

タスクバーかスタートメニューから以下のアイコンをクリックします。
image
PowerShellのコンソールに以下のコマンドを入力します。

PowerShell

ログインパスワードはTAに聞いてください。
画面に(base) guest@nedo2021dec:~$と表示されれば、ログイン成功です。

3. 作業ディレクトリを作る

自分の作業ディレクトリを/data2/goto_data/darknet/dnet-workに作ります。
元となる環境/data2/goto_data/darknet/dnet-work/work_dirをコピーして、自分専用の作業ディレクトリを作ってください。
以下のコマンドの <名前> の部分を自分のローマ字(小文字)に書き換えて実行し、ディレクトリを作成します。

PowerShell

cp -r /data2/goto_data/darknet/dnet-work/work_dir /data2/goto_data/darknet/dnet-work/<名前>_dir

(ディレクトリ名の例:nitami_dir)
⚠️ 注意: <名前>_dir という日本語のまま入力しないよう注意してください。

4. conda環境の有効化

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

PowerShell

cd /data2/goto_data/darknet

conda環境を有効にします。

PowerShell

conda activate darknet

5. 学習の実行

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

PowerShell

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 の両方が指定されています)

コマンド例1:最初から学習をやり直す(リセット)

設定ファイル(.cfg)を書き換えた場合や、途中で学習が失敗して最初からやり直したい場合は、コマンドの末尾に --clear をつけて実行します。

PowerShell

python dnet-work/scripts/train_yolo.py -r 512 -m yolov3-tiny -w dnet-work/<名前>_dir --clear

--clear: 過去の学習途中のバックアップデータをすべて無視し、完全に最初(0から)学習をやり直すオプションです。
⚠️ 注意: 前回の続きから学習を再開したい場合は、この --clear は絶対に付けないでください。

コマンド例2:途中のデータから学習を再開する(レジューム)

途中で学習が止まってしまった場合や、保存された特定の重みデータから続きを学習させたい場合は、コマンドの末尾に --resume をつけて実行します。

PowerShell

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 ファイル(学習済みの重み)を読み込み、その続きから学習を再開するオプションです。

⚠️ 注意: --resume の後ろに指定するファイルパスは、必ず自分の作業ディレクトリ内にある実際のファイル名(10000 や 20000 など、保存されている数字)に合わせて書き換えてください。

これを使う時は、先ほどの --clear は絶対に付けないでください。

コマンド例3:mAP計算のみ実行する

PowerShell

python dnet-work/scripts/train_yolo.py -r 512 -m yolov3-tiny -w dnet-work/<名前>_dir --skip-train

コマンド例4:GPUを指定する

PowerShell

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割の値です。

6. 途中結果の確認

初期設定(デフォルト)では、最大学習回数は 24000 iterations に設定されています。変更せずに実行した場合、24000回の反復学習が終了した時点で自動的にプログラムが停止します。かなり時間が掛かるので気長に待ってください。ログが出ていれば正常に進んでいます。ログの行の最初に、何回目の反復を行っているか回数が表示されています。

先程作ったdnet-work/<名前>_dirディレクトリの下に

  • chart.png
  • chart_yolov3-tiny-512.png

ができて、途中経過のグラフ(Loss vs iteration)を見ることができます。

グラフ1

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

7. 結果確認

最終的なLossのカーブは次のようになります。
グラフ2

結果の重みファイルは、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 % 

8. 結果の転送

出来上がったファイルを自分のPCにコピーします。
Windows PowerShellの+タブをクリックして新しいコンソールを開くか、Exitコマンドでサーバーから抜けてから、以下のコマンドを使って転送します。
まずは、cdコマンドでコピーしたいディレクトリに移動します。例えば、以下のコマンドはダウンロードディレクトリへの移動コマンドです。

PowerShell

cd Downloads

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

PowerShell

scp -r [email protected]:/data2/goto_data/darknet/dnet-work/<名前>_dir/work/backup/yolov3-tiny-512_final.weights .

PowerShell

scp -r [email protected]:/data2/goto_data/darknet/dnet-work/<名前>_dir/chart.png .

mAPの結果は、日付を含んだファイル名で保存されています。自分のディレクトリの下のlogディレクトリにできています。ファイル名を確認して、コマンドの「#」の部分をそのファイル名に変更してください。

PowerShell

scp -r [email protected]:/data2/goto_data/darknet/dnet-work/<名前>_dir/log/yolov3-tiny-512_########_######_results.txt .

次はFPGA接続に進みます。次のページへはここをクリック。




Google Colaboratoryを用いた学習方法

学習はGoogle Colaboratoryを用いて行うこともできます。ただ、無料版では十分に学習できず、有料版を使う必要があります。
darknetフォルダが必要です。TAから受け取ってください。

1. darknetフォルダを自分のgoogle driveへアップロード

受け取ったdarknetフォルダをマイドライブへアップしましょう。 ※ 40分ほど時間が掛かります。

2. Google Colaboratoryに接続

Googleアカウントにログインした状態で以下のサイトにアクセスします。
https://colab.research.google.com/notebooks/intro.ipynb (別タブで開きたい場合はCtrlを押しながらクリックしてください)

『ファイル』から『ノートブックを新規作成』をクリックします。

image

以下のような画面が開きます。

image

コードセルはPythonでソースコードを記述して実行する場所です。テキストセルはメモ等を記入する場所です。 コードセルにソースコードのコメントを記入することもできます。 326708796-1668af34-683b-4aa1-9ce9-14a54acda6c2をクリックすると該当セルのコードを実行します。

作成したノートブックは「My Drive」の「Colab Notebooks」から確認できます。 image

※ 今回のNotebookは以下のgithubを参考にしました。
  Yolo v4, v3 and v2 for Windows and Linux
  https://github.com/AlexeyAB/darknet

Google Colaboratoryのセルでは右クリックができません。コピー&ペーストを実行する時、貼り付けをするには右クリックメニューではなくショートカットキーのペースト(ctrlとVを同時押し)で貼り付けてください。

3. ランタイプを変更する

image

4. マイドライブをマウントする

ノートブックのコードセルに以下のコードを記載し実行します。

import os
from google.colab import drive

drive.mount('/content/drive')
%cd '/content/drive/MyDrive/darknet'
os.getcwd()

5. コンパイルする

ノートブックのコードセルに以下のコードを記載し実行します。

!make
!chmod +x ./darknet

6. 学習の実行

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

全ての学習を行うためには3時間ほどかかる。

7. 学習結果の確認

/darknet/chart.png に学習結果がグラフ化されているので確認すること。

image

入力が416×416より大きいサイズ(32の倍数)の場合、colabではmAPの計算は別途行う必要があります。

8. 学習結果の計算(入力が416×416より大きい時)

!./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  

次はFPGA接続に進みます。次のページへはここをクリック。

⚠️ **GitHub.com Fallback** ⚠️