ishigenの技術ブログ

卓球 機械学習 競ぷろ

yolov3を自前データで学習(成功編)

今回は前回失敗したままだった、yolov3の自前データでの学習についてです。

ishigentech.hatenadiary.jp

結論としては学習するところまではいけました。ただ、期待していたような結果は出ませんでした。RTX2080を購入したので、とりあえず学習までできたのは良かったかなと思います。

環境

ubuntu16.04
Geforce RTX 2080
nvidia-docker
opencv3.3.0

使用した実装はこちら

pjreddie.com
前回はkerasでの実装でしたが、cndnnのバージョンがシビアだったので変更しました。

手順

  1. nvidia-dockerでコンテナ作成
  2. opencv、darknetのインストール
  3. VOTTでアノテーションを行い、学習用データを作成(今回は100枚ほど)
  4. 学習を行う

nvidia-dockerでコンテナ作成

いい感じのDockerfile作れよって話かもしれませんが、やっていません。すみません。

イメージをダウンロードします。

docker pull nvidia/cuda:9.0-cudnn7-devel

コンテナの立ち上げです。
docker内でopencvGUIアプリケーションとして動かすため、環境変数やマウントしなければならないディレクトリがあります。また、ホストのxhostの設定も変更する必要があります。

xhost +local:root
nvidia-docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -it イメージ /bin/bash

また、マウントしたいディレクトリが他にもあれば-vオプションを追加します。

nvidia-docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v ホスト:コンテナ -it イメージ /bin/bash

opencv、darknetのインストール

ここは割愛します。以下参考記事の通りです。
Ubuntu16.04へのOpenCV 3.3.0インストールメモ - Qiita
YOLO: Real-Time Object Detection
darknetでYOLOv3を動かしてみた。 - Qiita

VOTTでのアノテーションは過去の記事の通りです。この時に作成したデータを使用しました。

ishigentech.hatenadiary.jp

学習を行う

学習済みのデータをダウンロードします。

wget https://pjreddie.com/media/files/darknet53.conv.74

環境によりますが、obj.dataやここで参照している各ファイルのパスは適宜合わせてください。
学習は以下のコマンドで行います。

./darknet detector train sample/data/obj.data sample/yolo-obj.cfg darknet53.conv.74

f:id:ishigentech:20190106143705p:plain
学習中のターミナル

学習が始まるとdarknet/backupに学習済みデータが保存されていくので、学習途中でも以下のコマンドで精度を確認することができます。

./darknet detector test sample/data/obj.data sample/yolo-obj.cfg backup/sample.backup テストデータ

手順は以上です。

今回は卓球の選手とボールの教師用データを作成し、学習させてみました。結果としては選手は検出でき、ボールはできていないという結果になりました。小さな物体に対してはまだ難しいのだろうと思います。

f:id:ishigentech:20190106144037p:plain
予測結果

ボールのトラッキングにはまだ時間がかかりそうでした。