Colaboratoryで学習済み画像認識モデルを動かす

# 概要
ColaboratoryへGoogle Driveにアップロードしておいた画像を取り込み、Kerasの学習済みモデルを使用して画像に対して自動的にラベル付けを行います。

## 用意するもの
- Googleアカウント
- 適当な画像1枚以上

## 用意しなくて良いもの
- 訓練データ
- ローカルでのPythonの環境構築

# 1. Google Drive上に画像ファイルをアップロードしておく  
Google Driveにアクセスし、「新規」→「ファイルをアップロード」を選択してローカルにある画像ファイルをアップロードしてください。

# 2. アップロードした画像ファイルのファイルIDを取得する
ファイルIDとはGoogle Drive上のファイルを一意的に特定するための半角英数字33文字から構成される文字列です。  
Google Drive上のファイルのファイルIDを確認するにはGoogle Drive上でファイルを右クリック→「共有可能なリンクを取得」→リンクの共有をONにして表示されるURLのうち、"id="以降の文字列です。

```
https://drive.google.com/open?id=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                                  ↑この部分がファイルID
```

# 3. Colaboratoryを開く
Google Driveの「新規」→「その他」→「Colraboratory」の順で選択してください。Colaboratoryが表示されていない場合は「その他」の一番下の「アプリを追加」から「Colaboratory」を追加してください。

# 4. ColaboratoryでGoogle Driveからファイルをダウンロード
Colaboratoryを開くと枠(セル)が表示されているので、以下のコードを貼り付けて実行してください。  
セルの実行は

- 「ランタイム」→「全てのセルを実行」
- セルを選択している状態でShift+Enter
- セルの左側の三角をクリック

などで行えます。

```python

# Install the PyDrive wrapper & import libraries.
# This only needs to be done once per notebook.
!pip install -U -q PyDrive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials

# Authenticate and create the PyDrive client.
# This only needs to be done once per notebook.
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

# Download a file based on its file ID.
#
# A file ID looks like: laggVyWshwcyP6kEI-y_W3P8D26sz
file_id = 'REPLACE_WITH_YOUR_FILE_ID' # ←ここをダウンロードするファイルIDで置き換える
downloaded = drive.CreateFile({'id': file_id})
downloaded.GetContentFile("img")
```

※上記のコードはColaboratoryの「ヘルプ」→「検索コード スニペット...」→「Downloading files or importing data from Google Drive」から挿入できるコード スニペットを基にしていますが、最後の1行を差し替えています

```python
# 画像ファイルではGetContentString()を実行するとエラーになるため以下の行を削除
print('Downloaded content "{}"'.format(downloaded.GetContentString()))

# ダウンロードしたファイルをColaboratoryのローカルにimgという名前で保存するため追加
downloaded.GetContentFile("img")
```

# 5. ColaboratoryにGoogle Drive上のファイルの使用を許可する
上記のコードを実行するとリンクとテキストボックスが表示されます。ログインしているGoogleアカウントを選択し、許可する項目に問題がなければOKを押下してください。その後表示される認可コードをColaboratoryのテキストボックスに貼り付けてEnterを押せばColaboratoryでGoogle Driveから画像ファイルをダウンロードされ、Colaboratoryのローカルにimgという名前のファイルで保存されます。

# 6. Kerasのモデルでダウンロードしたファイルのラベル付けを行う
Colaboratoryの別のセルに以下のコードを貼り付けて同様に実行してください。  
セルの追加は

- 画面左上の「コード」を選択
- セルの下端にカーソルを合わせると表示される「コード」を選択
- Shift+Enterでセルを実行すると最後のセルの下に空白のセルが追加される

などで行えます。

``` python
from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np

model = ResNet50(weights='imagenet')

img_path = 'img'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

preds = model.predict(x)
# decode the results into a list of tuples (class, description, probability)
# (one such list for each sample in the batch)
print('Predicted:', decode_predictions(preds, top=3)[0])
# Predicted: [(u'n02504013', u'Indian_elephant', 0.82658225), (u'n01871265', u'tusker', 0.1122357), (u'n02504458', u'African_elephant', 0.061040461)]
```
※上記のコードは[Kerasの公式ドキュメント](https://keras.io/ja/applications/)のサンプルコードを基にしています。

上記のコードを実行するとセルの下に結果が表示されます。  
例えば以下の画像を読み込ませると次のような結果が表示されます。
![2018-11-03 15.15.36.jpeg](https://qiita-image-store.s3.amazonaws.com/0/183854/c6c7e0a4-9766-a00f-b11a-a06831100fb4.jpeg)


```
('Predicted:', [(u'n02123045', u'tabby', 0.8190689), (u'n02123159', u'tiger_cat', 0.06618744), (u'n02124075', u'Egyptian_cat', 0.06509007)])
```

結果は3つのtuple要素を持つlist型で出力され、このtuple要素の2番目の要素がモデルが予想した画像のラベル名、3番目の要素がその確率であり、ラベルごとに確率の高い上位3つが出力されます。上記の結果ではtabby(ぶち猫)が81.90689%ともっとも高い確率になっており、モデルがこの画像はぶち猫の画像であると予想したことがわかります。

# 7. その他
Colaboratoryでは!を先頭につけることでLinuxコマンドを実行できます。

例えば

```
!ls
```
を実行するとimgが表示され、ダウンロードしたファイルが保存されていることがわかります。