社会人研究者が色々頑張るブログ

pythonで画像処理やパターン認識をやっていきます

単眼カメラによる前方車両の検出

はじめに

前の記事で高速、効率な白線検出の研究をPythonで実装し、その振る舞いを観察しました。
nsr-9.hatenablog.jp

色々な動画で白線技検出を行い楽しんでいた時にふと「この技術が具体的にどの様に応用されているんだろう?」と気になり調べて見た所、面白い研究[1]を見つけました。

この研究では、単眼車載カメラをベースとした前方車両の検出方式の提案をおこなっています。 射影ヒストグラムを特徴量として用いるのですが、その際に白線検出と消失点を用いて検出範囲を制限する事で効率的に検出しています。(走行空間モデル)。

射影ヒストグラム 走行空間モデルによる探索空間の削減
f:id:nsr_9:20210821135558p:plain f:id:nsr_9:20210821135403p:plain

近年の画像検出の研究では、大規模なデータセットGPUの計算資源を前提としたCNNベースの手法が主流となっていますが、本研究は非学習ベースかつ計算量がとても小さいものになっています。
白線検出の論文でも書かれていましたが、車両に搭載する際には省電力性、応答性が重要なので、より実用を想定した研究になっている様に感じます。

この研究の論文を読んでいきます。

[1] 藤岡明紘, et al. "単眼車載カメラによる前方車両の検出." 広島工業大学紀要研究編 第 ₄₅ 巻 pp ₂₅₉–₂₆₂, ₂₀₁₁ (2011).

提案法

従来研究ではミリ波やLiDAR,ステレオカメラなどの距離センサーを利用した手法が提案されていましたが,本論文では単眼カメラのみで前方車両の検出を行う手法を提案しています.
前方車両の検出処理では,以下の(1),(2)の処理を実行しています.
(1)探索領域の生成
(2)水平エッジによる車両検出

(1),(2)に関してそれぞれ説明します.

(1)探索領域の生成

前方車両検出する際に,画像全体に対して検出処理を施すのではなく,車が存在しそうな位置のみに検出範囲を制限することで,計算コストの削減と誤検出の抑制を実現しています.

この車の存在しそうな位置を走行空間モデルで定義しています.
f:id:nsr_9:20210821190758p:plain

走行空間モデルは,上の画像のように自車両が走行する車線を白線と白線の距離(W)と車両の高さ(H)でモデル化したものです.

走行空間モデルの画像上におけるHとWの大きさは,自車両から遠くなるにつれて遠近感の関係で小さくなっていきます.

また,走行空間モデルのH/Wは,無限遠で0に収束します.その際に消失点に向かって収束していきます.

f:id:nsr_9:20210821192843p:plain

本論文ではこの性質を利用して,前方車両の検出範囲をこの”消失点に向かって小さくなる矩形領域”に制限しします.
具体的には,以下の画像における黄色い矩形領域に当たります.
f:id:nsr_9:20210821193200p:plain

一般的な物体検出では画像全体に対して矩形領域を何度も何度も走査することで,対象物を探します.(これをSliding Windowと呼びます)

f:id:nsr_9:20210821193949p:plain
Sliding Windows for Object Detection with Python and OpenCV - PyImageSearch

この方法は任意のシーンにおいて画像の全領域から物体を検出することが出来るのですが,サイズの異なる物体を探そうとすると計算量が膨大になります.

本論文では検出すべき物体(前方の車両)とその物体の存在しそうな場所を事前にモデル化することで,計算量を大幅に削減しています.

このアプローチは,CNNを用いた最新の物体検出技術に対しても応用出来る素晴らしい知見だと思いました.

(2) 水平エッジによる車両検出

車両の様な人工物は,垂直や水平のエッジ成分がたくさん出ます.
特に車両背面画像に対して水平エッジを取り,縦方向に対してヒストグラムを作成すると,車の存在している部分に対してエッジの塊が出現します.
車両背面が写っている画像に対して水平エッジを取り,射影ヒストグラムを取ると,明確な塊が出ます.

f:id:nsr_9:20210821194803p:plain

車両を検出する際は、射影ヒストグラムに対してx方向にテンプレートマッチングを行います。 f:id:nsr_9:20210821210625p:plain

テンプレートマッチングを行う際は、テンプレートと射影ヒストグラムの類似度を計算します。
この類似度はZNCCによく似た式で求めます。

f:id:nsr_9:20210821210955p:plain

実験結果

走行シーンを撮影した画像の中から、車両ありのシーン(5枚)と車両無しのシーン(5枚)の合計10枚の画像を用いて実験を行っています。
走行空間モデルから求めた探索範囲に対し、エッジの射影ヒストグラムを求めた後に、テンプレートマッチングで類似度を算出しています。
その類似度に対し、一定のしきい値を超えたものを前方に車両があるシーンとして、性能を比較しています。

f:id:nsr_9:20210821211512p:plain

左側の車両ありのシーンでは類似度が最低でも0.65あるのに対し、車両なしのシーンでは類似度が最も高いものでも0.38になっています。
これはしきい値を例えば0.5に設定すれば、今回の10枚の画像に対して認識精度が100%になります。

各画像に対する射影ヒストグラムの結果次のようになっています。

車両あり 車両なし
f:id:nsr_9:20210821211859p:plain f:id:nsr_9:20210821211957p:plain
f:id:nsr_9:20210821211908p:plain f:id:nsr_9:20210821212007p:plain

左の車両ありのヒストグラム(上の赤いの)を見ると、似たような山なりの形状になっていることがわかります。
右の車両なしのヒストグラムを見ると、右上の様なシーンではヒストグラムの値が全体的に低いことがわかります。
興味深いことに、右下の様にガードレールが存在しているシーンのヒストグラムは全体的に高い傾向にあります。
しかしながら、ヒストグラムの形状は山なりで無いため、類似度自体は低い値になっているようです。

まとめ

走行空間モデルと射影ヒストグラムを用いた、前方車両検出技術の論文をよみました。
Computer Visionの研究をしていると「物体検出をやるの?なら、とりあえずCNN使っとこうね」って考えがちだったのですが、 問題設定を上手に細分化し、非学習ベースで着手する方法もあるんだなぁと今更ながら学びました。

非常に面白い研究だと思ったので、Pythonで実装していきたいと思いました。