[[太田研 公開用Wiki]] #counter Online: &online; ------------------------------------------ *複比を用いた横断歩道パターンの認識 [#r32cba2d] #contents *はじめに [#edc32e3f] **研究背景 [#z713f4d5] 近年,車の自動運転に注目が集まっており,活発に研究が行われている.自動運転を行うには道路や標識などの周囲の環境を認識する必要があり,さらに安全に走行するには信号や横断歩道を正確に認識し,判断しなければいけない.~ 横断歩道前での一時停止,横断歩道走行中の制御を行うことで事故を防ぎ,自動 運転の安全性を高めることができるので,本研究では横断歩道を認識することの 重要性に着目した. **研究目的 [#t0ec0dd1] 本研究では横断歩道の特徴的なパターンをエッジ画像などを用いて高速に認識することを目的とする. **問題点 [#w6158290] 人間の目やカメラに物が映るときに,近くにある物は大きく,遠くにある物は 小さく見える. ~ 横断歩道をカメラで撮影した画像や映像では下の図1,図2のように,カメラの高さや角度,距離によって線の太さや角度などの横断歩道のパターンが,その状況によって毎回変わってしまう. ~ したがって,一定のパターンを使って横断歩道を認識することができない. *複比 [#qb673ec5] 同一直線上の四点 A, B, C, D に対して複比を, CENTER:#ref(1.PNG,center,50%) とする.~ ~ 図3のようにある点Oから伸びる4本の直線がある. これらの直線とA, B, C, D で交わる別の直線がある場合,複比[ABCD]はその直線の取り方によらない. CENTER:#ref(cross_ratio1.png,center,50%) CENTER:&size(14){図3: KIWAMI}; よって図3の場合,直線l上の点A, B, C, Dと直線m上の点a, b, c, dで CENTER:#ref(2.PNG,center,55%) となる. *複比の応用 [#v3f81201] 横断歩道と 4 点以上で交わるある直線を考える. このとき,その直線と横断歩 道との連続する任意の4つの交点をそれぞれ順番にA, B, C, Dとする. ~ 画面に映るA, B, C, Dに対応する点をそれぞれa, b, c, dとする.また,A-a, B-b, C-c, D-dを結ぶ直線が交わる点をOとする. CENTER:#ref(cross_ratio.png,center,75%) このとき,実際の横断歩道と交わる線上の 4 交点 A, B, C, D から計算する複比 [ABCD]と,画像に映った横断歩道と交わる任意の線上のA, B, C, Dと対応する 4交点a, b, c, dから計算する複比[abcd]が一致する.~ このように複比を用いることでどのような角度から横断歩道を撮影しても,見え方の変化に関係なく横断歩道を検出することができる. *提案手法 [#r346955f] 以下の手法で横断歩道の検出を行う.~ ~ 1. 画像に映った横断歩道の直線を検出する~ 2. ある任意の直線と検出した横断歩道の直線が交わる点の座標を求める~ 3. 連続した4つの点の座標から複比を計算する~ 4. 計算した複比が実際の横断歩道の複比と一致すれば, 横断歩道と認識する~ ~ 詳しい手順を以下に説明する. **直線検出 [#zcd44359] まず,精度を極上げるために使用する画像に 7×7 のガウシアンフィルタを適用してノイズを除去し,画像をグレイスケール化する.~ OpenCVの Canny() という関数を使い画像からエッジを検出し,生成された エッジ画像からOpenCVの HoughLinesP() という関数を用いて直線を検出する.~ これらの関数について以下に説明する. ***canny法 [#s83d9eac] Canny法とはJohn F. Cannyが1986年に発表したエッジ検出のためのアルゴリズムである.~ Canny() という関数で実行できる.~ ~ 以下のようなステップによってエッジ検出を行う.~ ~ +ノイズ除去 ~ エッジ検出は画像中のノイズに対して敏感なため,まず初めに画像を平滑化 してノイズを削減する.5×5 のガウシアンフィルタでノイズを除去する.~ ~ +輪郭抽出 ~ 画像の輝度勾配を見つけるSobelフィルタで輪郭を抽出する.平滑化された 画像からSobelフィルタを使って縦方向(Gy)と横方向(Gx)の1次微分を取得 する.これら2つの微分画像から以下のようにエッジの勾配と方向を求める.~ CENTER:#ref(3.PNG,center,75%) ~ +非極大値の抑制 ~ エッジの強さが極大となる部分以外を除外する. 勾配の方向と強度を計算した後は,エッジと関係ない画素を取り除く. 各画素に対してその画素が勾配方向に対して極大値であるかどうかを確認する.~ ~ +ヒステリシスを使ってしきい値処理前処理で検出されたエッジの内,正しいエッジとそうでないものを区別する.~ この区別をするために minVal と maxVal という2つのしきい値を使う. ~ 画素値の微分値が maxVal 以上であれば正しいエッジとみなし, minVal 以下の値であればエッジではないとみなし除外する. 微分値が2つのしきい値の間であれば,正しいエッジとそうでないエッジとの隣接関係を基に区別する. ~ 正しいエッジと区別された画素につながっていれば正しいエッジとみなし,そうでなければエッジではない画素とみなす ***Hough変換 [#z53b33a4] HOUGH変換とは画像や点の集合から,直線や円など特定のパターンを検出する手法である. ~ HoughLines() という関数で行うことができる.~ ~ HOUGH変換による直線検出の手順~ ~ +各点 (x0, y0) に対して,(r, θ) 平面にr = x0 + y0 という曲線を描画する:~ 例えば,点の集合に (1, 0) が含まれる場合 r = という曲線を描画する.(r, θ) 平面には,元の画像における点の数だけ曲線が描画されることになる.~ ~ +(r, θ) 平面で多くの曲線が交わった点を求める:~ 手順1で描画した曲線の多くが,偶然特定の点 (r1, θ1) を通ったとする.これは,もとの画像において r1 = x0cosθ1 + y01 を満たすような (x0, y0) が 多く存在することを意味する.つまり,r1 = x1 + y1 という直線に多くの点 が乗っているということである.~ このようにして,多くの点が乗っているような直線が検出している.~ ~ 上記のHOUGH変換は,たった二つのパラメータを計算するのに大量の計算を必要とする. ~ 確率的HOUGH変換は画像の中から端点を持つ線分として線を検出する方法で「適当に選んだ点が直線に並んでいたら,その間にも点があるだろう」とあたりをつけ直線を探し出す手法であり,確率的ハフ変換はハフ変換の最適化を行ったもの とみなせる. ~ しきい値を減らすことで全画素を使って計算するのではなく,直線検出をするのに十分な点を画像中からランダムに選択して計算する. ~ ~ 確率的HOUGH変換は cv2.HoughLinesP() という関数で実行できる. **複比の計算 [#ye063f4f] 横断歩道とは法令上,~ ~ 「道路標識又は道路標示により歩行者の横断の用に供するための場所であることが示されている道路の部分(道路交通法第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)~ と求められるので,画像上の横断歩道から計算した複比がこの値と一致すればその部分を横断歩道として認識する. *実験と結果 [#rd11afb4] 指定した画像から直線を検出するプログラム a.cpp を作成した. ~ ある直線を指定して,先のプログラムで検出した直線との交点を求め複比を計算し,その計算結果によって横断歩道を認識するプログラム b.cpp と c.cpp を作成した.~ ~ この2つのプログラムを用いて横断歩道を検出する. **直線検出 [#j7431ce4] 縦600画素,横800画素の横断歩道が写っているある画像 a.jpg を使ってプログラムを実行した.~ まず,元の画像からcanny法を用いてエッジ検出を行った. CENTER:#ref(aG.jpg,center,60%) CENTER:&size(14){図7:KIWAMI}; 確率的HOUGH変換を行いエッジ画像から直線を検出し,検出された直線を図6 の左に赤で示した. ~ 図6の右の図は元の画像と直線を検出した画像を重ね合わせたものである. CENTER:#ref(aLDL.jpg,center,60%) CENTER:&size(14){図8:極}; この図から横断歩道の直線がしっかりと検出されていることがわかる.~ ここまでがプログラム a.cpp の実行結果である. **複比の計算と横断歩道の認識 [#n0c704f4] 次に,プログラム 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 だった. CENTER:#ref(Result320.jpg,center,60%) CENTER:&size(14){図10:kiwamu}; 前後の差が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 の直線上の横断歩道の部分はすべて認識されている. CENTER:#ref(a320.jpg,center,60%) CENTER:&size(14){図11:究}; 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と一致しているので横断歩道が正しく認識されていることがわかる. **他の直線の場合 [#dc05f495] 複比の値が直線のとり方によらないことを確かめるために,同じ画像上で先の例とは異なる直線(この場合は 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 だった. CENTER:#ref(Result350.jpg,center,60%) CENTER:&size(14){図12:k-wamu}; 前後の差が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 の直線上の横断歩道の部分はすべて認識されている. CENTER:#ref(a350.jpg,center,60%) CENTER:&size(14){図13:KWM}; 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と一致しているので横断歩道が正しく認識されていることがわかる. **他の画像の場合 [#r23d6e3b] 精度を確かめるために,先の例とは異なる画像上で同様の実験を行い,正しく横断歩道を認識できるか確かめた. ***b [#z1aadc43] 縦587画素,横880画素の横断歩道が写っているある画像 b.jpg を使ってプログラムを実行した. CENTER:#ref(bG.png,center,60%) CENTER:&size(14){図14:kami}; まず,元の画像からcanny法を用いてエッジ検出を行い,確率的HOUGH変換 を行いエッジ画像から直線を検出した. CENTER:#ref(DR450.jpg,center,60%) CENTER:&size(14){図15:きわむ}; 検出した直線と直線 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 の直線上の横断歩道の部分はすべて認識されている. CENTER:#ref(bp450.jpg,center,60%) CENTER:&size(14){図16:究}; —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と一致していて,それ以外の部分は異なる値になっているので横断歩道が正しく認識されていることがわかる. ***e [#icfc2ba2] 縦639画素,横960画素の横断歩道が写っているある画像 e.jpg を使ってプログラムを実行した.~ ~ 今回はロボットなどに搭載されることを考え,歩行者側からの視点で撮影された横断歩道の画像を使い正しく認識できるかを調べた.~ ~ まず,元の画像からcanny法を用いてエッジ検出を行い,確率的HOUGH変換を行いエッジ画像から直線を検出した. CENTER:#ref(eG.jpg,center,60%) CENTER:#ref(eG.jpg,center,57%) CENTER:&size(14){図9:KIWAM}; プログラム c.cpp を適当な直線 (この場合は y = 600 の直線) を指定して実行し, 検出した直線との交点を求めた. (プログラムc.cpp はプログラムb.cpp の処理 の x と y を逆にしただけで同じアルゴリズムである)~ CENTER:#ref(DR600.jpg,center,55%) CENTER:#ref(DR600.jpg,center,57%) CENTER:&size(14){図9:KIWAM}; ~ 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 だった. 左から順にすべての連続した4組の点で複比を計算した.~ それぞれの値が横断歩道の複比と一致するか調べ,一致していれば横断歩道として認識した.その結果の画像群を図25, 26 に示す(ここでは横断歩道として認識 された結果画像だけを示す). ~ 横断歩道として認識された部分を黄色い枠で囲って示している.~ ~ この画像上の y = 600 の直線上の横断歩道の部分はすべて認識されている. CENTER:#ref(ep600.jpg,center,55%) CENTER:#ref(ep600.jpg,center,57%) CENTER:&size(14){図9:KIWAM}; —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と一致していて,それ以外の部分は異なる値になってい るので横断歩道が正しく認識されていることがわかる. *考察 [#oda46f78] 本研究では画像上の 4 つの点から複比を計算し,その値が横断歩道の複比と一致した場合にその部分が横断歩道であると判断し,計算を行ったそれぞれの場所で横断歩道を認識することに成功した.~ ~ この動作を直線上のすべての連続した4点で一度に行い,検出された範囲をすべてつなぎ合わせれば横断歩道全体を認識することができる. ~ この方法を使えば横断歩道の一部が欠けていたり,横断歩道上に人や物で部分的に遮られて一部が認識できなくても,その周りが横断歩道として認識されていれば横断歩道全体の範囲がわかるので,一部が欠けていても問題ない.~ ~ 道路上の標識や線は形や大きさが法律で決められているので横断歩道と同じパターンのものが道路上にあることはない.~ したがって,誤検出をすることは考え にくい. しかし,道路外の部分に建物の模様や窓枠などの等間隔のものがあった場合,複比を計算したときに横断歩道の複比と一致し,横断歩道として誤認識してしまう恐れがある. ~ 道路レーンを検出するプログラムなどを一緒に使い,画像に写った道路以外の範囲を除外することで道路の中だけで直線の交点が求まるようにすればこの問題を解決でき,精度を極められる. *まとめ [#z525604d] 本研究では画像上の 4 つの点から複比を計算し,その値が横断歩道の複比と一致した場合にその部分が横断歩道であると判断し,計算を行ったそれぞれの場所で横断歩道を認識することに成功した.~ ~ ------------------------------------------ #counter Online: &online;