Caffeを使ってみた

Deep-Learning(深層学習)について

・生物の脳神経ネットワークをモデルとしてたニューラルネットワークというアルゴリズムを利用している
・例えばある画像を「犬の画像」だと判定する手順を従来であれば人が考えていたが
 機械学習ではデータ(犬が入ったものと入っていないもの)を大量投入し判定基準含めて機械が決めて判断する
・今まで画像特徴量をもとになにの画像か判定していたが、
 何をもとに判定したらよいかから機械が決めたほうが、より高い評価を得るようになってきた
・CUDA(NVIDA社)によってGPUが利用しやすくなり、
 ILSVRC2012でDeep-Learningを利用したチームが他チームを引き離して1位となったことから
 最近注目を浴びるようになった

Caffeとは

オープンソースとして開発されているディープラーニングフレームワークの1つ
(カリフォルニア大学バークレー校のコンピュータビジョンおよび機械学習に関する研究センターであるBVLCが中心となって開発している)

・CUDAによるGPU環境での動作をサポートしている。またGPU環境での処理速度が高速
 (パラメーターを変更することでGPU環境がなくても利用可能)
・学習済みのモデルが配布されており、自前で学習させようとすると何日もかかるようなデータサイズ、モデルも簡単に使える
・シェルでの実行とAPIを利用したコーディングでの実行が可能

Caffeを利用して画像認識などが可能。デモサイトも用意されている
2016-04-03_192846

Install

Ubuntu Installation

root@ubuntu1404:/home/shimizu# aptitude install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libboost-all-dev libatlas-base-dev
...

### デフォルトのgccではコンパイルできないらしい ###
root@ubuntu1404:/home/shimizu# aptitude install python-dev libgflags-dev libgoogle-glog-dev liblmdb-dev git g++-4.6 python-protobuf
...

root@ubuntu1404:/home/shimizu# cd /usr/local/src/
root@ubuntu1404:/usr/local/src# git clone https://github.com/BVLC/caffe.git
...
root@ubuntu1404:/usr/local/src# cd caffe/
root@ubuntu1404:/usr/local/src/caffe# cp Makefile.config.example Makefile.config
root@ubuntu1404:/usr/local/src/caffe# vi Makefile.config
===
### コメントアウト ###
CPU_ONLY := 1
### 変更 ###
CUSTOM_CXX := g++-4.6
===
root@ubuntu1404:/usr/local/src/caffe# make
...

root@ubuntu1404:/usr/local/src/caffe# make test
...

root@ubuntu1404:/usr/local/src/caffe# make runtest
...
[ RUN      ] NeuronLayerTest/1.TestExpGradientBase2Shift1
[       OK ] NeuronLayerTest/1.TestExpGradientBase2Shift1 (3 ms)
[----------] 48 tests from NeuronLayerTest/1 (377 ms total)

[----------] Global test environment tear-down
[==========] 1048 tests from 146 test cases ran. (60438 ms total)
[  PASSED  ] 1048 tests.

MNISTを利用してみる

Caffeで手書き数字(MNIST)の認識学習をする
MNIST(Mixed National Institute of Standards and Technology)
MNISTとは28x28pxの60000枚の学習サンプル、10000枚のテストサンプルからなる手書き数字画像データベースで
caffeにて試せるように事前に用意されている

### MNISTのデータセット取得 ###
root@ubuntu1404:/usr/local/src/caffe# cd data/mnist/
root@ubuntu1404:/usr/local/src/caffe/data/mnist# vi get_mnist.sh
root@ubuntu1404:/usr/local/src/caffe/data/mnist# ./get_mnist.sh
...

### MNISTのデータ変換(Caffeは画像学習を行う際LevelDBかLMDB形式で読み込ませる必要あり。エラー出るが 1394 をオフにした OpenCV をビルドしないといけないようなので無視) ###
root@ubuntu1404:/usr/local/src/caffe/data/mnist# cd /usr/local/src/caffe/
root@ubuntu1404:/usr/local/src/caffe# ./examples/mnist/create_mnist.sh
Creating lmdb...
libdc1394 error: Failed to initialize libdc1394
libdc1394 error: Failed to initialize libdc1394
Done.

### 学習させる(CPU_ONLYの場合は書き換える) ###
root@ubuntu1404:/usr/local/src/caffe# vi ./examples/mnist/lenet_solver.prototxt
===
# solver_mode: GPU
solver_mode: CPU
===

root@ubuntu1404:/usr/local/src/caffe# ./examples/mnist/train_lenet.sh
...

### 学習結果を利用してテストする(./examples/mnist/ 配下の lenet_iter_xxxx.caffemodel が学習結果) ###
root@ubuntu1404:/usr/local/src/caffe# ./build/tools/caffe test -model ./examples/mnist/lenet_train_test.prototxt -weights ./examples/mnist/lenet_iter_10000.caffemodel

###  prototxtファイルからブロック図を生成する ###
root@ubuntu1404:/usr/local/src/caffe# aptitude install python-pip python-dev python-numpy python-scipy python-matplotlib cython python-pandas python-skimage python-pydot
root@ubuntu1404:/usr/local/src/caffe# cd python/
root@ubuntu1404:/usr/local/src/caffe/python# pip install -r requirements.txt
root@ubuntu1404:/usr/local/src/caffe/python# cd ../
root@ubuntu1404:/usr/local/src/caffe# make pycaffe
...
root@ubuntu1404:/usr/local/src/caffe# echo 'export PYTHONPATH=/usr/local/src/caffe/caffe/python/:$PYTHONPATH' >> ~/.bashrc
root@ubuntu1404:/usr/local/src/caffe# source ~/.bashrc
root@ubuntu1404:/usr/local/src/caffe# python /usr/local/src/caffe/python/draw_net.py /usr/local/src/caffe/examples/mnist/lenet_train_test.prototxt output.png
libdc1394 error: Failed to initialize libdc1394
/usr/local/src/caffe/python/caffe/pycaffe.py:13: RuntimeWarning: to-Python converter for boost::shared_ptr<caffe::Net<float> > already registered; second conversion method ignored.
  from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
/usr/local/src/caffe/python/caffe/pycaffe.py:13: RuntimeWarning: to-Python converter for boost::shared_ptr<caffe::Blob<float> > already registered; second conversion method ignored.
  from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
/usr/local/src/caffe/python/caffe/pycaffe.py:13: RuntimeWarning: to-Python converter for boost::shared_ptr<caffe::Solver<float> > already registered; second conversion method ignored.
  from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
Drawing net to output.png

Caffe Demos
2016-04-03_195512

CIFAR-10を利用してみる

root@ubuntu1404:/usr/local/src/caffe# cd data/cifar10/
root@ubuntu1404:/usr/local/src/caffe/data/cifar10# ./get_cifar10.sh
root@ubuntu1404:/usr/local/src/caffe/data/cifar10# cd ../../
root@ubuntu1404:/usr/local/src/caffe# ./examples/cifar10/create_cifar10.sh
root@ubuntu1404:/usr/local/src/caffe# vi examples/cifar10/cifar10_quick_solver.prototxt
===
# solver_mode: GPU
solver_mode: CPU
===

root@ubuntu1404:/usr/local/src/caffe# ./build/tools/caffe train --solver examples/cifar10/cifar10_quick_solver.prototxt
...
I0403 23:58:47.250635 24251 solver.cpp:404]     Test net output #0: accuracy = 0.7119
I0403 23:58:47.250869 24251 solver.cpp:404]     Test net output #1: loss = 0.850394 (* 1 = 0.850394 loss)
I0403 23:58:47.250948 24251 solver.cpp:322] Optimization Done.
I0403 23:58:47.251015 24251 caffe.cpp:222] Optimization Done.

### 判定してみる (何かがおかしいorz) ###
root@ubuntu1404:/usr/local/src/caffe# cd python/
root@ubuntu1404:/usr/local/src/caffe/python# wget -d https://dl.dropboxusercontent.com/u/8148946/Develop/aws/cifar10_classifier.py
root@ubuntu1404:/usr/local/src/caffe/python# cd ../../
root@ubuntu1404:/usr/local/src# 
root@ubuntu1404:/usr/local/src# cp caffe/examples/cifar10/cifar10_quick_iter_4000.caffemodel.h5 caffe/examples/cifar10/cifar10_quick_iter_4000.caffemodel
root@ubuntu1404:/usr/local/src# wget -d https://upload.wikimedia.org/wikipedia/commons/7/7b/Hyla_japonica_001.jpg
root@ubuntu1404:/usr/local/src# python caffe/python/cifar10_classifier.py Hyla_japonica_001.jpg
...
[[ 0.1  0.1  0.1  0.1  0.1  0.1  0.1  0.1  0.1  0.1]]
0:airplane

plotしてみる

CaffeでMNISTを学習した経過をプロットしてみたより

root@ubuntu1404:/usr/local/src# ./caffe/tools/extra/parse_log.sh /tmp/caffe.ubuntu1404.root.log.INFO.20160415-011551.6345
root@ubuntu1404:/usr/local/src# mv caffe.ubuntu1404.root.log.INFO.20160415-011551.6345.test mnist.log.test
root@ubuntu1404:/usr/local/src# mv caffe.ubuntu1404.root.log.INFO.20160415-011551.6345.train mnist.log.train
root@ubuntu1404:/usr/local/src# gnuplot ./caffe/tools/extra/plot_log.gnuplot.example
# your_chart_name.png が出力される

2016-04-15_030457

参考URL

CaffeでDeep Learning つまずきやすいところを中心に
ノート/Caffeのデモプログラムを試してみる (2014-12-24)
もう迷わない Caffe入門 その1