おっぱいそん!

pythonを数値計算に使うときのテクニックとかをまとめていきたい。

Caffeの使い方

自分用にCaffeの使い方をメモしておく。
オライリーの本(読みやすいのでおすすめです)を参考に勉強してます。

インストール

Ubuntuでは公式HPに従えば、問題なくインストールできた。
MACは自分の環境(MacBook Pro (13-inch, Mid 2012), OSX10.10)では結構躓いた。まず、GPUIntel製だったのでCUDAとかを使うのは最初から無理だった。OSX 10.10以下ではlibstdc++関連のせいで色々めんどくさいです。Caffeのインストールには、公式ページにあるMakefileを自分で編集してMakeする方法と、非公式のCmakeを使う方法があるのですが、自分は最終的にCmakeを使ったらすんなりできました。

データベースの作成

オライリーの本にあったアルファベットと数字の分類(The Chars74K image dataset - Character Recognition in Natural Images)を例に。

学習・テストデータをDLしてくる

wgetとか使って適当な作業ディレクトリに。

正解ラベルが書かれたファイルをつくる

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を作る

Caffeで学習する時のモデルの設定 - おっぱいそん!

solverの設定するprototxtを作る

Caffeのsolverの設定 - おっぱいそん!

学習を開始する

build/tools/caffeを利用して行える。
bash train.sh

#!/bin/bash
set -e

../../build/tools/caffe train \
    -solver=lenet_solver.prototxt \
#    -snapshot=lenet_iter_15000.solverstate