Google Cloudで構築した画像分類モデルをエッジで動かす

# 1.はじめに
この記事ではGoogle Cloud Platform(以降、GCP)の「AutoML」の機能で構築した学習モデルを用いて日立制御エッジコンピュータCE50-10Aで推論を行う方法を解説していきます。
CE50-10AはAIを用いた制御を実現する制御エッジプラットフォームであり、耐環境性、長期安定サポートを特長としています。
https://www.hitachi.co.jp/products/it/control_sys/platform/cs_edge/index.html

## AutoMLとは
AutoMLとは機械学習のモデル構築からハイパーパラメータのチューニング、モデルの評価までを自動化する技術及び機能・ツール全般を指します。
GCPは以下の特長を持つ独自のAutoMLの機能を持っているため、ユーザは簡単に学習モデルの構築及び推論実行が出来ます。
・機械学習の深い知識は不要
・学習データを準備するだけでOK
・操作はいくつかのGUI操作のみ
https://cloud.google.com/automl?hl=ja

# 2. Google Cloudで学習
ここからはGCPで学習する手順について説明します。
簡単で分かりやすい画像分類を行うため、今回は犬・猫を判定する学習モデルを構築してみます。

学習データは以下のようなサイトで一般公開されているものがあるので活用しましょう。
尚、下記サイトは機械学習向けコンペティションプラットフォームである"kaggle"で準備されているデータセットです。
https://www.kaggle.com/datasets

## 2.1 APIの有効化
GCPにログインし、ナビゲーションメニューから、「APIとサービス」⇒「ライブラリ」を選択します。Auto MLを使うため「Cloud Vision API」有効化し、更にAI統合プラットフォームであるVertex AIを使うため、「Vertex AI API」を有効化します。
APIのロゴは以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/bcffd70c-c939-6c16-b7cc-54279c11f220.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/48e7f825-8b43-0840-c49a-87201fbdd8c9.png)

## 2.2 学習用データの準備
ナビゲーションメニューより、「Vertex AI」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/dfd08f17-c06c-85a3-a7f3-84abaa84554d.png)

Vertex AIのダッシュボードが表示されるので、左側のサイドメニューから「データセット」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/0864aaa5-cefa-9927-37fc-1ab220703c04.png)

メニュー上部の「作成」ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/34c2195a-ce16-a16c-d639-cc9d3933c775.png)

任意のデータセット名を入力します。
画像を教師データとして選べるモデルが4種類あるので、今回は犬・猫の判定に向けて画像分類（マルチラベル）を選択し、下部の作成ボタンをクリック。※リージョンによっては「作成」がグレーアウトされる場合があるので注意ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/beadff90-61bc-3c9c-ec3c-406c14c357c0.png)

画像のインポート設定画面に移行するため、画面の指示に従い画像をアップロードします。アップロード先のCloud Storageを入力したら、続行ボタンをクリックします。
画像の数によりますが、画像のアップロード＆Vertex AIへのインポートには数分以上かかるのでしばらく待ちます。完了したらアカウントに登録しているアドレス宛にメールが届きます。
尚、本機能の仕様としてはカテゴリ毎に最低10枚以上となっています。GCPのマニュアルでは高品質なモデルを構築するためには1000枚/カテゴリが推奨とされています。

## 2.3 ラベルの割り当て
インポートが完了すると、データセットメニューの"参照"タブが表示された状態となります。
メニュー中央部の「新規ラベルを追加」を選択し、任意のラベルを作成します。ここではcat、dogのラベルをそれぞれ作成します。

ラベル付けを行う画像を選択した状態で「ラベルの割り当て」クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/9aa799ab-34f7-ca3a-7a54-8a1b77c1bd4c.png)


適切なラベルを選択し、保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/3938418e-f5dc-aec7-923f-20d2350fdea8.png)

対象の全データのラベル付けが終わったら、いよいよトレーニングを実施します。

## 2.4 トレーニング
データセットメニュー右側の「新しいモデルをトレーニング」を選択します。
以下のメニューでは、AutoMLを選択し、モデルを使用する場所は「Edge」を選びます。
ここで「Cloud」を選ぶと、Cloudで推論処理を行うことも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/31432aec-2402-0a26-f0a1-9a0e1bb2ecc4.png)
以降は、画面の説明に従い任意の設定をします。
オプション設定で精度・パッケージサイズの選択が出来たので、今回は精度の高いHigher accuracyに設定してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/f7420592-db19-d3e5-1720-4a04880609dc.png)

各種設定が終わりましたら、最後に「トレーニングを開始」をクリックします。
トレーニングに関しても、完了次第アカウントに登録しているアドレス宛にメールが届きます。


## 2.5 モデルのエクスポート
Vertex AIメニューのModel Repositoryから作成した学習モデルを選択し、生成されている"1"というバージョンIDをクリックします。
メニュー上部の「エクスポート」を選択し、今回は「TF Lite」をクリックします。

出力先としてCloud Storageの任意のパスを入力し「エクスポート」ボタンをクリックすると、指定のパスにTensorflow Liteの形式のファイルが出力されます。
今回はclassification.tfliteという名称で保存します。
Cloud Storageから対象ファイルをダウンロードし、推論実行を行うCE50-10Aに配置します。

# 3. エッジデバイス：CE50-10Aで推論
ここからは、構築した学習モデルを使ってCE50-10Aで推論する手順について説明します。

## 3.1 Tensorflowのインストール
CE50-10A(Ubuntuモデル)を準備し、推論処理に必要なTensorflow Liteのruntime、及び関連パッケージをインストールします。
```
python3 -m pip install tflite-runtime numpy opencv-python pillow
```
また、今回使うサンプルプログラムでは、Tensorflow LiteだけでなくTensorflowのパッケージも必要となります。ここで１点注意が必要です。

TensorflowのVer.1.6以降はAVX命令が使われる仕様ですが、CE50-10Aが搭載しているAtomプロセッサーではAVX命令が非対応のため、Ver.1.6以降を使おうとすると「Illegal Instruction」のエラーが発生してしまいます。
そのため、Ver.1.6以降のTensorflowを使う場合は以下の記事の手順にしたがいAVXを使用しないTensorflowを構築してインストールします。
https://qiita.com/drafts/a7504194c818fc9ee1b1/edit

今回はCE50-10Aに搭載しているpython3.6に対応するTensorflow Ver.2.6を上記手順で構築した後の手順から説明します。
作成したTensorflowのオブジェクトをCE50-10Aに配置し、以下のコマンドでインストールします。※ファイル名はTensorflow、pythonのバージョンにより変動します。
この際、依存パッケージのインストールも行われるため、インターネットに繋げた状態で実施してください。

```
python3 -m pip install tensorflow-2.6.5-cp36-cp36m-linux_x86_64.whl
```
## 3.2 サンプルプログラム、画像、ラベルデータの準備
Tensorlow Liteのモデルを使って画像分類を行うサンプルプログラムがgithubで公開されているため、下記よりlabel_image.pyをダウンロードし、CE50-10Aに配備します。
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/examples/python

推論対象となる画像も準備します。序盤で紹介したkaggleのサイトから持ってきましょう。ここでは犬、猫の画像をそれぞれdog.jpg、cat.jpgとして保存します。

推論プログラムで使用するラベルデータ（labels.txt）も作成します。
推論結果の数値とラベル名称の組み合わせを以下のように作成します。
```labels.txt
0:dog
1:cat
```

## 3.3 推論実行
いよいよ推論処理を実行します。
まずは、以下の犬の画像(dog.jpg)に対して推論を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/49cf25b6-0002-5501-7bd3-4f56fce748ca.png)

```
python3 label_image.py --model_file classification.tflite --label_file labels.txt --image dog.jpg
```

結果は以下の通りです。
```
0.850980: 0:dog
0.137255: 1:cat
time: 683.269ms
```

犬のラベルの出力値が高い、つまり犬と判断しているということが分かります。
次は猫の画像に対して推論を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/46ec0f4e-7aa6-4a40-c1ae-cd1e4ac896bf.png)


```
python3 label_image.py --model_file classification.tflite --label_file labels.txt --image cat.jpg
```

結果は以下の通りです。
```
0.811765: 1:cat
0.172549: 0:dog
time: 680.345ms
```
猫のラベルの出力値が高いですね。
これで無事に、犬・猫の判定が出来ました。

# まとめ
本記事では、GCPのAutoMLを使って学習する手順及び作成した学習モデルをエッジコンピュータCE50-10Aで実行する手順について説明しました。
学習についてはAutoMLの機能により、機械学習の深い知識が無くとも学習モデルの構築が出来ることが分かったと思います。また、エッジデバイスでの推論もサンプルプログラムを活用して簡単に推論実行が出来ました。

本記事を参考にして頂き、是非オリジナルの学習モデルをエッジデバイス上で動かしてみて頂ければと思います。

# 免責・商標類
・本記事に記載した手順は、その動作や結果を保証するものではありません。
・製品の改良により、予告なく記載さ入れている仕様が変更になる場合があります。
・本記事に記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です。