Salesforceの画像認識AI「Einstein Vision」でアストロくんとアインシュタインを判別させてみた

# ストーリー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44105/5813f5bc-bb34-a091-5626-b91b7dbe6ae1.png)

2014年4月に誕生したアストロくん。2016年7月に誕生したアインシュタイン。
どちらもみんなから愛されるSalesforceの公式キャラクターですが、目の形や動きが似ているのでどっちがアストロなのかたまにわからなくなります。

そこで、アインシュタイン本人に、アストロくんとアインシュタインのどちらなのかを聞いてみました。
ちなみに、アストロくんは親しみを込めて「くん」付けしていますが性別はありません。

# Einstein とは？
Salesforceが提供している人工知能群。そのなかでも現在Salesforce Platformで提供されているものは、Einstein VisionとEinstein Languageの2つです。この2つをまとめて「Einstein Platform Services」と呼びます。

## Einstein Vision
Einstein Visionには2種類あります。

|名称                 |説明                             |
|:-------------------|:--------------------------------|
|Image Classification|画像全体をみてラベルにより仕分けをおこなう。|
|Object Detection    |画像内で複数の物体認識をおこなう。（執筆地点ではパイロット版）       |

今回はこのなかでも「Image Classification」の機能をつかってみることにします。
Einstein Visionは、面倒なプログラミングなしで誰でも機械学習の機能を使うことができるという思想で作られています。Einstein Visionを使うことで誰でもモデルを作成することができます。


# 準備物

- AstroとEinsteinの写真（計45枚以上）
- Herokuアカウント（無料版でOK）

# STEP.1 HerokuアカウントとTOKENの取得
## Herokuでアプリを作る
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44105/aeecffe0-e686-df18-bbcd-c9dc76b29525.png)

Heroku公式サイト http://heroku.com/
Herokuは、アプリケーションを実行するPaaS（Platform as a Service）です。Ruby on Railsをつかっているひとならおなじみですが、Einstein VisionはHerokuのAdd-onとして提供されているので簡単に使うことが出来ます。早速サインアップしてアプリをつくってみましょう。

## Resourceタブでアドオンを追加
無事にアプリを作れたら、設定画面の「Resource」タブで「Einstein」アドオンを追加します。検索ボックスに「Einstein」と入力すると確認画面が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44105/9c872ebb-6b56-8a19-0c2c-7cd3c3796f45.png)
Plan name は「Starter - Free」とし、「Provision」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44105/363f8d19-4f38-55f2-cbc3-907bd5c0fd2c.png)
無事アドオンが追加されました。

## SettingsタブでACCOUNT_IDとPRIVATE_KEYを取得
次に、設定画面の「Settings」タブを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44105/25f07e8b-2422-4d7d-179e-b25b22fbd4ba.png)
Config Variables項目で、「Reveal Config Vars」をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44105/1db9e9c0-03aa-b959-7a58-d10a734e90bb.png)
ここで表示される `ACCOUNT_ID`と`PRIVATE_KEY`はこのあとすぐ使うので控えておきましょう。

## Einstein VisionのTOKENを生成
[Generate an OAuth Token](https://api.einstein.ai/token)ページにアクセス。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44105/5b54a79c-e306-cae4-6cd6-2d49008ed300.png)

- Email or Account ID：`EINSTEIN_VISION_ACCOUNT_ID`の値をペースト
- Private Key：`EINSTEIN_VISION_PRIVATE_KEY`の値をペースト
- ファイルを選択:選択しない（何もしない）
- Expiration in Mins(このTOKENが無効になるまでの時間):`60`

入力を終えたら「GET_TOKEN」をクリックして、表示されたトークン（今後は`EINSTEIN_TOKEN`と表記） をコピーしておきます。

# STEP.2 モデルの作成
## zipファイルの準備
![スクリーンショット 2017-10-12 22.45.06.png](https://qiita-image-store.s3.amazonaws.com/0/44105/299142aa-caa8-fefb-c94d-9b54773b7a4e.png)
任意の名前のフォルダ内に、「Astro」「Einstein」というフォルダをそれぞれ作ります。このとき、フォルダ名がそのままラベル名になるので適当な名前ではなくラベルになりうる名前をつけてください。
準備ができたら、フォルダごとzip圧縮します。

## アップロード
ターミナルを開き、以下のコマンドを実行してzipファイルをアップロードします。

```ruby:Terminal
curl -X POST 
-H "Authorization: Bearer <TOKEN>" 
-H "Cache-Control: no-cache" 
-H "Content-Type: multipart/form-data" 
-F "type=image" 
-F "data=@<zipファイルまでのパスと名前>" 
https://api.einstein.ai/v2/vision/datasets/upload/sync
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44105/f666ae82-5574-bf20-2553-d65a8d2516b5.png)
黄色枠部分のID（`DATASET_ID`）が次に必要になるので控えておきましょう。

## 学習開始
nameの部分にこのモデルの名前を記載します。

```ruby:Terminal
curl -X POST 
-H "Authorization: Bearer <TOKEN>" 
-H "Cache-Control: no-cache" 
-H "Content-Type: multipart/form-data" 
-F "name=Astro and Einstein Model" 
-F "datasetId=<DATASET_ID>" https://api.einstein.ai/v2/vision/train
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44105/8c681d38-bdb7-4777-2de1-66495cc21264.png)

水色の枠にある`modelId`（モデルID）が今後必要になるので控えておきましょう。現在学習のプロセスは0%となっています。

## 確認

```ruby:Terminal
curl -X GET 
-H "Authorization: Bearer <TOKEN>" 
-H "Cache-Control: no-cache" 
https://api.einstein.ai/v2/vision/train/<モデルID>
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44105/89b186d5-f985-0e45-e9c4-8347e77ca882.png)
このとき、`process`項目が1(100%)になっていれば完了です。完了すると、`status`が`"SUCCEEDED"`となります。

# STEP.3 判別してみる

```ruby:Terminal
curl -X POST 
-H "Authorization: Bearer <TOKEN>" 
-H "Cache-Control: no-cache" 
-H "Content-Type: multipart/form-data" 
-F "sampleContent=@<画像ファイル名>" 
-F "modelId=<モデルID>" 
https://api.einstein.ai/v2/vision/predict
```

では、実際に以下の画像をつかって判別してみます。
![IMG_6917.JPG](https://qiita-image-store.s3.amazonaws.com/0/44105/25125242-22b7-bed3-b4c4-6a61174febaf.jpeg)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44105/7c095275-43cd-9095-32f2-b485fe7b853b.png)

Astroである確率が99.9%と表示されました。

このように、複雑なプログラミングなしでモデル作成から判別まですることができます。
次はこれをつかってアプリつくってみます。乞うご期待！