UFLD 介紹

How哥
12 min readJul 17, 2023

--

Ultra Fast Structure-aware Deep Lane Detection 超快速車道線偵測(Lane Detection)

雖然是 2020 年發表的論文,但他的 Inference 速度之快,如果想要放到邊緣裝置上應用的話,是一個非常可行的方案

ECCV 2020

Introduction

車道線偵測 (Lane Detection) 對於自駕車領域是一個重要的應用,在以往偵側車道線的方法有兩種,第一種是傳統的影像處理法,以前課堂上有教過,用類似投票的方式選出車道線在哪邊。第二種是影像分割的方法 (Segmentation Method),使用 Deep Learning Network 的方式,讓圖片上每一個 pixel 預測出一個機率值,代表自己是不是屬於車道線,這方法在近年來大獲成功,但 Semantic Segmentation 本身非常耗時的方法,邊緣裝置運算速度有限,比較難部署這種大模型,也很難應用

因此本篇論文提出新方法,有別於 Semantic Segmentation 讓每個 pixel 都預測出是否為車道線,他們把圖片分成很多的 grid,並讓每個 grid 預測出答案,如此可以大幅降低運算量,精準度跟當時 state-of-the-art 模型差不多,速度更是他的 4 倍,在 CULane dataset 還可以達到 300+ FPS

可以看到作者把圖片分成很多的 grid,他們也稱作為 anchor,如果該 anchor 在車道線上,就會把它標記出來

Related Work

Traditional methods

大多使用 HSI model 或是邊緣偵測的演算法,當視覺資訊不夠多時,還有使用追蹤還後處理找到的直線現在應該在哪個位置。或者使用 Markov and conditional random fields 來進行後處理

Deep learning Models

VPGNet 用消失點導出車道線的位置。SCNN 使用他們提出來的特殊 convolution layer 並且用 segmentation 找出車道線。有人想利用 LSTM 找出長直線各點之間的關係,也有人針對不平的道路提出 3D 車道線偵測的方法

Method

先附上一張表格,有不懂的變數名稱都可以來這裡看

其實這篇論文的觀點非常簡單,我們可以用以下這張圖來說明

(a) 是本篇論文的方法,(b) 是傳統論文的作法

從上圖 (a) 我們可以知道幾件事情

  • C 是代表總共有幾條直線,比如說這個 Dataset 中最多有 4 條線 (C=4),那 C 中的每一片 feature 就會預測出該條線的位置
  • ω 代表一條 row anchor 要被切成幾等分,對映著偵測線的細緻程度,切的越細就越準,但計算量也會增加,圖上面寫 ω+1,作者規劃多一個空間代表這條 row anchor 中到底有沒有該條線
  • h 表示畫面的高,要用多少條 row anchor 來表示,也是越細預準

至於圖 (b) 是 Semantic Segmentation 的作法,每一格都代表著一個 pixel,模型需要預測的參數就會多很多,因為 ω 遠小於 W (ω<<W),h 遠小於 H (h<< H)

Loss

針對上面的 Loss,作者使用常見分類用的 Cross Entropy Loss

X是圖片輸入,i,j 代表 iterate 過每一條 row anchor,最後得到該 row 的一條機率值 Pij
這邊的 T 是Ground True,Tij是把圖片切成格子狀之後,去記錄哪幾格包含道路線,並把整條 row anchor 用 One-Hot Label 的方式標記。最後跟模型預測出來的結果 Pij 計算 Cross Entropy Loss

Lane structural loss

在實際應用場景中,常常會發生因為遮擋或是光線散射等等問題,導致畫面上無法清楚分辨車道線,作者稱這個形況為 no-visual-clue problem,為了解決這個問題,作者提出另外兩個 Loss,讓模型了解同一條線中每個 grid 之間的關係,也透過 structural loss 利用位置資訊補足缺少的資訊,學習線的形狀和方向

當線被遮擋時,模型有能力利用附近的位置資訊來判斷正確的車道線位置

Similarity Loss

一條正常的車道線,他應該要是連續的,所以我們可以限制鄰近的兩條 row anchor 中,兩個分別被判斷為車道線的 anchor 距離應該要盡可能相近,可以寫成以下的表示法:

剛才提過 Pij 代表那一條 row anchor 的機率,所以限制兩條相鄰的 row 相減的值要越小越好

Shape Loss

這個 Loss 著重在線的形狀,大部分的線都是直線,即使有些道路線有彎曲,切成多條線斷來看依舊是直線

為了考慮車道的形狀,直觀的想法就是找出車道的位置,在 row anchor 中分數最高的那個 grid 就是車道線所在的位置:

我們只取 1 ~ ω,不考慮 background

Pijk 代表第 i 條線中的第 j 條 row anchor 的第 k 個位置的值,但我們知道取最大值會讓這個式子無法微分,所以後面更改成整條 row anchor 先用 softmax 轉換成 0~1 的機率值後,

算出整條的機率值

乘上 k 轉換成期望值,k 是一個整數,代表 row 中的第幾個 grid,式子可以寫成底下:

Loc 算出來代表期望值

接著作者用二分差來限制線的形狀發展,二次微分代表著該量的變化速度,透過底下的限制,可以讓預測出來離散的值有連續的關係

這個公式希望自己和下一個的差,和下一個和下兩個的差不要太多,有點繞口

最後全部的 structural loss 可以寫成底下:

λ 代表權重

Feature aggregation

我個人覺得最沒用的部分,就是這個 Feature aggregation,先看看整個模型架構圖

橘色框框的部分就是 Feature aggregation,只有訓練的時候會走這條路徑,Inference 只會走底下的路徑

藉由上面的 auxiliary segmentation task 來讓 backbone 擁有融合 multi-scale features 的能力,並讓他去預測 segmentation 的結果計算 Loss:

整個模型訓練的 Loss

如果以現代的角度來看,有很多方法都可以讓 backbone 有多尺度視野的能力,像是使用 DLA、Res2Net、FPN 等等許多 aggregation 可以用,只是該論文發表在 2020,當時可能沒有那麼多技術被提出來

Experiments

介紹一下資料集,目前車道偵測最主流的兩個 TuSimple、CULane

  • TuSimple: 在高速公路上行駛的照片,有穩定和充足的光線
  • CULane: 有 9 種不同的場域包括 normal, crowd, curve, dazzle light, night, no line, shadow, and arrow in the urban area
兩個資料集的比較

因為第一次看這類主題,所以列一下 metrics 如何計算,兩個資料集的評比標準不同

TuSimple

Cclip 代表有多少個 lane points 成功倍預測出來,Sclip 代表這個 clip 中總共有多少個 ground true lane points

所以很酷的是,即使預測錯誤分數也不會下降

CULane

每一條線的寬度被視為 30 pixels,只要預測出來的結果和 GT 的 IOU 超過 0.5 就算是 true positive,計算標準使用 F1-measure

Precision = TP/(TP+FP), Recall=TP/(TP+FN)

Data augmentation

做一些基本的 Data augmentation 包含 rotation, vertical and horizontal shift,為了保留車道線的結構,他們把做過 augmentation 的 ground true 線拉長到底,像下圖顯示這樣

把增強後的圖片中的線延長到底

Ablation Study

至於一個 row anchor 要分成多少個 grid 才足夠,作者分別做了 25、50、100 和 200 個 gird 來做實驗。愈大的 grid 雖然能在分類上達到比較好的結果,但是在定位上面就會非常不精準,越多的 grid 代表精緻度越高,但同時特徵中還有的資訊量也必須夠多才有辦法分類精準,最後取 100 當實驗最後的設定

超過 100 格,精準度會驟降

為了測試最後偵測線的地方用 regression 比較適合還是用 classification 比較適合,在會後接上輸出前的那組 head 進行替換,結果如下圖,CLS 和 CLS Exp 差在定位的方法不同,一個使用 argmax 另一個用 softmax

下圖是各個部份對模型精準度個貢獻,除了 New formulation 之外,其他的進步效果都有限,但我覺得這個論文最主要的貢獻是提出用 grid 偵測車道線的新方法

加入 Feature aggregation 只有提升 0.1%~0.34% 的精準度而已,而加入 Structural loss 也只有提升 0.08%~0.32%,影響不大

作者印出 Loss function 繪成的曲線圖,表示使用 similarity loss 會讓整個取線更平滑,更好走到最佳解

Qualitative comparison of similarity loss

Results

在速度上,完全壓制當時現有的論文,雖然準確度小輸一點點,但在 Inference time 卻是快了第二名 2 ~ 4 倍的速度

TuSimple 的結果比較,Multiple 中的倍數 x 是基於最慢的 SCNN

至於在多個場景的 CULane上,F1-score 也贏其他論文許多,底下的 FPS 建立於 GTX 1080 Ti 上,並且跑 100 次的平均結果

CULane 的結果跟其他論文比較

底下是一些視覺化的結果,前兩個 row 是 Tusimple,剩下的是 CULane,最左 column 中 ground true 是紅色,藍色是預測出來結果

Conclusion

我覺得這篇論文最大個貢獻在於提出用 row anchor 的方式來尋找車道線,在實際應用上,我們並不需要知道每一個 pixel 是不是車道,而是只要告訴我大概的位置就行,所以用一個較大框框表示那裡有車道線,是一個聰明又快速的方法,對於被部署裝置算是輕量級模型

如果拿轉成 tensorflow light,就能裝在邊緣裝置上,有一個坑需要注意,用 conda tensorflow 比用 pip tensorflow 跑得還快,因為 conda tensorflow 有支援 CPU 加入運算,詳情請看

Code

還有提供 pretrain weight,真的棒

--

--

How哥

台灣科技大學資工所研究生,把有趣的電腦視覺論文整理上來,希望能幫助到有需要的人,聯絡信箱 b10515007@gmail.com