AI高位合成ツール「AIRTIPS」とFPGAボードによる映像分析システム構築ガイド【後編】

sharp_engineer · note(ノート)

研究開発本部 山口典昭(やまぐちのりあき)

はじめに

前編では、AIRTIPS Ver2.0を使ってFPGAボード「KV260」上で物体検出モデル YOLOX-Nano を動かす方法を紹介しました。AIRTIPSと独自アクセラレータ「4DTC」により、高速かつ低消費電力なエッジAIを実現できました。

今回の後編では、このエッジAIシステムをさらに進化させ、「映像に何が映っているか」を自然な会話で教えてくれるAIチャットボットを構築します。
「今、何が見えてる?」と聞けば、「自転車に乗った人が通りましたよ」と教えてくれる。そんなSF映画のようなシステムを、エッジAIとクラウドAIを組み合わせることで実現します。
単なる「検知」を超えた「理解と対話」が可能になる、未来のカメラを一緒に作りましょう!

———
本記事のポイント

✅ KV260の「セマンティックカメラ」化
映像データそのものではなく、「何が映っているか」という意味情報(セマンティクス)だけを提供するAPIサーバーを構築します。これにより、プライバシーに配慮しつつ高度な分析が可能になります。

✅ MCP (Model Context Protocol) ライクな連携
クラウド上のLLMが必要な時だけエッジ(KV260)の情報を取得しに行く、MCPのコンセプト(Client-Host-Server)を取り入れたアーキテクチャを採用します。

✅ Function Callingによる自律的なデータ取得
LLMの機能(Function Calling)を活用し、ユーザーの質問に応じてAIが自ら「カメラの情報を見るべきか」を判断するスマートなシステムを作ります。

———
推奨実行環境

本記事の実装を試すために推奨される環境は以下の通りです。

1. KV260 (エッジ側)

OS: Ubuntu 20.04 LTS または 22.04 LTS (Kria SOM用イメージ)

Python: 3.8 以上 (推奨: 3.10)

ネットワーク: ノートPCと同じローカルネットワーク(LAN)に接続されていること。

前提条件: 前編の記事に従い、AIRTIPS Ver2.0によるYOLOX動作環境が構築済みであること。

2. ノートPC (クライアント側)

OS: Windows 11

Python: 3.10 以上 (推奨: 3.11 または 3.12)

ターミナル: PowerShell または コマンドプロンプト

必須要件: インターネット接続(Gemini API利用のため)、およびKV260へのネットワークアクセス。

使用LLM: 本記事およびサンプルコードでは Gemini 2.5 Flash を使用しています。他のモデルを使用する場合は、コード内の設定変更が必要です。

———
AIRTIPS Ver2.0について

AIRTIPS(AI Real Time Image Processor Synthesiser)は、エッジ端末向けにリアルタイム&低消費電力なAI映像処理を実現する高位合成ツールです。2025年10月に公開されたVer2.0では、4DTCアクセラレータを用いた物体検出モデルの高速化が可能になりました。前編で紹介したKV260+YOLOX-Nanoの構成をベースに、今回はクラウドAIとの連携を実現します。

https://corporate.jp.sharp/8k5g/8klab/ai-edge_report_202505.html

———
システム全体構成

今回のシステムは、KV260(エッジ)、PC(クライアント)、クラウドAIの3者が連携します。

[KV260: セマンティックカメラ] |-- YOLOX (物体検出) |-- API Server (app.py) ↑ (1) HTTP GET (Tool実行) | [PC: クライアントアプリ] <--(2) Prompt/Response--> [Cloud LLM (Gemini)] |-- User Input |-- Function Calling制御KV260は、物体検出結果をAPIで提供する「セマンティックカメラ」として常時稼働します。

PC上のアプリがユーザーと対話し、クラウドAI(LLM)に接続します。

LLMは、ユーザーの質問(例:「何が見える?」)に対し、必要であればKV260のAPIを叩くようPCに指示します。

———
MCPライクな最小構成(KV260の実装)

まずはエッジ側です。KV260を「セマンティックカメラ」にするためのサーバーアプリを構築します。

ファイルの準備

KV260用のファイル一式は以下からダウンロードしてください。

ダウンロードしたファイルを解凍し、KV260上の作業用フォルダ(例: `~/airtips_project/kv260`)に配置してください。

kv260/ ├── app.py # セマンティックカメラサーバー └── requirements.txt # 必要なライブラリ一覧`kv260` フォルダ内で以下を実行し、必要なライブラリをインストールします。

pip install -r requirements.txtコードのポイント解説 (`app.py`)

`app.py` は、YOLOXからの情報を受け取り、それを外部に公開する役割を持ちます。

# YOLOXからのデータ更新を受け取る窓口 @app.route('/detect', methods=['POST']) def update_detection(): global current_detection current_detection = request.json # ... # 外部(PC)からの問い合わせに答える窓口 @app.route('/tool/get_current_detection', methods=['GET']) def get_current_detection(): global current_detection return jsonify(current_detection)このように、内部からの報告を受け取るPOSTメソッドと、外部へ情報を渡すGETメソッドの2つを持つだけのシンプルな構成です。

———
クラウドAIとの連携(PC側の実装)

次に、PC側(クライアント環境)の実装です。

ファイルの準備

PC用のファイル一式は以下からダウンロードしてください。

PC上の作業用フォルダに解凍して配置してください。

pc/ ├── client.py # メインプログラム ├── llm_handler.py # LLM連携モジュール ├── tool_functions.py# ツール実行の実体 ├── tools.json # ツール定義 ├── config.json # 設定ファイル └── requirements.txt # 必要なライブラリ一覧`pc` フォルダ内で以下を実行し、ライブラリをインストールします。

pip install -r requirements.txt設定の変更

`config.json` を開き、以下の項目を設定してください。

`kv260_host`: KV260のIPアドレス(例: `http://192.168.1.10:5000`)

`gemini_api_key`: 取得したGoogle AI StudioのAPIキー

コードのポイント解説

このアプリの核となるのは、LLMに「私にはこんな道具(ツール)がありますよ」と教える部分と、LLMが「その道具を使いたい」と言った時に実際に動かす部分です。

1. ツールの定義 (`tools.json`)
「カメラ情報を見る能力」をLLMに提示します。

{ "tools": [ { "function_declarations": [ { "name": "get_current_detection", "description": "現在カメラに映っている物体の検出結果を取得します...", ... } ] } ] }2. ツール利用の促進 (`llm_handler.py`)
LLM(特に軽量モデル)は、会話に夢中になるとツールの存在を忘れてしまうことがあります。そこで、`tool_config` で「ツール利用を考慮せよ」と指示しています。

# Tool Useを促進するための設定 "tool_config": { "function_calling_config": { "mode": "AUTO" # 必要なら自動で使うモード } }
———
セマンティックカメラの実装 (semantic_camera.py)

いよいよ、映像を「意味」に変換してサーバーに送る部分です。
前編で使用したWebカメラ用のサンプルプログラム `main_models_movie.py` をベースに作成したスクリプト `semantic_camera.py` を使用します。

ファイルの準備

このファイルをダウンロードし、**前編で作成した作業ディレクトリ(`lib4dtc.so` がある場所)**に配置してください。

コードのポイント解説

前編のコードとの違いは、YOLOXが物体を見つけた直後に、その情報をサーバーへ「投函」する処理が追加されている点です。

# YOLOXによる推論実行 scores, boxes, classes = detector.detect(img) # ... (検出結果の整形) ... # 検出結果をサーバーに送信 try: requests.post("http://127.0.0.1:5000/detect", json={"objects": detected_objects}, timeout=0.05) except: pass # 送信に失敗しても、映像処理は止めない`requests.post` でデータを送るだけ。たったこれだけの変更で、普通のAIカメラが「ネットワーク連携カメラ」に進化します。

———
実行手順と動作確認

準備ができたら、システム全体を動かしてみましょう。

1. KV260側の起動(モニター接続推奨)

KV260にモニターとキーボードを接続し、2つのターミナルを開いてください。

ターミナル1: セマンティックカメラサーバーの起動

cd ~/airtips_project/kv260 python3 app.pyサーバーが起動し、情報の受け付けを開始します。

ターミナル2: セマンティックカメラの起動
前編と同様、4DTCへのアクセスには `sudo` が必要であり、ライブラリ参照のために `PYTHONPATH` の指定も必要です。
`lib4dtc.so` があるディレクトリに移動してから実行します。

cd ~/AIRTIPS/sample/yolo/onnx_yolox_deploy_relu/4dtc sudo PYTHONPATH=$LOCALPATH python3 semantic_camera.py画面にカメラ映像が表示され、物体検出が始まります。同時に、ターミナル1側にデータ受信のログが流れ始めれば成功です。

2. PC側の起動

PCのターミナルでクライアントアプリを実行します。

cd project/pc python client.py3. 会話の実行

クライアントアプリが起動したら、「何が見えますか?」と質問してみましょう。

実行ログ例:

You: 何が見えますか? AI思考中...[System] LLMがツール実行を要求しました: get_current_detection [Tool] KV260にアクセス中... (http://*.*.*.*:5000) [System] ツール実行結果: {'objects': [{'class': 'person', 'confidence': 0.791015625}, {'class': 'chair', 'confidence': 0.533203125}, {'class': 'tv', 'confidence': 0.474609375}]} AI: 現在、人、椅子、テレビが見えます。LLMが「今の状況を知るにはカメラを見る必要がある」と判断し、自律的にツールを実行して回答してくれます。

この仕組みを使えば、ただ答えるだけじゃなく、何か異常があったらスマホに教えてくれたり、家電を動かしたり...なんてこともできちゃいます。
では、実際にどうやって機能を増やせばいいのでしょうか? 次の章で、あなたのアイデアを形にするヒントを紹介します。

———
拡張のヒント:あなたのアイデアを形にしよう!

今回のコードは、ブロック遊びのように機能を追加できるように設計されています。「温度センサーもつけたいな」「不審者が来たら警報を鳴らしたいな」...そんなアイデアが、わずか数行のコードで実現できます。
ここでは、エッジデバイス(KV260)の特性を活かした拡張例を紹介します。ぜひ挑戦してみてください。

アイデア1:新しいツールを追加してみよう(温度センサーの例)

例えば、「部屋の温度」を取得するツールを追加したい場合、以下の3ステップで完了します。

Step 1: `tools.json` に定義を追加

// "tools" -> "function_declarations" の配列内に以下を追加 { "name": "get_temperature", "description": "現在の部屋の温度を取得します。", "parameters": { "type": "OBJECT", "properties": {} } }Step 2: `tool_functions.py` に関数を追加

# ファイルの末尾に追加 def get_temperature(host): # ここで実際のセンサーAPIを叩く return {"temperature": 25.5} # ダミーデータStep 3: `client.py` に登録

# execute_tool 関数内の tool_map に追加 tool_map = { "get_current_detection": tool_functions.get_current_detection, "get_temperature": tool_functions.get_temperature, # ここに追加! }たったこれだけで、LLMは「暑いですか?」という質問に対して温度センサーの値を確認し、「はい、25.5度なので快適ですね」と答えられるようになります。

アイデア2:過去の検知履歴を検索する(「さっき誰か来た?」)

常時稼働するエッジデバイスの強みは「記録」です。
`app.py` にリストを追加して履歴を保存すれば、「過去10分間に人が通った?」といった質問に答えられるようになります。

実装のヒント:

KV260側 (`app.py`): `history = []` というリストを用意し、`/detect` でデータを受け取るたびに `history.append(data)` します。そして、履歴を返す新しいAPI `/tool/search_history` を作成します。

PC側: 上記の「温度センサー」と同じ手順で、`search_history` ツールを追加します。

アイデア3:警備モードで警告を出す(「不審者がいたら教えて」)

LLMからの指示でエッジデバイスの状態(State)を変化させる例です。
「警備モードにして」と指示すると、KV260側でフラグが立ち、人を検知した際に画面に「WARNING」と赤文字で表示する、といった連携が可能になります。

実装のヒント:

KV260側 (`app.py`): `security_mode = False` というグローバル変数を用意し、これをON/OFFするAPI `/tool/set_security_mode` を作ります。

KV260側 (`semantic_camera.py`): データを送信した際、サーバーから現在の `security_mode` を受け取ります。

KV260側 (`semantic_camera.py`) の修正イメージ:

# サーバーからのレスポンスでモードを確認 response = requests.post(...) # 警備モードON かつ 人などの物体を検知した場合のみ警告を表示 if response.json().get('security_mode') and detected_objects: # KV260のモニター画面(OpenCVウィンドウ)に警告を描画 cv2.putText(img, "WARNING", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)このように、**「KV260にAPIを追加」→「PC側でツール定義」**という手順だけで、物理世界と対話するAIシステムを自由に作り上げることができます。

———
まとめ

KV260をセマンティックカメラ化し、MCPライクな構成でクラウドAIと連携させる方法を紹介しました。最小構成ながら、実用的な「対話型AIカメラ」が構築できたはずです。

ぜひ、このシステムをベースに、新しいエッジAIアプリケーションを開発してみてください。

参考文献

最後まで読んでいただき、ありがとうございました。