YOLOv3-tinyで学習してみた1(パソコン作業、アノテーションまで)
YOLOv3-tinyを学習させてみます。Google Colaboratoryを使用します。
初回(3回記事です)はColaboratoryの準備、アノテーションツールVOTTのインストール、学習データの準備、アノテーションまでを行います。
以下の例はWindows10です。
1.Google Drive、Colaboratoryの準備
Googleアカウントを登録してGoogleドライブを開きます。
Googleホームページ、右上のGooleアプリの中にあるドライブからも開けます。
- 右クリック-新しいフォルダ-YOLOを作成します。
- YOLOを選択して右クリック-アプリで開く-アプリを追加-Colaboratoryで検索してGoogle Colaboratoryを追加します。
- YOLOを開いて、右クリックして、その他-Colaboratoryのファイルを新規作成します。
2.GoogleDriveをColaboratoryにマウント
画面に表示されている新規コードセル(実行コードを入力するボックス)に次を入力して実行(右向き三角マークをクリック)します。
from google.colab import drive
drive.mount('/content/drive')
次の画面が表示されるので、リンクをクリックします。アカウント選択画面が表示されるのでアカウントを選択、アクセス許可画面を先に進むとアクセスコードが表示されるので、CTRL+Cでコピーし、四角のエリアにCTRL+VでペーストしてEnterを押すとGoogleDriveがColaboratoryにマウントされます。
3.GoogleDriveにdarknetをインストール、アクセラレータを設定
1)CUDA
CUDAのバージョンを確認します。Colaboratoryのセルの下方、横方向は中心あたりにカーソルを持って行くと、「+コード」、「+テキスト」と表示されるので、「+コード」をクリックします。次を入力して実行します。
!/usr/local/cuda/bin/nvcc --version
2019年10月現在でCUDAのバージョンは10.0でした。コードセルを追加、次を入力してCUDA10.0をインストールしてPATHを通します。
!apt install cuda-10-0 -y
import os
os.environ['PATH'] += ':/usr/local/cuda/bin'
os.environ['LD_LIBRARY_PATH'] += ':usr/local/cuda/lib64'
2)darknetダウンロード
コードセルを追加、次を入力、実行して、GoogleDriveのYOLOフォルダにdarknetのソースをダウンロードします。
%%bash
cd /content/drive/My\ Drive/YOLO
cd darknet
git clone https://github.com/AlexeyAB/darknet
3)darknetコンパイル
コードセルを追加して、次を入力、実行します。高速化のためGPU、CUDNNを有効にしてdarknetをコンパイルします。
%%bash
cd /content/drive/My\ Drive/YOLO/darknet
sed -i 's/GPU=0/GPU=1/g' Makefile
sed -i 's/CUDNN=0/CUDNN=1/g' Makefile
make
sedは文字列を置換します。例えば次の分の意味は、
sed -i 's/GPU=0/GPU=1/g' Makefile
Makefile中の'GPU=0’を探して'GPU=1'に置換してファイルを上書き(-i)。
-iが無いと標準出力に出力されるだけになります。コンパイルするとwarningがたくさんでます。
Colaboratoryのメニューからランタイム-ランタイムのタイプを変更-ハードウェアアクセラレータを選択して「なし」からGPUに変更します。
4.特徴抽出層の学習済みweight作成
元となる学習済みweightをパソコンにダウンロードします。サンプルでYOLOv3-tinyを動かしたのと同じものです。
https://pjreddie.com/media/files/yolov3-tiny.weights
このファイルをブラウザのGoogleDrive画面でYOLO/darknetフォルダにドラッグ&ドロップしてアップロードします、
特徴抽出層だけ学習済みのweight yolov3-tiny.conv.15を上記ファイルから作ります。Colaboratoryにコードセルを追加して、次を入力、実行します。最初の15層だけ抽出され、yolov3-tiny.conv.15が作られます。
%%bash
cd /content/drive/My\ Drive/YOLO/darknet
./darknet partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15
5.学習用データの構造
YOLOの学習に必要なデータは次の通りです。
- obj.data 学習の設定ファイル、クラス数を定義
例
classes= 2
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/
上記の例ですと分類種別は2種類。
学習用データはフォルダdataにあるtrain.txtで定義。
学習結果評価用データはフォルダdataにあるtest.txtで定義。
分類の名前はフォルダdataにあるobj.namesで定義。
学習中、学習後のweightをbackupフォルダに保存します。
- data/train.txt,data/test.txt
一行ずつ学習用画像、学習結果評価用画像へのpathを示します。trainは学習用、testは学習結果評価用。
例
data/obj/img1.jpg
data/obj/img2.jpg
data/obj/img3.jpg
- imgx.jpg,imagx.txt
imgx.jpgはjpeg画像で、上記train.txt、test.txtで指定されるもの。'imagx'の部分はそれぞれ任意の名前で良い。imagx.txtは画像中の対象物のclass、boundingbox情報でjpeg画像と同じファイル名として同じディレクトリに置く。画像中には複数の対象が写っていてもOKです。
imgx.txtには一行にひとつの対象の情報を入力します。それぞれの値は画像全体を1.0としてスケーリングしています。
原点は左上
<object-class> <x_center> <y_center> <width> <height>
例 1画像にクラス1が2つ、クラス0が1つ写っている場合
1 0.716797 0.395833 0.216406 0.147222
0 0.687109 0.379167 0.255469 0.158333
1 0.420312 0.395833 0.140625 0.166667
- obj.names
クラスの名称を示すテキストファイル。次の例の場合、クラス0は猫、クラス1は犬。
例
cat
dog
・
・
6.学習用画像の収集
学習用画像の収集方法として、インターネットで収集する、自分で撮影するといった方法があります。今回は、自分で集めることとし、集めやすい題材として駐車禁止の看板にしました。
スマホで通勤途中の看板15箇所をVGA動画(mp4)で撮影(1か所2,3分)してきました。
7.アノテーションツールVoTTをインストールする
動画から静止画を取り出しBoundingboxを設定するためのツール(アノテーションツール)VoTTをパソコンにインストールします。以降の例はWindows10です。
こちらから、Windws版のVoTTをダウンロードしてインストールします。
Releases · microsoft/VoTT · GitHub
8.アノテーション(タグ付け)する
1)フォルダを作成
パソコン上に作業用としてフォルダを2つ作成します。以下はあくまで例なので、すきな名前、場所に作成してください。
2)VOTTの設定
- New Projectをクリック
- Projct Settings画面が表示されるので次のように設定します。
Display Name
好きなプロジェクト名を入力
Source、Target Connection
画像元データ保管フォルダ、アノテーション後のデータ保管フォルダを設定
それ以外の欄
とりあえず、初期状態のままでOK
- Save Projectでプロジェクトを保存します。
3)アノテーションの実施
- TAGを追加
実際にアノテーション作業する画面(アノテーション画面)が表示されるので、画面をクリックして動画を一時停止します。右上のTAGSの+を押して、TAG名称(分類クラス名称)を入力します。’no parking'としました。'Ent'で名称を確定します。再度+を押すとtぐ入力画面が消えます。 - アノテーション
動画を止めて、Draw Rectangleを押し、対象物を囲みます。TAG 'no parking' を選択すると、囲み部分が緑表示になります。これで1枚終了なので、動画を進めて同じ作業を繰り返します。
アノテーションを進めつつ、画面上部のフロッピーディスクの絵をクリックして作業結果(プロジェクト)をセーブする。
4)Export
- Export Settings
画面左にある斜め上向きの矢印をクリックしてExport Setting画面に移動。Provider欄でPascal VOCを選択、Asset StateでOnly tagged Assetsを選択、Save Export Settingをクリックして設定を保存します。
- Export
アノテーション画面でデータ保存をクリックします。
dataフォルダ内に次のフォルダ、データが作成されます。
no-parking-PascalVOC-export
Annotations 画像サイズ、BoundingBox情報
ImageSets 学習用(train)、評価用(val)の画像データ名
JPEGImages jpeg静止画
pascal_label_map.pbtxt クラスの名前
最終的に作った静止画は約100、なお静止画の解像度(縦横のドット数)は特に調整していないので、数種類の大きさの静止画がまざったまま使いました。
つづく