ディープラーニングで本田翼を見分けたい。初歩編
2015/07/11
佐村河内守のアレの焼き増し。
ショートボブ4姉妹の画像群を学習させて本田翼を本田翼と正しく分類できたらバンザイですね、ってヤツ。
Contents
やること
- ディープラーニングを行う環境を整える
- 学習に必要な画像を集める
- 画像を学習させて分類器を作る
- 実際に試験用の画像を分類してみる
ディープラーニングを行う環境を整える
dockerを使って環境構築する
caffeというディープラーニングのフレームワークライブラリを使う。
『Caffeで手軽に画像分類』が手軽にできない。でも書いたが、環境構築が大変。
完璧主義者になって環境構築から挑戦して挫折するより、惰性を発揮してDockerを使うと良い。
dockerのインストール方法は適当にググると出てくる。
ありがたいことにcaffe環境をdockerizeしてくれてる人がいるので感謝しながらpullする。
1 2 |
docker pull tleyden5iwx/caffe-cpu-master docker run -it tleyden5iwx/caffe-cpu-master bin/bash |
optフォルダ以下にcaffeがあることが確認できるかと思う。
学習に必要な画像を集める
環境は整った。
ディープラーニングに限らず学習を行うためには大量の画像データが必要になる。
手で集めるのは大変だろうから、プログラムを組むなりして自動で集取するようにする。
こちらのように動画から顔画像を収集するもよし、クローラーで集めてくるもよし。
ここから先は基本的にご注文はDeep Learningですか?でやってることを丸パクリしてるだけ。
インターネッツに感謝です。シェアーさせていただきます。
取得してきた画像はImageMagickを使って正規化しておくと良いらしい。
xargsが好きなので、xargsでやった。
1 |
ls | grep jpg | xargs -I % convert % -equalize % |
各画像ディレクトリ名は数字にしていたのでそれに従う。
0:久保田智子
1:のっち(Perfume)
2:芹那
3:本田翼
4:その他
こんな感じ。
Caffe on Docker独自の問題?
コンテナの外にあるファイルを参照できるようにする
ちょっと脱線する。
今回Dockerを使ってるので、画像ファイルはコンテナ内に保存せず自分のローカル環境に保存しておきたい。
というもの、コンテナ内でwgetなどして画像を取ってきても、コンテナを壊すとその画像は破棄されるからだ。
一方、Caffe環境はDockerコンテナ内で用意しているためCaffe系のスクリプトの実行は当然コンテナ内でやる必要がある。
『ご注文はディープラーニングですか?』に書いてるように、用意した画像をLevelDBというデータベースに保存する必要がある。
で、この保存処理はCaffeが実行できる環境下で行わなければいけない。
画像をコンテナ内には保存したくない。
でも、画像を参照するスクリプトはコンテナ内で実行しないとダメ。
と、いう状況。
スクリプトからコンテナ外にあるファイルを参照できるようになればOK、ということ。
これを実現するためにDockerのVolumeという仕組み(オプション?)を使う。
1 |
docker run -v [ローカルの画像置いてるフォルダ]:[コンテナ内でローカルフォルダのリンクを設置する場所] -it [コンテナ名] bin/bash |
docker runを実行してる場所が画像設置してる場所なら下記のような感じでOK
1 |
docker run -v $PWD:/opt/caffe/volume:rw -it nihon_taro/caffe:v1003.0.0 bin/bash |
これでコンテナ内の/opt/caffe/volumeにcdしてみて、ローカルの画像設置フォルダを参照できているか確認する。
フォルダはあるけど画像が無い場合はパーミッションの問題かもしれない。
自分はboot2docker側の問題(?)で画像が参照できなかったので、下記を参考にして対処した。
https://github.com/boot2docker/boot2docker/issues/587#issuecomment-66935011
で、『ご注文はディープラーニングですか?』に書かれてるLevelDBに保存するスクリプトをCaffeコンテナ内で実行すれば大丈夫なはず。
コンテナで実行してる影響で参照するパスがちょっと変わってる。
これが原因でスクリプトが動作しないので、その辺は↓のようにイイカンジに直しておく。
1 |
path = os.path.join('/opt/caffe/examples/cifar10', name) |
無事にLevelDBが作れたはずなので、次は画像を学習させる。
画像を学習させて分類器を作る
自分で学習機を作るのはちょっと大変なので、有り物に便乗する。
これも『ご注文は…』の『学習機の設定』を丸パクリすればOK。
ここに載ってるのはcifar10というコンペでいい成績だした系の学習機の設定、、、かな。
cifar10_quick_train_test.prototxtを見ると、trainとtestで参照してるDBがLevelDBではなくLMDBになってる。
LevelDBで用意しちゃったので、ここをLMDBからLEVELDBに書き換えておく。
こんな感じに。
1 2 3 4 5 6 7 |
data_param { source: "examples/cifar10/cifar10_train_lmdb" source: "examples/cifar10/cifar10_train_leveldb" batch_size: 100 backend: LMDB backend: LEVELDB } |
cifar10_quick_train_test.prototxtとcifar10_quick.prototxtの出力結果のラベル数を表すip2レイヤーのnum_outputを10から主要キャラ5人+その他の6に変更しました。
今回は本田翼、のっち(Perfume)、芹那、久保田智子とその他(適当な人間画像)なので、num_outputは5にしておく。
それから、学習を実行する上でimage mean(平均画像?)が必要になる。
こんな感じ。
1 |
compute_image_mean -backend=leveldb example/cifiar10/cifiar10_train_leveldb example/cifiar10/mean.binaryproto |
設定したら学習を実行する。
CPUでやったので数時間かかった。。
1 |
caffe train --solver examples/cifar10/cifar10_quick_solver.prototxt |
待ってるとcifar10_quick_iter_4000.caffemodelというファイルが生成されてる。
実際に試験用の画像を分類してみる
分類器ができたので実際に画像を分類してみる。
スクリプトは下記の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import caffe from caffe.proto import caffe_pb2 import numpy as np mean_blob = caffe_pb2.BlobProto() with open('mean.binaryproto') as f: mean_blob.ParseFromString(f.read()) mean_array = np.asarray( mean_blob.data, dtype=np.float32).reshape( (mean_blob.channels, mean_blob.height, mean_blob.width)) classifier = caffe.Classifier( 'cifar10_quick.prototxt', 'cifar10_quick_iter_4000.caffemodel', mean=mean_array, raw_scale=255) image = caffe.io.load_image('tsubasa.jpg') predictions = classifier.predict([image], oversample=False) pred = np.argmax(predictions) print(predictions) print(pred) |
imageのパスに分類させたい画像を指定する。
分類例
いくつか画像を試してみたけど、サンプル(各ラベル100枚くらい。。)が足りないのかちょくちょく誤分類する。
うまくいったヤツ
1 2 3 4 5 6 7 8 9 10 |
[[[[ 2.79939035e-04]] [[ 1.04080811e-02]] [[ 4.14760917e-01]] [[ 5.74541986e-01]] [[ 9.08517359e-06]]]] 3 |
うまくいかないヤツ
1 2 3 4 5 6 7 8 9 10 |
[[[[ 8.23895462e-05]] [[ 1.32211484e-04]] [[ 8.35830748e-01]] [[ 1.63954601e-01]] [[ 1.59953278e-14]]]] 2 |
芹那と誤認。
おわりに
まあ、一応仕組みはできたはず。
次はサンプル数を増やしたり、スクリプトの使い勝手を良くして効率よく進められるようにしていきたい。
あとGPU化。
本田翼かわいい。
336px
336px
関連記事
-
-
deepdreamしてみたい
ht …
-
-
MacでKerasを使えるようにする
Ke …