White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

きんいろDeepLearning

http://deep-learning-hackathon.connpass.com/event/12867/

このイベントに参加して、DeepLearning(Caffe)を回してみました。

大体これまで上がってる記事で、ゴチうさでDeepLearningされてるのがあったので対抗してきんモザでやってみました。n番煎じです。((既にラブライブ等でもされてるようなので))

環境

問題設定

事前にanimefaceで顔領域を検出した部分に対し、アリスであるかカレンであるか、それとも他のキャラであるかを判定したい

単純な3クラス分類問題ですが、アリスもカレンもキンパツなので、色によるキャラ判別はできません。おそらく輪郭や目つきの情報を使う必要があります。

手順

ご注文はDeep Learningですか?[1]のところとほぼ同じです。 ソースもほぼそのまま使っています。

まずアリス、カレン、他の画像を用意しました。アリスが700,カレンが600、他が6000枚くらいです。画像の用意には[1]のコードをそのまま使っています。

次に自分の手元のマシンRX3上にCaffeをインストールして、LevelDBに上の画像をセットしました。さらにcifar10_quick_train_test.prototxtとcifar10_quick.prototxtを書き換えます。

今回はアリス、カレン、その他の判別なので、ip2レイヤーのnum_outputを3にしています。

また、最近のCaffeの更新で、データの読み込みDBがLevelDBからLMDBとかいうのに変わっているため、LevelDBを読むように書きなおしました。

$ vim examples/cifar10/cifar10_quick_train_test.prototxt

name: "CIFAR10_quick"
layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mean_file: "examples/cifar10/mean.binaryproto"
  }
  data_param {
    source: "examples/cifar10/cifar10_train_leveldb"
    batch_size: 100
    backend: LEVELDB
  }
} 
layer { 
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  } 
  transform_param {
    mean_file: "examples/cifar10/mean.binaryproto"
  }
  data_param {
    source: "examples/cifar10/cifar10_test_leveldb"
    batch_size: 100
    backend: LEVELDB
  }
} 

また、mean.binaryprotoファイルがないので、

cd $CAFFE_ROOT/data/cifar10
./get_cifar10.sh
cd $CAFFE_ROOT
./examples/cifar10/create_cifar10.sh

を実行して作ります。一緒にcaffe/examples/cifar10/cifar10*lmdbとかできますが使わないので消します。

ここまで編集し終わったら、EC2のN.Virginiaにつないで、 ami-763a311eをベースとしたg2.2xlargeのSpotInstanceを立ち上げます。このインスタンスは既にCUDA+Caffeまで入った状態なので、すぐに学習ができます。

インスタンスを立ち上げたら、RX3のcaffe/examples/cifar10以下をEC2:caffe/examples/cifar10以下に上書きします。

$ build/tools/caffe train --solver examples/cifar10/cifar10_quick_solver.prototxt

を実行すると学習が始まります。なおRX3ではCUDAを入れずにコンパイルが通りましたが、実行の際には examples/cifar10/cifar10_quick_solver.prototxtの中にあるsolver_modeをCPUに変える必要がありました。

# solver mode: CPU or GPU
solver_mode: CPU

学習時間

RX3で1時間以上、g2インスタンスで1分です。やはりGPUインスタンス早いですね。スポットインスタンスで起動からTerminateまで1時間も使ってないはずです。

学習結果

[1]と同様に元の動画に当てはめてみたのが下の画像です。ピンクがアリス、青がカレン、他が水色です(ゴチうさの判定器のチノ、ココア、リゼを他、アリス、カレンに当てはめただけです)。

f:id:showyou:20150524174057p:plain f:id:showyou:20150524174132p:plain f:id:showyou:20150524174152p:plain

大体顔と判定出来ているところでは、ほとんどアリスとカレンが正しく識別できています。画像突っ込んだだけで他に特徴抽出とかパラメータ設定などは一切行っていません。

明らかに失敗しているパターンも貼っつけておきます。 f:id:showyou:20150524174241p:plain

アリスなのにカレンと判定されています。

元のサイトの方でも書かれていますが、AnimeFaceの検出能力はかなり高いと感じるのですが、その検出能力に不満を感じるぐらい精度よくアリス・カレンの認識が出来ています。

参考サイト

[1]ご注文はDeep Learningですか? http://kivantium.hateblo.jp/entry/2015/02/20/214909

[2]Caffeのインストール http://kivantium.hateblo.jp/entry/2015/01/03/223607

[3]アニメ顔検出 https://github.com/nagadomi/lbpcascade_animeface

[4]cifar10 tutorial http://caffe.berkeleyvision.org/gathered/examples/cifar10.html

[5]Caffe on EC2 Ubuntu 14.04 Cuda 7 https://github.com/BVLC/caffe/wiki/Caffe-on-EC2-Ubuntu-14.04-Cuda-7

失敗談

MacでOpenCV2.4.9をbrewで入れたのですが、シンボリックリンク貼ってもimport cvが通りませんでした。なのでLinuxを使っています。

久々にOpenCV使ったので、動画の出力時に入力と同サイズじゃないとダメな件を忘れてました。正直Caffeのインストールより手こずってます。UbuntuベースであるMint使ってるせいか、Caffeのインストールはすんなり行きました。

またavidemuxから音声が抜き出せていません。