Custom Vision on IoT Edge v2 (Docker)

いままでCustom Visionにはあまり興味が無かったのですが、Build 2018のVision KeynoteでCustom VisionをIoT Edge v2(Docker)で動かしていたようなので試してみました。

Custom Vision

データの用意が簡単そうな、Classificationでやってみることに。compactじゃないと後でDockerfileにエクスポートできないようなので、‘General(compact)`を選びます。

f:id:matsujirushix:20180510212143p:plain

手元に使えそうな、、、Wio LTEとWio 3Gの写真があったのでこれを買いました。

Custom Visonは初めてですが、なんとなくポチポチすれば大丈夫な感じですw
それぞれの写真にWio LTEもしくはWio 3Gのタグを付けます。
どうやら、各タグに最低5枚の写真を用意しなければいけないようです。

f:id:matsujirushix:20180510213136p:plain

で、Trainをポチっと。

f:id:matsujirushix:20180510213326p:plain

なんか出来たっぽい♪

Quick Testで、アップしていない画像をテストしてみます。

f:id:matsujirushix:20180510213457p:plain

あれ?
どちらも0%だと。

気を取り直して、条件良さそうな画像でテスト。

f:id:matsujirushix:20180510213704p:plain

83.7%でWio LTE。ちゃんと動いているようです。

じゃあ、ExportDockerFileを選んでみます。

f:id:matsujirushix:20180510213844p:plain

LinuxWindowsを選ばないといけないようなので、Linuxを選びます。

f:id:matsujirushix:20180510213956p:plain

Dockerfileの入った、zipファイルが取れました。2.57MB。

f:id:matsujirushix:20180510214232p:plain

Docker

手元にあるUPボードのUbuntu Server 16.04にzipファイルをコピー、解凍して、docker buildします。

$ docker build -t wio-module .
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/ubuntu/cv/Dockerfile: no such file or directory

あれれエラーw

ファイル名を変更して、再トライ。

$ docker build -t wio-module .
Sending build context to Docker daemon  2.938MB
Step 1/6 : FROM python
latest: Pulling from library/python
3d77ce4481b1: Downloading [=>                                                 ]  1.609MB/54.26MB
534514c83d69: Downloading [======>                                            ]  2.364MB/17.58MB
d562b1c3ac3f: Downloading [==>                                                ]  2.199MB/43.25MB
4b85e68dc01d: Waiting
a60ceaabb01c: Waiting
ba209b7a7239: Waiting
235ce1ab7310: Waiting
bd6e9cb6b441: Waiting

今度は問題なく動き出しました。(これどこにフィードバックしたらいいんだろう、、、まぁ、すでに気づいているはずだ。うんうん。)

10分ほどで完了。
結構デカイな。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wio-module          latest              fcc778e06ba7        8 seconds ago       1.1GB
python              latest              d69bc9d9b016        5 days ago          691MB

では、実行してみましょう。

$ docker run -p 127.0.0.1:80:80 -d wio-module
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
4eeaad81e990        wio-module          "/bin/sh -c 'python …"   8 seconds ago       Up 7 seconds        127.0.0.1:80->80/tcp   trusting_lichterman
$ docker logs 4eeaad81e990
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)

動いているっぽい。

適当な画像をcurlでPOSTしてみると、

$ time curl -X POST http://127.0.0.1/image -H "Content-Type: application/octet-stream" --data-binary @IMG_0015.JPG
{
  "created": "2018-05-10T13:09:01.371454",
  "id": "",
  "iteration": "",
  "predictions": [
    {
      "boundingBox": null,
      "probability": 0.9996715784072876,
      "tagId": "",
      "tagName": "Wio LTE"
    }
  ],
  "project": ""
}

real    0m1.364s
user    0m0.012s
sys     0m0.028s

オォー

動いているっぽい。

Dockerコンテナのログは、

$ docker logs 4eeaad81e990
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
2018-05-10 13:07:15.363135: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2
172.17.0.1 - - [10/May/2018 13:07:16] "POST /image HTTP/1.1" 200 -

POST来てますね♪

Dockerコンテナのメモリ使用量は115MBでした。

$ docker stats 4eeaad81e990
CONTAINER ID        NAME                  CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
4eeaad81e990        trusting_lichterman   0.03%               114.6MiB / 3.274GiB   3.42%               3.28MB / 12.3kB     0B / 0B             13

感想

  • ちょーお手軽簡単に、CustomVisionのローカル実行環境が立てれました。(ただし、Dockerの知識は必要。)
  • 中身はTensorFlowなのでGPUを使ってより高速化が可能?(HTTPのオーバーヘッドも結構ありそう?)

Python + Flask + TensorFlowで動いているようですが、詳しくは後日調べたいと思います。