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というディレクトリを作成する。
└test/
ちなみに、keras2.0以上を使っている場合は、ここを参考に、ssd_layers.pyにおいて
def get_output_shape_for(self, input_shape):
を
def compute_output_shape(self, input_shape):
に変更する。
2)画像の用意
例として、はてなマークを検出するモデルを作成する。
testディレクトリ内に以下の画像を用意する。
ちなみに、画像は2枚以下だと後々困るので3枚以上用意すること。
(画像は訓練用と検証用に使われ、2枚以下だと画像が全て訓練用に使われてしまい、検証用の画像がなくてエラーが出る)
3)xmlファイルの作成
labelimgを用いて、用意した画像からxmlファイルを作成する。
labelimgの導入方法は以下の通り。
haitenaipants.hatenablog.com
ここでは、”question_mark”というラベルでラベリングした。
また、考えているディレクトリ内は以下のようになっているはず。
これらを、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.pyをssd_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)