Custom Vision がさらに簡単＆ローカル作成可能に！Lobe でカスタム画像分析モデルを作成してみよう

[Cognitive Services Custom Vision](https://azure.microsoft.com/ja-jp/services/cognitive-services/custom-vision-service/) は充分簡単にカスタム画像認識 (クラス分類(Classification) & オブジェクト検出(Object Detection)) モデルが作成できてしまうサービスなのですが、これをさらにカンタンにした＆アプリとしてローカル環境で作成～エクスポートできるのが、[Microsoft Lobe](https://lobe.ai/) です。

# Lobe とは

Lobe の利用シナリオとして、以下のようなサンプルが提示されています

 - Plant Species (庭の植物を見分ける)
 - Hand Gestures (数のカウント、じゃんけんもできそう?)
 - Personal Trainer (筋トレポーズ、ヨガももちろんできそう)
 - Emotional Reactions (顔の表情)
 - Interactive Painting (色の検出)
 -  : 

![20201206_Lobe_Examples.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/85cabebd-fd95-88e0-699b-e5bbbf3dd9f5.png)

https://lobe.ai/examples

実は Lobe のスゴイところは、直接カメラ映像(動画)を取得して自動で画像を切り出し、ラベル付けができるところです。

![20201206_Lobe_CameraDemo01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/91732c8d-05ad-40b8-97b8-1dfe7d76c6f4.png)
![20201206_Lobe_CameraDemo02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/a28e0e6b-58ab-719e-f12c-fb7f8e19d7c6.png)

https://youtu.be/Mdcw3Sb98DA?t=63

実際に Lobe をダウンロードするところから、学習データ(画像) を覚えさせて TensorFlow にエクスポートして利用してみるまで (もちろん無料！) の手順を紹介します。今回はヨガのポーズを分類するモデルを作成してみます。

# 準備

特にマイクロソフトアカウントとかAzure サブスクリプションは必要ありません。初期登録 (名前、メールアドレス) のみで利用できます。(※ 2020年12月現在)

## Lobe の登録 & アプリのダウンロード

まず Lobe のトップページ (https://lobe.ai/) を参照して、**[Download]** をクリックします。
![20201206_Lobe_WebTop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/b6dec1c8-8c6d-e651-caac-6af26fcff477.png)

**Join Beta** から登録を行います。Japan を選択すると日本語ローカライズの可能性が高まるかも?!
登録情報を入力したら **[Download]** をクリックして Lobe をダウンロードします。
![20201206_Lobe_SignUp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/33c2855c-6fdd-e395-a804-fb377feeb61e.png)

ダウンロードした Lobe.exe  (← Windows の場合?) をクリックして、ローカル環境にインストールします。

# Lobe で画像分析モデルを作成

## 新規プロジェクト作成

Lobe を起動します。**New Project** をクリックして、新規プロジェクトを作成します。

![20201206_Lobe_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/e5cd2c80-821d-e051-41fe-648b47ad1439.png)

## 学習データのロード～自動でモデル作成

画面右上の [Import] をクリックして、学習データとなる画像を選択します。
画像認識モデルを作成するには 1 タグあたり 5 枚以上の画像が必要というところが既に Custom Vision っぽい :)

![20201206_Lobe_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/7f3182a5-4521-9b2a-3475-bad2d4c37326.png)

**[Dataset]** を選択すると、分類したフォルダーごと読み込みできるのはとても便利！

![20201206_Lobe_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/9fa95636-e279-227e-f9d6-3063805edf7b.png)

*Yoga* というフォルダーを作成し、その中にポーズ名(*Cobra*, *downdog*...)をつけたフォルダーに画像を格納しておきます。**Yoga** フォルダーを指定します。

![20201206_Lobe_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/bc3f929d-b75f-68b1-607c-985c48c0cdbe.png)

画像を分類するタグ名はフォルダー名そのまま or カスタムもできます。今回はそのままで。

![20201206_Lobe_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/0315d3d9-ca05-ee4a-6b69-9e6620821ff3.png)

プロジェクト名も親フォルダーの名前(Yoga)に設定されました。
画像が読み込まれ、自動で学習 (Training) が実行されます。

![20201206_Lobe_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/0cebcfdf-fa1e-52a2-7f0e-7c05d1b829c7.png)

## 分析モデルの確認

[Train] をクリックすると、作成した分析モデルの精度が確認できます。

![20201206_Lobe_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/ae169bf0-a5ef-e166-68f5-682c4055e2e5.png)

## 分析モデルのテスト

**Play** をクリックして、学習データとして使っていない画像で分析モデルのテストを行います。

![20201206_Lobe_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/1849d43f-a24f-68ac-8901-77508c3a51f4.png)

テストしたい画像を Drag & Drop するか、**Import** をクリックして画像を選択すると、画像の分析結果が表示されます。

![20201206_Lobe_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/34f7fe08-e39c-d465-77eb-42b7bf93d939.png)

## 分析モデルのエクスポートとサンプルコード実行

TensorFlow | TensorFlow Light にエクスポート、または Local API として利用できます。
ひとまず TensorFlow でダウンロードしてみます。

左上の **Ξ** をクリックして、表示される **Export** をクリックします。

![20201206_Lobe_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/480b39a6-bc5f-351f-76dc-5f0c4bc9eadd.png)

**Export** のメニューから TensorFlow を選択します。

![20201206_Lobe_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/22b055e2-76e9-0856-d5ea-656a880cd264.png)

![20201206_Lobe_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/20a73f4d-b05a-347f-4250-c63d745371d3.png)

ローカルに *<プロジェクト名> TensorFlow* というフォルダーが作成されます。
*example* フォルダーにサンプルコード(python) も一緒に作成されます。

![20201206_Lobe_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/37a8a77a-564f-0658-df76-27f8f3efc78d.png)

*example/readme.md* に書かれている手順を参考にサンプルコードを実行してみます。

> TensorFlow 1.15.3 を利用するため、実行するには Python 3.7.* が必要です。

*tf-venv* という名前で Python 仮想環境を作ります。(下記 Windows の場合)

```
python -m venv tf-venv

// Python 3.7 がデフォルト環境でないなら
py -3.7 -m venv tf-venv
```

*tf-venv* を起動します。

```
tf-venv/Scripts/activate
```

pip をアップグレードした後、example/requirements.txt に記載されているモジュールをインストールします。

```
(tf-venv) python -m pip install --upgrade pip
(tf-venv) python -m pip install -r example/requirements.txt
```

> requirements.txt からインストールするモジュールは以下の2つです。
 - tensorflow==1.15.3
 - pillow==7.2.0


無事環境が作成出来たら、サンプルコード(tf_sample.py) を実行してみます。
*test* というフォルダーを作成して、テスト用画像を配置して指定 (test/warrior2.jpg) しています。

```
(tf-venv) python example/tf_example.py test/warrior2.jpg
```

TensorFlow v1.* を利用している Warning が最初出力されますが、**Predicted** 以下が分析モデルで画像を推定した結果です。

```
WARNING:tensorflow:From example/tf_example.py:40: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
Predicted: {'Prediction': 'warrior', 'Confidences': [0.02098606899380684, 0.00528041971847415, 3.6378631193656474e-05, 0.0019086095271632075, 0.00045342574594542384, 0.004871818702667952, 0.9664632081985474]}
```

**Prediction** の結果が **warrior** だとタグ名で出力されます。
**Confidences** の数値は各タグ(出力順)の推定値になります。(warrior=>0.9664632081985474)

タグの出力順は、分析モデルの情報が記述された *signature.json* に記載されています。

```signature.json
{
    "doc_id": "********-****-****-****-************", 
       :
    "inputs": {
       :
    }, 
    "outputs": {
       :
    }, 
    "tags": ["serve"], 
    "classes": {
        "Label": ["cobra", "downdog", "headstand", "plough", "tree", "triangle", "warrior"]
    }, 
    "filename": "saved_model.pb"
}
```