1. はじめに
AITRIOS LocalEditionでは推論開始・終了の操作と推論結果の受信にLocalConsoleが必要です。
学習モデルの確認であれば問題ないのですが、いよいよ実際の環境で運用する際にはこれでは不便なので、Local Console以外のアプリケーションで推論開始・終了の操作と推論結果を受信する方法を実際の調査過程とともに紹介します。
なお、調査にはAITRIOS LocalEdition 1.4.0.aとAIH-IVRW2(AITRIOSのエッジカメラ)を使用し、AIH-IVRW2のFWのバージョンは以下の通りです。
Main chip : 0400FEWS
Sensor Chip FW (main) : 020300
Sensor Chip FW (loader) : 020301
また、Wiresharkを使用して通信パケットのキャプチャも行っています。
調査にあたっては、@matsujirushi さんからXにて多大なアドバイスをいただきました。ありがとうございます。
2. Mosquittoの設定変更
AITRIOS LocalEditionをインストールすると自動的にMQTTブローカーのMosquittoもインストールされますが、初期状態では外部からの接続ができない状態になっています。
LocalEditionの起動時にはバックグラウンドでは外部接続が可能な状態でmosquittoが立ち上がるようですが、ここではmosquittoの初期状態を外部接続が可能な状態に設定します。
Windowsではサービスの一覧画面からMosquitto Broker
を探し出し、起動していれば一旦停止します。
次に、Mosquittoインストール先のmosquitto.conf
ファイルを編集します。
windowsであればファイルまでのパスはC:\Program Files\mosquitto\mosquitto.conf
です。
もし上書き禁止になっていたら、アクセス権の設定を変更してログインユーザーでも変更できるようにしましょう。
mosquitto.conf
ファイルに追記する内容は以下の2行です。ファイルの最後にでも追記しましょう。
それぞれ、MQTTブローカーのポートとユーザー名を指定しない接続を許可する旨の設定です。
listener 1883
allow_anonymous true
mosquitto.conf
ファイルに追記できたら、サービス一覧の画面から開始を選択してMosquittoを再起動させます。
スタートアップの種類が自動であれば、PCを再起動した際に今回の設定が反映された状態で自動的にMosquittoが起動するはずです。
3. MQTTによる推論開始・終了メッセージ
3-1. Wiresharkを使用して確認
まずはAIH-IVRW2と、LocalConsoleをセットアップしたPC間の通信内容を確認する必要があります。
WiresharkでPCのネットワーク接続に対しip.addr == <AIH-IVRW2のIPアドレス>
をフィルタに設定すると、このようにAIH-IVRW2から送受信された通信パケットがフィルタリングされた状態で表示されます。
※AIH-IVRW2のIPアドレスはWi-Fiルーターから探し出すか、Wi-Fi接続時の設定でIPアドレスを固定IPにしてください。
クライアント名はnuttx
です。
この状態でLocal Consoleにて推論開始のボタンを押します。
すると、この瞬間にMQTTでPublish Message
から始めるMQTTのメッセージがPCからAIH-IVRW2へPublishされるのが観測できます。
これが推論開始のメッセージです。
※MQTTのポート番号はWi-Fi接続用のQRコード作成時に設定したポートになっているはずです。
送信パケット詳細ウインドウを開いて一番下の部分にMessage
があり、これがMQTTでAIH-IVRW2へ向けてPublishされたJSON形式のメッセージです。
Messageの部分は右クリックしてコピー→ASCII形式テキストとして…
を選択すると、文字列としてコピーでき、JSONきれい ~JSON整形ツール~などで見やすくした状態にできます。
実際の推論開始のJSON形式のメッセージは以下の通りです。
{
"method": "ModuleMethodCall",
"params": {
"moduleMethod": "StartUploadInferenceData",
"moduleInstance": "backdoor-EA_Main",
"params": {
"CropHOffset": 0,
"CropVOffset": 0,
"CropHSize": 4056,
"CropVSize": 3040,
"Mode": 1,
"UploadMethod": "HttpStorage",
"StorageName": "http://<httpサーバのIPアドレス>:<ポート番号>",
"StorageSubDirectoryPath": "images",
"UploadMethodIR": "HttpStorage",
"StorageNameIR": "http://<httpサーバのIPアドレス>:<ポート番号>",
"UploadInterval": 30,
"StorageSubDirectoryPathIR": "inferences"
}
}
}
併せて推論停止のJSONメッセージも紹介しておきます。
{
"method": "ModuleMethodCall",
"params": {
"moduleMethod": "StopUploadInferenceData",
"moduleInstance": "backdoor-EA_Main",
"params": {}
}
}
推論せずに撮影のみの場合は推論開始のJSONメッセージとほぼ同じですが、Mode
のパラメータを0にします。
{
"method": "ModuleMethodCall",
"params": {
"moduleMethod": "StartUploadInferenceData",
"moduleInstance": "backdoor-EA_Main",
"params": {
"CropHOffset": 0,
"CropVOffset": 0,
"CropHSize": 4056,
"CropVSize": 3040,
"Mode": 0,
"UploadMethod": "HttpStorage",
"StorageName": "http://<httpサーバのIPアドレス>:<ポート番号>",
"StorageSubDirectoryPath": "images",
"UploadMethodIR": "HttpStorage",
"StorageNameIR": "http://<httpサーバのIPアドレス>:<ポート番号>",
"UploadInterval": 30,
"StorageSubDirectoryPathIR": "inferences"
}
}
}
なお、このメッセージはConsole ユーザーマニュアルのCommand Parameterファイル (JSON) 仕様に概ね準拠しています。
なので、設定内容を変更したいときには参考になるはずです。
大事なのはStorageName
とStorageNameIR
で、このパラメータでメタデータと画像データの送信先を設定しています。
このパラメータはLocalConsoleではポート番号をランダムに設定しているので、LocalConsoleやAIH-IVRW2では一意に決めていません。
逆に言えば、LocalConsole以外のアプリケーションからMQTTでこのフォーマットに沿ったメッセージをPublishすれば、自前で構えたhttpサーバに対してデータを送るように指示できるということです。
3-2. Pythonで推論開始・終了メッセージをPublish
では実際に推論開始・停止のメッセージをMQTTでPublishしてみます。
下記のプログラムを実行すると推論開始のメッセージをPublishできます。
なお、paho-mqtt
ライブラリが必要になるので、あらかじめpip install paho-mqtt
でインストールしておいてください。
import json
import paho.mqtt.client as mqtt
# MQTT Brokerの設定
broker = "localhost" # MQTT Brokerのホスト(適宜変更)
port = 1883 # MQTT Brokerのポート(適宜変更)
topic = "v1/devices/me/rpc/request/26255775"
# 送信するメッセージ
message = {
"method": "ModuleMethodCall",
"params": {
"moduleMethod": "StartUploadInferenceData",
"moduleInstance": "backdoor-EA_Main",
"params": {
"CropHOffset": 0,
"CropVOffset": 0,
"CropHSize": 4056,
"CropVSize": 3040,
"Mode": 1,
"UploadMethod": "HttpStorage",
"StorageName": "http://192.168.11.100:62074", # メタデータ送信先のhttpサーバ(適宜変更)
"StorageSubDirectoryPath": "images",
"UploadMethodIR": "HttpStorage",
"StorageNameIR": "http://192.168.11.100:62074", # 画像データ送信先のhttpサーバ(適宜変更)
"UploadInterval": 30,
"StorageSubDirectoryPathIR": "inferences"
}
}
}
# メッセージをJSON形式に変換
message_json = json.dumps(message)
# MQTTクライアントの設定
client = mqtt.Client()
# MQTT Brokerへの接続
client.connect(broker, port)
# メッセージの送信
client.publish(topic, message_json)
# メッセージ送信後に接続を切断
client.disconnect()
print(f"Message sent to topic {topic}")
MQTTでメッセージをPublishするには相手先をTopicで指定する必要があります。
上で紹介しているWiresharkで捕まえた推論開始のメッセージからは、Topicがv1/devices/me/rpc/request/26255775
であると読み取れるのですが、図中にも書いているように8桁の数字はランダムな数字であればなんでもいいようで、繰り返しの使用も可能でした。
ただし、推論開始と推論停止では別の8桁の数字にしないとメッセージを受け取ってくれないようです。
4. httpによる推論結果のメタデータと画像データの受信
4-1. Wiresharkを使用して確認
3-2. Pythonで推論開始・終了メッセージをPublishで作成した推論開始のフローを実行すると、AIH-IVRW2から指定したIP・ポートに向けてhttpで推論結果のメタデータと画像データが送信されてきます。
これもWiresharkを使用して確認します。
AIH-IVRW2からは先に画像データの方が送信されてきます。
下記スクリーンショットのput /images/****.jpg
のデータがそうです。
画像データはBASE64形式でエンコードされた文字列バイナリデータとして送信されてくるので、スクリーンショットのようにBASE64形式でコピーして https://rakko.tools/tools/71/ などでデコードするとjpg画像として確認できます。
推論結果のメタデータの方は同じくhttpプロトコルのPUT /inferences/****.txt
のデータです。
スクリーンショット左下のDataで選択し反転した範囲がデシリアライズ前の推論結果のJSONデータなので、ASCII形式でコピーしテキストファイルとしてコピーしたうえで下記の記事で紹介している推論結果をデシリアライズするPythonコードの作成・実行を行えば、JSON形式に変換できます。
4-2. Pythonプログラムで受信用サーバを構築
AITRIOS公式の外部転送設定チュートリアル (HTTP Server)にPythonで推論結果のメタデータ・画像データ受信用のHTTPサーバセットアップ方法が紹介されています。
5. HTTP Server セットアップ
を実行すると、LocalConsole以外で推論結果のメタデータ・画像データを受け取ることができます。
5. おわりに
LocalEdition購入時からずっと気になっていたLocalConsoleを使用しない推論実行・推論結果の受信方法をようやく明らかにすることができました。
自分の所属する会社もそうですが、クラウドの利用や従量課金制の支払いに対して制約のある会社は一定数あると思いますので、プリペイドで支払いができLocal環境で完結するLocalEditionを使用してのAITRIOSの利用を検討している方の参考になれば幸いです。