【演習】IBM Watson Services for Core ML Tutorial

# はじめに
この記事では[IBM Watson Services for Core ML Tutorial](https://www.raywenderlich.com/190191/ibm-watson-services-for-core-ml-tutorial)を訳しつつなぞってみるというものです。
全文訳すわけではないので、興味を持ったら原本も参照して見てください。

この記事ではIBM Watsonアカウントを作成し、Visual RecognitionというWatsonの画像認識サービスをトレーニングし、Core MLモデルを使ったiOSアプリを構築します。

# Watsonサービスとは？
この記事では[Watson Studio](https://www.ibm.com/cloud/watson-studio)という、機械学習モデルをトレーニングするのにコーディングを必要としないサービスを利用していきます。

Watsonサービスは、データ系・知識探索系・画像系・会話系・音声系・言語系の機械学習モデルをカバーしています。
Watsonサービスをアプリに加えることで、継続的に学習を重ねていくアプリを構築することができます。

## [Turi](https://github.com/apple/turicreate) vs. Watson
TuriはAppleの機械学習ライブラリです。
- Turiはどちらも画像系と言語系の機械学習モデルを提供しますが、Core MLに関していうと、2018年4月現在ではWatsonはまだ画像認識モデルしか提供していません。
- Turiにはactivity classifierがありますが、Watsonにはありません。WatsonにはDiscoveryという、Turiのどのサービスにも増して洗練されたサービスがあります。
- Turiを用いるには、Pythonを使ったモデルのトレーニングが必要です。Watsonが必要とするのは言語の種類ではなくデータのみです。

## ユーザーのプライバシーは確保されますか？
Core MLの大きな長所はモデルがiOSデバイス上で実行されることです。つまり、オフラインでも利用できユーザーのデータを保護します。ユーザーのデータがデバイスの外に出ることはありません。

しかし、Watsonのモデルによる予測の正確性をフィードバックする際には、アプリはIBMのサーバーにユーザーの利用した写真を送ることになります。IBMにはクラウド利用に関するプライバシーポリシーはあります。また、Appleも新たなプライバシーキーの要求を加えるでしょう。

# 始める前に
## Carthage
Watson Swift SDKの構築のために、[Carthage](https://github.com/Carthage/Carthage)という依存性管理ツールが必要です。

Carthage.pkgを[Carthage releases](https://github.com/Carthage/Carthage/releases)からインストールします。
あるいは、Carthage [readme](https://github.com/Carthage/Carthage)を参照し、Homebrewを使ってインストールします。

## IBM Sample Apps
[IBM Watson Services for Core ML](https://developer.apple.com/ibm/)にアクセスし、「Getting Started」までスクロールダウンします。
中央のBegin with Watson Starters内の[Start on GitHub](https://github.com/watson-developer-cloud/visual-recognition-coreml)をクリックします。
ZIPファイルをダウンロードして解凍したら、QuickstartWorkspace.xcworkspaceを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/8e46699b-0138-99d2-eb2d-594d345c732b.png)

このワークスペースには、Core ML Vision SimpleとCore ML Vision Customの2つのアプリケーションが含まれています。Core ML Vision Simpleは一般的なDIYツールとプラントを分類するためにCore MLモデルを利用します。Core ML Vision CustomはWatsonサービスからダウンロードされたCore MLモデルを利用します。このモデルをこれからこのチュートリアルで構築します。

内包されているREADMEの[Running Core ML Vision Custom](https://github.com/watson-developer-cloud/visual-recognition-coreml#running-core-ml-vision-custom)までスクロールダウンします。
ガイドに従って[Watson Studio](https://dataplatform.ibm.com/registration/stepone?target=watson_vision_combined&context=wdp&apps=watson_studio&cm_sp=WatsonPlatform-WatsonPlatform-_-OnPageNavCTA-IBMWatson_VisualRecognition-_-CoreMLGithub)にログインします。

# Watson Studioにログイン
IBM Cloudアカウントを持っていなければ右欄の一番上のテキストボックスにメールアドレスを入力しアカウントを作成します。すでに、アカウントを持っていなければその下のガイドに従います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/6205ac1a-5c7f-f425-00bc-ff1a0911e1f0.png)

ログインできると以下のような画面に移りました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/4d4c3c17-0785-4855-5a07-44d8652438b6.png)

もともとIBMアカウントを持っていたから原本のガイドとここまでに至った道筋が違ったのか、欲しかったVisual Studioがないのでサービスを加えようと思う。
上部の「Services」から「Watson Services」を選択し、「Add Service」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/7e174c8b-be55-7db5-4370-0f76f063c1dd.png)

Visual Studioを探し「Add」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/cbb0669c-4b48-bdf8-36c4-04bcbdc8a1fa.png)

Liteプランを選択し、Createをクリックすると、Confirm Creationが出てくるので、内容を確認してConfirmをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/2e01b62f-4635-2422-d650-d714a7bcd5dc.png)

Launch toolをクリックして、Visual Recognitionサービスを起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/4c987b48-495e-6f6c-b020-0c7b5bc29510.png)

# Custom Object Classifierを作成
## 新規プロジェクトの作成
Custom欄のCreate Modelをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/f5485d96-04ac-50d6-832a-0f4f7e65179e.png)

プロジェクト名を入力してCreateをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/178cd2c4-18e2-1231-9d1e-49a2d4b182bd.png)

下のような画面が出てきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/c2318b5c-24e7-0771-013f-f350c01f5401.png)

## 学習用データの追加
最初にダウンロードしたフォルダの「Training Images」フォルダに入ったデータを使って学習していきましょう。
ご自身のデータを用いても構いません。

右側の「1001」と書いてあるアイコンがクリックされていることを確認して、その下の枠の「browse」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/499bd228-2481-a778-c252-0cd20017fa08.png)

Training Imagesフォルダ内の4つのZipファイルを選択し、Openをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/e8908a3d-4949-d62a-ed98-77c85e69f742.png)

4つのアイテム全てのチェックボックスにチェックを入れ、3つの点のメニューをクリックして「Add selected to model」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/9a0b36dd-c2e8-e978-1690-c2e6802419c4.png)

データをモデルに追加できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/2c3d14bd-8966-5220-bc7e-8a705f726e72.png)

## モデルを学習する
右側の「Train Model」をクリックします。
完了するまで5-10分ほどかかるということなので夕飯でも準備しながら待ちましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/dc9de917-d331-e487-6091-3af8915ebeba.png)

学習が終わったら以下のようなメッセージが出ます。
このメッセージ上の「here」をクリックすると、モデルの概要を確認したりテストをしたりする画面に行くことができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/a3a0218e-6c41-900e-19d1-7fcb90cca0c3.png)

## アプリにモデルを加える
「here」を押したら現れたDefault Custom Modelのページにいき、「Associated Service」欄のインスタンス名をクリックします。
(もしも、リンクが消えてしまっていたら、上部のメニュ0から「Projects]->「Custom Core ML」->「Default Custom Model」でいけます。)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/72f6e873-3020-b64b-25af-6f715ffb3d62.png)

Custom Modelsの欄までスクロールダウンしてCopy model IDをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/3ed4978e-718e-38d9-bb60-d136b090ab6f.png)

ここで、序盤に「QuickstartWorkspace.xcworkspace」を開いたときに起動したXcodeに戻ります。
Core ML Vision Customアプリ内のCore ML Vision Customフォルダ内のImageClassificationViewController.swiftファイルを開きます。

「let classifierId =」の横に先ほどコピーしたmodel IDを貼り付けます。(本記事作成時だと33行目)

ページの一番上に戻り、タブを「Overview」から「Credentials」に動かします。
「View Credentials」を押して、その中の「api_key」をコピーしてImageClassificationViewController.swiftの「let apiKey =」のところに貼り付けます。(本記事作成時は32行目)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/9591435b-95c6-2493-2e74-c8ed92ef542c.png)

let versionの欄をアプリ作成時の日付に書き換えます。(34行目)

## Watson Swift SDKを構築する
Watsonサービスを利用するためのフレームワークをアプリに加えます。
ターミナルを開きCore ML Vision Customまでディレクトリを移動させます。(Cartfileを含むもの)
```carthage bootstrap --platform iOS``` コマンドを実行します。(5分ほどかかります)

## やってみる
Core ML Vision Customのアプリ名を選択し、設定を変更します。
「Bundle Identifier」をオリジナルのものに変更します。
Signingからチームを選びテストを実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141025/447fe1b8-014c-d338-02e2-d52f980e2b85.png)

#おわり
自分のテスト実行環境(Signing)がうまくいかなかったのもあり、一部尻切れとんぼですが、ぜひみなさん最後までやってみてください。