はてなブログのフォトコンで人工知能を使ってはてなTシャツをゲットするためGUIのディープラーニングツール「CSLAIER」を使ってみた

f:id:karaage:20170418103620p:plain:w640

2017/07/01 chainerのダウングレードに関して追記

はてなTシャツを手に入れるために人工知能を使ってみることを考えました

 はてなブログのフォトコンテスト、毎年挑戦しているのですが、1回落選、2回入賞という成績です。今年こそTシャツ絶対ゲットするという堅い思いを持っています。フォトコンで勝つためにはどうすれば良いか。いつも悩むのが、どの写真をフォトコンに出すかです。過去も他の写真を出していれば受賞できていたのでは?と思うことも多々有ります(勘違いかもですが)。

 でも、どれがフォトコンで受賞できる写真かなんて分かるわけがありません…うーん、写真をみるだけで魔法のように判別してくれる便利なものがあれば…まてよ、人類にはディープラーニングがあるじゃないか!これを使えば何でもできるはず!きっとフォトコンの受賞写真を判別するなんてお茶の子さいさいのはず!

 というわけで、はてなブログのフォトコンではてなTシャツをゲットできるか判別する人工知能を自作してみることにしました。ちなみに、ここからしばらく宇宙語が続くので、よくわからない人は、最後のまとめだけ見るか、ここで離脱した方がベターです。ちなみに最初に言っておくとタイトルの通り全然うまくいきませんでした。

GUIのディープラーニングツールCSLAIERの概要とセットアップ

CSLAIERとは?

 今回は、ディープラーニングの学習と判別にCSLAIERというSONYとUEIが開発したディープラーニングのGUIツールを使います。これを使うとGUIで直感的にディープラーニングを使えるので非常に良いです。詳しくは、開発者の一人の id:shi3z さんの以下の著書を読むのが一番よいと思います。

 ツール自体は、GitHubでMITライセンスで公開されていて、誰でも商用にも個人用にも使用できるようになっています。素晴らしいですね。ディープラーニングのフレームワークは、国産のChainerというフレームワークが使用されています。

 Chainerでの画像認識などは、以前やったりしています。興味ある方は以下参照ください

 学習に関しては、なかなか手軽にやる方法がなく二の足の踏んでいたのですが、CSLAIERを使うと非常に簡単に学習から判別まで実施することが可能になります。

CSLAIERセットアップ

 公式は、以下GitHubのREAMEに書いてあります。

 基本的には公式に従えばよいのですが、参考までに自分がMacでpyenvを使って設定した例を記載しておきます。以下は基本自分のメモなのでうまくいかない場合は公式を参考にしましょう。

 まず、以下記事を参照に、pyenv-virtualenvインストールのところまで実施します。

 そのあとはCSLAIER用の仮想環境を構築して、仮想環境に入ります。

$ pyenv global anaconda-2.4.0
$ conda create -n cslaier opencv hdf5 scipy matplotlib
$ pyenv global anaconda-2.4.0/envs/cslaier

 あとは、仮想環境で必要なパッケージをREADMEの通りインストールします。

$ git clone https://github.com/SonyCSL/CSLAIER
$ cd CSLAIER
$ ./setup.sh
$ pip install -r requirements.txt

 追記、2017年7月現在、chainerのメジャーバージョンアップにより動作しなくなっているようです。以下でchainerのダウングレードをして下さい。

$ pip uninstall chainer
$ pip install chainer==1.8.1

 これでセットアップ完了したので、以下でCSLAIERを起動します。

$ ./run.sh

 以下のように表示されたらOKです

[INFO] Starting CSLAIER server on localhost:8080

 Safariなどのブラウザのアドレス欄にlocalhost:8080を入力します。以下のような画面がでればセットアップは完了です。 f:id:karaage:20170327140556p:plain:w640

CSLAIERで学習から判別までテスト

 CSLAIERでの学習から判別までの流れは以下の通りです。これは、他のディープラーニングのフレームワークでも同様の流れですね。

  • データセット準備
  • 学習
  • 判別テスト

データセット準備

 まずはテスト的に、代表的な判別用のデータセットをダウンロードします。具体的には、以下のCaltech101というやつを落とします。

Caltech101

 上記サイトからポチポチクリックしてダウンロードして圧縮すればよいのですが、説明が面倒くさいので以下Macのターミナルのコマンドで説明します。コマンドよくわからない人は、上記サイトからダウンロードしたファイルをとにかくzipで固めればよいです。頑張ってみてください。

 以下コマンドでデータセットダウンロードして解凍します。

$ wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
$ tar xvzf 101_ObjectCategories.tar.gz

 ファイルの中身は以下のように、フォルダ名がクラス。中に画像ファイルがずらずら入っているようになっていればOK f:id:karaage:20170417160954p:plain:w640

 中身は問題なさそうなので、以下コマンドで圧縮します。

$ zip -r 101_ObjectCategories.zip 101_ObjectCategories

 これで学習データの準備は完了です。

学習

 次にデータセットを用いて、ニューラルネットの学習を行います。

 以下画面で、まずはDatasetの右の+Newを選択 f:id:karaage:20170327140556p:plain:w640

 Imagesを選択。Dataset Nameに好きな名前(今回は101_ObjectCategories)を入力して、先ほどzipで固めたデータを選択します f:id:karaage:20170417160556p:plain

 データをアップロードします f:id:karaage:20170417160553p:plain

 アップロード完了したら、次は以下画面で、Modelsの右の+Newを選択します f:id:karaage:20170327140556p:plain:w640

 ネットワークを選択。今回は取り敢えずnin.pyというシンプル(らしい)ネットワークを使用。Frameworkはchainer、Training TypeはImage Classificationを選択して、中央下のCreateをクリックします f:id:karaage:20170417160601p:plain:w640

 次にStart Trainをクリックすると学習の設定画面になります。Select Datasetは、先ほど入力した101_ObjectCategoriesPretrained ModelNewEpoch(世代数)を20くらいにします。その下の画像処理の設定は、とりあえずデフォルトでStartをクリックします f:id:karaage:20170417160616p:plain:w640

 学習が始まる f:id:karaage:20170417160622p:plain:w640

 しばらくほっといた後、ブラウザを更新すると学習が進んで行く f:id:karaage:20170417160605p:plain:w640

 Mac Book Proで10時間くらいかかるとか言ってる…GPU使わないからこんなもんかな f:id:karaage:20170417165029p:plain:w640

判別テスト

 次は判別です。ある程度学習進むか、学習完了したら左下のInspectをクリック f:id:karaage:20170417165029p:plain:w640

 ファイルを選択をクリックして、ダイアログから判別したい画像を選択。 f:id:karaage:20170417165617p:plain:w640

 学習した結果が表示されます f:id:karaage:20170418103404p:plain:w640

 2epochの学習でも、ちゃんと飛行機と判別してくれています。素晴らしいですね。

自分の学習データで学習させて判別

 まずは、データセットを準備しましょう。はてなブログの過去の記事から、Tシャツを獲得した画像と入選した画像、落選した画像をダウンロードしてそれぞれhatenaphotoというフォルダの直下にTshirt Accept NG というフォルダに分けて入れます。

f:id:karaage:20170417173450p:plain:w640
 こんな感じね

 分け終わったらhatenaphotoフォルダをまるごとzipファイルに圧縮します。あとはCaltech101のときと同様に、CSLAIERのモデルを作成します。

f:id:karaage:20170417173756p:plain:w640
 アップロードした後

f:id:karaage:20170417173809p:plain:w640
 こんな感じにちゃんと分類されて登録されていればOK

 この後の学習から判別までの流れはCaltech101のときと全く同じです。 f:id:karaage:20170418103104p:plain:w640

 ただ、Caltech101のときと違って4種類のグラフがちゃんと出て来ない。嫌な予感がします。はてなTシャツ過去ゲットした写真で判別 f:id:karaage:20170418103620p:plain:w640
 オー!正しく判定されていない!!

 別の写真で試すと f:id:karaage:20170418103727p:plain:w640
 これまたダメ!Why Deep Learning People!?

 他の画像も試してみましたが、ほとんど正しく判別することはできませんでした(全部ほぼ同じ結果が出てしまう)。

 一応ニューラルネットワークの層の中身とかも、以下のように見れるのですが。 f:id:karaage:20170418104620p:plain:w640
 うん、わからん!!

 データが足りないのかなと「はてなTシャツ+入選」と「それ以外」の2グループに分けて学習したりしてみたのですが、accuracyが全然上がらない… f:id:karaage:20170418113551p:plain

 2グループで0.5なのでチンパンジーが適当に選ぶのと変わらない程度の知能しかないことになってしまいます。

まとめ

 人工知能を使ってはてなTシャツをゲットしようとしたのですが、自分の力ではチンパンジー以下の人工知能しか生み出すことはできませんでした。ディープラーニングって基本ブラックボックスなので、うまくいったときは良いのですがうまくいかないときって原因を調べるのが辛いですね。結局ネットワークを試行錯誤で変えてみたり、データ量をガンガン増やすくらいしかやれることがない気がしています。

 わからないなりに原因を推察するに、写真にあまりに共通点がなくて人工知能で判別するような特徴量をうまく抽出することができなかったんじゃないかな?と勝手に思っています。

 しかし、今回はうまくいかなかったとはいえ、こうやって手軽にディープラーニングという最先端技術が素人にも簡単に試せるようになったのはなかなか凄いことですね。ただ、このままブラックボックス的に黒魔術としてディープラーニングを使い続けるのは、致命的な間違いしていても気づかなかったりする可能性が高かったり、ツールの使い方の用語が分からなかったり、ツール無しでは何もできなくなってしまうのが自分としては嫌な感じなので、以下のようなフルスクラッチでディープラーニングを実装できるような本を読んで、理論の方を補完していきたいなと思っています。

 この本は時間かけて読む価値のある名著!(と思う)

 というわけで、今回の実験から得た自分なりの結論は「はてなブログのフォトコンの企画は人工知能には置き換えられない!」でした。本当かな?我こそはという方は、フォトコン必勝人工知能を生成して私にそっと提供して下さい!!

関連記事