ロボ図鑑

レシピ: 家のカメラ×LLMで『何が起きたか』を言葉で受け取る

公開: 2026-08-09

監視カメラの通知は今も「動体を検知しました」で止まっている。本レシピでは、カメラ映像を vision 対応 LLM に読ませ、「玄関に宅配業者。荷物を置いて帰った」「猫が台所のコンロ横に乗っている」という言語化された通知に変える。設計の核心は一点だけ — LLM に常時映像を見せないこと。後述のコスト試算の通り、常時監視は月数十万円、イベント駆動なら月数百円で済む。

材料(機材・ソフト・費用概算)

構成図(テキスト)

構成A(最小・ポーリング型)
[カメラ] --RTSP--> [ffmpegで静止画抽出] --> [vision LLM(Claude API)] --> [ntfy/Slack通知]

構成B(実用・イベント駆動)
[カメラ] --RTSP--> [Frigate: 動体検知→物体検知(person/car/cat…)]
                       └-- イベント発生時のみスナップショット --> [vision LLM] --> [通知]

手順

構成A: ffmpeg + Claude API(30分で動く)

RTSPから静止画を抜く。単発と定期抽出の2パターン。

# 1枚だけスナップショット
ffmpeg -rtsp_transport tcp -i "rtsp://user:pass@192.168.1.50:554/stream1" \
  -frames:v 1 -q:v 2 snapshot.jpg

# 10秒に1枚を連続抽出(fps=1/10)
ffmpeg -rtsp_transport tcp -i "rtsp://user:pass@192.168.1.50:554/stream1" \
  -vf fps=1/10 -q:v 2 frames/frame_%04d.jpg

抜いた画像をvision LLMに渡す。監視用途は枚数が多いのでコスト優先で Haiku 4.5 を使う。

import base64, anthropic

client = anthropic.Anthropic()  # 環境変数 ANTHROPIC_API_KEY
img = base64.standard_b64encode(open("snapshot.jpg", "rb").read()).decode()

msg = client.messages.create(
    model="claude-haiku-4-5",
    max_tokens=300,
    messages=[{"role": "user", "content": [
        {"type": "image", "source": {"type": "base64",
         "media_type": "image/jpeg", "data": img}},
        {"type": "text", "text": "監視カメラ画像で起きていることを日本語1〜2文で。"
         "人・車・動物とその行動を具体的に。特筆すべきものがなければ『変化なし』とだけ。"},
    ]}],
)
print(msg.content[0].text)

通知はwebhookに流すだけ。

curl -d "$SUMMARY" ntfy.sh/your-topic

cronで回せば動くが、この構成のままポーリング間隔を詰めるとコストが爆発する(次節で数字を示す)。動作確認と仕組みの理解までがこの構成の役割で、実用は構成Bへ進む。

構成B: Frigateでイベント駆動にする

Frigate はOSSのAI NVR。RTSPを受けてローカルで動体検知→物体検知(person/car/cat等)し、イベント単位でスナップショットを切り出す。LLMに渡すのはこのイベント画像だけにする。

Frigateには Generative AI 機能が組み込みである(0.14で導入、現行0.17系では object descriptions と review summaries の2系統)。設定キーは genai、ネイティブproviderは Ollama / Google Gemini / OpenAI / Azure OpenAI と OpenAI互換API。Claudeを直接指定する口はないので、Claudeで統一したければ LiteLLM 等の OpenAI互換ゲートウェイを挟むか、後述の Home Assistant 経由を使う。

# Frigate config.yml(公式ドキュメントの例に準拠)
genai:
  provider: openai            # OpenAI互換。Claude利用時はゲートウェイ経由
  api_key: "{FRIGATE_OPENAI_API_KEY}"
  model: gpt-4o
objects:
  genai:
    enabled: True
cameras:
  front_door:
    objects:
      genai:
        enabled: True
        use_snapshot: True    # 高品質スナップショット1枚を送る

プロンプトは object_prompts でラベル別にカスタマイズできる(例: person: に「行動と意図を推定せよ」)。組み込み機能を使わず自前で組む場合も、FrigateはMQTTにイベントを流すので、イベント購読→スナップショット取得→構成Aのスクリプトに渡すだけで成立する。

Home Assistant 経由という選択肢

Home Assistant を運用しているなら、HACSカスタム統合の LLM Vision(v1.7系・活発に開発中)が最短。providerとして Anthropic / OpenAI / Gemini / Ollama 等をネイティブサポートし、image_analyzer / stream_analyzer 等のアクションで画像・カメラフィードを解析できる。付属ブループリントを使えば「カメラ通知にAI要約を付ける」自動化が設定だけで組め、Frigateのイベントも扱える。

コスト設計 — なぜ常時LLMは非現実的か

Claudeの画像トークンは ⌈幅/28⌉×⌈高さ/28⌉。1080p画像は自動縮小されて約1,560トークン/枚(Haiku 4.5等の標準解像度モデル)。Haiku 4.5 は入力$1/100万トークン・出力$5/100万トークン(2026年8月時点の公式料金。1ドル150円、出力150トークン/件で概算)。

方式 画像枚数 月額概算
常時1fps 86,400枚/日 ≈ 1.35億入力トークン/日 入力だけで約$4,000、出力込み約$6,000(約90万円)
イベント駆動(30件/日×1枚) 30枚/日 ≈ 5万入力トークン/日 約$2.2(約330円)

同じカメラ・同じモデルで約3,000分の1。これが「検知はローカル、理解だけLLM」という分業の根拠になる。さらに削るなら stream2(640×360)を渡せば約300トークン/枚と1/5になり、玄関の宅配判定程度なら精度も落ちない。

プライバシーと運用の注意

発展

参考情報

いずれも2026年8月に内容を実確認。

他のガイド