【初心者向け】MacでDockerを使ってTensorFlowの画像認識を試す

# 概要
前回TensorFlowの導入までやりましたが、
そこではHello Worldまでしかできず全く機械学習感がゼロだったので、もうちょっとやってみようと思います。
とはいえPythonは書けないし機械学習もわからないので、ここではサンプルのモデルを動かして機械学習を体感するというとこまでやりたいともいます。(自分でモデルを作ったりとかはしません)

# 環境構築
こちらを参考にすでにdockerでTensorFlowが使える状態にしておきます。
[【初心者向け】MacでDockerを使ってTensorFlowを試す(Jupyter Notebook)](http://qiita.com/hikarut/items/ce0ab9bcc6d2a7d7aa05)

# 画像認識を試すまで
### 1.サンプルのモデルファイルをダウンロード
ローカルのMacにTensorFlowのgithubからサンプルのモデルファイルをダウンロードします。
https://github.com/tensorflow/models
https://github.com/tensorflow/tensorflow/blob/f63ee319e0dd8bf9ec578e8d3d5c9890cde01841/tensorflow/g3doc/tutorials/image_recognition/index.md


* 作業フォルダの作成

```
$ mkdir tensorflow
$ cd tensorflow
```

* サンプルモデルのダウンロード

```
$ git clone https://github.com/tensorflow/models.git
```

* モデルファイルの確認

```
$ ls models/tutorials/image/imagenet
BUILD			classify_image.py
```


### 2.画像の用意
画像認識に使う画像を用意します。
今回は漫画の画像2つを使います。
![onepiece.jpg](https://qiita-image-store.s3.amazonaws.com/0/110485/a60c04fc-71d5-cf5c-4d47-c9112a3149cc.jpeg)![konan.jpg](https://qiita-image-store.s3.amazonaws.com/0/110485/0ea9c966-8b49-3627-354e-6021ec4cdb1d.jpeg)

* モデルファイルがあるディレクトリに移動

```
$ cd models/tutorials/image/imagenet
```

* 画像ファイルを置く

```
$ ls
BUILD			classify_image.py	konan.jpg		onepiece.jpg
```


### 3.dockerの起動

```
$ docker run --name image -it -p 8888:8888 gcr.io/tensorflow/tensorflow
```

### 4.Jupyter Notebookにアクセス
コンテナの起動に成功したらこちらにアクセスします。
http://localhost:8888/

### 5.モデルファイルと画像をJupyter Notebook上に配置
右上の「Upload」ボタンを押して先ほど画像をおいたパスにある画像とPythonファイルをアップロードします。
<img width="1206" alt="スクリーンショット 2017-01-21 15.58.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/4c0c5531-e3df-a616-9d23-9cf2c86d50d2.png">

<img width="1215" alt="スクリーンショット 2017-01-21 15.59.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/383bd521-7187-cdc3-1f89-736c94390175.png">


### 6.画像認識を試してみる
まずはターミナルを起動します。
<img width="1205" alt="スクリーンショット 2017-01-21 16.02.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/2fd6b5fc-6947-1117-ee4a-fc82adfe0d1c.png">

先ほどのモデルファイルに画像を指定して実行します。
<img width="1224" alt="スクリーンショット 2017-01-21 16.34.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/113d752c-a263-a691-4094-15f9b1279267.png">

ワンピースの画像を読み込ませた結果
![onepiece.jpg](https://qiita-image-store.s3.amazonaws.com/0/110485/a60c04fc-71d5-cf5c-4d47-c9112a3149cc.jpeg)

```
# python classify_image.py --image_file onepiece.jpg
W tensorflow/core/framework/op_def_util.cc:332] Op BatchNormWithGlobalNormalization is deprecated. It will cease to wo
rk in GraphDef version 9. Use tf.nn.batch_normalization().
comic book (score = 0.86219)
book jacket, dust cover, dust jacket, dust wrapper (score = 0.01314)
web site, website, internet site, site (score = 0.01159)
jigsaw puzzle (score = 0.00393)
slot, one-armed bandit (score = 0.00363)
```
86%でコミックブックと判定されました。だいたい合ってますね。

コナンの画像を読み込ませた結果
![konan.jpg](https://qiita-image-store.s3.amazonaws.com/0/110485/0ea9c966-8b49-3627-354e-6021ec4cdb1d.jpeg)

```
# python classify_image.py --image_file konan.jpg
W tensorflow/core/framework/op_def_util.cc:332] Op BatchNormWithGlobalNormalization is deprecated. It will cease to wo
rk in GraphDef version 9. Use tf.nn.batch_normalization().
comic book (score = 0.69279)
envelope (score = 0.03921)
book jacket, dust cover, dust jacket, dust wrapper (score = 0.03605)
tray (score = 0.02330)
web site, website, internet site, site (score = 0.01357)
```
こちらも69%でコミックブックと判定されました。

# 感想
実際に画像を読み込ませてみましたが、割と賢い感じに判定してくれそうでした。これは完全にサンプルのモデルを実行しただけなので、これにもうちょっとカスタマイズしたりできると実際に活用できそうな感じがしました。