男のための機械学習〜RBMでA◯女優さんの共通特徴量を得よう〜

いま、巷で話題(3年くらい前からだいぶ話題だけど)のDeep learningをア◯でも使えるpylearn2を使って見る。

Deep learningとは?

一言で言うと「教師なしのニューラルネットをいっぱいつなげて多層ネットワーク化したもの。」

いままでは

前処理職人の丹精を込めた特徴量作り → 分類器(SVMとか、ロジスティック回帰とか、なんでもいいので関数)の学習

だったのが、

黒魔術で特徴量作り → 分類器(SVMとか、ロジスティック回帰とか、なんでもいいので関数)の学習

にできる。

黒魔術をもうちょっと紐解く

「黒魔術」って言ってるところでやっていることは「ベストな写像関数の学習」

もう少し、言葉を厳密に表現すると、「入力/ノイズ付き出力の変換をうまく表現できる関数の学習」

この関数はできるだけ良い[1]条件で別の空間に写像する。

なので、この関数が学習できると、特徴量空間に射影する関数を学習できたことになる。

[1] 「何が、どういいのか?」はやはり黒魔術である

え、そんなのわかんねえし、という人向け

「そんなのわかんねえよksが」っていう人は「画像をいっぱい入力したら、似たところを自動でとってきてくれる便利なツール」って認識しておけばいいんじゃないっすかね(鼻くそほじほじ)

お手軽Deep learningをやってみよう

口でいうのは簡単だが、それをコードを落とすとなると難しい。

しかし、No problemだ。どっかモントリオール大学の優秀な学生達が、Deep learning用汎化ライブラリ(Theano)を作成してくれた。

しかし、これでもやや敷居が高い。無能な私にはチュートリアルで終わるのが精一杯だった。

という状況の中、さらに便利なツールが登場した!それがPylearn2である。

Theanoのラッパーとして、アホでも使える程度の簡単さにしてくれた。まだ、開発版ではあるが、十分に遊べるレベルになっている。

今回は、Pylearn2のテスト使用ということで、ちょっと遊んでみた。

顔の特徴量抽出をしてみよう

Deep Learningは元々は画像認識分野から出てきた(Hintonという偉いおっさんが初めて使った)。

その時は、画像認識(画像を入力して、写っている物の名前を当てるタスク)で使われていた。

そこで、脅威の性能を出してしまったばかりに、例によってGoogleが興味をもって、ここにGoogleネコが誕生した

この時のGoogleのアイディアは「いっぱいネコ画像を入力に与えたら、ネコの顔だけ抽出してくれる関数を学習してくれんだろ。バーロ」みたいな感じだった。

ここに歪んだ欲望と男のロマンをちょっとだけ加えると次のようになる。

「いっぱい好みの女優さんの顔画像を与えたら、自分の好みの顔を学習してくれんだろ。バーロ」

と、いうことでやってみた。きっとHintonも喜んでくれるだろう。

pylearn2で顔パーツを学習してみよう

ごくごく簡単にpylearn2を使うまでの手順を書くと、こうなる

  • (前提) python, git, pipを使える状態。numpyとscipyがインストールされている。
  • 1 theanoをインストールする
  • 2 pylearn2をインストールする。(とはいってもgit cloneをする)

python, git, pip, numpy, scipyの使用準備の説明は今回、省く。

theanoのインストール

pip install theano

でおしまいなはず(設定がうまくいっていれば)

pylearn2のインストール

インストールと準備の段階では以下のサイトも参考になる

必要なライブラリ

  • PIL
  • PyYAML
  • IPython
  • Cython

全部、pip installコマンドで楽勝である。

ただし、PILはpip install PILではダメでpip install pillowと打たないとダメらしい。参考

pylearn2のインストール

次の2つのコマンドを実行すれば、うまくいく(はず)

  • git clone git://github.com/lisa-lab/pylearn2.git

  • python setup.py develop

pylearn2のテスト

pylearn2の使い方は、簡単にまとめると、

  • データセットを用意する(.plkなり、.csvなり)
  • 訓練データのパスと訓練方法のレシピを記述する(*.yamlファイルに記述)
  • train レシピ書いたyamlファイルを実行

このサイトの下の方に、CIFAR10とMNISTという画像データセットでのサンプル実行例がある。

pylearn2で、女優さんの顔から特徴量を抽出してみよう

画像の学習のために、pylearn2を更に簡単に使えるコードが用意されてる。ここ

このコードがあれば、画像から色情報csvファイルへの変換、レシピyamlを使った学習までとっても簡単。

やってみること

  • DMM女優名鑑から好み(主観)の女優さんの画像を集めてくる。
  • 女優さんの画像を入力にして、Deep learningでモデルを構築してみる。
  • 共通する特徴量を抽出する

顔画像の収集

入力画像はDMM女優名鑑から集めてくる。顔画像は155*155で保存されているので、好都合。

wgetコマンドで簡単に画像を落とせる。

URLの構成規則はhttp://pics.dmm.co.jp/mono/actjpgs/姓_名.jpgになっているのと、割りと簡単。

マシンは型落ちMacBookなので、学習量を少なくするため、10枚ぐらいに

集めてきた顔画像はこんな感じ。(あくまで私の好みです) スクリーンショット 2014-11-04 4.35.30.png

画像のグレースケール化とcsvへの変換

画像のグレースケール変換は、PILライブラリを使って簡単にできる。

こんなコードを書いた。

#! /usr/bin/python

from PIL import Image
from PIL import ImageOps
import os
import sys

if __name__ == "__main__":
    if len(sys.argv)==3:
        input_path = sys.argv[1]
        output_path = sys.argv[2]
    else:
        sys.exit("Need 2 args. Input ans Output path")

    input_image = Image.open(input_path)
    output_image = ImageOps.grayscale(input_image)
    output_image.save(output_path)

色情報csvファイルへの変換はここスクリプトを使う。

python img2csv.py グレースケール変換した.jpgのリスト train.csv

を実行する。

クラスの用意とパス設定

クラスファイルをpylearn2で呼び出せるようにしておく。

ここからクラスが記述されたファイルを落としてきて、pylearn2/datasets/に配置する

環境変数

export PYLEARN2_DATA_PATH=train.csvとgrbm.yamlが置いてあるパス

export PYLEARN2_VIEWER_COMMAND="opne -Wn"[2]

[2]はmac専用のコマンド。windowsの場合は・・・・知らね

モデルの学習

今回はグレースケール化して、サイズも同だし、いろいろ考えるのも面倒なので、「制約付きボルツマンマシン(RBM)」で片付ける。(コード中のアルゴリズムではgrbm)

カラー化していれば、grbm_smd、サイズが違えばmultimodalを使った方がいいだろう(って、公式マニュアルに書いてあったお。)

実行するコマンドは、grbm.yamlが置いてある場所で、

train.py grbm.yaml

を実行するだけ。

逐次学習をしている様子がコマンドラインに流れていくはず。

イテレーションはこんな画面 スクリーンショット 2014-11-04 4.29.53.png

学習結果の確認

学習した関数の出力を画像で表示するには

show_weights.py grbm.pkl

を実行する。

結果はこんな感じだった

tmp_aP8j6.jpg

夜に見たら、おしっこちびりそう・・・・

椎名りくが強すぎワロタ

いくつかの特徴量では、うまく人間共通の顔パーツを学習できている様子。

あくまで考察だけど、椎名りくの画像だけ他と違って、セーラー服で、ラインが入っていたため、外れ値が多かったのでは・・・とかそんなことを思いました。

ちなみに私はブレザー派です

まとめ

Deep learningって楽しいね!