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