TokyoTechFes2015の使い方

# はじめに
[TokyoTechFes2015](https://github.com/Arudori5001/TokyoTechFes2015)の使用方法の説明をします。
デモの実践やスクリプトの改良参考になれば幸いです。

# 環境
* Mac OS 10.11.6 (El Capitan)
* Python 2.7.10

# 何をするスクリプトなのか
機械学習で顔画像カテゴリ判別を行います。
`dataset`フォルダ以下を変更して学習することで、任意の顔画像カテゴリ判別ができるようにしてあります。

# 導入
まずgitからcloneしておきます。

```sh
git clone https://github.com/Arudori5001/TokyoTechFes2015.git
cd TokyoTechFes2015
```

* ImageMagick
PCのカメラで写真を撮るアプリケーションです。
http://cactuslab.com/imagemagick/ (Mac)で入手できます。

* OpenCV
http://qiita.com/zabeth129/items/f065f79b1322a82edb1d
などを参考にしてインストールをしてみて下さい。

* pythonの依存ライブラリ
全てpipで入手できます。chainerのバージョンがかなり古いことに注意してください。

```sh
pip install cv2==1.0
pip install pillow==2.9.7
pip install chainer==1.3.2
pip install matplotlib==1.4.3
```

次に`dataset.zip`の解凍を行っておけば準備は完了です。

```shell-session
unzip dataset.zip
```

解凍してできる`dataset`フォルダのディレクトリ構成は以下のようになっています（フォルダのみ表示）。

```shell-session
$ tree dataset -d
dataset
├── Baysters
├── Buffealoes
├── Carp
├── Dragons
├── Eagles
├── Fighters
├── Giants
├── Hawks
├── Lions
├── Marines
├── Swallows
└── Tigers
```

野球12球団の名前が並んでいると思います。各フォルダの中には、それぞれの球団の選手の顔画像が入っています。
デフォルトのまま予測を行うと、「与えられた画像の中にある顔は、12球団のどのチームの選手の顔に近いか」を予測するようになっています。
何を予測するかは、`dataset`フォルダ以下を変更すれば変えることができるようになっています(後述)。

# 予測
1.まずImageMagickで顔写真を撮り、できた画像を適当なパスへ移動します。
2.以下のコマンドを入力します。

```
python bbteam_pred.py （予測したい画像のパス）
```

3.撮った画像が画面に現れます。顔認識できれば顔の周りに枠が表示されます。できなかった場合は、`cannot detect!`と表示されてスクリプトは終了します。
4.顔認識できた場合、表示された枠の画像を左上の×ボタンで閉じると、画面が2つ新たに現れます。一方は撮った画像の顔の上に「You belong to (カテゴリ)!」という文字列が書かれている画像、もう１つは棒グラフの画像が現れます。これら前者はどのカテゴリに予測されたのかを、後者は各カテゴリの確信度（事後確率）を出力しています。

## 例

ここでは例として、`sample`フォルダに既に入っている`eagles_koyama.jpg`という画像が手順1.で撮影した画像だと仮定し、予測したいとします。
![eagles_koyama.jpg](https://qiita-image-store.s3.amazonaws.com/0/77520/1cef8126-a4a2-8d1c-535d-43a075928862.jpeg)
ちなみにこの人はファイル名の通り楽天イーグルスの小山です。

2.以下のコマンドを入力します。

```
python bbteam_pred.py sample/eagles_koyama.jpg
```

3.撮った画像が画面に現れます。顔の周りに枠が付いています。
![detected.jpg](https://qiita-image-store.s3.amazonaws.com/0/77520/cc06a11a-6ff9-1330-a22a-665fc11165b6.jpeg)

4.表示された枠の画像を左上の×ボタンで閉じると、画面が2つ新たに現れます（一方が他方のウィンドウに隠れていることがあります）。
![msg.jpg](https://qiita-image-store.s3.amazonaws.com/0/77520/6b83bf8e-bbe4-c15e-a3d6-2296cc7e822d.jpeg)
![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/77520/5edebee7-8f81-4f72-75d8-97cfaaef89c6.png)

上の画像から、小山が正しくイーグルスの選手の顔に近いと予測されていて、確信度が95%であると分かります。
下の画像にはイーグルス以外のチームに対する確信度も表示されています。イーグルスが95%である以外に、カープが5%程度の確信度であるようです。

ちなみに同様の出力がコンソールにもされるようになっています。

```
predicted categoriy : Eagles
certainty factor of predicted categoriy : 0.954637289047
certainty factors of each categories : 
Baysters :
	 0.00%
Buffealoes :
	 0.00%
Carp :
	 4.51%
Dragons :
	 0.00%
Eagles :
	95.46%
Fighters :
	 0.00%
Giants :
	 0.00%
Hawks :
	 0.02%
Lions :
	 0.00%
Marines :
	 0.00%
Swallows :
	 0.00%
Tigers :
	 0.00%
```


# 学習
## データセットの変更
何を予測するかを変更したい等といった場合は、データセットを変更した上で、学習を行う必要があります。
データセットは`dataset`フォルダ内にある決められたディレクトリ構成のファイルを学習・テストに用いるようになっています。
デフォルトの場合、先述したように、以下のようなディレクトリ構成になっています。

```shell-session
$ tree dataset -d
dataset
├── Baysters
├── Buffealoes
├── Carp
├── Dragons
├── Eagles
├── Fighters
├── Giants
├── Hawks
├── Lions
├── Marines
├── Swallows
└── Tigers
```

`dataset`フォルダ直下の各ディレクトリの名前(`Baysters`, `Buffealoes`, ...)はカテゴリ名を表しています。デフォルトの場合は、`Baysters`ならベイスターズが1つのカテゴリになっています。

`Baysters`等のフォルダ直下には画像が並んでいます。

```
$ tree dataset/Baysters 
dataset/Baysters
├── 1000003_ss.jpg
├── 1000007_ss.jpg
├── 1000117_ss.jpg
├── 1000118_ss.jpg
├── 1000119_ss.jpg
...
```
これらの画像は、それぞれのカテゴリに属する顔画像です。
`Baysters`にはベイスターズの選手の顔画像が並んでいます。以上のことを参考にディレクトリ構成を変更して下さい。

例えば男か女かを判定したい場合は以下のようにします。`Female`には女性の顔画像を、`Male`には男性の顔画像を保存します。

```shell-session
$ tree dataset -d
dataset
├── Female
└── Male
```

## 学習スクリプトの実行
以下のコマンドで学習が行われます。

```shell-session
python Learning.py （学習に使うデータ数） (テストに使うデータ数)
```

デフォルトの場合、データセットの画像は680枚あります。学習用に520枚、テスト用に120枚使用したい時は、以下のようにします。

```shell-session
python Learning.py 520 130
```