Caffeの使い方
自分用にCaffeの使い方をメモしておく。
オライリーの本(読みやすいのでおすすめです)を参考に勉強してます。
インストール
Ubuntuでは公式HPに従えば、問題なくインストールできた。
MACは自分の環境(MacBook Pro (13-inch, Mid 2012), OSX10.10)では結構躓いた。まず、GPUはIntel製だったのでCUDAとかを使うのは最初から無理だった。OSX 10.10以下ではlibstdc++関連のせいで色々めんどくさいです。Caffeのインストールには、公式ページにあるMakefileを自分で編集してMakeする方法と、非公式のCmakeを使う方法があるのですが、自分は最終的にCmakeを使ったらすんなりできました。
データベースの作成
オライリーの本にあったアルファベットと数字の分類(The Chars74K image dataset - Character Recognition in Natural Images)を例に。
正解ラベルが書かれたファイルをつくる
Caffeでは以下のような学習用やテスト用の正解ラベルが書かれたテキストファイルを作らないとだめですが、多くの場合そういったファイルは自分で作らないとだめです。一列目がファイルのある場所、二列目が正解ラベル(ラベルの数字は0から始めないとだめなので注意)。
English/Fnt/Sample001/img001-00001.png 0 English/Fnt/Sample001/img001-00002.png 0 English/Fnt/Sample001/img001-00003.png 0 English/Fnt/Sample001/img001-00004.png 0 English/Fnt/Sample001/img001-00006.png 0 ...
本ではPerlとか使っていましたが、自分はPythonの方が慣れているのでPythonでScriptを書きました。
python createLabelList.py
これで、train.txtとtest.txtができます。createLabelList.pyは以下。
import os import glob import re directory = "English" file_test = open('test.txt','w') file_train = open('train.txt','w') files = glob.glob(directory+"/*/*/*.png") + glob.glob(directory+"/*/*/*/*.png") files = [f for f in files if os.path.isfile(f)==True] files.sort() pattern = r"Sample[0]+(\d+)/" repattern = re.compile(pattern) for i in range(len(files)): f = files[i] match = repattern.search(f) class_index = int(match.group(1)) class_index -= 1 if (i%5) != 4: file_train.write(f+' '+str(class_index)+'\n') else: file_test.write(f+' '+str(class_index)+'\n') file_test.close() file_train.close()
DBの作成
/build/tools/convert_imagesetを使って、画像とクラスが書かれたテキストデータ(train.txt, test.txt)を元に、データベースを作成できます。
bash create.sh
create.shは以下
#!/bin/bash set -e ROOTFOLDER=. BUILD=../../build/tools BACKEND="lmdb" echo "Creating ${BACKEND}..." rm -rf $ROOTFOLDER/chars74k_train_${BACKEND} rm -rf $ROOTFOLDER/chars74k_test_${BACKEND} $BUILD/convert_imageset \ --backend=${BACKEND} \ -check_size \ -gray \ -resize_height=28 \ -resize_width=28 \ -shuffle \ $ROOTFOLDER/ \ $ROOTFOLDER/train.txt \ $ROOTFOLDER/chars74k_train_${BACKEND} $BUILD/convert_imageset \ --backend=${BACKEND} \ -check_size \ -gray \ -resize_height=28 \ -resize_width=28 \ -shuffle \ $ROOTFOLDER/ \ $ROOTFOLDER/test.txt \ $ROOTFOLDER/chars74k_test_${BACKEND}
ネットワークを定義するprototxtを作る
solverの設定するprototxtを作る
学習を開始する
build/tools/caffeを利用して行える。
bash train.sh
#!/bin/bash set -e ../../build/tools/caffe train \ -solver=lenet_solver.prototxt \ # -snapshot=lenet_iter_15000.solverstate