PR
AI・プログラミングトックリツバメ観察

リアルタイム動体検知で進化したYouTube野鳥配信システム 〜親鳥の訪問を定量化してヒナの成長を科学する〜

はじめに:なぜ親鳥の訪問回数を数えるのか?

前回の記事では、ラズパイでYouTubeライブ配信システムを構築して安定した野鳥観察配信を実現しました。しかし、実際に配信を続けるうちに「もっと配信を盛り上げたい」「科学的なデータが欲しい」という2つの課題が浮上してきました。

前回記事です。

https://take1bit.com/computer-ja/youtube_live_tsubame/

こちらがYoutubeライブ配信をトピック映像として集めたものになります。

課題1:固定テキストでは配信が単調

YouTube Live配信では、時刻表示だけでは視聴者にとって変化に乏しく、長時間の観察配信が単調になりがちでした。リアルタイムで変化する情報を表示することで、視聴者の関心を維持したいと考えました。

課題2:親鳥の訪問頻度とヒナの成長の関係を定量化したい

親鳥の訪問頻度は、ヒナの成長に直結する重要な指標です。健康なヒナほど頻繁な給餌が必要で、親鳥の訪問回数や滞在時間から、ヒナの状態や成長段階を推測できます。これまで感覚的な観察に頼っていた部分を、数値として可視化したかったのです。

課題3:作業時の親鳥の警戒時間を把握したい

野鳥観察では、ヒナが巣から落ちることがよくあります。その際、巣の周辺で作業すると親鳥が警戒し、しばらく巣に戻らなくなります。この警戒時間がどの程度続くかは重要な情報で、巣の放棄リスクを判断する基準になります。

直近の親鳥来訪時刻を常時表示することで、「作業後どのくらい経っているか」「まだ警戒している可能性があるか」を判断できるようになります。

解決策:UDP連携による動体検知システム

これらの課題を解決するため、配信プログラムと動体検知プログラムをUDP通信で連携させる仕組みを開発しました。

システムの全体像

技術的なポイント

1. ラズパイ5でも軽量動作を実現

ラズパイ5という限られたリソースで、YouTube配信と動体検知を同時実行するため、極限まで軽量化を追求しました:

  • 処理FPS: 2fps(配信は30fps、検知は2fps)
  • 検知解像度: 720×720(配信と同じ)
  • ROI指定: 巣エリアのみに限定(590×66ピクセル)
  • シンプルアルゴリズム: フレーム差分+連結成分解析

2. UDP通信による低遅延連携

FFmpegのteeマルチプレクサを使用して、YouTube配信と並行してUDP出力を生成:

ffmpeg -i /dev/video0 \
  -f tee \
  "[f=flv]rtmp://youtube.com/live2/STREAM_KEY|[f=mpegts]udp://localhost:1234"

3. リアルタイムテキスト更新

5秒間隔でファイル変更を監視し、更新があればFFmpegを再起動して画面テキストを更新する仕組みを実装しました。

動体検知アルゴリズムの詳細

実際の画像

以下のような画像を参考にして、左側の

これらの画像から以下の左下の部分はヒナは干渉せず、親鳥が来た時だけ画像が変わる部分なので、そこのエリアだけの動体検知を別プログラムで並走させます。

スコアリングシステム

親鳥の訪問判定には、複数の要素を組み合わせたスコアリングシステムを採用:

parent_score = 0

# 1. 動き検出(前フレームとの差分)
if recent_motion > 0.05:     # 5%の変化で +1点
    parent_score += 1

# 2. 面積変化(物体サイズ)  
if recent_area > 0.08:       # 8%の変化で +2点
    parent_score += 2

# 3. 明度変化(影の検出)
if recent_darkness > 0.3:    # 30%が暗くなると +2点
    parent_score += 2

# 4. 大きな物体検出
if large_objects > 0:        # 大きな物体で +2点
    parent_score += 2

# 合計4点以上で「訪問」と判定
if parent_score >= 4:
    visit_detected = True

パフォーマンス最適化

ROI(関心領域)の限定

巣のエリアのみに処理を限定することで、計算量を大幅削減:

# 巣エリアのみを切り出し(座標は実測値)
nest_roi = (26, 618, 590, 66)  # x, y, width, height
roi = frame[y:y+h, x:x+w]

履歴ベースの判定

過去5フレームの移動平均を使用して、ノイズに強い検知を実現:

self.motion_history = deque(maxlen=5)
recent_motion = np.mean(list(self.motion_history))

実装結果と配信画面

表示される情報

配信画面には4つの情報が表示されます:

┌─────────────────────────────────┐
│ 2024-08-24 14:30:15           │ ← 現在時刻(自動)
│ 2回目の産卵! 8月22日巣立ち予定  │ ← topic.txt
│ 訪問回数: 12回 滞在: 8.3秒     │ ← visit_info.txt(自動更新)
│ Youtube登録お願いします         │ ← stream.txt
└─────────────────────────────────┘

各ファイルの役割

  • topic.txt: 現在の状況・トピック(例:「産卵中」「抱卵期間」「巣立ち間近」)
  • visit_info.txt: 動体検知結果(JSON形式、自動生成)
  • stream.txt: 視聴者向けメッセージ(例:「チャンネル登録お願いします」)

実際のデータ例

実際の観察で得られた訪問データ(JSON形式):

{
  "count": 47,
  "last_duration": 15.2,
  "last_visit_time": "14時25分", 
  "total_duration": 245.8,
  "visits": [
    {
      "time": "2024-08-24T14:25:33",
      "duration": 15.2,
      "count": 47
    }
  ]
}

このデータから以下の分析が可能になりました:

  • 1日の訪問回数: 平均45-60回
  • 平均滞在時間: 給餌時3-8秒、掃除時10-20秒
  • 訪問パターン: 早朝と夕方にピークあり
  • 警戒時間: 人的作業後、平均2-3時間は訪問頻度低下

技術仕様とパフォーマンス

システム性能

ハードウェア: Raspberry Pi 5 (8GB) 配信設定: 1280×720 → 720×720、30fps、1200kbps 動体検知: 720×720、2fps処理 CPU使用率: 平均60-70%(配信+検知同時実行) メモリ使用量: 約1.2GB

安定性の向上

自動再接続機能

  • 8時間ごとの定期再接続
  • 切断時の自動復旧(最大5回試行)
  • テキスト更新時の自動反映

エラーハンドリング

  • UDP接続エラー時のフォールバック
  • FFmpeg異常終了時の自動復旧
  • ファイル読み書きエラーの処理

野鳥観察への応用と発見

科学的観察の向上

定量的データにより、これまで気付かなかった行動パターンが明らかに:

1. 給餌頻度の変化

  • 孵化直後: 30分間隔
  • 成長期: 15分間隔
  • 巣立ち前: 45分間隔

2. 滞在時間の意味

  • 3秒以下: 餌の受け渡しのみ
  • 5-10秒: 餌やり+様子確認
  • 15秒以上: 巣の掃除・整備

3. 人間活動の影響

  • ベランダ作業後: 2-4時間警戒
  • 洗濯物干し: 30分-1時間警戒
  • 騒音: 一時的(10-30分)

配信の盛り上がり

リアルタイム統計表示により視聴者の関心が大幅向上:

  • 滞在時間増加: 平均観視聴時間が約2倍に
  • コメント活性化: 「今の訪問は何秒だった?」等のやり取り増加
  • 科学的関心: 「親鳥の頑張りが数値で分かる」という評価

まとめ:低コストで実現する科学的野鳥観察

今回のシステムにより、総額2万円程度の機材で以下を実現できました:

技術的成果

  • ラズパイ5での配信+動体検知同時実行
  • リアルタイムデータ更新機能
  • 24時間安定動作

観察的成果

  • 定量的な行動分析
  • 人間活動影響の可視化
  • 配信品質の向上

今後の展開

このシステムは他の野鳥観察や定点観測にも応用可能です。ROI座標や検知パラメータを調整することで、様々な観察対象に対応できます。

パラメータ調整例

  • 大型鳥: score_threshold=5min_visit_interval=5
  • 小型鳥: score_threshold=3、面積閾値を小さく
  • 夜行性: 明度検出の重み付け変更

野鳥観察の楽しみ方が「感覚的観察」から「科学的分析」へと進化し、新しい発見や気づきを得られるシステムとなりました。


技術詳細・ソースコード

今回開発したプログラムはgithubで公開しています:

https://github.com/hiirofish/bird-watching-youtube-streamer

設定方法や詳細な使い方も記載していますので、同様のシステムを構築したい方はぜひ参考にしてください!

まとめ:シンプルな仕組みで大きな効果を実現

ライブ感の向上と視聴体験の改善

このシステム導入により、配信のライブ感が大幅に向上しました。固定テキストだけの配信から、リアルタイムで変化する統計情報が表示されることで、視聴者は「今まさに何が起きているか」を数値で把握できるようになりました。

特に10時間を超える長時間配信において、その効果は絶大でした。YouTubeでは長時間配信のプレビューが適切に表示されず、シークバーでの時間移動も大雑把になってしまいます。そんな中、「直近の親鳥訪問時刻」の表示は非常に実用的で、視聴者が「親鳥がいつ来たか」を瞬時に判断できる貴重な情報源となりました。

軽量で実用的な動体検知アプローチ

今回採用した**「特定領域のみを親鳥のみが通る」という前提に基づく簡易検知方式**は、想像以上に効果的でした。ROI指定により計算量を大幅削減し、ラズパイでの負荷はほぼゼロ。誤検知は存在しますが、参考情報としては十分な精度を確保できました。

今後の展望とおわりに

時間と予算があれば、機械学習による鳥種識別や行動パターン分析など、より高度なシステムへの発展も可能でしょう。しかし現在のシンプルなシステムでも、低コスト・軽量・実用的というキーワードで野鳥観察配信の新しい可能性を切り開けたと考えています。

同じように野鳥観察や定点観測を楽しまれている方々に、このシステムが新しいインスピレーションを与えられれば幸いです。技術的な質問や改良アイデアがございましたら、ぜひGitHubやコメント欄でお聞かせください!

タイトルとURLをコピーしました