コンテンツにスキップ

設定ガイド (Configuration Guide)

バージョン: v3.11.1


Copyright (c) 2026 Masanori Sakai

Licensed under the MIT License


概要

このガイドでは、流星検出システムの各種設定方法とチューニング手法について説明します。

サンプル画面

全カメラ設定ページの例です。

Meteo ダッシュボードの設定画面サンプル

目次


カメラ命名規則(v3.11.0+)

v3.11.0 以降、generate_compose.py はカメラの内部名CAMERA{i}_NAME)を インデックスベースで固定 します。生成される内部名は camera1 / camera2 / camera3 ... のみで、IP アドレスを含みません。

本ドキュメントでは用語を以下の 2 種類に統一します(UI 側の表記揺れを避けるため)。

  • 内部名(CAMERA_NAME / CAMERA{i}_NAME: ディレクトリ名・SQLite の camera 列・runtime_settings/<name>.json のファイル名に使用。camera1 / camera2 ... で固定。
  • 表示名(CAMERA_NAME_DISPLAY / CAMERA{i}_NAME_DISPLAY: ダッシュボード UI のラベルにのみ使用。未設定時は内部名と同じ値が UI に出る。

背景

v3.10.x までは内部名に IP が含まれていました(例: camera1_10_0_1_25)。この方式には以下の課題がありました:

  • カメラの IP を変更すると内部名も変わり、過去の検出結果ディレクトリと紐づかなくなる
  • SQLite の camera 列にも旧名が残り続け、統計やフィルタが分断される

仕様

  • CAMERA{i}_NAME = camera{i} で常に固定される。streamers ファイルの 3 列目は表示名としてのみ扱われ、内部名には使われず、ダッシュボード UI の表示名 (CAMERA{i}_NAME_DISPLAY) にのみ反映される
  • 保存先ディレクトリは $DETECTIONS_DIR/camera{i}/runtime_settings/camera{i}.json なども同じ内部名で統一される
  • CAMERA_NAME_DISPLAY はあくまで表示名であり、ファイル名やディレクトリ名には使われない

旧環境からの移行

旧 IP ベースのディレクトリ(camera1_10_0_1_25/ など)が既にある場合は、スタンドアロンスクリプト migrate_camera_dirs.py で安全に移行できます。

# 実行前に必ず dry-run で内容確認
python migrate_camera_dirs.py --dry-run

# 問題なければ本実行(対話確認あり)
python migrate_camera_dirs.py

# 対話確認を省略する場合
python migrate_camera_dirs.py --yes

主な動作:

  • detections/camera{i}_*/ 配下のメディア(.mp4 / .jpg / .png)を detections/camera{i}/ へ移動
  • detections.jsonl は追記マージ
  • detections.dbcamera 列と各パスカラムを新名に一括 UPDATE(実行前に .bak_<timestamp> バックアップを自動作成)
  • 元の camera{i}_*/camera{i}_*.migrated_<timestamp>/ へリネームして残置

詳細手順は OPERATIONS_GUIDE.md の「v3.11.0 → カメラ名インデックス化アップデート」節を参照してください。


環境変数

カメラコンテナの環境変数

docker-compose.ymlで設定される環境変数:

変数名 デフォルト値 説明 設定例
TZ Asia/Tokyo タイムゾーン America/New_York
RTSP_URL - RTSPストリームURL rtsp://user:pass@192.0.2.25/live
CAMERA_NAME camera カメラの内部名(v3.11.0+ では generate_compose.py によって camera{i} に固定設定される) camera1
CAMERA_NAME_DISPLAY "" カメラの表示名(ダッシュボード UI のみで使用、ディレクトリ名には使われない) 東側
SENSITIVITY medium 検出感度 low / medium / high / faint / fireball
SCALE 0.5 処理スケール 0.25 ~ 1.0
BUFFER 15 リングバッファ秒数(RTSP Webは検出前後1秒+最大検出時間に上限調整) 10 ~ 30
EXCLUDE_BOTTOM 0.0625 画面下部除外率 0.0 ~ 0.25
EXTRACT_CLIPS true クリップ動画保存 true / false
LATITUDE 35.3606 観測地の緯度 35.6762(東京)
LONGITUDE 138.7274 観測地の経度 139.6503(東京)
TIMEZONE Asia/Tokyo タイムゾーン名 UTC / Europe/London
ENABLE_TIME_WINDOW true 天文薄暮時間帯制限 true / false
WEB_PORT 8080 内部HTTPポート 通常変更不要
MASK_IMAGE "" 事前生成済みマスク画像(優先) /app/mask_image.png
MASK_FROM_DAY "" 昼間画像からマスク生成 /app/mask_from_day.jpg
MASK_DILATE 20 マスク拡張ピクセル数 10 / 30
MASK_SAVE "" マスク保存先 /output/masks/camera1_mask.png
NUISANCE_MASK_IMAGE "" ノイズ帯マスク画像(v1.12.0+) /app/nuisance_mask.png
NUISANCE_FROM_NIGHT "" 夜間画像からノイズ帯マスク生成(v1.12.0+) /app/nuisance_night.jpg
NUISANCE_DILATE 3 ノイズ帯マスク拡張ピクセル数(v1.12.0+) 2 / 5
NUISANCE_OVERLAP_THRESHOLD 0.3 ノイズ帯重複率閾値(v1.12.0+) 0.2 ~ 0.5
EXCLUDE_EDGE_RATIO 0.0 画面四辺除外率(v1.16.0+) 0.0 ~ 0.2
TWILIGHT_DETECTION_MODE reduce 薄明時の検出動作(v3.5.0+) reduce(感度を下げて継続)/ skip(停止)
TWILIGHT_TYPE nautical 薄明の種類・太陽沈み角(v3.5.0+) civil(6°) / nautical(12°) / astronomical(18°)
TWILIGHT_SENSITIVITY low reduce モード時の感度プリセット(v3.5.0+) low / medium / high / faint
TWILIGHT_MIN_SPEED 200 reduce モード時の最小速度 px/秒(v3.5.0+)。鳥など遅い物体の誤認識を抑制 100 ~ 500
TWILIGHT_BIRD_FILTER_ENABLED true 薄明時の黒点フィルタ(鳥シルエット除外) true / false
TWILIGHT_BIRD_MIN_BRIGHTNESS 80 薄明時の除外輝度閾値(0-255、これ未満を除外) 40 ~ 120
BIRD_FILTER_ENABLED false 通常時の黒点フィルタ(opt-in) true / false
BIRD_MIN_BRIGHTNESS 80 通常時の除外輝度閾値 40 ~ 120

!!! warning "高閾値のリスク" BIRD_MIN_BRIGHTNESS および TWILIGHT_BIRD_MIN_BRIGHTNESS を 120 以上に設定すると暗い流星を誤除外するリスクがある。faint プリセット使用時は特に注意。

ダッシュボードの環境変数

変数名 デフォルト値 説明
PORT 8080 HTTPサーバーポート
LATITUDE 35.3606 観測地の緯度
LONGITUDE 138.7274 観測地の経度
TIMEZONE Asia/Tokyo タイムゾーン名
ENABLE_TIME_WINDOW false 天文薄暮時間帯制限(カメラコンテナ側のデフォルトは true
CAMERA1_NAME - カメラ1の内部名(ディレクトリ名・SQLite の camera 列に使われる)
CAMERA1_NAME_DISPLAY - カメラ1の表示名(ダッシュボード UI 専用。保存先ディレクトリや runtime_settings のファイル名には使われない)
CAMERA1_URL - カメラ1のURL
CAMERA1_STREAM_KIND webrtc ライブ表示方式 (mjpeg / webrtc)
CAMERA1_STREAM_URL CAMERA1_URL ライブ表示用URL (webrtc 時は http://localhost:1984/stream.html?src=camera1&mode=webrtc&mode=mse... など。埋め込み時はダッシュボード表示中のホスト名を優先して接続)
DETECTIONS_DIR /output 検出結果ディレクトリ
CAMERA1_YOUTUBE_KEY - カメラ1のYouTubeストリームキー(設定時のみYouTube配信ボタン表示)
CAMERA1_RTSP_URL - カメラ1のRTSP URL(YouTube配信用。ffmpegでAAC変換に使用)
GO2RTC_API_URL http://localhost:1984 go2rtc APIのURL(Docker内では自動的に http://go2rtc:1984 に変換)
CAMERA_MONITOR_ENABLED true カメラ監視有効化
CAMERA_MONITOR_INTERVAL 2.0 カメラ監視間隔(秒)
CAMERA_MONITOR_TIMEOUT 6.0 監視タイムアウト(秒)
CAMERA_RESTART_TIMEOUT 5.0 再起動リクエストのタイムアウト(秒)
CAMERA_RESTART_COOLDOWN_SEC 120 再起動クールダウン(秒)
CAMERA_MONITOR_FAIL_THRESHOLD 12 監視失敗閾値(連続N回失敗で再起動)
DETECTION_MONITOR_INTERVAL 2.0 検出結果ファイル監視間隔(秒)

環境変数の設定方法

方法1: generate_compose.pyで一括設定

python generate_compose.py \
  --streamers streamers \
  --sensitivity high \
  --scale 0.5 \
  --buffer 15 \
  --streaming-mode webrtc \
  --latitude 35.6762 \
  --longitude 139.6503 \
  --enable-time-window true \
  --extract-clips true \
  --mask-output-dir masks

方法2: docker-compose.ymlを直接編集

services:
  camera1:
    environment:
      - SENSITIVITY=high
      - SCALE=0.5
      - EXTRACT_CLIPS=false

  dashboard:
    environment:
      - CAMERA1_STREAM_KIND=webrtc
      - CAMERA1_STREAM_URL=http://localhost:1984/stream.html?src=camera1&mode=webrtc&mode=mse&mode=hls&mode=mjpeg&background=false

webrtc を Docker 内の go2rtc で使う場合は、go2rtc.yamlwebrtc.candidates にブラウザから到達可能なホスト側 IP/ポートを設定してください。generate_compose.py は既定でローカル IP を自動検出して設定し、必要な場合だけ --go2rtc-candidate-host <host-ip> で上書きできます。

go2rtcwebrtc.candidates で指定した host candidate に加えて、STUN 由来の srflx candidate を返すことがあります。srflx がログやブラウザ開発者ツールに見えても異常ではありません。重要なのは、同時に指定した host candidate も返っており、最終的な表示モードが RTC になっていることです。

方法3: .envファイルを使用

# .env ファイルを作成
cat > .env << 'EOF'
# 全カメラ共通設定
SENSITIVITY=medium
SCALE=0.5
BUFFER=15
EXTRACT_CLIPS=true

# 観測地点
LATITUDE=35.6762
LONGITUDE=139.6503
ENABLE_TIME_WINDOW=true

# RTSP認証情報(セキュリティ向上)
RTSP_USER=username
RTSP_PASS=password
EOF

chmod 600 .env  # パーミッション制限

docker-compose.ymlで参照:

environment:
  - SENSITIVITY=${SENSITIVITY:-medium}
  - RTSP_URL=rtsp://${RTSP_USER}:${RTSP_PASS}@192.0.2.25/live

ダッシュボード一括設定(再ビルド不要) v1.13.0+

/settings から全カメラへ設定を一括反映できます。

  • GET /settings: 設定UI
  • GET /camera_settings/current: 現在値取得
  • POST /camera_settings/apply_all: 全カメラ一括反映

反映タイミング

即時反映(再起動不要): - 検出パラメータ: diff_threshold, min_brightness, min_linearity, min_length, min_speed, min_duration, max_duration, min_area, max_area - ノイズ除外パラメータ: nuisance_overlap_threshold, nuisance_path_overlap_threshold, min_track_points, max_stationary_ratio, small_area_threshold - 録画マージン設定(v1.14.0+): clip_margin_before, clip_margin_after - マスク設定: mask_dilate, nuisance_dilate, mask_*, nuisance_* の画像パス - 画面端除外(v1.16.0+): exclude_edge_ratio

自動再起動で反映(再ビルド不要): - 基本設定: sensitivity, scale, buffer, extract_clips

永続化

起動時依存の設定は output/runtime_settings/<camera>.json に保存されます。 これにより、コンテナ再起動後も同じ設定が維持されます。 <camera> には CAMERA_NAME内部名が使われ、CAMERA_NAME_DISPLAY表示名には切り替わりません。

設定変更の推奨手順

  1. ダッシュボードの /settings ページにアクセス
  2. 変更したいパラメータを入力(差分のみハイライト表示)
  3. 「全カメラに適用」ボタンで一括反映
  4. 即時反映項目はリアルタイムで適用、再起動項目は自動で再起動
  5. output/runtime_settings/<camera>.json に永続化され、次回起動時も有効

SQLite 検出データベース(v3.6.0+)

概要

ダッシュボードは $DETECTIONS_DIR/detections.db(SQLite)を検出データの正本として使用する。 検出エンジンは引き続き各カメラの detections.jsonl に追記し、ダッシュボードが増分同期で SQLite へ取り込む。

自動生成

$DETECTIONS_DIR/detections.db はダッシュボード起動時に自動生成される。手動での作成は不要。

初回移行

既存の detections.jsonl を SQLite へ移行するには、初回のみ以下を実行する:

source .venv/bin/activate
python scripts/migrate_jsonl_to_sqlite.py

DETECTIONS_DIR 環境変数が設定されていない場合、カレントディレクトリの detections/ が対象になる。

ロールバック

既存の JSONL ファイルは移行後も削除されない。SQLite を使わない状態に戻す場合は detections.db を削除するだけでよい。

詳細

SQLite スキーマ、JSONL → SQLite 同期アルゴリズム、主要 API(query_detections() / soft_delete / count_asset_references など)の詳細は DETECTION_STORE.md を参照してください。


マスク設定(固定カメラ向け)

streamers ファイルの書式

streamers ファイルでは | 区切りで最大4フィールドを指定できます。

RTSP URL | マスク画像 | 表示名 | youtube:STREAM_KEY
フィールド 必須 説明
RTSP URL カメラのRTSP接続URL
マスク画像 - 除外マスク生成用の昼間画像パス
表示名 - ダッシュボード UI の表示名CAMERA{i}_NAME_DISPLAY にマップされる。内部名には使われない)
youtube:KEY - YouTube Liveストリームキー(youtube:プレフィックス必須)
rtsp://user:pass@192.0.2.25/live | camera1.jpg | 東カメラ
rtsp://user:pass@192.0.2.3/live  | camera2.jpg | 西カメラ
rtsp://user:pass@192.0.2.11/live || 南カメラ | youtube:xxxx-xxxx-xxxx-xxxx

streamers に昼間画像を指定

streamersRTSP URL | 昼間画像 の形式にすると、generate_compose.py 実行時に 除外マスクを自動生成してコンテナに同梱します。

  • 画像パスは streamers と同じフォルダ基準(相対パス可)
  • マスク生成には OpenCV が必要

その場でマスクを更新(永続化)

ダッシュボードの「マスク更新」ボタンで、現在フレームからマスクを再生成できます。 保存先は /output/masks/<camera>_mask.png です。

generate_compose.py 再実行時のマスク保護

generate_compose.py は実行時に masks/.generated_hashes.json へ生成マスクの SHA256 ハッシュを記録します。 次回実行時にハッシュを比較し、手動で更新されたマスクは上書きしません

状況 動作
マスクファイルが存在しない 新規生成する
ハッシュ記録がない(初回 or 削除済み) 上書き生成する
ハッシュ一致(前回生成と同じ) 上書き生成する
ハッシュ不一致(手動更新済み) スキップ(上書きしない)

強制上書きする場合は --force-overwrite-masks オプションを指定します:

python generate_compose.py --force-overwrite-masks

.generated_hashes.json は git 管理対象にすることを推奨します(「システムが最後に生成したハッシュ」を追跡できるため)。

MASK_BUILD_DIR 環境変数

項目 内容
変数名 MASK_BUILD_DIR
設定主体 自動設定generate_compose.py が docker-compose.yml に埋め込む)
用途 コンテナ内の masks/ マウントパスを示す。ダッシュボードの「マスク更新」操作時に、コンテナ内の検出用パスへ書き込んだ後、この変数が示すパスにも同期書き込みする

!!! note "MASK_BUILD_DIR の扱い" MASK_BUILD_DIR はユーザーが手動設定する変数ではありません。また、.generated_hashes.json が削除または git 管理されていない場合、ハッシュ記録が失われるため generate_compose.py 再実行時に手動更新済みのマスクが上書きされることがあります。


ノイズ帯マスク設定(v1.12.0+)

概要

ノイズ帯マスク機能は、電線や部分照明など、動かない明るい線状物体による誤検出を防ぎます。 通常のマスクと異なり、ノイズ帯と軌跡が重複した場合のみ除外判定を行います。

設定パラメータ

パラメータ デフォルト値 説明 推奨値
nuisance_mask_image "" 事前生成済みノイズ帯マスク /app/nuisance_mask.png
nuisance_from_night "" 夜間画像からマスク自動生成 /app/nuisance_night.jpg
nuisance_dilate 3 マスク拡張ピクセル数 2 ~ 5
nuisance_overlap_threshold 0.3 重複率閾値(軌跡の何%がノイズ帯に重なったら除外) 0.2 ~ 0.5

設定方法

方法1: 環境変数で直接指定

environment:
  - NUISANCE_FROM_NIGHT=/app/nuisance_night.jpg
  - NUISANCE_DILATE=3
  - NUISANCE_OVERLAP_THRESHOLD=0.3

方法2: ダッシュボードから設定(v1.13.0+)

  1. /settings ページにアクセス
  2. nuisance_overlap_threshold を調整(0.2 = 20%重複で除外)
  3. 「全カメラに適用」で即時反映

使用例:電線対策

電線が画面中央を横切る場合:

environment:
  - NUISANCE_FROM_NIGHT=/app/night_with_wires.jpg
  - NUISANCE_DILATE=5  # 電線を太めに認識
  - NUISANCE_OVERLAP_THRESHOLD=0.25  # 軌跡の25%以上が電線に重なったら除外

注意事項

  • 夜間画像を使用: 電線や照明が明るく写っている夜間画像が必要
  • 通常マスクとの併用: 建物など完全除外したい領域は通常マスクを使用
  • 重複率の調整: 値を小さくすると除外が厳しく、大きくすると緩くなる

検出パラメータ

物理量に読み替える目安(天文観測者向け)

検出しきい値はコード上 px / px/s ですが、観測上は「何km・何km/sか」が重要です。 ここでは、ATOM Cam 2 の水平画角を 120度、解像度を 1920x1080 として読み替えます。

前提: - 水平1pxあたり角度: 120 / 1920 = 0.0625度(約 0.0010908 rad) - 距離 R km に対して - 見かけ長さ L ≈ R * 角度(rad) - 見かけ速度 V ≈ R * 角速度(rad/s)

現在の標準しきい値(medium): - min_length = 20 px - min_speed = 50 px/s

距離別の換算目安:

想定距離 R 最小検出長(20px) 最小見かけ速度(50px/s)
100 km 約 2.18 km 約 5.45 km/s
200 km 約 4.36 km 約 10.91 km/s
300 km 約 6.55 km 約 16.36 km/s

読み方: - 距離が遠いほど、同じ px でも実距離・実速度は大きくなります - 低空(低仰角)で見える流星は距離が伸びやすく、300km前後になることがあります - 運用上は「この設定で拾える最低ライン」を km/km/s で把握しておくと調整しやすくなります

DetectionParams クラス

meteor_detector_rtsp_web.py内で定義されるパラメータ:

@dataclass
class DetectionParams:
    diff_threshold: int = 30          # 差分閾値
    min_brightness: int = 200         # 最小輝度
    min_length: int = 20              # 最小軌跡長 (px)
    max_length: int = 5000            # 最大軌跡長 (px)
    min_duration: float = 0.1         # 最小継続時間 (秒)
    max_duration: float = 10.0        # 最大継続時間 (秒)
    min_speed: float = 50.0           # 最小速度 (px/s)
    min_linearity: float = 0.7        # 最小直線性 (0-1)
    min_area: int = 5                 # 最小面積 (px²)
    max_area: int = 10000             # 最大面積 (px²)
    max_gap_time: float = 0.2         # 最大トラッキング間隔 (秒)
    max_distance: float = 80          # 最大移動距離 (px)
    exclude_bottom_ratio: float = 1/16 # 画面下部除外率

パラメータの詳細説明

diff_threshold(差分閾値)

説明: フレーム間差分の閾値。この値を超える変化を検出対象とする

影響: - 低い値(15-20): 小さな変化も検出 → 感度高、誤検出も増加 - 高い値(40-50): 大きな変化のみ検出 → 感度低、誤検出減少

推奨値: - 明るい環境: 40 - 通常環境: 30 - 暗い環境: 20

調整例:

# コード内で直接変更する場合
params = DetectionParams()
params.diff_threshold = 25  # より敏感に

min_brightness(最小輝度)

説明: 検出対象とする最小の明るさ(0-255)

影響: - 低い値(150-180): 暗い流星も検出 - 高い値(220-255): 明るい流星のみ検出

推奨値: - 市街地(光害あり): 220 - 郊外: 200 - 山間部(光害なし): 180


min_length / max_length(軌跡長)

説明: 検出する軌跡の長さ範囲(ピクセル)

min_length の影響: - 短い(10-15px): 短い軌跡も検出 → 誤検出増加 - 長い(30-50px): 長い軌跡のみ → 見逃し増加

推奨値: - 1920x1080: min=20, max=5000 - 1280x720: min=15, max=3000 - 640x480: min=10, max=2000


min_duration / max_duration(継続時間)

説明: 検出する軌跡の時間範囲(秒)

推奨値: - 通常の流星: min=0.1, max=10.0 - 火球専用: min=0.5, max=20.0


min_speed(最小速度)

説明: 検出する最小移動速度(ピクセル/秒)

影響: - 低い値(20-30): ゆっくり動く物体も検出 → 航空機を誤検出 - 高い値(70-100): 速い物体のみ → 流星の見逃しが増える

推奨値: 50 px/s

参考: 流星の典型的な速度は100-500 px/s


min_linearity(最小直線性)

説明: 軌跡の直線度合い(0.0-1.0)。1.0が完全な直線

影響: - 低い値(0.5-0.6): 曲がった軌跡も検出 - 高い値(0.8-0.9): ほぼ直線のみ検出

推奨値: 0.7

計算方法: 主成分分析(PCA)による固有値比


exclude_bottom_ratio(画面下部除外率)

説明: 画面下部の除外範囲(0.0-1.0)

用途: 地上の建物や木などの誤検出を防ぐ

推奨値: - 空のみ撮影: 0.0 - 地平線が写る: 0.0625(1/16) - 建物が多い: 0.125(1/8)

:

画面高さ 1080px × 0.0625 = 下から67.5px を除外

exclude_edge_ratio(画面四辺除外率) v1.16.0+

説明: 画面四辺(上下左右)からの除外割合(0.0-0.2)

用途: 画面端のノイズや歪みによる誤検出を防ぐ

影響: - 0.0(デフォルト): 除外なし - 0.05: 各辺から5%を除外 - 0.1: 各辺から10%を除外 - 0.2(最大): 各辺から20%を除外

推奨値: - 通常運用: 0.0 - 画面端ノイズあり: 0.05 - 魚眼レンズ(歪み大): 0.1

設定方法:

# generate_compose.pyで設定
python generate_compose.py --exclude-edge-ratio 0.05

# docker-compose.ymlで設定
environment:
  - EXCLUDE_EDGE_RATIO=0.05

# ダッシュボードから即時反映
# /settings ページで exclude_edge_ratio を設定

:

画面サイズ 1920x1080、EXCLUDE_EDGE_RATIO=0.05 の場合:
- 左右: 1920 × 0.05 = 96px ずつ除外
- 上下: 1080 × 0.05 = 54px ずつ除外
- 有効領域: 1728 × 972px

注意事項: - exclude_bottom_ratio と併用可能(下部のみさらに除外) - 値を大きくしすぎると検出範囲が狭まる


clip_margin_before / clip_margin_after(録画マージン設定) v1.14.0+

説明: 検出イベント前後に追加で録画する時間(秒)

用途: 流星の出現直前・直後の状況も記録

デフォルト値: - clip_margin_before: 0.0秒 - clip_margin_after: 0.0秒

推奨値: - 標準運用: before=0.5, after=0.5 - 詳細記録: before=1.0, after=1.0 - ディスク節約: before=0.0, after=0.0

設定方法:

# docker-compose.ymlで設定(v1.14.0以降)
environment:
  - CLIP_MARGIN_BEFORE=0.5
  - CLIP_MARGIN_AFTER=0.5
# ダッシュボードから即時反映(v1.14.0+)
# /settings ページで clip_margin_before, clip_margin_after を設定

使用例:

検出時間 10:00:05.0 ~ 10:00:07.0(2秒間)の場合: - margin_before=0.5, margin_after=0.5 設定時 - 録画範囲: 10:00:04.5 ~ 10:00:07.5(3秒間)

メリット: - 流星の出現前の空の状態を確認可能 - 複数の流星が連続した場合も記録 - 検出漏れの前後フレームも保存

注意事項: - BUFFER設定より大きい値は無効 - 値を大きくするとファイルサイズが増加


感度プリセット

プリセット一覧

プリセット diff_threshold min_brightness 用途 誤検出率
low 40 220 明るい流星のみ
medium 30 200 バランス型(推奨)
high 20 180 暗い流星も検出 やや高
faint 16 150 短く暗い流星の取りこぼし低減
fireball 15 150 火球専用

プリセットの適用

# generate_compose.pyで設定
python generate_compose.py --sensitivity high

# または docker-compose.ymlで直接設定
environment:
  - SENSITIVITY=high

プリセット別の特徴

low(低感度)

特徴: - 明るい流星のみ検出 - 誤検出が最も少ない - 暗い流星は見逃す

推奨環境: - 市街地(光害が多い) - 満月期 - テスト運用時

検出例: - -3等級以上の明るい流星 - 火球


medium(中感度)★推奨

特徴: - バランスの取れた設定 - 多くの環境で良好な結果 - 誤検出と見逃しのバランスが良い

推奨環境: - 郊外 - 標準的な観測環境 - 長期運用

検出例: - 0等級~-3等級の流星 - 一般的な散在流星 - 流星群の流星


high(高感度)

特徴: - 暗い流星も検出 - 誤検出がやや増える - 見逃しが少ない

推奨環境: - 山間部(光害が少ない) - 新月期 - 流星群極大期

検出例: - +2等級~-5等級の流星 - 微光流星

注意点: - 航空機を誤検出する可能性 - ログ確認が必要


fireball(火球専用)

特徴: - 最も敏感な設定 - 長時間・大きな物体を検出 - 誤検出が多い

推奨環境: - 火球専用観測 - 短期集中観測

検出例: - -4等級以上の火球 - 長時間光る流星

追加設定:

max_duration = 20.0  # 長時間OK
min_speed = 20.0     # ゆっくりでもOK
min_linearity = 0.6  # 多少曲がってもOK

処理スケール設定

SCALE パラメータ

説明: フレームを縮小して処理する比率(0.0-1.0)

影響:

SCALE 処理サイズ(1920x1080の場合) CPU使用率 メモリ使用量 検出精度
1.0 1920x1080(等倍) 100% 400MB 最高
0.5 960x540(推奨) 30% 200MB
0.25 480x270 15% 100MB

推奨設定

graph TD
    Start["ハードウェア性能"]
    CheckCPU{"CPUコア数"}
    CheckMem{"メモリ容量"}
    CheckCamera{"カメラ数"}

    Scale100["SCALE=1.0<br/>最高精度"]
    Scale050["SCALE=0.5<br/>推奨"]
    Scale025["SCALE=0.25<br/>省リソース"]

    Start --> CheckCPU
    CheckCPU -->|"8コア以上"| Scale100
    CheckCPU -->|"4コア"| CheckMem
    CheckCPU -->|"2コア以下"| Scale025

    CheckMem -->|"16GB以上"| Scale050
    CheckMem -->|"8GB以下"| CheckCamera

    CheckCamera -->|"1-2台"| Scale050
    CheckCamera -->|"3台以上"| Scale025

    style Scale050 fill:#dff6e8

スケール別の特徴

SCALE=1.0(等倍処理)

メリット: - 最高精度 - 小さな流星も検出 - 軌跡が正確

デメリット: - CPU使用率が高い(90-100%) - メモリ消費が大きい - 多数カメラには不向き

推奨環境: - 高性能PC(8コア以上、16GB RAM以上) - カメラ1-2台 - 短期観測


SCALE=0.5(推奨)

メリット: - 精度とパフォーマンスのバランスが良い - CPU使用率30-50% - 多数カメラに対応可能

デメリット: - 微小な流星は検出困難

推奨環境: - 標準的PC(4コア、8GB RAM) - カメラ3-5台 - 長期運用


SCALE=0.25(省リソース)

メリット: - 最も軽い - CPU使用率15-20% - 多数カメラ対応

デメリット: - 検出精度が低下 - 小さな流星は見逃す

推奨環境: - 低スペックPC(2コア、4GB RAM) - カメラ6台以上 - 明るい流星のみ検出


天文薄暮時間帯設定

ENABLE_TIME_WINDOW の仕組み

説明: 天文薄暮期間(前日の日没~翌日の日出)のみ検出を有効化

gantt
    title 1日の検出スケジュール
    dateFormat HH:mm
    axisFormat %H:%M

    section 検出OFF
    日中(検出無効): done, day, 06:00, 10h

    section 検出ON
    夜間(検出有効): active, night1, 16:00, 14h
    夜間(検出有効): active, night2, 00:00, 6h

設定方法

# generate_compose.pyで設定
python generate_compose.py \
  --enable-time-window true \
  --latitude 35.6762 \
  --longitude 139.6503

# docker-compose.ymlで直接設定
environment:
  - ENABLE_TIME_WINDOW=true
  - LATITUDE=35.6762
  - LONGITUDE=139.6503
  - TIMEZONE=Asia/Tokyo

座標の取得方法

方法1: Google Mapsで取得

  1. Google Mapsで観測地点を右クリック
  2. 表示される座標をコピー
  3. 例: 35.6762, 139.6503

方法2: コマンドラインで取得

# curlで現在地の座標を取得
curl -s "https://ipapi.co/json/" | jq '.latitude, .longitude'

主要都市の座標

都市 緯度 経度
東京 35.6762 139.6503
大阪 34.6937 135.5023
札幌 43.0642 141.3469
福岡 33.5904 130.4017
那覇 26.2124 127.6809
富士山頂 35.3606 138.7274

時間帯の確認

# ダッシュボードのAPIで確認
curl "http://localhost:8080/detection_window?lat=35.6762&lon=139.6503" | jq

# レスポンス例
{
  "start": "2026-02-01 16:45:23",
  "end": "2026-02-02 06:12:45",
  "enabled": true,
  "latitude": 35.6762,
  "longitude": 139.6503
}

薄明動作モード(v3.5.0+)

ENABLE_TIME_WINDOW=true の場合、検出対象の夜間時間帯に加えて、薄明(twilight)期間の検出挙動を個別に制御できます。薄明期間は astro_twilight_utils.py によって太陽の沈み角(civil / nautical / astronomical)別に計算されます(詳細は ASTRO_UTILS.mdastro_twilight_utils.py 節を参照)。

関連環境変数

変数名 デフォルト値 説明
TWILIGHT_DETECTION_MODE reduce 薄明期間中の検出動作。reduce(感度を下げて継続)/ skip(候補除外)
TWILIGHT_TYPE nautical 薄明の定義。civil(6°) / nautical(12°) / astronomical(18°)
TWILIGHT_SENSITIVITY low reduce モード時に適用する感度プリセット
TWILIGHT_MIN_SPEED 200 reduce モード時の最小速度 (px/s)。鳥や航空機など遅い物体の誤検出抑制

モード別の挙動

  • reduce(推奨): 薄明期間中のみ TWILIGHT_SENSITIVITY プリセットを適用し、min_speedTWILIGHT_MIN_SPEED まで引き上げる。明るい物体は通常通り検出されるが、鳥・飛行機など遅く暗めの物体が混入しにくくなる
  • skip: 薄明期間中は全候補を破棄する。誤検出を最も抑える代わりに、薄明直後の明るい流星も取りこぼす

鳥シルエット除外フィルタ

薄明時は空が明るく、鳥が「黒い塊」として差分検出にかかることがあります。これを抑えるため、detection_filters.pyfilter_dark_objects() によって 平均輝度が閾値未満のオブジェクトを除外 できます。

変数名 デフォルト値 適用タイミング
TWILIGHT_BIRD_FILTER_ENABLED true 薄明期間中のみ有効(opt-out)
TWILIGHT_BIRD_MIN_BRIGHTNESS 80 薄明時の輝度閾値(これ未満は鳥とみなして除外)
BIRD_FILTER_ENABLED false 通常夜間時間帯にも適用(opt-in)
BIRD_MIN_BRIGHTNESS 80 通常時の輝度閾値

!!! warning "高閾値のリスク" 閾値 120 以上は暗い流星を誤除外するリスクがあります。faint プリセット使用時は特に注意してください。

設定例

# 薄明時は反応を抑えたい(reduce モード、civil 薄明まで抑制)
environment:
  - ENABLE_TIME_WINDOW=true
  - TWILIGHT_TYPE=civil
  - TWILIGHT_DETECTION_MODE=reduce
  - TWILIGHT_SENSITIVITY=low
  - TWILIGHT_MIN_SPEED=250
  - TWILIGHT_BIRD_FILTER_ENABLED=true
# 薄明中は完全停止する(skip モード)
environment:
  - ENABLE_TIME_WINDOW=true
  - TWILIGHT_TYPE=nautical
  - TWILIGHT_DETECTION_MODE=skip

ハードウェア別推奨設定

低スペックPC(2コア、4GB RAM)

environment:
  - SENSITIVITY=medium
  - SCALE=0.25
  - BUFFER=10
  - EXTRACT_CLIPS=false  # クリップ動画を保存しない
  - ENABLE_TIME_WINDOW=true

カメラ数: 最大2台


標準PC(4コア、8GB RAM)★推奨

environment:
  - SENSITIVITY=medium
  - SCALE=0.5
  - BUFFER=15
  - EXTRACT_CLIPS=true
  - ENABLE_TIME_WINDOW=true

カメラ数: 3-5台


高性能PC(8コア以上、16GB RAM以上)

environment:
  - SENSITIVITY=high
  - SCALE=0.75
  - BUFFER=20
  - EXTRACT_CLIPS=true
  - ENABLE_TIME_WINDOW=false  # 常時検出

カメラ数: 8台以上


Raspberry Pi 4(4GB)

environment:
  - SENSITIVITY=low
  - SCALE=0.25
  - BUFFER=10
  - EXTRACT_CLIPS=false
  - ENABLE_TIME_WINDOW=true

カメラ数: 最大1台

注意: 長時間運用時はヒートシンク必須


チューニング方法

ステップ1: ベースライン設定

# 推奨設定で開始
python generate_compose.py \
  --sensitivity medium \
  --scale 0.5 \
  --buffer 15

./meteor-docker.sh start

ステップ2: 誤検出の確認

# 1時間運用後、検出結果を確認
ls -lh ./detections/camera1_*/

# ダッシュボードで確認
open http://localhost:8080/

誤検出の種類: - 航空機(点滅する光、ゆっくり移動) - 昆虫(不規則な動き) - 雲の移動(広範囲、ゆっくり) - 車のヘッドライト(画面下部)


ステップ3: 感度調整

誤検出が多い場合

# 感度を下げる
python generate_compose.py --sensitivity low

# または画面下部除外を増やす
python generate_compose.py --exclude-bottom 0.125

見逃しが多い場合

# 感度を上げる
python generate_compose.py --sensitivity high

# さらに短く暗い流星を拾いたい
python generate_compose.py --sensitivity faint

ステップ4: パフォーマンス調整

# リソース使用率を確認
./meteor-docker.sh status

# CPU使用率が高い(70%以上)
python generate_compose.py --scale 0.25

# メモリ使用量が多い
python generate_compose.py --buffer 10

ステップ5: 長期運用

# 1週間運用後の統計
find ./detections -name "*.mp4" | wc -l

# 誤検出率を計算
# 誤検出率 = 誤検出数 / 総検出数

# 目標: 誤検出率 < 20%

環境別チューニング例

市街地(光害あり)

課題: 街灯、車のライト、建物の照明が多い

推奨設定:

environment:
  - SENSITIVITY=low
  - SCALE=0.5
  - EXCLUDE_BOTTOM=0.125  # 下部1/8を除外
  - ENABLE_TIME_WINDOW=true

params調整:

params.min_brightness = 220  # 明るい流星のみ
params.min_speed = 70        # 遅い物体を除外

郊外(標準環境)

推奨設定:

environment:
  - SENSITIVITY=medium
  - SCALE=0.5
  - EXCLUDE_BOTTOM=0.0625
  - ENABLE_TIME_WINDOW=true

そのままでOK


山間部(光害なし)

課題: 暗い流星も検出したい

推奨設定:

environment:
  - SENSITIVITY=faint
  - SCALE=0.75
  - EXCLUDE_BOTTOM=0.0
  - ENABLE_TIME_WINDOW=true

params調整:

params.min_brightness = 150
params.diff_threshold = 16
params.min_area = 5
params.max_distance = 90

トラブルシューティング

検出数が少なすぎる

原因: - 感度が低すぎる - 時間帯設定の問題

対策:

# 感度を上げる
python generate_compose.py --sensitivity high

# さらに取りこぼしを減らす
python generate_compose.py --sensitivity faint

# 時間帯制限を無効化
python generate_compose.py --enable-time-window false

誤検出が多すぎる

原因: - 感度が高すぎる - 航空機や昆虫を検出

対策:

# 感度を下げる
python generate_compose.py --sensitivity low

# 画面下部を除外
python generate_compose.py --exclude-bottom 0.125

CPUが高い

対策:

# 処理スケールを下げる
python generate_compose.py --scale 0.25

# カメラ数を減らす
# streamersファイルから一部削除

ディスク容量が足りない

対策:

# クリップ動画保存を無効化
# docker-compose.ymlで EXTRACT_CLIPS=false

# バッファを減らす
python generate_compose.py --buffer 10

# 古いファイルを削除
./meteor-docker.sh clean

バージョン別新機能

v3.4.6 - 全選択UI常時表示・Dockerfile.dashboard改善

変更点: - 検出結果一覧の全選択UIを常時表示化(選択モードトグル廃止)。日付選択直後からチェックボックス・「全選択/全解除」・「選択した N 件を削除」ボタンが利用可能。 - Dockerfile.dashboard の apt インストールを BuildKit cache mount 方式に変更。並列ビルド時のディスク枯渇を解消。

v3.4.5 - YouTube配信エンコーダ3段階フォールバック・Dockerfile修正

変更点: - YouTube 配信エンコーダを QSV → VAAPI → libx264 の3段階フォールバックに拡張 - Intel QSV 利用可能時: h264_qsv 720p 2000kbps(N100 等最新 Intel) - QSV 不可・VAAPI 利用可能時: h264_vaapi 720p 2000kbps(旧世代 Intel / AMD GPU) - どちらも不可: libx264 ultrafast 720p 2000kbps(CPU エンコード) - Dockerfile.dashboardpython:3.11-slim-bookworm (Debian 12) ベースに変更 - Docker Desktop for Mac の時刻ずれによる GPG 署名エラーを解消 - Ubuntu 専用の libmfx-gen1.2 パッケージを削除


v3.4.4 - YouTube配信のマルチプラットフォーム対応

新機能・変更点: - Intel QSV ハードウェアエンコードを自動検出し利用可能な場合は h264_qsv でエンコード - QSV 非対応環境(Apple Silicon 等)は libx264 ultrafast に自動フォールバック - YouTube 配信に自動再接続ループを追加(切断後 15 秒待機して再接続) - 映像解像度を 1280×720 に統一(CPU/GPU 負荷軽減) - Dockerfile.dashboard を Ubuntu 24.04 ベースに変更し Intel QSV パッケージを整備


v3.3.0 - YouTube Live配信

新機能: - ダッシュボードからカメラ単位でYouTube Liveへの配信開始/停止が可能 - streamers ファイルの4番目のフィールドに youtube:STREAM_KEY を指定 - ダッシュボードコンテナ内の ffmpeg サブプロセスが go2rtc の RTSP リレー経由で映像を取得し、YouTube に直接 RTMP 送信 - 配信中は「配信中 LIVE」ボタンがパルスアニメーションで表示 - 10秒間隔でプロセス状態を確認して配信状態を自動ポーリング

設定例:

# streamers ファイル
rtsp://user:pass@192.0.2.11/live || 南カメラ | youtube:xxxx-xxxx-xxxx-xxxx

新規環境変数: - CAMERA{i}_YOUTUBE_KEY — YouTubeストリームキー - CAMERA{i}_RTSP_URL — RTSP URL(ffmpeg AAC変換用) - GO2RTC_API_URL — go2rtc APIのURL(通常は自動設定)

注意事項: - YouTube は H.264 映像 + AAC 音声が必須。dashboard コンテナ内の ffmpeg が自動的に変換する - ffmpeg は -re フラグでリアルタイム読み込みを強制し、バースト送信を防止


v3.2.1 - 手動録画一覧表示改善

手動録画の一覧表示を改善。manual_recordings/<camera>/ 配下の録画ファイルが正しくリストアップされるよう修正。


v3.2.0 - 手動録画機能

新機能: - ダッシュボードから任意タイミングで録画予約が可能(録画予約 UI) - 手動録画の保存先: manual_recordings/<camera>/


v3.1.0 - WebRTC/go2rtc サポート

新機能: - generate_compose.py--streaming-mode webrtc オプションを追加 - --go2rtc-candidate-host <IP> でWebRTC candidateホストを上書き指定可能(未指定時は自動検出) - go2rtc.yaml の自動生成(--go2rtc-config で出力先変更可) - ダッシュボード環境変数 CAMERA1_STREAM_KIND=webrtc / CAMERA1_STREAM_URL によるWebRTC埋め込み表示

使用例:

python generate_compose.py \
  --streamers streamers \
  --streaming-mode webrtc \
  --go2rtc-candidate-host 192.0.2.10

v1.16.0 - 画面端ノイズ除外

新規パラメータ: - EXCLUDE_EDGE_RATIO(環境変数、デフォルト: 0.0、範囲: 0.0-0.2) - --exclude-edge-ratio(コマンドライン引数)

機能: 画面四辺(上下左右)から指定割合を除外し、端部のノイズや歪みによる誤検出を防止

使用例:

python generate_compose.py --exclude-edge-ratio 0.05

ダッシュボードから即時反映可能(再起動不要)


v1.14.0 - 録画マージン設定

新規パラメータ: - clip_margin_before: 検出前の追加録画時間(秒) - clip_margin_after: 検出後の追加録画時間(秒)

機能: 流星検出イベントの前後に余裕を持たせて録画

デフォルト値: 0.0秒(両方)

推奨値: 0.5秒(両方)

使用例:

environment:
  - CLIP_MARGIN_BEFORE=0.5
  - CLIP_MARGIN_AFTER=0.5

ダッシュボードから即時反映可能(再起動不要)


v1.13.0 - 全カメラ設定UI

新機能: - /settings ページによる全カメラへの一括設定 - 設定差分のハイライト表示 - output/runtime_settings/<camera>.json への永続化

即時反映項目(再起動不要): - 検出パラメータ(diff_threshold, min_brightness, min_linearity等) - ノイズ除外パラメータ - マスク設定 - 録画マージン設定(v1.14.0+) - 画面端除外設定(v1.16.0+)

自動再起動項目(再ビルド不要): - sensitivity, scale, buffer, extract_clips

メリット: - Docker再ビルド不要で設定変更可能 - 設定が永続化され、再起動後も維持 - 複数カメラへの設定を一括適用


v1.12.0 - ノイズ帯マスク

新規パラメータ: - nuisance_mask_image: 事前生成済みノイズ帯マスク画像 - nuisance_from_night: 夜間画像からマスク自動生成 - nuisance_dilate: マスク拡張ピクセル数(デフォルト: 3) - nuisance_overlap_threshold: 重複率閾値(デフォルト: 0.3)

機能: 電線、部分照明など固定された線状ノイズを除外

通常マスクとの違い: - 通常マスク: 領域内の検出を完全に無効化 - ノイズ帯マスク: 軌跡がノイズ帯と一定以上重複した場合のみ除外

使用例:

environment:
  - NUISANCE_FROM_NIGHT=/app/night_with_wires.jpg
  - NUISANCE_DILATE=5
  - NUISANCE_OVERLAP_THRESHOLD=0.25

ダッシュボードから閾値を即時調整可能


関連ドキュメント