CustomVisionのモデルで推論(Jetson Nano)


はじめに

Jetson NanoでCustomVisionのモデルを動かします。
この記事をある程度参考にやっていきます。

環境

  • JetPack4.4

Jetson Nanoのセットアップ

この記事などを参考にセットアップを済ませましょう。GUIのままでも推論はできたのでCUIに切り替えなくても大丈夫です。

CustomVisionモデルのダウンロード

ここを参考にモデルをエクスポートします。

まずCustomVisionで以下のどれかのドメインで学習します。

学習が終わったらCustomVisionのPerformanceタブ→Exportを押してDockerLinuxでエクスポート、ダウンロードします。

エクスポートしたモデルのzipファイルをscpなどでNanoに持ってきて展開します。

unzip CustomVision.zip -d customvision

展開したcustomvisionフォルダの中に、DockerFileがあると思います。それを以下のように編集します(python3-opencvいらないかも)。

Dockerfile
FROM nvcr.io/nvidia/l4t-tensorflow:r32.4.4-tf2.3-py3
RUN apt-get update -y
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y python3-opencv
RUN pip3 install flask pillow
COPY app /app
# Expose the port
EXPOSE 80
# Set the working directory
WORKDIR /app
# Run the flask server for the endpoints
CMD python3 -u app.py

Tensorflow2.3が入っているみたいです。ここを参考に、Tensorflow1.15でも入れられそうです。ビルドに思ったより時間はかかりませんでした。

docker build . -t mycustomvision

ビルドができたらコンテナを起動します。

docker run -p 127.0.0.1:80:80 -d mycustomvision

コンテナ一覧を表示すると、起動しているのがわかります。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
10548014b918        mycustomvision      "/bin/sh -c 'python3…"   2 hours ago         Up 2 hours          127.0.0.1:80->80/tcp   sleepy_elgamal

推論

PythonでPOSTして推論してみます。

inference.py
import json
import requests

file = "./test.png"

with open(file,"rb") as f:
    data = f.read()

url = "http://127.0.0.1/image"
files = {"imageData":data}

response = requests.post(url,files=files)
results = json.loads(response.content)
print(results)

↓結果

$ python3 inference.py
{'created': '2020-11-05T14:58:32.073106', 'id': '', 'iteration': '', 'predictions': [{'boundingBox': {'height': 0.16035638, 'left': 0.738249, 'top': 0.41299437, 'width': 0.05781723}, 'probability': 0.91550273, 'tagId': 0, 'tagName': '1'}], 'project': ''}

ちゃんと結果が得られました。

おわりに

お疲れさまでした。
もともとのDockerfileではTensorflow2.0.0が指定されていましたが、2.3.0でも大丈夫なのかどうかはわかりません。とりあえず正しそうに推論ができているのでよしとします。

間違い等ありましたらご指摘よろしくお願いします。