車載カメラによる動画からYOLOで石造物検出

この記事は1年以上前に書かれました。
内容が古くなっている可能性がありますのでご注意下さい。

深層学習(ディープラーニング)のフレームワーク Darknet YOLO には、動画から物体検出するサンプルプログラムが付属しています。そこで、車載カメラで撮影した動画から石造物を検出してみることにします。



動画の撮影に使用したカメラは DJI Osmo Pocket です。車内に設置して真横方向を撮影しました。3軸スタビライザーを搭載しており、チルト固定モードを使用することで常に水平線が画面の中心を通るように保つことができます。車内に固定するときにも傾きを気にすることがなく便利ですが、加速・減速時には水平線が少し傾きます。動画は4K/60FPSで撮影しましたが、フルHD/60FPSに変換しました。

GitHubで公開されている darknet_video.py を、何か物体を検出している間とその前後15フレームを.mp4ファイルに保存するように改造しました。
まず、動画の形式を MPEG4 AVC(H.264)にするために、

fourcc = cv2.VideoWriter_fourcc(*"MJPG")

となっている箇所を

fourcc = cv2.VideoWriter_fourcc(*"avc1")

と変更します。また、エンコーダのDLLを
https://github.com/cisco/openh264/releases
からダウンロードし、PATHの通ったところに置く必要があります。

物体を検出する以前のフレームも保存するために、Python の deque を利用して15フレーム分のリングバッファを用意しました。dequeの使用方法は以下のとおりです。

# インポート
from collections import deque
# リングバッファの作成
ring_buffer = deque([], 15)
# リングバッファへフレームを追加
ring_buffer.append(frame)
# リングバッファにあるフレームをすべて書き出し
while True:
    try:
        frame = ring_buffer.popleft()
        video.write(frame)
    except IndexError:
        break
# リングバッファのクリア
ring_buffer.clear()

Darknet YOLOをPythonで使う」では、石造物と「夜」の文字を検出しました。月待塔には「〇〇夜」と刻まれているので、石造物の種類を判別するためです。今回はさらに「庚申」「道祖」の文字と地蔵像を検出できるようにしました。
学習に使用した画像ファイルは10,033枚で、そのうち2,971枚はラベル付けの対象外(石造物が写っていない)です。
ラベルの内訳は

  • 石 10,702件
  • 「夜」 3,145件
  • 「庚申」 2,051件
  • 地蔵 729件
  • 「道祖」 483件

です。

石造物を検出して出力された動画は以下の通りです。実際のスピードではあっという間に通り過ぎてしまうので、60FPSの動画を10FPSとして出力しています。

巨大な廿三夜塔(鳥居と比べれば大きさが分かると思います)の「夜」の字は、かなり高い確信度で検出されました。「庚申」の字は風化によってかすれているためか、検出が不安定でした。

こちらには小さな道祖神が写っていますが、残念ながら文字も石自体も検出されませんでした。廿三夜塔の「夜」の字は少し草に隠れていますが高い確信度で検出されました。

一番左の石自体は検出さていますが、彫られている地蔵像は検出されませんでした。


2020年11月24日 追記

AIが検出した石造物の動画を地図上で紹介する地図「車載カメラとAIによる路傍の石造物調査」を作成しました。