2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AITRIOS Local EditionをLocal Console以外で推論開始し受信する

Last updated at Posted at 2025-02-19

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を探し出し、起動していれば一旦停止します。
image.png

次に、Mosquittoインストール先のmosquitto.confファイルを編集します。
windowsであればファイルまでのパスはC:\Program Files\mosquitto\mosquitto.confです。
もし上書き禁止になっていたら、アクセス権の設定を変更してログインユーザーでも変更できるようにしましょう。

mosquitto.confファイルに追記する内容は以下の2行です。ファイルの最後にでも追記しましょう。
それぞれ、MQTTブローカーのポートとユーザー名を指定しない接続を許可する旨の設定です。

mosquitto.conf
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から送受信された通信パケットがフィルタリングされた状態で表示されます。

image.png

※AIH-IVRW2のIPアドレスはWi-Fiルーターから探し出すか、Wi-Fi接続時の設定でIPアドレスを固定IPにしてください。
クライアント名はnuttxです。
image.png

この状態でLocal Consoleにて推論開始のボタンを押します。

image.png

すると、この瞬間にMQTTでPublish Messageから始めるMQTTのメッセージがPCからAIH-IVRW2へPublishされるのが観測できます。
これが推論開始のメッセージです
※MQTTのポート番号はWi-Fi接続用のQRコード作成時に設定したポートになっているはずです。

image.png

送信パケット詳細ウインドウを開いて一番下の部分にMessageがあり、これがMQTTでAIH-IVRW2へ向けてPublishされたJSON形式のメッセージです。
Messageの部分は右クリックしてコピー→ASCII形式テキストとして…を選択すると、文字列としてコピーでき、JSONきれい ~JSON整形ツール~などで見やすくした状態にできます。

image.png

実際の推論開始の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) 仕様に概ね準拠しています。
なので、設定内容を変更したいときには参考になるはずです。

大事なのはStorageNameStorageNameIRで、このパラメータでメタデータと画像データの送信先を設定しています。
このパラメータはLocalConsoleではポート番号をランダムに設定しているので、LocalConsoleやAIH-IVRW2では一意に決めていません。
逆に言えば、LocalConsole以外のアプリケーションからMQTTでこのフォーマットに沿ったメッセージをPublishすれば、自前で構えたhttpサーバに対してデータを送るように指示できるということです。

3-2. Pythonで推論開始・終了メッセージをPublish

では実際に推論開始・停止のメッセージをMQTTでPublishしてみます。

下記のプログラムを実行すると推論開始のメッセージをPublishできます。
なお、paho-mqttライブラリが必要になるので、あらかじめpip install paho-mqttでインストールしておいてください。

python
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のデータがそうです。

image.png

画像データはBASE64形式でエンコードされた文字列バイナリデータとして送信されてくるので、スクリーンショットのようにBASE64形式でコピーして https://rakko.tools/tools/71/ などでデコードするとjpg画像として確認できます。

image.png

推論結果のメタデータの方は同じくhttpプロトコルのPUT /inferences/****.txtのデータです。

image.png

スクリーンショット左下のDataで選択し反転した範囲がデシリアライズ前の推論結果のJSONデータなので、ASCII形式でコピーしテキストファイルとしてコピーしたうえで下記の記事で紹介している推論結果をデシリアライズするPythonコードの作成・実行を行えば、JSON形式に変換できます。

4-2. Pythonプログラムで受信用サーバを構築

AITRIOS公式の外部転送設定チュートリアル (HTTP Server)にPythonで推論結果のメタデータ・画像データ受信用のHTTPサーバセットアップ方法が紹介されています。
5. HTTP Server セットアップを実行すると、LocalConsole以外で推論結果のメタデータ・画像データを受け取ることができます。

image.png

5. おわりに

LocalEdition購入時からずっと気になっていたLocalConsoleを使用しない推論実行・推論結果の受信方法をようやく明らかにすることができました。

自分の所属する会社もそうですが、クラウドの利用や従量課金制の支払いに対して制約のある会社は一定数あると思いますので、プリペイドで支払いができLocal環境で完結するLocalEditionを使用してのAITRIOSの利用を検討している方の参考になれば幸いです。

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?