はじめに
Jetson NanoでCustomVisionのモデルを動かします。
この記事をある程度参考にやっていきます。
環境
- JetPack4.4
Jetson Nanoのセットアップ
この記事などを参考にセットアップを済ませましょう。GUIのままでも推論はできたのでCUIに切り替えなくても大丈夫です。
CustomVisionモデルのダウンロード
ここを参考にモデルをエクスポートします。
まずCustomVisionで以下のどれかのドメインで学習します。
学習が終わったらCustomVisionのPerformanceタブ→Exportを押してDockerのLinuxでエクスポート、ダウンロードします。
エクスポートしたモデルのzipファイルをscp
などでNanoに持ってきて展開します。
unzip CustomVision.zip -d customvision
展開したcustomvision
フォルダの中に、DockerFileがあると思います。それを以下のように編集します(python3-opencvいらないかも)。
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して推論してみます。
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でも大丈夫なのかどうかはわかりません。とりあえず正しそうに推論ができているのでよしとします。
間違い等ありましたらご指摘よろしくお願いします。