2018年1月7日日曜日

L*a*b*色空間+SVMによる歩行者信号色の抽出

つくばチャレンジ2017に向けて検討していた歩行者用信号色の解析および抽出について紹介.
色については上記大会にあたり少し調べた程度の理解度なので,間違い等あると指摘いただけるとありがたいです...

SVMによる分類結果(青信号)


まとめ


  • CIE L*a*b*色空間で歩行者信号の色の分布を分析
  • SVMを用いて識別器を構築,テスト画像にて信号色の抽出能力を確認





背景・目的


つくばチャレンジ2017の課題で横断歩道の走行があり,そのために信号の判定が必要であった.
その信号の判定のためには,簡単には信号色を画像から色で識別する方法が考えられる.
そこで,各ピクセルが「信号色(赤・青)」に属しているか判定する方法を検討した.

なお,他にSSDやYoLoなどディープラーニング手法で信号検出から信号色判定まで一気に行う手も考えられるが,SSDを探索対象検出という別の目的で使用していたため,チームの技術の幅を広げる意味合いもあり,色識別を選択した.(全体システムは過去の記事参照)


特徴の分析


当然ながら,極力誤判定を避けるべきで,そのためには他の背景とは異なる信号色の特徴を見つける必要がある.そこで,まずは以下の画像をサンプルとして分析を行った.画像はつくばチャレンジ2017のコースにおける信号の一つである.
サンプル画像(歩行者信号青)
青信号らしき部分を抽出すると,以下の画像になる.
抽出した青信号
サンプル画像の各ピクセル値(RGB)をL*a*b*色空間に変換し,a*-b*平面上にプロットした.L*a*b*を用いたこと,そしてL*を除外してa*-b*平面にプロットした理由は,環境で変化し得る明るさの影響を避けたかったからである.HSV色空間でも同様の処理ができる可能性があるが,L*a*b*を選んだ理由は,HSVのHue値が0〜360度で循環するため扱いにくくなることを懸念したためである.
ちなみに,歩行者信号もフレームごとで見ると一定周期で明るくなったり暗くなったりと明滅を繰り返している.(おそらく交流電源の影響)

a*-b*平面における背景・信号色の分布

プロットした結果は,意外と他の背景と比較してみると偏った特徴的な分布を持っていることがわかる.ただ,例えば水たまりに反射した信号など,どうしても実際の信号以外にも同じ色を持つものは存在しうる.そのため,ある程度の誤判定は許容せざるを得なく,そうすると線形識別でも十分な分類ができるようにみえた.そのため,線形識別器を適用して信号色か否かを分類してみることにした.


識別器の適用


線形識別ということで,Support Vector Machine (SVM) を用いて分類を行った.
分析結果よりターゲットの信号以外にも同色を発光している部分があること,そして信号領域の中にも他背景と近い色を持つ部分があることがわかっている.
今回はそのことを踏まえ,scikit-learnのSVCを用い,ペナルティパラメタC値を調整して識別器の学習を行った.
SVMによる分類結果(青信号)


テスト


テストには以下の画像を使用した.つくばチャレンジ2017のコースに存在するもうひとつの歩行者信号である.
テスト画像

これに対して上で準備した識別器を適用すると,以下のような結果が得られる.
テスト画像の各ピクセルに対する分類結果

実際に画像に適用してみると,狙い通り概ね歩行者信号のみが抽出出来ていることが分かる.
識別器(青)を用いてテスト画像から信号色(青)を抽出した結果


ロボットへの実装について

「ピクセルごとの色の判定」に限ればつくばチャレンジの課題を達成するうえでは十分な性能を有していると思う.
ただし,当然ながら信号色を判定するにはシステムとして誤判定をなくす必要がある.

今回は画像全体に対して適用したが,対象の信号以外の物,例えば車両信号の赤色や青色も抽出されてしまう.そのため,実際には信号の位置の検出を先に行い,その領域内のピクセルに対してこの色識別器をかける形にするのが一般的かと思う.

実際,我々のチームでは信号位置が既知であったため,概ね信号が映るはずの画像領域を切り出してから判定するシステムを組んでいた.

また,自動車などの通過によるオクルージョンや信号の明滅にも対応し,間違っても赤信号を青信号と誤判定して進むようなことがないようにシステムを組む必要がある.これらは,例えば,数フレームの判定結果から最終判断したり,ベイズフィルタを組んで確率的に判定する方法が考えられる.


所感


正直,思ったより信号色が特徴的で,きれいに分類できているようで驚いた.
実際,定量的評価はできていないが,晴天時も含めて過去に実機で取得したカメラログを流してみたところ,ほぼ信号色以外は正しくフィルタリングされているように見えた.

上にも書いたとおり,ディープラーニング手法での認識も可能で,そちらの方が現状盛り上がってる感があるが,計算コスト的にはシンプルに色で判定するほうが有利なはずで,使うべき手法を検討価値はまだあるかなと思う.
(探索対象検出の方では深く考えずにディープラーニングを使うことを選んだが...)


参考: その他テスト結果


赤信号の識別器も青信号同様にほぼ狙い通りの抽出結果
SVMによる分類結果(赤信号)

テスト画像(歩行者信号・赤)に識別器(赤)を適用した結果
歩行者信号が青,つまり自動車信号が赤のときに,赤信号の識別器を通すと自動車用信号の赤色が抽出される.また,自動車信号が青のときに,青信号の識別器を通した場合も同様.
画像全体から色のみで判定するだけでは,システムとして不十分なことが分かる.
テスト画像(歩行者信号・青)に識別器(赤)を適用した結果
テスト画像(歩行者信号・赤)に識別器(青)を適用した結果


0 件のコメント:

コメントを投稿