帶你讀AI論文丨LaneNet基於實體分割的端到端車道線檢測

摘要:LaneNet是一種端到端的車道線檢測方法,包含 LanNet + H-Net 兩個網絡模型。

本文分享自華為雲社區《【論文解讀】LaneNet基於實體分割的端到端車道線檢測》,作者:一顆小樹x。

前言

這是一種端到端的車道線檢測方法,包含LanNet+H-Net兩個網絡模型。

LanNet是一種多任務模型,它將實例分割任務拆解成「語義分割」和「對像素進行向量表示」,然後將兩個分支的結果進行聚類,得到實例分割的結果。

H-Net是個小網絡,負責預測變換矩陣H,使用轉換矩陣H對同屬一條車道線的所有像素點進行重新建模。即:學習給定輸入圖像的透視變換參數,該透視變換能夠對坡度道路上的車道線進行良好地擬合。

整體的網絡結構如下:

論文地址:TowardsEnd-to-EndLaneDetection:anInstanceSegmentationApproach

開源數據集TuSimple:

開源代碼:

一、LanNet

LanNet對輸入圖像進行實例分割,其中網絡結構分為兩個方向,一個是語義分割,另一個是對像素進行向量表示,最後將兩個分支的結果進行聚類,得到實例分割的結果。LaneNet輸出實例分割的結果,為每個車道線像素分配一個車道線ID。

1.1網絡結構

先看看網絡結構:

分支1:語義分割,Segmentation,對像素進行二分類,判斷像素屬於車道線還是背景;

分支2:對像素進行向量,Embedding,對像素進行嵌入式表示,把圖像特徵表示為嵌入空間中,特徵之間的關係映射在嵌入空間。

聚類,基於Mean-Shift算法實現的,把將兩個分支的結果進行聚類,得到實例分割的結果。

LaneNet是基於ENet的encoder-decoder模型,如下圖所示,ENet由5個stage組成,其中stage2和stage3基本相同,stage1,2,3屬於encoder,stage4,5屬於decoder。

1.2語義分割

這部分是對像素進行二分類,判斷像素屬於車道線還是背景;並且高度不平衡,因此參考了ENet,損失函數使用的是標準的交叉熵損失函數。

設計語義分割模型時,為了處理遮擋問題,論文對被車輛遮擋的車道線和虛線進行了還原(估計);

Loss使用softmax_cross_entropy,為了解決樣本分佈不均衡的問題,使用了boundedinverseclassweight對loss進行加權:

其中,p為對應類別在總體樣本中出現的概率,c是超參數。

Loss的設計參考了:論文ENet:ADeepNeuralNetworkArchitectureforReal-TimeSemanticSegmentation

1.3像素映射到嵌入空間

當分割識別得到車道後,為了知道哪些像素歸這條車道,哪些歸那條車道,需要訓練一個車道instanceembedding分支網絡。它能輸出一個車道線像素點距離,歸屬同一車道的像素點距離近,反之遠,基於這個策略,可聚類得到各條車道線。

為了區分車道線上的像素屬於哪條車道,為每個像素初始化一個embedding向量,並且在設計loss時,使屬同一條車道線的表示向量距離儘可能小,屬不同車道線的表示向量距離儘可能大。

這部分的loss函數是由三部分組成:方差損失、距離損失、回歸損失:

其中,C是車道線數量,Nc是屬同一條車道線的像素點數量,μc是車道線的均值向量,xi是像素向量(pixelembedding)。

該loss函數源自於論文《SemanticInstanceSegmentationwithaDiscriminativelossfunction》

方差loss(Lvar):當像素向量(pixelembedding)xi與對應車道線均值向量μc的距離大於δv時,模型會進行更新,使得xi靠近μc;

距離loss(Ldist):當不同車道線均值向量μca和μcb之間的距離小於δd時,模型會進行更新,使得μca與μcb遠離彼此;

方差loss(Lvar)使得像素向量向車道線的均值向量μc靠近,距離loss(Ldist)則會推動聚類中心遠離彼此。

1.4聚類

embedding(像素映射到嵌入空間)已經為聚類提供好的特徵向量了,利用這些特徵向量我們可以利用任意聚類算法來完成實例分割的目標。

聚類是基於Mean-Shift算法實現的,把將兩個分支的結果進行聚類,得到實例分割的結果。

首先使用meanshift聚類,使得簇中心沿着密度上升的方向移動,防止將離群點選入相同的簇中;之後對像素向量進行劃分,直到將所有的車道線像素分配給對應的車道。

二、H-Net

LaneNet的輸出是每條車道線的像素集合,還需要根據這些像素點回歸出一條車道線。傳統的做法是將圖片投影到俯視圖(鳥瞰圖)中,然後使用2階或者3階多項式進行擬合。在這種方法中,變換矩陣H只被計算一次,所有的圖片使用的是相同的變換矩陣,這會導致地平面(山地,丘陵)變化下的誤差。

為了解決這個問題,論文訓練了一個可以預測變換矩陣H的神經網絡H-Net,網絡的輸入是圖片,輸出是變換矩陣H:

通過置0對轉置矩陣進行約束,即水平線在變換下保持水平。(即坐標y的變換不受坐標x的影響)

由上式可以看出,轉置矩陣H只有6個參數,因此H-Net的輸出是一個6維的向量。H-Net由6層普通卷積網絡和一層全連接網絡構成,其網絡結構如圖所示:

三、模型效果

車道線檢測效果,與其他模型對比

​模型的精度高達96.4%,這個效果挺不錯了。

模型速度:

2018年:在NVIDIA1080TI上測得的512X256圖像的速度。總的來說,車道檢測可以以52FPS的速度運行。檢測速度比較快了,實時性較高。

2020年:添加實時分割模型BiseNetV2作為Lanenet主幹,新模型在單幅圖像推理過程中可以達到78fps。可以在此處找到基於BiseNetV2訓練的新Lanenet模型。

模型效果:

四、開源代碼

開源代碼:

該開源代碼是使用LaneNet深度神經網絡模型,進行實時車道檢測(非官方版)

該模型由編碼器-解碼器階段、二進制語義分割階段和使用判別損失函數進行實時車道檢測任務的實例語義分割組成。

代碼的運行環境:(以下是親測的)

系統:ubuntu16.04(x64)

語言:Python3.6

深度框架:TensorFlow1.15.0(GPU版本)

其他依賴庫:cv2、matplotlib、scikit_learn、numpy等。

實踐過程:

1)創建conda環境

condacreate-nLineNetpython=3.6

2)進入剛才創建的環境

condaactivateLineNet

3)根據requirements.txt要求去安裝相關的依賴庫(這裡我也阿里雲加速安裝了)

pip3install-rrequirements.txt-i//mirrors.aliyun.com/pypi/simple/

看了一下這個的文件,發現有點問題。

tensoflow重複了:tensorflow_gpu==1.15.0、tensorflow==1.15.0,根據使用情況刪除一個,我是準確使用GPU加速的,於是刪掉tensorflow==1.15.0。

4)安裝英偉達的cudatoolkit10.0版本

condainstallcudatoolkit=10.0

5)安裝英偉達深度學習軟件包7.6版本

condainstallcudnn=7.6.5

6)設置lanenet_model環境變量

exportPYTHONPATH="${PYTHONPATH}:your_path/lanenet-lane-detection/lanenet_model"

your_path是lanenet-lane-detection文件夾所在的絕對路徑。

7)下載模型

鏈接://pan.baidu.com/s/1-av2fK7BQ05HXjKMzraBSA提取碼:1024

一共4個文件,30M左右。

然後在lanenet-lane-detection目錄下,新建一個子目錄,名為model_weights,存在這個4個模型文件,待會用到。

8)測試模型

pythontools/test_lanenet.py--weights_pathmodel_weights/tusimple_lanenet.ckpt--image_path./data/tusimple_test_image/3.jpg

成功使用GPU加速:

語義分割和像素嵌入效果:

實體分割效果:

模型效果:

參考:

LaneNet:TowardsEnd-to-EndLaneDetection:anInstanceSegmentationApproach

ENet:ADeepNeuralNetworkArchitectureforReal-TimeSemanticSegmentation

DiscriminativeLoss:SemanticInstanceSegmentationwithaDiscriminativelossfunction

論文地址:TowardsEnd-to-EndLaneDetection:anInstanceSegmentationApproach

開源代碼:

本文只提供參考學習,謝謝。

 

點擊關注,第一時間了解華為雲新鮮技術~