Darknetをubuntu 16.04 LTS + VirtualBoxで使ってみる(学習準備編)


BBox-Label-Toolとconvert.py、process.pyを使って学習用データをつくってみます。

 

a:画像データ(*.jpg)

b:座標データ(*.txt)

c:画像リスト(train.txt,test.txt)

d:クラスリスト(obj.names)

 


a,bを作ってみる(アノテーション)

BBox-Label-ToolのインストールはDarknetをubuntu 16.04 LTS + VirtualBoxで使ってみる(コンパイル編)の末尾参照

 

インストール直後のBBox-Label-Tool/main.pyでは扱う画像ファイルの拡張子は「JPEG」になっています。これではなにかと不便なので、main.pyをエディターで開いて「JPEG」を「jpg」に変更しておきます。

 

BBox-Label-Toolがどんなツールなのか体験してみるために、まずは、画像ファイル(jpg)を集めましょう。

試しに11枚ほどのワンちゃん画像をネットから落とします(実用には程遠い枚数ですが)。

実用に耐える画像データを用意する場合は、このブログなんかを参照

画像の水増し方法に関しては ここや  ここなどを参照

 

BBox-Label-Tool/Images/001ディレクトリーとBBox-Label-Tool/Labels/001ディレクトリーにあるオリジナルは削除しておいて、BBox-Label-Tool/Images/001ディレクトリーに新しい画像を移しておきます。

ファイル名は、000.jpgから連番のファイル名にしておきます。サイズはそのままでOK。

 

BBox-Label-Tool/main.pyでBBox-Label-Toolを起動。

cd ~/BBox-Label-Tool
python2 main.py

 

画像はBBox-Label-Tool/Images/001ディレクトリーにあるので、Image Dirには「001」を入力してLoadします。

 

使ってみて「おや?」と思うかもしれませんが出てくる画像は連番どおりではなくランダムです。main.pyの中ではリストはシャッフルされているので、順番どおりには表示されません。

マウスで囲ってNextをクリックすればデータが作成されます。

 

BBox-Label-Tool/Labels/001ディレクトリーに結果ファイルが作成されています。

 

 

 

ディレクトリー・ファイル構成

BBox-Label-Tool

main.py

Images

┣000.jpg

┣001.jpg

┣010.jpg

Labels

┣000.txt

┣001.txt

┣010.txt

 

 

 

BBoxでつくった座標データはYOLOで使える形式とは違っていてそのままでは使えません。

BBox-Label-Tool/Labelsの*.txtデータを変換します。

 

事前作業は、ずいぶんややこしくて回りくどいやり方ですが、こんな感じです。

(BBoxをWindowsで使う場合は、この部分はExcel-VBAで代替する予定)

 

 

『convert_py』というディレクトリを作っておき、ここで作業をします。

convert.py のコードをコピーしてconvert.pyファイルを作ります。

convert.pyでも扱う画像ファイルの拡張子は「JPEG」になっていますので、「JPEG」を「jpg」に変更しておきます。

また、UNIX系用に「\r\n」の改行コードも「\n」に変更しておきます。

convert.py サンプル


『convert_py』ディレクトリの中に、『images』と『labels』という名前のディレクトリを作ります。
『images』ディレクトリの中に、『stopsign』という名前のディレクトリを作ります。
『labels』ディレクトリの中に、『stopsign』と『stopsign_original』という名前のディレクトリを作ります。

BBox-Label-Toolから画像と座標データをコピーします。

BBox-Label-Tool/Images/*.jpg -> convert_py/images/stopsign
BBox-Label-Tool/Labels/*.txt -> convert_py/labels/stopsign_original

 

変換を実行します。

cd ~/convert_py

python2 convert.py

convert_py/labels/stopsignに変換された座標データ(*.txt)が格納されます。

 

ディレクトリー・ファイル構成

convert_py

convert.py

images

stopsign

┣000.jpg

┣001.jpg

┣010.jpg

labels

stopsign_original

┣000.txt

┣001.txt

┣010.txt

変換結果はここに作成されます。

stopsign

┣000.txt

┣001.txt

┣010.txt

 

こういうデータ

1
<xmin> <ymin> <xmax> <ymax>


が、

こういう風に変換されます。

0 <bbox中心のx座標> <bbox中心のy座標> <bboxの幅> <bboxの高さ>

 


c,d作成

process.pyのサンプル

『darknet/data/images』というディレクトリを作って画像ファイルをコピーしておきます。

BBox-Label-Tool/Images/001/*.jpg–> darknet/data/images

 

『darknet/data/labels』に座標データをコピーしておきます。

BBox-Label-Tool/Labels/001/*.txt –> darknet/data/labels

 

 

結果格納用に『darknet/backup』ディレクトリを作成しておきます。

process.pyをimagesの中に保存。

process.pyを実行可能にしておいて、実行。

cd ~/darknet/data/images

python2 process.py

 

 

c:画像リスト

以下の画像リストファイルが作成されます。test.txtに記述される数はprocess.pyの中のpercentage_testで設定された数値から割り出されたものです。

darknet/data/images/test.txt
darknet/data/images/train.txt

 

 

d:クラスリスト

今回のクラスは1種類なので

dog

と記述したobj.namesファイルを、『darknet/data/images』に保存します。

 


Next

トレーニングしてみる。

(GPU使ってないと……..多分来年中には結果が出るかもってことになるなぁ)

GPUなしの環境は現実的ではないので、少し方向を変えてみます。

どう変えるのかは、また今度ということで。

 

 

参考までに学習実行はこんな風にやります(クラスが1の場合)。

darknet/cfg/obj.data

classes=1
train = data/images/train.txt
valid = data/images/test.txt
labels = data/images/obj.names
backup = backup/
top = 2

 

既存のdarknet/cfg/yolo-vos.cfgをベースにしてdarknet/cfg/yolo-obj.cfgを作成

変更点

batch=64 #<– 1

subdivisions=8 #<–1

classes=1

filters=30 #<–237行目

初期値としてdarknetディレクトリ直下に移動して以下のファイルをDLしておく。

wget https://pjreddie.com/media/files/darknet19_448.conv.23

 

実行

cd ~/darknet

./darknet detector train cfg/obj.data cfg/yolo-obj.cfg darknet19_448.conv.23

 

 


画像水増し(Data Augmentation)

Pythonコード

オリジナルx1
コントラスト調整x2
ガンマ変換x2
平滑化x1
ヒストグラム均一化x1
ガウシアンノイズx1
Salt&Pepperノイズx1

上記のものを反転

で、全部で18-1パターンの水増しができる……ってことかな。

このコードには含まれていないけど、これ以外に拡大・縮小、ドット単位の上下左右へのずらし(shift)、回転などを入れればもっとパターンは増えます。

OpenCV

 

何も考えずに端末からubuntu 16.04にOpenCV 2.4.13をインストールする場合

$ sudo apt update

$ sudo apt upgrade

必要なライブラリを導入
$ sudo apt -y install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip

$ cd ~

//
$ wget https://github.com/opencv/opencv/archive/2.4.13.zip

$ unzip 2.4.13.zip

$ cd opencv-2.4.13/

$ mkdir build

$ cd build/

$ cmake -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D WITH_VTK=ON ..


$ make

$ sudo make install

Pathを設定

rootでログインしていない場合

$ sudo gedit /etc/ld.so.conf.d/opencv.conf

*opencv.confが作成されていない場合は空白で開かれることもあります。

以下を記述

/usr/local/lib

$ sudo ldconfig
$ sudo gedit /etc/bash.bashrc

 

行の一番下に
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

 

 

 


 

参照

OpenCVをapt-getでインストール

記事では「執筆時点では2.4.xしかできません」と書いてます、で、いつの執筆かというと、これはマイナビブックスの「OpenCV 3 プログラミングブック」の記事で、発売日が2015/09/29なので、この辺です。

OpenCV3のインストールに関しては、2017/06頃の記事

Install OpenCV3 on Ubuntu

多分いろんなサイトの記事の元ネタはこれかな?

コメントでいろんなツッコミが入ってますが、どれも有用です。

 


参考資料

AI ごあいさつに移動しました

 


 

 

Be the first to comment

Leave a Reply

Your email address will not be published.


*