やってみた!

やってみた!

試したことを中心に、書評や興味のあること、思ったこととか

YOLOv3-tinyで学習してみた1(パソコン作業、アノテーションまで)

 YOLOv3-tinyを学習させてみます。Google Colaboratoryを使用します。
 初回(3回記事です)はColaboratoryの準備、アノテーションツールVOTTのインストール、学習データの準備、アノテーションまでを行います。
 以下の例はWindows10です。

1.Google Drive、Colaboratoryの準備

 Googleアカウントを登録してGoogleドライブを開きます。

drive.google.com

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にマウントされます。

 f:id:akifukka:20191014180230j:plain

 

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'

f:id:akifukka:20191021160818j:plain

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の学習に必要なデータは次の通りです。

  1. 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分)してきました。

f:id:akifukka:20191019080801j:plain

 

7.アノテーションツールVoTTをインストールする

github.com

  動画から静止画を取り出しBoundingboxを設定するためのツール(アノテーションツール)VoTTをパソコンにインストールします。以降の例はWindows10です。

 こちらから、Windws版のVoTTをダウンロードしてインストールします。

Releases · microsoft/VoTT · GitHub

8.アノテーション(タグ付け)する

1)フォルダを作成

 パソコン上に作業用としてフォルダを2つ作成します。以下はあくまで例なので、すきな名前、場所に作成してください。

  • source
    撮影した画像元データを入れるフォルダ。フォルダ作成後、スマホで撮った動画ファイルをここにいれます。
  • data
    アノテーションして新たに作られるデータが保管されるフォルダ。

 2)VOTTの設定

  • New Projectをクリック
  • Projct Settings画面が表示されるので次のように設定します。
    Display Name
     好きなプロジェクト名を入力
    Source、Target Connection
     画像元データ保管フォルダ、アノテーション後のデータ保管フォルダを設定
    それ以外の欄
     とりあえず、初期状態のままでOK
    f:id:akifukka:20191020181651j:plain

    f:id:akifukka:20191020183018j:plain
  • Save Projectでプロジェクトを保存します。

3)アノテーションの実施

  • TAGを追加
    実際にアノテーション作業する画面(アノテーション画面)が表示されるので、画面をクリックして動画を一時停止します。右上のTAGSの+を押して、TAG名称(分類クラス名称)を入力します。’no parking'としました。'Ent'で名称を確定します。再度+を押すとtぐ入力画面が消えます。
    f:id:akifukka:20191020184543j:plain
  • アノテーション
    動画を止めて、Draw Rectangleを押し、対象物を囲みます。TAG 'no parking' を選択すると、囲み部分が緑表示になります。これで1枚終了なので、動画を進めて同じ作業を繰り返します。

    f:id:akifukka:20191020185206j:plain

     アノテーションを進めつつ、画面上部のフロッピーディスクの絵をクリックして作業結果(プロジェクト)をセーブする。

4)Export

  • Export Settings
    画面左にある斜め上向きの矢印をクリックしてExport Setting画面に移動。Provider欄でPascal VOCを選択、Asset StateでOnly tagged Assetsを選択、Save Export Settingをクリックして設定を保存します。
    f:id:akifukka:20191020192214j:plain
  • Export
    アノテーション画面でデータ保存をクリックします。f:id:akifukka:20191020190910j:plain

    dataフォルダ内に次のフォルダ、データが作成されます。
    no-parking-PascalVOC-export
      Annotations 画像サイズ、BoundingBox情報
      ImageSets 学習用(train)、評価用(val)の画像データ名
      JPEGImages jpeg静止画
      pascal_label_map.pbtxt クラスの名前

     最終的に作った静止画は約100、なお静止画の解像度(縦横のドット数)は特に調整していないので、数種類の大きさの静止画がまざったまま使いました。

つづく

akifukka.hatenablog.com

 

Jetson Nano カテゴリーの記事一覧へ