#はじめに
レーザポインタを物体検出するためのYOLO学習データの作成でレーザーポインタを学習させてみましたが、学習中XavierNXが使えないのが不便です。
GOOGLE Colabでやればいろいろパラレルでできる上にXabvierNXより3倍ほど高速でした。
以下は備忘録としてステップバイステップで。。
#やったこと
レーザーポインタの学習データをGoogle Colabで作成しました。
#手順
- ./cfg/task/datasets を作成します。
- ./cfg/task/backup を作成します。
- レーザポインタを物体検出するためのYOLO学習データの作成で、スクリプトで作成されるjpgとtxtを全てdatasets内に入れます。
- taskディレクトリ内でmklist.shを実行します。
sed -i -e 's/.*img/img/g' list.txt
sed -i -e 's/^/\/content\/train\/cfg\/task\/datasets\//g' list.txt
grep -v 1.jpg list.txt > train.txt
grep 1.jpg list.txt > test.txt
- taskディレクトリ内にdatasets.dataを作成します。
classes= 1
train = /content/train/cfg/task/train.txt
valid = /content/train/cfg/task/test.txt
names = /content/train/cfg/task/class.txt
backup = /content/train/cfg/task/backup
- taskディレクトリ内にclass.txtを作成します。
laser
- taskディレクトリ内にyolov3-voc.cfg をコピー、変更します。
- yolov3-voc.cfg はdarknetをgit cloneしたディレクトリの中のcfg内にオリジナルがあります。
-
このファイルの全てのfiltersを18に変更スミマセン嘘つきました。 [yolo]ってかいてあるブロックを探し、その直前の[convolutional]ブロック内のfiltersのみを18に変更してください。計3カ所です。同様に[yolo]ブロック内のclassesを1に変更して(同様に3カ所です)taskディレクトリに置きます。 - 18は、filters=mask_num * (classes + 5) から計算された値です。
また、先頭部分にあるbachとsubdivisionをそれぞれ私の場合は32と8に変更しました。元々は1,1になっているので、そのままだとデータが発散して学習が停止する場合があります。
また、大きくするとメモリが足りなくなって終了する可能性があります。 (6/7追記)
ここまででtask内は以下になります。
train.txt , test.txt : mklist.shで作成される。
yolov3-voc.cfg : 上の手順で作成
datasets.data : 上のコンテンツそのまま
class.txt : 上のコンテンツそのまま
datasets : 学習用JPEGデータとTEXTデータが全部はいっている
backup: 空のディレクトリでweightsが作られる
cfg内はtask だけがある状態です。
ここまでできたらcfgの親ディレクトリに行き
tar zcvf train.tgz cfg/*
としてアーカイブを作成します。
- 出来たアーカイブをブラウザ経由でgoogle driveにアップロード
- google colab を開きます。
- googleアカウントにログインしたブラウザからgoogle colabを検索、開きます。
- Colaboratoryへようこその画面が開くので
- 右下の青字の ノートブックを新規作成を開きます。
先ほどアップロードしたtrain.tgzが見えます。
少し上の+コードをクリックし、新しいセルを開きます。
セルに以下を入力、再生ボタンを押します。
%%bash
mkdir train
cd train
tar zxvf /content/drive/My\ Drive/train.tgz
rm cfg/task/backup/*
しばらく再生ボタンがグルグルしたあと、アーカイブの展開ログが表示されます。
左側ディレクトリツリーを開き直すと、trainディレクトリが作成されています。
開き治すには ... を押した後、
contentをクリックします。
ここまでで作成したtrainディレクトリがcolab上に展開されます。
次にdarknetをビルドします。
また+コードをクリック、新しくできたセルに
%%bash
git clone https://github.com/AlexeyAB/darknet.git
cd darknet
sed -i 's/GPU=0/GPU=1/g' Makefile
sed -i 's/CUDNN=0/CUDNN=1/g' Makefile
sed -i 's/CUDNN_HALF=0/CUDNN_HALF=1/g' Makefile
sed -i 's/OPENCV=0/OPENCV=1/g' Makefile
sed -i 's/LIBSO=0/LIBSO=1/g' Makefile
make
を入力、実行します。
darknetをgit clone してビルドして実行するので少し時間がかかります。
しばらくすると、ビルド結果がでてきます。warningはいっぱいでますが、エラーは無いはずです。
次にいよいよ学習を開始します。
また+コードをクリック 新しくできたセルに
%%bash
cd train
cp ../darknet/darknet .
cp ../darknet/libdark* .
./darknet detector train ./cfg/task/datasets.data cfg/task/yolov3-voc.cfg -dont_show > darknet_out.txt
を入力して、再生ボタンを押すと学習が始まります。
yolov3-voc.cfg
の設定にもよりますが、上記の手順通りだとほっとくとおわりませんが、
実行を開始すると、trainディレクトリに、darknet_out.txt というファイルが出来ており、そこに途中結果が出力されます。
また、1000イテレーション毎に、train/cfg/task/backupディレクトリ内にweightsファイルが作成されます。
放置すると勝手にブラウザが切断され、データが全て削除されるので30分に一度いじって、途中のファイルをダウンロードする必要があります。