はじめに
こんにちは。ぺいぺいです。大学の研究で自動運転がらみの研究をすることになり、自動運転に必要な、車線検出についての備忘録です。間違い等ありましたら、指摘していただければ幸いです。また、本記事では特定の技術の解説よりかは全体像の把握に重きを置いていますのでご了承ください。
0. 大まかなまとめ
-
自動運転の画像処理は、ディープラーニングのセグメンテーションタスク、回帰タスクにあたる。
-
セグメンテーションタスク
- セマンティックセグメンテーションベース
それぞれのピクセルに対する道路か、背景か、人か、...かを分類。
(SCNN, CurveLanes-NAS) - Row-wise classification
画像を列単位で見ていき、列のどの部分に車線があるかを予測。
(E2E-LMD, IntRA-KD)
- セマンティックセグメンテーションベース
-
回帰タスク
- Ancherベース
事前知識をもとに、車線分離線がどこにあるかのあたりをつけておき、そのあたりからどの程度ずれがあるかを予測する。YOLOv3やSSDに近い。
(Line-CNN, LaneATT) - Parameterベース
車線の点の位置などをモデルで直接回帰するのではなく、形状のパラメータを回帰して、車線の位置を把握する。
(PllyLaneNet, LSTR)
- Ancherベース
-
太陽光の反射、車などの障害物によって線が隠される、悪天候により線が見えなくなるなどの多くの困難な点が存在する。
-
上記の条件下でも正しい車線検出を行うには、大域的特徴と局所的特徴が共に必要。
1. 自動運転における車線検出
- 車線は、自動運転を行う際に、必要不可欠な情報の1つである。車線の位置が正しく分かれば、自分の位置、進むべき方向、などさまざまな情報を得ることができるため、正しく検出することが必要不可欠である。
- 応用方法を変えれば、車が車線を踏んだ際に警告音を出すなどの運転手のアシスタントとしても使用できる。(Adcanced Driver Assistance System)
https://www.think-sp.com/2021/09/07/tw-katagawaissyasen-usetsu/
2. 車線検出の困難性
近年のディープラーニングを使用したコンピュータビジョン技術の向上により、画像の特徴を効率的に抽出できるようになった。しかし、人の命がかかる自動運転に必要な精度をいかなる状況下でも満たすのはかなり難しい。検出が難しい要因を挙げていく。
CLRNet: Cross Layer Refinement Network for Lane Detectionより画像を引用。
2.1 大域的特徴が必要
この画像は、車線を誤って検出してしまった一例である。本来は、赤線の左隣の線がターゲットであるが、間違えて他のレーンの車線を検出している。正解レーンと誤検出レーンは、以下の共通点がある。
- 白くて長い白線である
- 共に傾きが似ている
これはモデルが小さい範囲しか見ていないために起こるミスである。(畳み込み層で言うとカーネルサイズが小さいイメージ)
2.2 局所的特徴量が必要
この画像は、車線の検出が大雑把すぎた例である。この結果を出力したモデルは、広い範囲の特徴量しか使用していないため、車線の細かな予測ができなくなってしまっている。命がかかっている自動運転では、このような些細なずれも許されない。
2.3 障害物による遮り
運転中、車やバイク、歩行者などによって車線が見えなくなってしまうことも多くある。このような条件下でも車線を検出するには、やはり広い範囲から特徴をとってくる必要がある。
2.4 太陽光の反射
太陽光が道路に反射することで車線が見えなくなってしまうことも考えられる。この場合も広い範囲からの特徴がなければ、反射している部分に車線があるかないかを判断することはできない。
2.5 環境の変化
そのほかにもさまざまな環境による変化が考えられる。
- 国ごとの表記の変化。左車線や、右車線など。
- 天候、時間帯による変化。雨、雪、夜の暗い道など。
- 歩行者の量、車の量や種類
3. 車線検出のためのディープラーニング
近年は、車線検出にディープラーニング技術が使用されることが多い。(非ディープラーニングの車線検出としてはハフ変換による直線検出などがある。)ディープラーニングを使用した車線検出もまた、いくつかの手法に分類することができる。
3.1 Segmentation-based
https://medium.com/@mhamdaan/multi-class-semantic-segmentation-with-u-net-pytorch-ee81a66bba89
セマンティックセグメンテーションは、どのピクセルがどのクラスに属するかを出力するピクセル単位の分類問題である。対応するモデルとしては、以下のものがある。
- SCNN
- SAD
- CurveLanes-NAS
道路が写っているピクセルを正しく出力することができれば、自動運転等に利用することができる。また、人や車、障害物を正しく検出できていれば、それを避ける運転をすることもできる。セマンティックセグメンテーションは、計算時間が大きくなることが多く、リアルタイム処理が求められる自動運転では、いかに計算時間を減らすかが肝になってくる。上記の画像では、道路を丸ごと検出しているが、以下のようなセグメンテーションも考えられる。
これも同様のセグメンテーションタスクであるが、車線のみを検出しており、道路や木などを検出していない。また、全ての車線は区別されている(左レーン、中央レーン、右レーン)。このように同様の車線というクラスでも別のものと区別する手法は正確には、インスタンスセグメンテーションと呼ぶ。
Row-wise classificationという、列ごとに画像を見ていき、その列の何番目が車線に該当するかを予測する手法もある。該当するモデルとしては、以下のものがある。
- E2E-LMD
- IntRA-KD
3.2 Anchor-based
アンカー(Anchor)とは、事前知識を活かして作成する基準点のことである。例えば、道路は画像上部に写っていくことはほとんどないし(事故でも起こらなければ)、車線はたいていの場合、手前から斜めで中心に向かっていく。これらの事前知識を生かせば、基準とした斜め線から目的の車線までどのくらい移動させれば一致するかどうかをモデルに予測させるように学習させることができる。事前知識を利用している分、0からの学習よりもスムーズにいくことが期待できる。
有名なYOLOv3やSSDっといったモデルは、BoundingBoxを出力するためのアンカーを使用しているが、車線検出を行うモデルのアンカーは、少し異なる。Ancher-basedな手法は以下のものがある。
- Line-CNN
- LaneATT
- SGNet
- UFLD
- CondLaneNet
Keep your Eyes on the Lane: Real-time Attention-guided Lane Detection
上記のLaneATTというモデルを例に挙げる。
- あらかじめ斜め線のアンカーを複数用意しておき、それぞれのアンカーに対して、複数のθを設定しておく。
- 斜め線をいくつに区切るかも予めパラメータとして与える。
- モデルが予測するのは、アンカーが車線からどのくらい離れているかの値 $x$とアンカーの何番目の区切りまでが車線に対応するかを表す値 $l$、車線のクラスはなんなのかを表す$p$(背景も含む)を予測できるように学習させる。
3.3 Parameter-based
Parameter-basedな手法は、点を回帰するAncher-basedとは異なり、車線の曲線をパラメータでモデル化し、そのパラメータを回帰することで車線を検出する。以下のモデルが当てはまる。
- PolyLaneNet
- LSTR
4. 終わりに
今回は、自動運転に採用されるディープラーニングの画像処理手法を俯瞰的にまとめました。今後、それぞれの手法を細かく確認していこうと思いますので、もし更新されたらぜひ見てみてください。