從零開始的無人駕駛 1

Lanes Finding with Computer Vision

利用計算機視覺進行道路檢測,一般包括6部分:攝像頭校正(camera calibration)、圖像失真校正(distortion correction)、色彩/梯度二值化(color/gradient threshold)、視角轉換 Perspective transform 、行道線檢測(Detect lane lines)、 道路彎度測量(Determine the lane curvature)

Calibration 校正

首先要對失真的程度進行測量,然後根據measurement的結果進行undistort

166c411774ca300b?w=1280&h=720&f=png&s=190076
這個東西叫做chessboard pattern, 用的時候從不同的角度拍這個chessboard,利用的是每個方塊的corner去校正 (圖像要記得轉成灰度圖)

得到的結果其實只跟拍照的相機有關。對於每個的鏡頭,要單獨做一遍這種校正。

Distorition 圖像失真

理論上,只要不是針孔攝像機,基本都會存在圖像失真的問題(透鏡成像更快點,針孔相機這點上比不了)

圖像失真會影響到道路檢測(將直線判斷成曲線),車輛檢測(用CNN檢測的時候,識別出來的車比實際更大或者更小)

由透鏡引起的失真主要是兩個:

  • 徑向畸變(Radial Distortion)
    原因是光線穿過透鏡的邊緣時發生的偏轉大於穿過中心發生的偏轉

  • 切線畸變(Tangential Distortion)

原因是光線穿過透鏡之後並沒有垂直打在成像平面上

ROI (Region of Interest)

道路檢測要先從攝像頭視角獲取道路信息,然後選取ROI(目標區域), 包括選顏色和選區域。

選顏色比較接近直覺, 路上的線也就兩種顏色,要麼白線,要麼黃線。
白線其實比較好找
color selection

但是黃線的話就不能直接用原圖了。要先把原圖分成RGB三層
yellow line

而黃色的線在藍色那層是看不到的
RGB
(因爲是互補色)
光的三原色

選區域是可以直接利用CV解決的問題。

從車頭視角向前看,大部分像素都是沒有用的。尤其是天空的部分。對於自動駕駛來說差不多等價於干擾信號,基本上可以直接過濾掉
車頭視角
區域選擇

Color Space 色彩空間

在RGB色彩空間(以RGB建立三維空間)中,白色是由紅綠藍三種顏色的最大值組成的。

因此想獲得白線,可以通過設置RGB值的閾值

但是這種情況下,會丟失黃線的信息。一般的處理方式是使用別的色彩空間,比如HSV, HLS, LUV...

其中HSV(色相、飽和度、明度)和HLS(色相、亮度、飽和度)使用最多

HLS (hue, saturation, lightness)

也叫HSL,甚至叫HSL的還更多點。

其實圖像本身在光亮條件下變化最大,HS信道一般倒是不怎麼變。所以我們把圖像按照HSL拆分,在S信道下黃線非常明顯

Canny Edge Detection

下一步是使用邊緣檢測算法尋找邊線。如果我們把視圖當成一張灰度圖來看待,那麼每一條邊其實都在明暗塊交替的位置

通過計算亮度的變化,可以把原圖轉化成一張梯度圖

然後再將結果銳化,得到亮度數值變化最大的像素點

實際上,在做Canny算法之前,要對圖像做高斯平滑(Gaussian smoothing / Gaussian Blur) ,消除噪聲和僞梯度點

(題外話) Sobel Operator 索伯算子

首先,爲什麼卷積神經網絡會有卷積(convolution)這種操作…

看完Sobel算子總算懂了,卷積這種運算講究的是一個信號疊加。相比於Canny邊緣檢測,Sobel邊緣檢測其實更容易理解(然而還是Canny效果好)。

Hough Transform 霍夫變化

Hough Transform是圖像變化中的經典算法,主要用來尋找圖像中符合某種特徵的集合,說白了就是檢測直線、圓、橢圓。


Hough變化要將笛卡爾座標下的點變化到霍夫極座標系,原來的點共線問題會由此轉化計算成曲面在極座標下的共點,效果上就是該算法對邊緣間斷不敏感。大致上是這個意思,實際操作的時候是統計累加空間裏的局部最大值(峯值),以該峯值作爲結果(所以說抗噪能力還是很強的)。

總結一下就是:

原圖 -> 灰度圖 -> 邊緣檢測 -> 直線檢測 -> 過濾掉斜率過低的直線 -> 將最後結果疊加回原圖

原圖

灰度圖&邊緣檢測

最後結果疊加回原圖

Perspective Transform

由於Perspective的存在,2D圖像存在近大遠小的現象

這樣會導致原本平行的行道線,出現匯聚的趨勢

因此需要把視角轉換成俯視

將行道線還原到平行

Lane Curvature

解決道路彎曲(Lane Curvature)問題,實際上比較複雜。先要依次校正原圖
lc
選取ROI

然後要進行視角轉換(Perspective Transform)

最後根據俯視圖(Top-down view) 用二次函數擬合行道線

Sliding windows 滑動窗口

在檢測弧線的過程中,首先在圖像底部選取一小段,在垂直方向做直方圖

將頂點連接,變成峯值圖

出現峯值的地方是行道線的位置

以此爲起點,使用逐步向上移動,每次處理一小段圖像

這種檢測模式叫做滑動窗口

一旦擁有了第一幀的行道線位置,在隨後的檢測中可以利用邊緣檢測 + ROI 的方式獲得之後的行道線

得到道路的二次函數並沒有用,從駕駛的角度來看,真正需要的是當前的轉彎弧度。所以需要求出圖片組的曲率半徑(radius of curvature),在對應計算出現實中的曲率半徑

最後

還有一些小的細節,包括Offset, Sanity Check, Look-Ahead Filter, etc. 懶得講


Vehicle Detection 車輛檢測

CNN (Convolutional Neural Networks 卷積神經網絡) 普遍運用之前,車輛檢測是通過使用條件隨機場或者SVM(支持向量機)來實現的。操作上分爲兩步,先是從圖像上提取特徵,然後基於特徵建立模型,判斷車輛位置。

template matching 模板匹配

對於圖像上的每一塊顏色,計算與背景圖的distance

甚至更硬核一點,直接把各種可能的車輛圖片存起來,然後跟相機視角的圖片進行比較

這類解決方案統稱 template matching

Color Histogram

template matching的缺陷也很明顯,對於沒有預存過的模板,自然無從識別。因此出現了 Color Histogram方案

將車輛的模板轉換成顏色直方圖,運算時比較目標物體與預存直方圖的相似度。優點是同一個物體在不同角度仍可識別。比如對於一輛紅色的車,從不同方向看過去,模板匹配無法很好地識別,而利用Color Histogram則不受影響。

HOG

Histogram of Oriented Gradients (定向梯度直方圖), 相比於之前的特徵,HOG特徵更加健壯,並且無視顏色的影響。

操作的時候,首先捕捉圖像的輪廓與紋理信息

然後將圖像劃分爲多個cell。對每個cell計算梯度方向

統計每個cell的局部直方圖

將結果歸一化,得到的主方向將成爲局部特徵梯度方向

彙總每個cell得到的局部信息,就可以得到HOG特徵

Features Combination

首先是數據預處理,這裏主要是進行特徵組合。

比如HOG特徵是針對梯度信息的特徵,HSV特徵則是針對顏色信息的特徵

可以直接將二者拼接,得到顏色+梯度的組合信息

這裏面有一些要注意的地方,一般多個特徵擁有不同的模量,所以數字上相差很大

那麼就需要進行正則化,將數據對齊

還可以利用決策樹等方法,捨棄影響不大的變量

Sliding Windows

使用滑動窗口進行車輛檢測,在這種場景下有一些機巧

首先還是ROI, 車輛其實只會出現在圖片的下半塊區域

其次可以預先設定好車輛可能的最大寬度和最小寬度

這樣在檢測時進行有限的multi-scale window

減小搜索空間

Multiple Detection

最後對於同一車輛的Multiple Detection

建立heat-map,計算中心位置

Build Model & Tracking


模型的選取倒是比較簡單,SVM, Decision Tree, Nerual Network, etc. 這些都是常見的選擇

針對每一幀圖像,檢測車輛位置,形成連續追蹤


Behavior Cloning 行爲克隆

使用神經網絡進行無人駕駛的理論基礎來源於Imitation Learning (模仿學習)。行爲克隆算是Imitation Learning的一種。思路倒是很簡單,將人類駕駛作爲基礎數據全部收集下來,然後讓神經網絡去擬合數據。目前Tesla主要採用的就是Behavior Cloning.

這類端到端的解決方案基本上是一個路子,優點:簡單且有效,缺點:受限於收集的數據。因爲訓練集總是有限的,如果出現了神經網絡之前沒見過的數據,那麼效果就會很差。

一個比較經典的條件是天氣,下雨天的路面跟晴天的路面不一樣,有霧的天氣下道路能見度也會對攝像頭收集的數據有很大影響。


原發佈於掘金。2019年初遷移至思否

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章