Cognitive Services Custom Vision から画像解析モデルを Dockerimage に Export して利用する

Custom Vision を利用すると、最小で画像5枚から画像解析モデルを作成し、Web API や CoreML、TensorFlow、ONNX のフォーマットで Export して利用できるほか、そのままお手持ちの Docker 環境で Image Build して Web API サービスとして利用できる Dockerfile としても Export 可能です。

今回は Custom Vision で作成したモデルを Dockerfile として Export し、ローカルの Docker 環境で動かして画像解析してみるまでの手順を紹介します。


# 準備

- Custom Vision の利用環境
    - Cognitive Services Custom Vision で画像解析モデルを作成します。
    - 利用準備: [Microsoft Azure & Cognitive Services 利用準備](https://qiita.com/annie/items/3c9ddc3fb8f120769239)
- Docker 環境 (Windows または Linux)
    - 以下の手順では、Windows10 + Docker for Windows (ver 18.09.2)、Linux コンテナーで確認しています。

# 手順

## Custom Vision で画像解析モデルを作成、Export

### Custom Vision で画像解析モデルを作成

[Custom Vision を利用した独自の画像分類およびオブジェクト検出のアルゴリズム構築](https://github.com/seosoft/AINightsBegineerTrack-JP#%E3%82%BF%E3%82%B9%E3%82%AF-3-microsoft-azure-cognitive-services---custom-vision) の手順を参考に、画像分類(Classification) または オブジェクト検出(Object Detection) モデルを作成します。

モデルの Export を行いたいときは、Project 作成時に "compact" と書かれている Domain を選択します。
![20190706_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/0580c16e-f928-06ac-6cb5-1a90c55a1d36.png)

作成済みの Project を使いたい場合は、設定画面で "compact" と記されている Domain を選択し、Train すると Compact モデルが作成されます。
![20190706_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/441b0534-f269-4ab8-c70f-3ffce07fb3ed.png)


### Dockerimage で Export

モデルを作成した Project で **[Performance]** 画面を開きます。
上部バーの **[Export]** をクリックします。
![20190706_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/0f1ed3fd-8345-96d8-8c1a-2b21d39b30b1.png)

Export する形式は **[Dockerfile]** を選択します。
![20190706_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/dca7c19b-7700-007a-273a-adf0f1b15831.png)

Docker Version は Linux または Windows をお手持ちの環境に合わせて選択します。
![20190706_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/fa07a3ab-e5d6-ba73-7aa8-d32a65e343c4.png)

モデルが準備できて **[Download]** と表示されたらクリックしてダウンロードします。
![20190706_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/807ed47e-27fd-0d35-84e2-3727c91fdfc3.png)

ダウンロードした Dockerfile の ZIP ファイルを展開すると、以下のような構造になっています。
Web サービスのアプリ部分も含まれているため、Image Build してすぐに利用できます。

CVDockerImage
┗ app
　┗ app.py
　┗ labels.txt
　┗ model.pb
　┗ predict.py
　┗ requirements.txt
┗ azureml
　┗ README.txt
　┗ score.py
┗ Dockerfile
┗ README.txt


## Dockerfile から Image Build、Web API でアクセス

ダウンロードした dockerfile (ZIP ファイル) を展開しておきます。
docker コマンドで Image Build を行います。

| 設定 | ※ご自身の環境に合わせて変更してください |
|:---------------|:---------------|
| dockerfile を展開したディレクトリ | C:\\data\CVDockerImage |
| 作成する Docker Image の名前 | cvclassification |

```
> docker build -t cvclassification C:\data\CVDockerImage
```

しばらくして、以下のようなイメージ作成が成功したメッセージが表示されたら OK です。

```
> docker build -t cvclassification C:\data\CVDockerImage
Sending build context to Docker daemon  5.105MB
Step 1/7 : FROM python:3.5
3.5: Pulling from library/python
 :
Successfully built 0000a00a0000
Successfully tagged cvclassification:latest
```

ls コマンドでイメージが作成されていることを確認します。

```
> docker image ls
REPOSITORY        TAG      IMAGE ID       CREATED              SIZE
cvclassification  latest   0000a00a0000   About 5 minutes ago  1.51GB

```

run コマンドでコンテナーを起動します。以下では Web サービスを localhost (127.0.0.1)、Port: 4000 に設定しています。

```
> docker run -p 127.0.0.1:4000:80 -d cvclassification
000a00aa000a
```

ブラウザーで `http://localhost:4000` にアクセスすると、Custom Vision の Host メッセージが表示されれば OK です。
![20190706_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/4bb85b6d-24bf-5c58-1dc2-1cd0773b91d4.png)

では Web API としてアクセスしてみます。

- 画像ファイル(バイナリ)を送信する場合: `http://localhost:4000/image`
- 画像ファイル URL を送信する場合: `http://localhost:4000/url`

```
POST http://127.0.0.1:4000/image
Content-Type: application/octet-stream
Body: /*画像ファイル(バイナリ)*/
```

解析結果が取得できればOKです。
![20190706_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/87217e68-4f51-06bf-9706-54de4a771f61.png)


ps -a コマンドで作成されているコンテナーを確認できます。

```
> docker ps -a
CONTAINER ID  IMAGE             COMMAND                CREATED          STATUS              PORTS                   NAMES
000a00aa000a  cvclassification  "/bin/sh -c 'python …" 21 minutes ago   Up 20 minutes       127.0.0.1:4000->80/tcp  heuristic_banach
```

起動したコンテナーは stop コマンドで停止できます。

```
> docker stop 000a00aa000a
```

# 参考
[docker docs > Get Started, Part 2: Containers](https://docs.docker.com/get-started/part2/)