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

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

車線逸脱検知の為の効率的な車線検出アルゴリズム

はじめに

車線検出は自動運転や先進運転支援技術にとって重要な画像処理技術の一つです。
その中でも特に実用性にフォーカスを当てた先行研究を見つけたので、内容を理解し扱えるようになりたいと思いました。
今回取り上げる論文は、An Efficient Lane Detection Algorithm extbfor Lane Departure Detection[1]です。IV学会と呼ばれる自動運転技術に関する有名な国際会議に投稿された投稿された論文で、80件近くリファーされています。(すごい!)

Abstractにも書かれていましたが、計算能力の低いプロセッサで高速に動かすことを想定しており、 240MHzのCPUと10MbyteのRAMのローパワー計算機で14fpsで動作するそうです。
直感的に14fpsだと高速道路でのユースケースではちょっと物足りない感じがありますが、現代(2020年代)ではモバイルCPUが著しい進歩を遂げているので、十分に動作する事が期待できます。

[1]Jung, Heechul, Junggon Min, and Junmo Kim. "An efficient lane detection algorithm extbfor lane departure detection." 2013 IEEE Intelligent Vehicles Symposium (IV). IEEE, 2013.
以下、各画像は論文から引用します。

提案法

本手法は、以下の7stepで構成されています。
f:id:nsr_9:20210813175818p:plain

各ステップでの役割は次のようになります。

フロー名 役割
Camera カメラから画像を取得する
Candidate Extraction 白線位置の候補点の検出
Hypothesis Generation 白線候補の仮説を立てる
Verification 仮説の検証をする
Lane Update 白線モデルの更新
Lane Departure Detection 車線逸脱検出
Warning 警報を出す

処理フローはとてもシンプルである事がわかります。

Camera

特に特別なことは書かれておらず、一般的なカメラ画像読み取り処理を行っています。
論文では640x480[pix]のVGAカメラをバックミラーの後ろに取り付けています。
カメラを取り付ける際は、無限遠に画像中心が来るように校正しているようです。

f:id:nsr_9:20210813180057p:plain

Candidate Extraction

白線の候補点を検出します。
Haar-likeの様な白黒で構成されたステップフィルタを用いてエッジ検出を行っています。

f:id:nsr_9:20210813180126p:plain

左右に白黒で別れたステップフィルタを用いることで、白線の見える角度にかかわらずに良好に検出ができるそうです。
また、Haar-Likeな画像処理を用いることで、積分画像と呼ばれる画像処理を高速化できるテクニックを用いる事ができます。
高精度かつ高速化が狙えるいい感じの手法ということですね。

エッジ画像が得られたら、次は画像を左右(320x480)に分けて処理を行います。
f:id:nsr_9:20210813180205p:plain

左右に分けたそれぞれの画像に対し、中心から道路端に向かってエッジの最大値を探索していきます。
探索する際には逐次エッジ強度を比較していき、現在のエッジ強度が前のモノよりもしきい値Tr以上より大きい場合、最大値を更新していきます。
端っこまで探索した際の最大値を白線位置の候補点とします。

また、候補点を探索する際は、以下の様に処理範囲を限定します。(黒い領域が探索範囲)

f:id:nsr_9:20210813180231p:plain

探索範囲を限定することで、以下の2つのアドバンテージが生まれます。
1.計算量が低減する
2.白線以外の路面標識の誤検出を低減する
特に2は重要だと思いました。

f:id:nsr_9:20210813180247p:plain

こんな感じに道路には様々な路面標識がペイントされているのですが、そういった標識に対するロバスト性は非常に重要ですね。

Hypothesis Generation

このステップでは白線候補点から白線の仮説を生成します。
具体的には、以下の点pから直線lと消失点vを求めます。

f:id:nsr_9:20210813180337p:plain

点pはCandidate Extractionで求めた白線の候補点です。 直線lは左右の点pを用いて求める事ができます。

  \displaystyle
\textbf{l}_1=\textbf{p}_1 \times \textbf{p}_3 \\
\textbf{l}_2=\textbf{p}_4 \times \textbf{p}_6 \\

また、消失点vは2本の直線の交点から求める事ができます。

  \displaystyle
\textbf{v}=\textbf{l}_1 \times \textbf{l}_2 \\

Verification

仮説検証は2本の直線と消失点に対して行います。

直線の検証

直線の検証では点pとその点pを通る直線lの距離を求めます。
本論文では一般的に用いられる直線と点の距離の公式をカスタマイズし、計算コストを削減した近似計算を提案しています。

  \displaystyle
distance^*(\textbf{l}, \textbf{p}) = |m - x_0|
  \displaystyle
\textbf{p}=[x_0 \space y_0 \space 1]^{T}
  \displaystyle
\textbf{l}=[a \space b\space c ]^T

この距離としきい値Tlを用いて仮説を検証します。

  \displaystyle
distance^*(\textbf{l}_1, \textbf{p}_2) < T_l
  \displaystyle
distance^*(\textbf{l}_2, \textbf{p}_5) < T_l

それぞれの距離がしきい値以下の場合、生成した仮説は正しいということになります。

消失点の検証

消失点の検証は、消失線と消失点の距離を用いて行います。
消失線を求めるのは難しいので、本論文では事前にカメラ中心に無限遠(地平線)が来るようにカメラを構成しました。
したがって、消失線は画像中心を通る水平線になります。
こちらも近似式を用いて距離計算を行います。

  \displaystyle
distance^{\dagger}(\textbf{l}_v, \textbf{v}) = |y_1-o_y|
  \displaystyle
\textbf{v}=[ x_1 \space y_1 \space1 ]^T

こちらもしきい値を用いて仮説検証を行います。

  \displaystyle

distance^{\dagger} (\textbf{l}_v, \textbf{v}) < T_v

Lane Departure Detection

検出した車線を用いて、車線逸脱検出を行います。
車線検出は検出した消失点と、中心座標との距離を用いて求めます。

  \displaystyle
distance^{\ddagger}(\textbf{l}_h, \textbf{v})=|x_1 - o_x| \\
  \displaystyle
\textbf{l}_h=[ \frac{1}{o_x} \space 0 \space 1 ]^T

この距離がしきい値以上の時、逸脱とします。

  \displaystyle
distance^{\ddagger}(\textbf{l}_h, \textbf{v})>T_d

しきい値は車幅に依存し、コンパクトカーでは大きな値で大型車では小さな値を持ちます。
また、逸脱した際の方向は次のように求めます。

  \displaystyle
departure=
\left\{
 \begin{array}{ll}
  right & (x_1 - o_x) < -T_d\\
  left & (x_1 - o_x) > T_d \\
  no & otherwise
 \end{array}
\right.

実験と検証

アルゴリズムの検証のために、Desktop PCと低計算機システムの2種類で実験しています。

計算機 CPU RAM
Desktop PC Intel i5 2.8GHz 8GB
低計算機 240MHz 10MB

定性的な結果

VGAカメラで撮影した様々なシーンの画像で構成されるデータセットを作成しました。
出力結果は次のようになっています。

f:id:nsr_9:20210813182513p:plain

右下2つ(g, f)の画像の結果がとてもすごいですね。
(g)は逆光なのでしょうか?輝度が飽和しており画像全体が真っ白になっています。一般的なしきい値処理で検出することは非常に難しそうです。
(h)は逆に真っ暗な画像になっています。論文に記載する際に画質が失われている影響もあると思いますが、非常に困難なデータでも推定できる可能性を示唆しています。

定量評価

定量評価は、車線検出率と処理時間の観点で報告されています。
車線検出率は”日中シーンの5000フレーム"を用いていますが、検出率は90%だったそうです。
車線検出精度に対する肌感覚が無いのでピンと来ませんが、90%って自動運転システム的にはどうなんでしょうか・・・?(高いんですかね?)
また、実行時間はデスクトップPCで20fps(カメラが20fpsなのでMax値)、低計算機では14fpsだったそうです。
240MHzの計算機でVGAの画像を14fpsで処理するのはとてもすごいなぁっと思いました。

まとめ

IV学会に投稿された、ローパワー向けの車線検出アルゴリズムの論文を読みました。
所々に計算効率を高めるためのエッセンスが含まれており、とても勉強になりました。
シンプルなアルゴリズムだったので、本手法をPythonで動かしてみたいと思います。