研究開発本部 山口典昭(やまぐちのりあき)
はじめに
前編では、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アプリケーションを開発してみてください。
参考文献
最後まで読んでいただき、ありがとうございました。