はじめに
夜空の美しい瞬間を捉えたい――天文ファンのロマンである流星観測を、市販のネットワークカメラ2台とローカルで動くマルチモーダルAI(VLM)を使って完全自動化するシステムを構築しました。
単なる「動体検知による常時録画」では、虫の羽音や飛行機の点滅灯などで大量の誤検知が発生してしまいます。本システムでは、OpenCVによる高速な差分トリガーと、ローカル環境で動作する軽量VLM(Qwen2.5-VL:7b)による高度な意味論的判定、さらには外部トレンド(RSS)のリアルタイム突合を組み合わせることで、実用的な自動観測パイプラインを実現しています。
今回は、そのアーキテクチャや「AI_76」と名付けた別班風ダッシュボード、そして検知時の前後10秒動画・静止画自動保存の仕組みまで詳しく解説します。

1. システムアーキテクチャと全体像
システムの全体像としては、Linuxサーバー/Docker環境をベースに、マルチプロセス・マルチスレッドで各カメラのストリームを常時監視しています。
- 入力: RTSPストリームカメラ 2台 (
192.168.1.37/192.168.1.38) - 一次判定(トリガー): OpenCVによるフレーム間差分(ピクセル変化量カウント)
- 二次判定(AI検証): Ollama経由のローカルVLM (
qwen2.5vl:7b) - 外部補完: Googleニュース等のRSSから火球・流れ星のトレンドをリアルタイム取得し、AIのプロンプトへ動的に反映
- 出力・可視化: Flask製ダークモード・司令室ダッシュボード「AI_76」 (ポート
8081) - エビデンス保存: 検知時の静止画(
screenshot/)および、リングバッファを活用した前後10秒間の動画(movie/)自動保存
2. 誤検知を防ぐための3つの工夫
夜間の屋外監視カメラは、ノイズの宝庫です。システムを実用に耐えるものにするため、主に3つの仕組みを実装しています。
① 「夜間限定モード」によるリソース最適化
昼間は太陽光の反射、雲の流れ、鳥や虫の往来により、VLMの無駄な呼び出しが頻発します。そのため、スクリプト内に時間判定ロジックを組み込み、日没から夜明け(17:30 〜 翌朝 05:30)の間に限定して監視・AI判定を行う設計にしています。
② 二段階フィルタリング(OpenCV + ローカルVLM)
すべてのフレームをAIに流すと負荷が高騰するため、軽量なOpenCVのフレーム差分で変化量を検知し、閾値を超えた瞬間だけを切り出してQwen2.5-VLに送り込みます。さらに、プロンプト内で「飛行機の点滅灯」「虫」「車のヘッドライト」などを除外すべき対象として厳格に指定しています。
③ 外部トレンド(RSS)の動的連携
トリガー検知時に非同期でニュースのRSSを参照し、世間で火球や流れ星の話題が盛り上がっている文脈をAIのプロンプトに自然に差し込むことで、認識精度を多角的にサポートしています。
3. 検知時の「前後10秒動画&静止画」自動保存ロジック
本システムの見どころの一つが、決定的な瞬間を逃さないエビデンス保存機能です。
- リングバッファの活用:
collections.dequeを用いて、メモリ上で常に直近10秒間のカメラフレームをストックし続けます。 - 未来フレームのキャプチャ: VLMが「YES(流星)」と判定した瞬間に、ストックしていた過去10秒分のフレームと、その後の未来10秒間のフレームを別スレッドで結合し、タイムスタンプ形式のMP4動画として保存します。
Python
# 保存先ディレクトリ構造
/home/owner/nas/docker/pythom/
├── screenshot/ # 例: 20261010_231530_Camera_37.jpg
└── movie/ # 例: 20261010_231530_Camera_37.mp4
4. 別班司令室風ダッシュボード「AI_76」
観測状況や検知ログをリアルタイムで把握するため、Flaskを用いた専用のコントロールセンターを構築しています。
- ダーク&サイバーな別班UI: 黒とディープブルーを基調とし、リアルタイムな解析フィードやシステム稼働状況を表示。
- 美しく色分けされたログビューア:
fireball.logの中身を自動パースし、検知アラート(ゴールド)やVLM判定結果(パープル)などをターミナル風に美しくハイライト表示します。

おわりに
ローカルLLM/VLMの急速な進化により、かつては高度な専用機材やクラウド連携が必須だった画像認識・監視システムが、自宅の環境だけで手軽に構築できるようになりました。
夜空のロマンと最新AI技術の融合、皆さんもぜひ自宅の観測環境にとり入れてみてはいかがでしょうか?

コメント