ssd kerasの学習モデル作成

ssd kerasの学習は大まかに以下の手順で行われる。
1)jpeg等の画像データの収集
2)モノの”種類”と”位置”を記したxmlファイルの作成
3)pklファイルxmlファイルをまとめたファイル)の作成
4)上で作ったpklファイルにより学習を行う

このssd kerasの学習についてのメモ。

 

参考にされる方は自己責任でお願いします。

また学習モデルの作り方を理解するには、ここここを参考に、VOC(Visual Object Classes)のデータで練習するのが一番だと思います。

 

考えている環境は以下のようである。

windows 10 64bit

python 3.6

tensorflow 1.8.0 (cpu版)

keras 2.1.5

labelimg

ssd_keras


1)ssd kerasの準備

ここから、ssd_kerasをデスクトップにダウンロードする。学習モデルもダウンロードしておく。
ssd_keras-masterというフォルダーがデスクトップに現れるはず。

この内部に、以下のようにtestというディレクトリを作成する。

ssd_keras-master/
 └test/

 

ちなみに、keras2.0以上を使っている場合は、ここを参考に、ssd_layers.pyにおいて

def get_output_shape_for(self, input_shape):

def compute_output_shape(self, input_shape):

に変更する。


2)画像の用意

例として、はてなマークを検出するモデルを作成する。

testディレクトリ内に以下の画像を用意する。

f:id:haitenaipants:20180620002328j:plain
f:id:haitenaipants:20180620003958j:plain
f:id:haitenaipants:20180620004003j:plain
左から fig1.jpg, fig2.jpg, fig3.jpg

ちなみに、画像は2枚以下だと後々困るので3枚以上用意すること。
(画像は訓練用と検証用に使われ、2枚以下だと画像が全て訓練用に使われてしまい、検証用の画像がなくてエラーが出る)


3)xmlファイルの作成

labelimgを用いて、用意した画像からxmlファイルを作成する。

labelimgの導入方法は以下の通り。
haitenaipants.hatenablog.com

ここでは、”question_mark”というラベルでラベリングした。

また、考えているディレクトリ内は以下のようになっているはず。

ssd_keras-master/
 └test/
   ├ fig1.jpg
   ├ fig2.jpg
   ├ fig3.jpg
   ├ fig1.xml
   ├ fig2.xml
   └ fig3.xml

これらを、figとxmlというディレクトリを作って、以下のように整理する。

ssd_keras-master/
 └test/
   ├ fig/ 
   │ ├ fig1.jpg
   │ ├ fig2.jpg
   │ └ fig3.jpg
   └xml/
     ├ fig1.xml
     ├ fig2.xml
     └ fig3.xml

 

4)pklファイルの作成

ssd_keras-master/PASCAL_VOCの中にあるget_data_from_XML.pyssd_keras/testにコピーアンドペーストする。

このget_data_from_XML.py内部の"aeroplane""question_mark"にする。

次に、pythonを起動して、testディレクトリ内において以下のコマンドをうつ。

import pickle
import get_data_from_XML

data =get_data_from_XML.XML_preprocessor('xml/').data

pickle.dump(data,open('test.pkl','wb'))

test.pklができていることを確認。

 

5)pklファイルの確認

上のコードに続いて、以下のコマンドを実行する。

f = open('test.pkl', 'rb')

data = pickle.load(f)

print(data.keys())

print(data['fig1.jpg'])

行列が出てきたら成功。

 

6)学習モデルの作成

ssd_keras-masterにcheckpointsというディレクトリを作っておく。

あとはこここことかを参考に、SSD_training.ipynbを書き換えてjupyter notebookで実行するのみである。

ポイントとしては、

(a) In [2]

NUM_CLASSES=4

を以下のように書き換える。

NUM_CLASSES=21 

 

(b) In [4]

gt=pickle.load(open('gt_pascal.pkl','rb'))  

を以下のように、作ったpklファイル名に書き換える。

gt=pickle.load(open('test/test.pkl','rb'))  

 

(c) In [6]

path_prefix='../../frames/'

を以下のように、画像のある場所に書き換える。

path_prefix='test/fig/' 

 

(d) In [6]

gen=Generator(gt, bbox_util, 16, '../../frames/',

               train_keys, val_keys,

               (input_shape[0], input_shape[1]), do_crop=False)

を以下のように書き換える。赤字は変更箇所を示す。

gen=Generator(gt, bbox_util, 1,'test/fig/' 

               train_keys, val_keys,

               (input_shape[0], input_shape[1]), do_crop=False)