Online: 1
近年,車の自動運転に注目が集まっており,活発に研究が行われている.自動運転を行うには道路や標識などの周囲の環境を認識する必要があり,さらに安全に走行するには信号や横断歩道を正確に認識し,判断しなければいけない.
横断歩道前での一時停止,横断歩道走行中の制御を行うことで事故を防ぎ,自動 運転の安全性を高めることができるので,本研究では横断歩道を認識することの 重要性に着目した.
本研究では横断歩道の特徴的なパターンをエッジ画像などを用いて高速に認識することを目的とする.
人間の目やカメラに物が映るときに,近くにある物は大きく,遠くにある物は 小さく見える.
横断歩道をカメラで撮影した画像や映像では下の図1,図2のように,カメラの高さや角度,距離によって線の太さや角度などの横断歩道のパターンが,その状況によって毎回変わってしまう.
したがって,一定のパターンを使って横断歩道を認識することができない.
同一直線上の四点 A, B, C, D に対して複比を,
とする.
図3のようにある点Oから伸びる4本の直線がある. これらの直線とA, B, C, D で交わる別の直線がある場合,複比[ABCD]はその直線の取り方によらない.
よって図3の場合,直線l上の点A, B, C, Dと直線m上の点a, b, c, dで
となる.
横断歩道と 4 点以上で交わるある直線を考える.
このとき,その直線と横断歩 道との連続する任意の4つの交点をそれぞれ順番にA, B, C, Dとする.
画面に映るA, B, C, Dに対応する点をそれぞれa, b, c, dとする.また,A-a, B-b, C-c, D-dを結ぶ直線が交わる点をOとする.
このとき,実際の横断歩道と交わる線上の 4 交点 A, B, C, D から計算する複比 [ABCD]と,画像に映った横断歩道と交わる任意の線上のA, B, C, Dと対応する 4交点a, b, c, dから計算する複比[abcd]が一致する.
このように複比を用いることでどのような角度から横断歩道を撮影しても,見え方の変化に関係なく横断歩道を検出することができる.
以下の手法で横断歩道の検出を行う.
1. 画像に映った横断歩道の直線を検出する
2. ある任意の直線と検出した横断歩道の直線が交わる点の座標を求める
3. 連続した4つの点の座標から複比を計算する
4. 計算した複比が実際の横断歩道の複比と一致すれば, 横断歩道と認識する
詳しい手順を以下に説明する.
まず,精度を極上げるために使用する画像に 7×7 のガウシアンフィルタを適用してノイズを除去し,画像をグレイスケール化する.
OpenCVの cv2.Canny() という関数を使い画像からエッジを検出し,生成された エッジ画像からOpenCVの cv2.HoughLinesP() という関数を用いて直線を検出する.
これらの関数について以下に説明する.
Canny法とはJohn F. Cannyが1986年に発表したエッジ検出のためのアルゴリズムである.
cv2.Canny() という関数で実行できる.
以下のようなステップによってエッジ検出を行う.
HOUGH変換とは画像や点の集合から,直線や円など特定のパターンを検出する手法である.
cv2.HoughLines() という関数で行うことができる.
HOUGH変換による直線検出の手順
上記のHOUGH変換は,たった二つのパラメータを計算するのに大量の計算を必要とする.
確率的HOUGH変換は画像の中から端点を持つ線分として線を検出する方法で「適当に選んだ点が直線に並んでいたら,その間にも点があるだろう」とあたりをつけ直線を探し出す手法であり,確率的ハフ変換はハフ変換の最適化を行ったもの とみなせる.
しきい値を減らすことで全画素を使って計算するのではなく,直線検出をするのに十分な点を画像中からランダムに選択して計算する.
確率的HOUGH変換は cv2.HoughLinesP() という関数で実行できる.
横断歩道とは法令上,
「道路標識又は道路標示により歩行者の横断の用に供するための場所であることが示されている道路の部分(道路交通法第2条第4項第1号)」
であり,以下のように定められている.
• 白線の幅: 0.45 - 0.5[m]
• 白線の間隔: 0.45 - 0.5[m]
上記より横断歩道の複比は
[ABCD] = AC CB × AD DB = 2 1 × 3 2 = 1.33333....... (5)
と求められるので,画像上の横断歩道から計算した複比がこの値と一致すればその部分を横断歩道として認識する.
指定した画像から直線を検出するプログラム a.cpp を作成した.
ある直線を指定して,先のプログラムで検出した直線との交点を求め複比を計算し,その計算結果によって横断歩道を認識するプログラム b.cpp と c.cpp を作成した.
この2つのプログラムを用いて横断歩道を検出する.
縦600画素,横800画素の横断歩道が写っているある画像 a.jpg を使ってプログラムを実行した.
まず,元の画像からcanny法を用いてエッジ検出を行った.
#ref(): File not found: "LDL.eps" at page "複比を用いた横断歩道パターンの認識"
確率的HOUGH変換を行いエッジ画像から直線を検出し,検出された直線を図6 の左に赤で示した.
図6の右の図は元の画像と直線を検出した画像を重ね合わせたものである.
#ref(): File not found: "sunny_bovw.png" at page "複比を用いた横断歩道パターンの認識"
この図から横断歩道の直線がしっかりと検出されていることがわかる.
ここまでがプログラム a.cpp の実行結果である.
次に,プログラム b.cpp を適当な直線(この場合は y = 320 の直線)を指定して実行し,検出した直線との交点を求めた.
指定した直線(y = 320 の直線)上の画素を左から一つずつ確認していき,赤い画素であればそこを交点とする.
26個の交点が見つかり,それらを図7に赤で示した. 26個の交点の座標はそれぞれ 61, 62, 63, 64, 65, 121, 122, 123, 124, 182, 183, 250, 316, 383, 446, 514, 515, 579, 644, 645, 708, 709, 710, 774, 775, 776 だった.
#ref(): File not found: "cloud_hom.png" at page "複比を用いた横断歩道パターンの認識"
前後の差が2以下の点を1つの点とみなし平均を取って12個に絞り,図7に青で 示した.
12個の点の座標はそれぞれ 63, 122.5, 182.5, 250, 316, 383, 446, 514.5, 579, 644.5, 709, 775 だった.
左から順にすべての連続した4組の点で複比を計算した.
それぞれの値が横断歩道の複比と一致するか調べ,一致していれば横断歩道として認識した.その結果の画像群を図8に示す.
横断歩道として認識された部分を黄色い枠で囲って示している.
この画像上の y = 320 の直線上の横断歩道の部分はすべて認識されている.
#ref(): File not found: "a320.jpg" at page "複比を用いた横断歩道パターンの認識"
1つめの画像で計算された複比 1.3579502
2つめの画像で計算された複比 1.3031903
3つめの画像で計算された複比 1.3417604
4つめの画像で計算された複比 1.3166305
5つめの画像で計算された複比 1.3670600
6つめの画像で計算された複比 1.3026607
7つめの画像で計算された複比 1.3504408
8つめの画像で計算された複比 1.3265609
9つめの画像で計算された複比 1.3419600
計算された複比の値を確認すると,上記のように,ほぼ実際の横断歩道の複比の 1.333と一致しているので横断歩道が正しく認識されていることがわかる.
複比の値が直線のとり方によらないことを確かめるために,同じ画像上で先の例とは異なる直線(この場合は y = 350 の直線)を用いて同様の実験を行った.
検出した直線と直線 y = 350 の交点を求めた.
22個の交点が見つかり,それらを図9に示した.
22個の交点の座標はそれぞれ 7, 74, 76, 77, 78, 149, 150, 225, 226, 301, 379, 454, 455, 456, 534, 609, 610, 685, 686, 687, 757, 758 だった.
#ref(): File not found: "cloud_miss.png" at page "複比を用いた横断歩道パターンの認識"
前後の差が2以下の点を1つの点とみなし平均を取って11個に絞り,図9に青で 示した.
11個の点の座標はそれぞれ 7, 76.25, 149.5, 225.5, 301, 379, 455, 534, 609.5, 686, 757.5 だった.
左から順にすべての連続した4組の点で複比を計算した.
それぞれの値が横断歩道の複比と一致するか調べ,一致していれば横断歩道として認識した.その結果の画像群を図10に示す.
横断歩道として認識された部分を黄色い枠で囲って示している.
この画像上の y = 350 の直線上の横断歩道の部分はすべて認識されている.
#ref(): File not found: "00122.png" at page "複比を用いた横断歩道パターンの認識"
1つめの画像で計算された複比 1.3288302
2つめの画像で計算された複比 1.3237703
3つめの画像で計算された複比 1.3421204
4つめの画像で計算された複比 1.3205405
5つめの画像で計算された複比 1.3479806
6つめの画像で計算された複比 1.3151107
7つめの画像で計算された複比 1.3465208
8つめの画像で計算された複比 1.3157300
計算された複比の値を確認すると,上記のように,ほぼ実際の横断歩道の複比の 1.333と一致しているので横断歩道が正しく認識されていることがわかる.
精度を確かめるために,先の例とは異なる画像上で同様の実験を行い,正しく横断歩道を認識できるか確かめた.
縦587画素,横880画素の横断歩道が写っているある画像 b.jpg を使ってプログラムを実行した.
#ref(): File not found: "00125.png" at page "複比を用いた横断歩道パターンの認識"
まず,元の画像からcanny法を用いてエッジ検出を行い,確率的HOUGH変換 を行いエッジ画像から直線を検出した.
#ref(): File not found: "hom_zengo.png" at page "複比を用いた横断歩道パターンの認識"
検出した直線と直線 y = 450 の交点を求めた.
42個の交点が見つかり,それらを図12に示した.
42個の交点の座標はそれぞれ 100, 101, 135, 184, 186, 187, 188, 189, 193, 194, 200, 201, 202, 281, 282, 314, 315, 316, 347, 380, 381, 414, 415, 448, 482, 517, 551, 552, 587, 588, 621, 622, 656, 657, 658, 717, 718, 719, 720, 810, 811, 838 だった.
前後の差が2以下の点を1つの点とみなし平均を取って20個に絞り,図12に青で示した.
20 個の点の座標はそれぞれ 838, 100.5, 135, 186.8, 193.5, 201, 281.5, 315, 347, 380.5, 414.5, 448, 482, 517, 551.5, 587.5, 621.5, 657, 718.5, 810.5, 838 だった.
左から順にすべての連続した4組の点で複比を計算した.
それぞれの値が横断歩道の複比と一致するか調べ,一致していれば横断歩道として認識した.その結果の画像群を図13, 14 に示す(ここでは横断歩道として認識 された結果画像だけを示す).
横断歩道として認識された部分を黄色い枠で囲って示している.
この画像上の y = 450 の直線上の横断歩道の部分はすべて認識されている.
#ref(): File not found: "hom_pitta.png" at page "複比を用いた横断歩道パターンの認識"
—No Crosswalk Detected—— 1.04798
—No Crosswalk Detected—— 1.87856
—No Crosswalk Detected—— 1.75938
—No Crosswalk Detected—— 1.02569
—No Crosswalk Detected—— 1.52668
1つめの画像で計算された複比 1.35425
2つめの画像で計算された複比 1.32641
3つめの画像で計算された複比 1.32681
4つめの画像で計算された複比 1.33990
5つめの画像で計算された複比 1.33644
6つめの画像で計算された複比 1.32381
7つめの画像で計算された複比 1.34618
8つめの画像で計算された複比 1.31180
9つめの画像で計算された複比 1.35629
—No Crosswalk Detected—— 1.44963
—No Crosswalk Detected—— 1.28098
—No Crosswalk Detected—— 1.10156
計算された複比の値を確認すると,上記のように,横断歩道がある所はほぼ実際の横断歩道の複比の1.333と一致していて,それ以外の部分は異なる値になっているので横断歩道が正しく認識されていることがわかる.
縦639画素,横960画素の横断歩道が写っているある画像 e.jpg を使ってプログラムを実行した.
今回はロボットなどに搭載されることを考え,歩行者側からの視点で撮影された横断歩道の画像を使い正しく認識できるかを調べた.
まず,元の画像からcanny法を用いてエッジ検出を行い,確率的HOUGH変換を行いエッジ画像から直線を検出した.
#ref(): File not found: "bovw_zengo.png" at page "複比を用いた横断歩道パターンの認識"
#ref(): File not found: "bovw_zengo.png" at page "複比を用いた横断歩道パターンの認識"
プログラム c.cpp を適当な直線 (この場合は y = 600 の直線) を指定して実行し, 検出した直線との交点を求めた. (プログラムc.cpp はプログラムb.cpp の処理 の x と y を逆にしただけで同じアルゴリズムである)
21個の交点が見つかり,それらを図24に示した.
21個の交点の座標はそれぞれ 85, 91, 102, 103, 119, 135, 153, 154, 175, 194, 220, 249, 285, 319, 355, 398, 440, 489, 510, 534, 535 だった.
前後の差が2以下の点を1つの点とみなし平均を取って18個に絞り,図24に青で 示した.
18個の点の座標はそれぞれ 85, 91, 102.5, 119, 135, 153.5, 175, 194, 220, 249, 285, 319, 355, 398, 440, 489, 510, 534.5 だった.
#ref(): File not found: "bovw_zengo.png" at page "複比を用いた横断歩道パターンの認識"
左から順にすべての連続した4組の点で複比を計算した.
それぞれの値が横断歩道の複比と一致するか調べ,一致していれば横断歩道として認識した.その結果の画像群を図25, 26 に示す(ここでは横断歩道として認識 された結果画像だけを示す).
横断歩道として認識された部分を黄色い枠で囲って示している.
この画像上の y = 600 の直線上の横断歩道の部分はすべて認識されている.
#ref(): File not found: "bovw_zengo.png" at page "複比を用いた横断歩道パターンの認識"
—No Crosswalk Detected—— 1.25320
—No Crosswalk Detected—— 1.25344
1つめの画像で計算された複比 1.37408
2つめの画像で計算された複比 1.33205
3つめの画像で計算された複比 1.27710
4つめの画像で計算された複比 1.44242
5つめの画像で計算された複比 1.28638
6つめの画像で計算された複比 1.35468
7つめの画像で計算された複比 1.27666
8つめの画像で計算された複比 1.35960
9つめの画像で計算された複比 1.35939
10つめの画像で計算された複比 1.29060
11つめの画像で計算された複比 1.37438
—No Crosswalk Detected—— 1.16071
—No Crosswalk Detected—— 1.60494
計算された複比の値を確認すると,上記のように,横断歩道がある所はほぼ実際 の横断歩道の複比の1.333と一致していて,それ以外の部分は異なる値になってい るので横断歩道が正しく認識されていることがわかる.
本研究では画像上の 4 つの点から複比を計算し,その値が横断歩道の複比と一致した場合にその部分が横断歩道であると判断し,計算を行ったそれぞれの場所で横断歩道を認識することに成功した.
この動作を直線上のすべての連続した4点で一度に行い,検出された範囲をすべてつなぎ合わせれば横断歩道全体を認識することができる.
この方法を使えば横断歩道の一部が欠けていたり,横断歩道上に人や物で部分的に遮られて一部が認識できなくても,その周りが横断歩道として認識されていれば横断歩道全体の範囲がわかるので,一部が欠けていても問題ない.
道路上の標識や線は形や大きさが法律で決められているので横断歩道と同じパターンのものが道路上にあることはない.
したがって,誤検出をすることは考え にくい. しかし,道路外の部分に建物の模様や窓枠などの等間隔のものがあった場合,複比を計算したときに横断歩道の複比と一致し,横断歩道として誤認識してしまう恐れがある.
道路レーンを検出するプログラムなどを一緒に使い,画像に写った道路以外の範囲を除外することで道路の中だけで直線の交点が求まるようにすればこの問題を解決でき,精度を極められる.
本研究では画像上の 4 つの点から複比を計算し,その値が横断歩道の複比と一致した場合にその部分が横断歩道であると判断し,計算を行ったそれぞれの場所で横断歩道を認識することに成功した.
Online: 1