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を起動。
1 2 |
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』ディレクトリの中に、『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
③
変換を実行します。
1 2 3 |
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 2 |
1 <xmin> <ymin> <xmax> <ymax> |
が、
こういう風に変換されます。
1 |
0 <bbox中心のx座標> <bbox中心のy座標> <bboxの幅> <bboxの高さ> |
c,d作成
『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を実行可能にしておいて、実行。
1 2 3 |
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)
オリジナルx1
コントラスト調整x2
ガンマ変換x2
平滑化x1
ヒストグラム均一化x1
ガウシアンノイズx1
Salt&Pepperノイズx1
上記のものを反転
で、全部で18-1パターンの水増しができる……ってことかな。
このコードには含まれていないけど、これ以外に拡大・縮小、ドット単位の上下左右へのずらし(shift)、回転などを入れればもっとパターンは増えます。
何も考えずに端末からubuntu 16.04にOpenCV 2.4.13をインストールする場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$ 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でログインしていない場合
1 |
$ sudo gedit /etc/ld.so.conf.d/opencv.conf |
*opencv.confが作成されていない場合は空白で開かれることもあります。
以下を記述
/usr/local/lib
1 |
$ sudo ldconfig |
1 |
$ sudo gedit /etc/bash.bashrc |
行の一番下に
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
参照
記事では「執筆時点では2.4.xしかできません」と書いてます、で、いつの執筆かというと、これはマイナビブックスの「OpenCV 3 プログラミングブック」の記事で、発売日が2015/09/29なので、この辺です。
OpenCV3のインストールに関しては、2017/06頃の記事
多分いろんなサイトの記事の元ネタはこれかな?
コメントでいろんなツッコミが入ってますが、どれも有用です。
参考資料
AI ごあいさつに移動しました
Leave a Reply