ABEJA Platformで料理に合う酒類をオススメするAIをつくってみた

こんにちは。ぎょりです。
これは、[ABEJA Platform AdventCalendar 2018](https://qiita.com/advent-calendar/2018/abejaplatform) 、9日目の記事です。

今回はABEJA Platformを使って、ぎょりが思う料理に合う飲み物をオススメするAIをつくってみた (TBD) の回です。
※内容は出来上がり次第順次更新されます。

#### 流れ
1. 今回使うための料理の画像データを集める
2. 教師データをつくる
3. データセットを作成する
4. 学習学習
5. 推論APIを生成する
6. 画像を投げるとぎょりがおすすめする飲み物情報が得られる!!

##### 1. 今回使うための料理の画像データを集める
今回はicrawlerを使って料理画像を集めました。
参考にした記事 : [pythonライブラリicrawlerを使い簡単に画像データを集める](https://qiita.com/NakaokaRei/items/8c7e7b1f2c0c7ef8b3a3)

```icrawler.py
from icrawler.builtin import GoogleImageCrawler

keyword = 'ippin ryori'
crawler = GoogleImageCrawler(storage={"root_dir": keyword})
crawler.crawl(keyword=keyword, max_num=5000)
```

##### 2. 教師データをつくる
ABEJA Platformには教師データを作るための[AnnotationツールとAnnotation委託サービス](https://abejainc.com/platform/ja/feature/annotation/lp/03)があります。今回は私の趣味嗜好を反映するため、ツールだけを使って自分で教師データを作りました。

ただひたすらに、一品料理の画像に対して、私だったらこれを選ぶな...という酒類を選択していきます。ぽちぽち...つらい...マニュアル化して誰かに渡したいけど渡せない...がんばる。

ざっと200枚ぐらい。少ない、だが仕方ない。

##### 3. データセットを作成する
作った教師データのjsonデータをABEJA Platformにデータセットとして登録します。
今回は[こちらのgithubのコード](https://github.com/peisuke/dataset_importer)を参考にして登録しました。

50行目の ['Kind'] -> ['recommend'] に変更。
※recommend = 私のアノテーションのカテゴリName

``` classification.py 
for d in data:
        channel_id = d['task']['metadata'][0]['channel_id']
        label = d['information']['recommend']
        label_id = label_to_id[d['information']['recommend']]
        filename = d['task']['metadata'][0]['information']['filename']
        file_id = d['task']['metadata'][0]['source'] 
```

labels.jsonの設定は以下の通り

```labels.json
[
  {
    "label_id": 0,
    "label": "ビール"
  },
  {
    "label_id": 1,
    "label": "ハイボール"
  },
  {
    "label_id": 2,
    "label": "日本酒"
  },
  {
    "label_id": 3,
    "label": "赤ワイン"
  },
  {
    "label_id": 4,
    "label": "白ワイン"
  },
  {
    "label_id": 5,
    "label": "モヒート"
  },
  {
    "label_id": 6,
    "label": "芋焼酎"
  }
]
```

ちなみにちょっと間違えちゃってDatasetを削除したくなっちゃったときは以下のCLIをぶん投げれば削除できます。

```
$ abeja dataset delete-dataset --dataset_id [dataset_id]
```

##### 4. 学習学習
[ドキュメント](https://developers.abeja.io/getting-started-guide/training-model/training-and-model/)を参考に、ABEJA Platform上でジョブを定義、学習を開始します。今回はclassificationなのでサンプルのコードをほぼそのまま使いました。

![createtrainingjob.png](https://qiita-image-store.s3.amazonaws.com/0/46136/79114d63-b8c0-d034-96f2-2254b44f71ab.png)

変更点 : 23行目のclass数を変更

```train.py
batch_size = 32
num_classes = 7
epochs = int(os.environ.get('NUM_EPOCHS', 100)) 
```

たたかいの軌跡。
エラーになってもABEJA PlatformではGUI上で簡単にログを確認することができます。ログを確認してエラーを修正して、を繰り返して4回目に成功しました!!

![たたかい.png](https://qiita-image-store.s3.amazonaws.com/0/46136/309c15cd-1365-e214-3f2f-a6c585a7762f.png)

2/4のエラーではzip化がうまくできていないことが理由でした。zip化する対象のファイルのあるディレクトリにいる状況化で以下でzip化をすると解決。

```
$ zip -r archive.zip *
```


##### 5. 推論APIを生成する
ABEJA Platform上で推論用のAPIを生成します。ここは、[こちらのドキュメント](https://developers.abeja.io/getting-started-guide/training-model/deploy/)の通りに進めます。

ちなみに、deploymentを生成するためのcheckを忘れずに!!（チェックをしておくとこの後のdeploymentが楽ちんです。）
![checkを忘れずに.png](https://qiita-image-store.s3.amazonaws.com/0/46136/94828dfd-29e2-a00f-576b-54e85f954141.png)

##### 6. 画像を投げるとぎょりがオススメする飲み物(=酒)情報が得られるAPIができました!!

やっぱりビアだよね!!!
<img width="737" alt="Screen Shot 2018-12-09 at 21.53.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/46136/f6ffdb0a-234e-229e-5193-23ed3806a467.png">

やっぱ、白ワインだよね!!!
<img width="726" alt="Screen Shot 2018-12-09 at 21.57.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/46136/a416e105-f071-5a42-d282-afb032995454.png">


#### まとめ
いろいろはまったけれど、エンジニアでなくても個人的なレコメンドAI的な何かを作ってみることができました。ABEJA Platformたのしーい。おもしろーい。
もっとつかってみたーい!!という、方はぜひ **[ハンズオン勉強会](https://cloudai.connpass.com/event/112498/)** にご参加ください。

#### これからの抱負
もう少しデータ量、ラベル種類を増やしてもっとぎょりオススメを正確に出せるようにしていきたいと思います。