Ry0 / snsd_classify

Caffeを用いた少女時代のメンバー識別プログラムと学習用設定ファイル

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Caffeを使って少女時代の顔を識別するためのプログラム

詳しい説明はブログにも書いているので参考にしてみてください.

ここからは簡単にこのリポジトリの概要のみ説明します.

  • Cifar10の学習モデルをベースにして少女時代のメンバーを学習行った.
  • このプログラムはcaffe/examples/上にcloneしてください.
cd caffe/examples/
git clone https://github.com/Ry0/snsd_classify.git
  • 学習器の設定はこのレポジトリにあるsnsd_cifar10_full.prototxt、Caffeモデルはsnsd_cifar10_full_150717_iter_60000.caffemodelを指定
  • 平均画像ファイルはsnsd_mean.binaryproto
  • データセットは肖像権の関係で公開できませんが,すでに学習済みのモデルはこのレポジトリにおいています.
  • したがって下のメンバー識別プログラムはデータセットを自分で用意しなくても実行できます.

少女時代の顔を学習

少女時代の顔を切り出すプログラムによって大量のデータセットを作ってください. このプログラムはここにあります.
https://github.com/Ry0/facedetection
ここの「LevelDBデータセットの準備」の項を参照して,LevelDBを作成します. ファイルはレポジトリ内のsnsd_dataに以下のようなフォルダ内容で作成.
snsd_databuild_leveldb.pyの45行目は自分のcaffeをおいているディレクトリを指定してください.

メンバー名 フォルダ名
etc 0
ヒョヨン 1
ジェシカ 2
ソヒョン 3
スヨン 4
ソニ 5
テヨン 6
ティパニ 7
ユナ 8
ユリ 9
cd snsd_data
python build_leveldb.py

snsd_cifar10_test_leveldbsnsd_cifar10_train_leveldbsnsd_classifyのディレクリにできていることを確認した後,以下のコマンドを実行. ただし実行する前に環境に応じてsnsd_cifar10_full_solver.prototxtの最後の行をCPUかGPUを変更してください.

./train_full.sh

snsd_classify.py

  • 顔を切り取った写真を前提
  • 一番もっともらしいメンバーの名前を表示
  • その他のメンバーの確率も表示

実行方法

cd python
python snsd_classify.py src.jpg

snsd_facedetection.py

  • OpenCVで入力画像から顔検出
  • そのあと切り出した画像から、分類器にかける
  • 1番確率の高かったメンバー名を画像に書きこむ
  • 2番目,3番目の候補も下に表示

実行方法

cd python
python snsd_facedetection.py src.jpg output.jpg

または

cd python
python snsd_facedetection.py src.jpg

出力先を指定しない場合は保存した時間を名前にして勝手にsuccess_imgというディレクトリにぶち込まれます.

実行すると「Show Image」と書かれたウィンドウが出現し,結果が可視化される.
この結果を保存したかったらウィンドウ上でsキーを押す.保存したくなかったらs以外のキーを押すとプログラムが終了.

実行結果

この結果は**データの水増し,Dropoutあり(後述)**の手法で学習させた結果です.

yoona_sooyoung.jpg

Dropoutをいれた

Cifar10のモデルをそのまま使ったら,過学習が起きたので,これを軽減させるために,データをランダムにクロップして学習につかったり,画像を左右反転させたり,データの水増しをした. あとDropoutと呼ばれるブロックを追加した. このモデルはdropoutブランチにそれ用の.prototxtがあります.

ノーマル

  • バリバリ過学習が起きてる.
  • テストデータに関する精度も77%程度

overtraining.png

データの水増し,Dropoutあり

  • 過学習が抑えられている!!
  • テストデータに関する精度も82%とノーマルのときよりも精度向上\(^o^)/

dropout.png

IPython Notebook

これらの結果をIPython Notebookを使って出力してみました. 中間層が見れたりします.

https://github.com/Ry0/snsd_classify/blob/dropout/ipynb/snsd.ipynb

About

Caffeを用いた少女時代のメンバー識別プログラムと学習用設定ファイル


Languages

Language:Jupyter Notebook 98.2%Language:Python 1.3%Language:Shell 0.3%Language:Gnuplot 0.1%