手把手写Demo系列之车道线检测
點擊上方“3D視覺工坊”,選擇“星標”
干貨第一時間送達
文章導讀
本文是一篇從零開始做車道線檢測Demo的教學式文章,從場景的定義到模型微調的輸出,描述車道線Demo式例程中在每個環節需要做的工作,以及中途可能會遇到的各種問題。
1
場景維度定義
根據任務需求,需要對其進行維度劃分以便后續數據采集和模型評估。如果我們做一個全場景的車道線檢測任務,需要考慮:
時間維度:白天、晚上
天氣維度:晴朗、陰天、下雨
應用場景:高速道路、城市道路、鄉鎮小路
目標類別:長實線、雙黃線、虛線等等
難易情況:道路清晰、數據遮擋、車道線磨損等
數據采集之前必須明確任務需求,在什么場景下能夠解決什么樣的問題?做Demo不可能一個模型適用所有自然場景。
2
數據采集清理
根據設定好的需求場景,以視頻錄制的方式采集,一般需要以下幾個步驟:
視頻錄制
間隔抽幀
相似性過濾
數據分類
數據篩選
視頻錄制過程中,如果使用的是USB等免驅的攝像頭,直接調用OpenCV的VideoCapture接口打開即可;如果使用的是車載相機需要購買配套的解串套件或者根據攝像頭的串行編碼,對應完成解串功能獲取Raw Data數據。
間隔抽幀這一步考慮到視頻如果按照30FPS的幀率錄制,在每一幀之間的變化很小,特征差異不大,將這些圖片全部進行后續的標注會增加很大的人力成本,所以通常以5s/幀的方式進行幀間采用,推薦使用ffmpeg指令,簡單方便,對于畫質、采樣率、采用周期等均可以參數調節:
ffmpeg -i out.avi -r 5 -f image2 image-%05d.jpeg
相似性過濾用于解決車輛反復行駛在相同路段情況、車速在行駛過程中有快有慢,甚至遇到紅綠燈時停車小一分鐘的情況,間隔抽幀后的數據中仍然有很多重復或者相似的圖片。
圖像之間的相似性度量方法很多,傳統算法一般采用特征提取+距離度量,根據閾值判斷;深度學習方法把上述兩步封裝在端到端的網絡中。考慮到這里僅是預處理的環節,采用類似直方圖統計、感知哈希、結構相似性等類似算法即可,針對車道線檢測的任務, 關注的區域在地面上,所以需要將感興趣區域限定在圖像下方(下圖綠色直線下方):
數據分類是為了匹配場景維度的定義,將不同場景或者類型的圖片數據放在定義好的文件夾中,觀測數據量在類別之間的平衡,有利于后續有針對性的填充數據。比如將城市道路的數據和高速道路數據分開存放,白天和晚上的數據分開存放等。
數據篩選的細致與否會影響到后續網絡模型的收斂以及精度優劣,雖然神經網絡具有較強的特征提取能力,對場景有一定魯棒性,但是在訓練數據中添加太多的噪聲也會提升網絡學習難度(畢竟寫Demo階段,并沒有海量數據能夠把噪聲淹沒),訓練的數據希望是如下車道線清晰,光照良好的數據:
但是實際上自然場景采集的圖片數據存在很多噪聲,比如擁堵路段的車道線遮擋嚴重,如果車道線網絡模型采用像素級分類的思路搭建,對以下圖片的標注就比較困難;如果車道線網絡模型上升到抽象的語義空間,根據上下文的環境信息預測車道線空間位置,下圖倒也可以使用。
除了車道線被遮擋的問題,在城市路況中存在施工或很久未翻修的老路,道路線條磨損嚴重,很多情況人肉眼都無法區分,建議刪除這一部分訓練數據:
當然也有很多本來就沒有車道線的路況,此類數據需要根據數據轉換的程序來決定去留,在數據轉換時僅少數代碼未加判斷會導致程序崩潰:
檢查數據時還會遇到在拱橋下,進出隧道等光照昏暗或者曝光嚴重的情況,造成車道線辨別率降低,如下圖所示:
當然你要問實際工程上如何解決這些問題,無外乎從軟件角度怎么增加算法模型的魯棒性;從硬件角度如何定制傳感器接受更多光子以及優化ISP算法。
3
樣本標注轉換
本次車道線檢測的歷程,我們采用實例分割的方式做逐像素點的分類。可以采用開源的標注工具,比如labelme,標注精靈等。
第一步:根據模型的不同,輸入數據的類型也存在差異,這里我們采用劃線的方式進行標注,如下圖所示,因為是實例分割,不同的車道標注不同的類別:
如果采用labelme進行標注,生成的是json格式的標簽數據,如下圖所示,標簽中以折點的形式存儲:
第二步:使用labelme自帶的功能函數轉換成實例圖等信息,其中包括原始圖片,實例圖,可視化圖等:
第三步:由于搭建的網絡如果輸入原始圖像、語義圖像、實例圖像三種,所以需要將json轉換后的數據通過腳本生成TuSimple數據集的形式,得到如下形式,三個文件夾分別存放二值圖,原始圖,示例圖,train.txt用于存放訓練數據列表,val.txt用于存放驗證數據列表:
4
模型預訓練
基于深度學習的方法造輪子的成本一般很高,需要經歷大量的模型修改、參數調節的反復試錯過程。不僅對服務器硬件平臺有較高的要求,也考驗算法工程師自身的知識積淀。
如何快速高效的寫Demo呢?
現有網絡模型
開源數據集
自己數據微調
之前有篇文章具體聊過車道線檢測的網絡,大多數是基于像素的分割模型,也有一些基于檢測方法的車道線檢測,常用的開源模型相關論文如下(可以找小編要或者等后續上傳云盤):
車道線的開源數據集有很多,比如:
Caltech
VPGNet
TuSimple
CULane
BDD100k
ApolloScape
CurveLanes
TuSimple數據集位于高速場景,天氣晴朗,車道線較為清晰,適用于高速,高架等應用場景的Demo制作:
CULane數據集包含擁擠,黑夜,暗影等八種難以檢測的情況,適合補充TuSimple數據集提升難例的精度:
因為TuSimple和CULane數據量均不大,適合普通服務器或者本機上的預研式訓練。推薦將兩個數據集的數據統一進行模型訓練,得到一份預訓練的權重。
更為簡單的方法即是下載開源模型提供的一些權重,省去了自己訓練的環節,不過這樣會大大降低模型修改的靈活度,現在的分割網絡一般基于encoder-decoder的形式搭建,為了加速推理時間或者提供預測精度,通常會對開源網絡做些修改:
采用輕量化模型替換特征提取網絡;
減少上采樣次數,替代掉全分辨率的輸出;
增加ASPP或者Attention機制
模型結構變化后就無法使用源碼中提供的預訓練權重,所以后續微調的靈活度出發,自己用開源數據集做訓練的方法最佳。
5
Fintune訓練
Fintune階段一般就兩步:
加載預訓練模型
加載自己的數據繼續訓練
加載預訓練模型時,可以考慮是否需要凍結encoder層或者只釋放最后幾層進行參數更新,當然也可以不凍結模型,全部進行微調。根據開源數據和自己數據的比例及差異而決定:
開源數據量遠大于自己的數據并且類型差異不大,建議只釋放網絡后面的幾層進行微調;
開源數據量僅比自己的數據多一個量級但是類型差異較大,建議參數全部參與訓練;
加載自己的數據訓練,期望是損失不斷下降最后收斂,不過大多數時候屬于——期望很美好,現實很骨感。可能會遇到:
實例損失居高不下;
訓練開始梯度爆炸;
模型震蕩不收斂等;
可以嘗試以10倍遞減降低學習率;修改學習率衰減策略;修改網絡實例分割部分的聚類參數;最最最重要的是檢查數據和標簽
由于選用的車道線檢測網絡的實例分割部分會根據點到不同車道線的距離來迭代拉近類內距離,放大類間距離,所以如果數據中的不同車道線在遠處交織在一起,就很容易造成實例損失的異常,如下圖所示:
通過進一步過濾標簽數據,或者做截斷,通過后處理的曲線擬合來彌補前方損失的一小段車道。
最后訓練收斂后用驗證集做評估,或者直接拉到路上進行測試,畢竟做Demo,針對實際場景不好的數據再收集回來做數據填充迭代。
本文僅做學術分享,如有侵權,請聯系刪文。
下載1
在「3D視覺工坊」公眾號后臺回復:3D視覺,即可下載 3D視覺相關資料干貨,涉及相機標定、三維重建、立體視覺、SLAM、深度學習、點云后處理、多視圖幾何等方向。
下載2
在「3D視覺工坊」公眾號后臺回復:3D視覺github資源匯總,即可下載包括結構光、標定源碼、缺陷檢測源碼、深度估計與深度補全源碼、點云處理相關源碼、立體匹配源碼、單目、雙目3D檢測、基于點云的3D檢測、6D姿態估計源碼匯總等。
下載3
在「3D視覺工坊」公眾號后臺回復:相機標定,即可下載獨家相機標定學習課件與視頻網址;后臺回復:立體匹配,即可下載獨家立體匹配學習課件與視頻網址。
重磅!3DCVer-學術論文寫作投稿?交流群已成立
掃碼添加小助手微信,可申請加入3D視覺工坊-學術論文寫作與投稿?微信交流群,旨在交流頂會、頂刊、SCI、EI等寫作與投稿事宜。
同時也可申請加入我們的細分方向交流群,目前主要有3D視覺、CV&深度學習、SLAM、三維重建、點云后處理、自動駕駛、多傳感器融合、CV入門、三維測量、VR/AR、3D人臉識別、醫療影像、缺陷檢測、行人重識別、目標跟蹤、視覺產品落地、視覺競賽、車牌識別、硬件選型、學術交流、求職交流、ORB-SLAM系列源碼交流、深度估計等微信群。
一定要備注:研究方向+學校/公司+昵稱,例如:”3D視覺?+ 上海交大 + 靜靜“。請按照格式備注,可快速被通過且邀請進群。原創投稿也請聯系。
▲長按加微信群或投稿
▲長按關注公眾號
3D視覺從入門到精通知識星球:針對3D視覺領域的知識點匯總、入門進階學習路線、最新paper分享、疑問解答四個方面進行深耕,更有各類大廠的算法工程人員進行技術指導。與此同時,星球將聯合知名企業發布3D視覺相關算法開發崗位以及項目對接信息,打造成集技術與就業為一體的鐵桿粉絲聚集區,近3000星球成員為創造更好的AI世界共同進步,知識星球入口:
學習3D視覺核心技術,掃描查看介紹,3天內無條件退款
?圈里有高質量教程資料、可答疑解惑、助你高效解決問題
覺得有用,麻煩給個贊和在看~??
總結
以上是生活随笔為你收集整理的手把手写Demo系列之车道线检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot:搭建第一个Web程
- 下一篇: java pdf文件压缩_PDF文件压缩