ライブカメラに映った落雷をAmazon Novaで検出する試み
こんにちは。ウェザーニューズ モバイル・インターネット事業部の hoka です。
ウェザーニューズにはウェザーニュース アプリユーザーのみなさまにご協力いただき設置しているライブカメラが日本国内に 2000 ヵ所以上あります。ライブカメラの映像を動画理解モデルである Amazon Nova を使って解析し、落雷の検出を試してみました。
録画・検出例
落雷・稲妻がはっきり映っていることがわかります。
落雷の検出例(茨城県 土浦市)
落雷の検出例(石川県 珠洲市)
落雷検出のアプローチ
3 つのステップに分けて処理しています
- 落雷が発生した地点周辺のライブカメラを録画
- 映像内で輝度がスパイクした箇所の前後を切り出し
- Amazon Nova で落雷の有無を解析
Step 1: 落雷が発生した地点周辺のライブカメラを録画
落雷が発生した地点周辺のライブカメラをピックアップして録画しました。落雷の情報は、社内で使える落雷発生地点の緯度経度データを利用しました。落雷発生地点の周囲 4km 以内のライブカメラを抽出し、5 分間の録画をしています。
Step 2: 映像内で輝度がスパイクした箇所の前後を切り出し
映像内で輝度がスパイクした箇所を切り出しました。録画した全ての動画を Amazon Nova で解析するとコスト面・インフラ面の負荷が大きいため、まずは落雷が映った可能性がある箇所を絞り込んでいます。このステップでは落雷の有無を正確に検出する必要はないため、比較的軽量に処理できる輝度のスパイク検出を行いました。ffprobe を使ってフレームごとの輝度を取得し、フレーム間の輝度差分が 99.5 パーセンタイルを超えており、MAD(Median Absolute Deviation)が一定値を超えている箇所をスパイクとして検出しました。スパイクの前後を切り出し、次のステップで落雷の有無を判定するための動画としています。
輝度スパイク検出の可視化。青色の線がフレーム間の輝度差分、緑色の点線は 99.5 パーセンタイル、オレンジ色の線は 300 フレームの移動窓で算出した MAD を使ったしきい値。赤色の点がスパイクとして検出され、その前後を切り出している。
Step 3: Amazon Nova で落雷の有無を解析
Amazon Nova を使って落雷の有無を判定しました。Amazon Nova Lite, Pro をいくつかのサンプルで比較し、Pro のほうが JSON 出力のフォーマットや動画理解の内容が安定していると判断したため、今回は Pro を利用しました。Amazon Nova のプロンプトに関するベストプラクティス[1] [2]を参考に、役割、目的の提示、定義、誤検出対策、判断手順、出力検査などを記述したプロンプトを作成しました。また、Amazon Nova は動画を 1fps にサンプリングして解析するため[3]、落雷の瞬間が見落とされる可能性があります。そのため、オリジナルの動画を引き伸ばし、1fps にサンプリングした動画を作成して解析に使いました。
プロンプト
# 役割
あなたは定点観測カメラから得られた気象動画を分析する、慎重で経験豊富な気象アナリストです。
# 目的
次の JSON **のみ**を出力する(前後に説明文やコードフェンスを付けず、純粋な JSON オブジェクト 1 つを返す)。
- "overview": 日本語で 5〜7 文。動画全体の様子をできるだけ詳細・具体的に記述する。
- "transient_details": 1〜5 フレーム程度の一過性の細部を、発生位置・形状・明暗・時間的推移を含めできるだけ詳細・具体的に記述する。
- "thunder_elements": 稲妻と判定した要素がある場合、その形状(分岐/屈曲/樹枝状/太さ/長さ/曲率/本数)、位置(画面内の領域や方位/高度感)、時間特性(出現フレーム・持続フレーム・再発有無)、明確さ(コントラスト/エッジ鮮明度/背景との分離)をできるだけ詳細に記述する。該当がなければ空文字とする。
- "false_positive_analysis": 稲妻と判定した要素について、誤検出になりやすい要素かどうかの観察と判断(根拠・代替仮説・残る不確実性)を記述する。稲妻要素がなければ空文字とする。
- "has_lightning_bolt": 「稲妻」(1 本以上の高コントラストな線状・糸状の要素)が**明確に**確認できる場合のみ true。少しでも不確実性がある場合は false。
# 定義
- **稲妻**: 1 つ以上の高コントラストな線状・糸状パターン。**必ず分岐または屈曲を伴う**線・糸形状である。瞬間的出現が特徴。
# 誤検出対策(必ず適用)
以下はノイズまたは非稲妻現象として分類し、稲妻候補から外す。該当が確認できる場合は has_lightning_bolt=false を出力する。
- 夜間の白黒/ナイトビジョン映像に写る雨粒・雪片・虫・近距離の塵の白点/筋
- 車のヘッドライト、街灯、看板、建物の光、レンズフレア、路面や水面の反射
- カメラの露出変動/オートゲイン、圧縮ノイズ、タイムラプス由来の周期点滅
- 飛行機/ヘリの点滅灯、花火、サーチライト、信号機、遠方の工場光
- 画面端・地表近く・構造物近傍の一時的光跡(近接物やレンズ面の汚れ/滴を含む)
- 画面水平方向に帯状で瞬間的に出現する光(広域一様増光に伴う帯状ノイズ)
- 画面の両端に接する直線または帯
- 広範囲で均一に明るさが一時的に上がる現象(雲内部の発雷や遠雷の拡散光など)
- 放射状の発光(閃光)
- ほぼ直線の光
# 判断手順(内部推論。出力は JSON のみに限定)
1. 全体把握: 天気(晴れ/雲/降水/霧/雪など)と時間帯(昼/夜)を把握し、露出や色調の一様変化が自動露出かどうかを評価する。
2. 稲妻候補の抽出: 1〜数フレームで出現/消失する高コントラストで細い線状(分岐/屈曲/樹枝状を含む)パターンを、主に空の領域から検出する。
- 形態: 細線・糸状・樹枝状・分岐・屈曲を重視。滑らかな弧や長い直線的筋は虫/雨筋の可能性が高いためノイズ候補として扱う。
- 位置: 地上光源・道路・水面・建造物近傍の線状光跡は人工光や反射の可能性が高くノイズ候補として扱う。
- 時間: ごく短時間(1〜5 フレーム)での瞬間的出現を重視し、連続移動の軌跡は別クラスとして扱う。
3. 信頼性評価: 誤検出対策の各項目と照合し、形態・位置・時間特性が稲妻の特徴と整合するかを評価する。明確に整合すると判断できるときのみ has_lightning_bolt=true。
4. 記述生成:
- "overview" に全体の天候・視野・主要な現象を具体的に記述する。
- "transient_details" に 1〜5 フレーム級の細部を具体的に記述する。
- 稲妻要素がある場合は "thunder_elements" と "false_positive_analysis" を詳細に記述する。該当がなければ両フィールドは空文字とする。
# 出力検査
- 厳密な JSON スキーマに準拠し、末尾カンマのない JSON を返す。
- 文字列フィールドは文字列のみを使用し、真偽値は JSON の true/false を使用する。
- エスケープされた Unicode を出力に含めない。使用するのはエスケープされていないネイティブ文字に限定する。例えば、\u3492 などのシーケンスは含めない。
# 追加ルール
- 観測対象が不鮮明または判別困難な場合は、その旨を "overview" に明確に記述し、has_lightning_bolt は保守的に false を返す。
- 出力は **JSON オブジェクト 1 つだけ**とし、純粋な JSON を返す。
# 出力形式(厳密)
{
"overview": "string", // 日本語 5〜7 文。句点「。」で文を区切る
"transient_details": "string", // 1〜5 フレーム級の一過性細部を詳細に記述
"thunder_elements": "string", // 稲妻要素の詳細。該当なしの場合は空文字
"false_positive_analysis": "string", // 誤検出の可能性に関する観察と判断。該当なしの場合は空文字
"has_lightning_bolt": true | false // JSON ブール値
}
利用例とこれから
検出結果は社内向けツールで確認できるようにしています。また、ウェザーニューズのライブ放送(ウェザーニュース LiVE)で落雷の映像を紹介する際に利用しています。検出精度の評価・改善、落雷以外の事象の検出、コンテンツとしての活用を今後も進めていきます。
社内向けツールのスクリーンショット
Discussion