无人驾驶环境感知 | 01 车道线检测网络LanNet原理及实现
文章目錄
- 一、LaneNet 算法詳解
- 1.1 LaneNet 簡介
- 1.2 整體結構分析
- 1.3 LaneNet 網絡結構
- 1.4 H-Net 網絡結構
- 1.5 LaneNet 性能優點
- 二、手把手帶你實現 LaneNet
- 2.1 項目介紹
- 2.2 環境搭建
- 2.3 準備工作
- 2.4 模型測試
- 1024,祝大家節日快樂!喜歡就給我點個贊吧,您的支持是我創作的最大動力!
資源匯總:
論文下載地址:https://arxiv.org/abs/1802.05591
github項目地址:https://github.com/MaybeShewill-CV/lanenet-lane-detection
LanNet論文翻譯:車道線檢測網絡之LaneNet
關注下方公主號【AI 修煉之路】,回復【LaneNet】,獲得LanNet資料合集
一、LaneNet 算法詳解
1.1 LaneNet 簡介
傳統的車道線檢測方法依賴于手工提取的特征來識別,如顏色的特征、結構張量、輪廓等,這些特征還可能與霍夫變換、各種算子或卡爾曼濾波器相結合。在識別車道線之后,采用后處理技術來過濾錯誤檢測并將其分組在一起以形成最終車道。然而,由于道路場景的變化,這些傳統的方法容易出現魯棒性問題!
更新的方法利用深度學習模型,這些模型被訓練用于像素級車道分割。但這些方法僅限于檢測預定義的固定數量的車道,例如當前車道,并且不能應對車道改變。
基于此,2018年Davy Neven等人提出一種新的車道線檢測網絡LaneNet,LaneNet主要做出了如下兩個貢獻:
- 將車道檢測問題歸結為一個實例分割問題,其中每條車道都形成了自己的實例,可以端到端地進行訓練。
- 構建了一個新的網絡H-Net,用于學習給定輸入圖像的透視變換參數,該透視變換能夠對坡度道路上的車道線進行良好地擬合,克服了魯棒性不好的問題。
1.2 整體結構分析
作者提出了一個多分支的網絡結構,包含一個二值化分割網絡(lane segmentation)和一個實例分割網絡(lane embedding),從而實現端到端、任意數量的車道線檢測。具體來說,二值分割網絡輸出所有的車道線像素,而實例分割網絡將輸出的車道線像素分配到不同的車道線實例中。整體的網絡結構圖如下:
另一方面,數據集輸入到H-Net網絡中,學習到透視變換參數H矩陣。用于不同車道線實例的像素,進行車道線擬合,從而得到上圖所示連續點狀的車道線。
1.3 LaneNet 網絡結構
LaneNet的整體網絡結構如下:
二值化分割網絡
Lanenet的一個分支為二值化分割網絡,該網絡將車道線像素與背景區分開。由于目標類別是2類(車道/背景),并且高度不平衡,因此參考了ENet,損失函數使用的是標準的交叉熵損失函數。
實例分割網絡
該分支網絡參考了《Semantic Instance Segmentation with a Discriminative Loss Function》,使用基于one-shot的方法做距離度量學習,將該方法集成在標準的前饋神經網絡中,可用于實時處理。該分支網絡訓練后輸出一個車道線像素點距離,基于歸屬同一車道的像素點距離近,不同車道線像素點距離遠的基本思想,利用聚類損失函數聚類得到各條車道線。
聚類損失函數
損失函數如下:
?? ?[x]+=max(0,x)[x]_+=max(0, x)[x]+?=max(0,x)
?? ?Ltotal=Lvar+LdistL_{total}=L_{var}+L_{dist}Ltotal?=Lvar?+Ldist?
其中,各個參數表示如下:
- C——表示車道線實例個數;
- NcN_cNc?——每個車道線實例中像素的個數;
- ucu_cuc?——每個車道線實例的像素中心;
- LvarL_{var}Lvar?是方差損失,他的目的是為了降低類內距離;
- LdistL_{dist}Ldist?是距離損失,它的目的是增大類間距離 (不同車道線之間的距離);
網絡結構圖
LaneNet的架構基于編碼器-解碼器網絡ENet,該網絡是由5個階段組成。前3個階段是編碼器網絡,進行了兩次下采樣;后兩個階段是解碼器網絡,進行了兩次上采樣。
LaneNet在該網絡的基礎上修改成了雙分支網絡。由于ENet的編碼器比解碼器包含更多的參數,完全在兩個任務之間共享完整的編碼器將導致不令人滿意的結果。因此,LaneNet只在兩個分支之間共享前兩個階段(1和2),留下ENet編碼器的階段3和完整的ENet解碼器作為每個單獨分支的主干。分割分支的最后一層輸出單通道圖像,用于二值化分割;而實例分割分支的最后一層輸出N通道圖像,其中N是實例維度。每個分支的損失項都是相等加權的,并通過網絡反向傳播。
1.4 H-Net 網絡結構
LaneNet網絡輸出的是每條車道線的像素集合,常規的處理是將圖像轉為鳥瞰圖,然后用二次或三次多項式擬合出彎曲的車道線。然而,目前所使用的透視變換矩陣的參數通常是預先設定、不會改變的,在面對水平線波動的影響(如上下坡)等情況下的車道線擬合并不準確,魯棒性不強。因此,作者提出了H-net模型,用來學習透視變換矩陣的參數H。
H有6個自由度,放置零是為了強制約束,即在變換下水平線保持水平。
H-NET的網絡體系結構較小,由3x3卷積、BN層 和 Relu 的連續塊構成。使用最大池化層來降低維度,并在最后添加2個全連接層。完整的網絡結構如下圖所示:
最后一個全連接層的結點數是6,對應的就是H矩陣中的6個參數。
1.5 LaneNet 性能優點
檢測速度。在英偉達1080Ti顯卡上進行測試,檢測一幀大小為512x512的彩色圖片,耗時19ms,因此每秒可處理50幀左右。
檢測精度。 通過使用LaneNet結合三階多項式擬合和H-Net的變換矩陣,在tuSimple挑戰中檢測精度達到96.4%,獲得了第四名,與第一名相比只有0.5%的差異。結果可以在下表中看到。
二、手把手帶你實現 LaneNet
2.1 項目介紹
該項目在github上已經開源,獲得了1.3k的星標,想試試的同學可克隆下來:https://github.com/MaybeShewill-CV/lanenet-lane-detection,如果打不開,也可以從我的百度云網盤下載:LaneNet資料合集 ,提取碼:o1kf
代碼結構和各部分功能如下:
lanenet-lane-detection ├── config //配置文件 ├── data //一些樣例圖片和曲線擬合參數文件 ├── data_provider // 用于加載數據以及制作 tfrecords ├── lanenet_model │ ├── lanenet.py //網絡布局 inference/compute_loss/compute_acc │ ├── lanenet_front_end.py // backbone 布局 │ ├── lanenet_back_end.py // 網絡任務和Loss計算 inference/compute_loss │ ├── lanenet_discriminative_loss.py //discriminative_loss實現 │ ├── lanenet_postprocess.py // 后處理操作,包括聚類和曲線擬合 ├── model //保存模型的目錄semantic_segmentation_zoo ├── semantic_segmentation_zoo // backbone 網絡定義 │ ├── __init__.py │ ├── vgg16_based_fcn.py //VGG backbone │ └─+ mobilenet_v2_based_fcn.py //mobilenet_v2 backbone │ └── cnn_basenet.py // 基礎 block ├── tools //訓練、測試主函數 │ ├── train_lanenet.py //訓練 │ ├── test_lanenet.py //測試 │ └──+ evaluate_dataset.py // 數據集評測 accuracy │ └── evaluate_lanenet_on_tusimple.py // 數據集檢測結果保存 │ └── evaluate_model_utils.py // 評測相關函數 calculate_model_precision/calculate_model_fp/calculate_model_fn │ └── generate_tusimple_dataset.py // 原始數據轉換格式 ├─+ showname.py //模型變量名查看 ├─+ change_name.py //模型變量名修改 ├─+ freeze_graph.py//生成pb文件 ├─+ convert_weights.py//對權重進行轉換,為了模型的預訓練 └─+ convert_pb.py //生成pb文2.2 環境搭建
根據開源作者描述,其測試的環境為:
- ubuntu 16.04
- python3.5
- cuda-9.0
- cudnn-7.0
- GTX-1070 GPU
- tensorflow 1.12.0
我使用的環境與配置為:
- ubuntu16.04系統
- PyCharm 2020
- python3.6
- tensorflow1.13.1-gpu
- cuda-10.0
- cudnn7.6.4
- opencv4.0.0
- RTX 2070 GPU
想嘗試的朋友,可以參考上面兩種配置,也可以自行嘗試其他的版本。
2.3 準備工作
如果想要自行訓練的同學,可以下載TuSimple數據集,進行訓練。同樣,我們也可以直接使用官方訓練好的模型,來輸入圖片,看看測試效果。為了方便,下面我們直接加載已經訓練好的模型,進行本地測試。
(1) 下載TuSimple數據集,如果不訓練可以跳過這一步。
(2) 下載訓練好的模型,下載鏈接:LaneNet資料合集 ,提取碼:o1kf
下載完后,我們將模型文件tusimple_lanenet放在工程目錄下的model文件中,如下圖所示:
2.4 模型測試
完成環境配置和模型部署后,我們就可以進行測試了!
(1) 先對TusSample數據集中的圖片進行測試
- 第一步,在原工程目錄下的data文件中新建一個Mytest文件夾,然后任意選取TusSample數據集中的一張圖片放入其中,例如1.jpg,如下圖所示:
- 第二步,使用PyCharm打開下載好的項目工程,配置好環境后,打開終端,如下圖所示:
- 第三步,在終端輸入以下命令,執行程序:
最后車道線檢測效果如下:
(2)對自己的圖片進行測試
- 第一步,選擇自己拍攝的一張車道線圖片2.jpg,放入剛才新建好的Mytest文件夾下,如下圖所示:
第二步,打開終端,輸入命令,執行程序:
對自己的拍攝的圖片檢測效果如下:
測試分析:
從圖中可以看出,對自己的圖片進行檢測時,最終的檢測結果雖然能夠完美地與實際車道線重合,但是延伸至了空中。
產生這種情況最主要的原因是:沒有自己制作數據集進行訓練,從而得到更有針對性的模型造成的。由于這里我使用的測試模型是在TuSimple數據集下訓練得到的,所以我們對TuSimple中的圖片測試效果會很好,比如前面的1.jpg。
如果我們想要對自己的圖片進行測試,得到更好的效果,那么就需要自己的數據集。比較好的辦法是:
- 首先在TuSimple數據集下進行訓練,得到的訓練模型作為預訓練模型,這一部分工作其實已經做好了,大家直接下載預訓練模型即可
- 然后,在預訓練模型的基礎上,加載自己制作的數據集,再進行訓練,直到達到預期的效果。
采用這種遷移學習的思想,往往能夠事半功倍!
1024,祝大家節日快樂!喜歡就給我點個贊吧,您的支持是我創作的最大動力!
總結
以上是生活随笔為你收集整理的无人驾驶环境感知 | 01 车道线检测网络LanNet原理及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言水王争霸链表,水王争霸(water
- 下一篇: 陶哲轩实分析 习题5.5.2