單目相機減速帶檢測以及測距項目是一個計算機視覺領域的應用,旨在使用一個攝像頭(單目相機)來識別道路上的減速帶,并進一步估計車輛與減速帶之間的距離。這樣的系統對于智能駕駛輔助系統(ADAS)特別有用,因為它可以幫助駕駛員提前減速,避免碰撞或劇烈顛簸。
下面是一個典型的單目相機減速帶檢測和測距項目的組成部分:
1.?數據集準備
- 收集包含減速帶的大量圖像或視頻片段,這些數據用于訓練機器學習模型。
- 數據集應該多樣化,包括不同天氣條件、光照水平、減速帶類型和視角的圖像。
2.?目標檢測模型訓練
- 使用深度學習框架,如YOLOv5、SSD或Faster R-CNN,訓練一個目標檢測模型以識別減速帶。
- 訓練模型需要標注的數據,即在每張圖像中標注減速帶的位置。
3.?相機標定
- 為了準確地測量距離,必須先標定相機,以獲取其內參數(如焦距、主點位置)和任何畸變參數。
- 標定通常使用帶有已知幾何圖案(如棋盤格)的標定板完成。
4.?測距算法開發
- 開發算法來根據減速帶在圖像中的大小和相機的參數計算其距離。
- 可以采用三角法或透視投影法,其中已知減速帶的實際尺寸是一個關鍵參數。
5.?系統集成與測試
- 將檢測和測距模塊整合到一個系統中,確保它們協同工作。
- 在各種條件下測試系統,包括不同的光線、角度和減速帶類型,以評估其魯棒性和準確性。
6.?實時處理
- 優化系統以實現實時處理,這對于車載應用至關重要。
- 可能需要硬件加速,如GPU或專用的計算機視覺處理器,以達到所需的幀率。
7.?用戶界面與警報系統
- 設計用戶界面,顯示減速帶的位置和距離信息。
- 如果減速帶距離過近,可能需要觸發警報系統,提醒駕駛員采取行動。
在實際應用中,單目相機減速帶檢測和測距項目可能還會涉及到一些挑戰,例如減速帶的多樣性(形狀、顏色、材質)、環境因素的影響(如陰影、雨雪等)以及相機運動的補償等。因此,持續的改進和適應性是此類項目成功的關鍵。
?
一、相機標定(拍照+標定+去畸變)
? 相機標定在calibration.py里實現。目前不足:魚眼相機去畸變有點問題,其他均正常。
? 使用方法:運行calibration.py,按照提示運行即可。請注意,本程序capture時會自動清空標定板圖片文件夾(已修改為可選擇是否清空)。先capture拍照,拍照數目可以在程序里預設;然后calibrate標定,不同類型相機的結果會自動寫入不同config里。然后可以undistort去畸變。
? 標定板相關請參考我的博客:本程序使用的標定板是x方向奇數11個、y方向偶數8個、角點間距1cm的標定板,在程序里為calibration.py的:
board = Board(11,8,10) #col row width(mm)
把部分函數放入到了utils/calibrate下,供其他程序使用。新增了鳥瞰圖,運行birdeye.py即可。
? PS:鳥瞰圖轉換中,標定板平面坐標系的原點以左上角為基礎,向左上平移了200mm。
二、單應矩陣標定
? 本著有啥用啥的原則,我直接用宿舍的瓷磚標定了哈哈哈(其實之前用外面的瓷磚標定過,但是相機太爛了拍不清,在宿舍放了幾個標志物再標定的)。
? 單應矩陣至少需要四個點,用findHomography函數,這里有個坑了我一下午的坑:這個函數找到的H滿足 $$ c[x,y,1]^T = H[u,v,1]^T $$? 其中,u,v是成像坐標系的點,x,y是地面坐標系的點。一定注意還有個c,因為H是八自由度的,最后得到轉換后的坐標不是標準齊次坐標,還要手動轉化為標準齊次坐標。
? 程序運行方法:運行getHomography.py以拍照、鼠標點擊獲得像素以及標定(大體是這樣,我最后把像素坐標寫死了),然后求解H;運行getDistance以實現運用獲得的H點擊像素之后測距(可能以后會刪除,因為這個.py是用來測試測距的)。
三、目標檢測
? 初步試了下用自己的數據集訓練。建立了datasets文件夾,標注工具為labelimg。數據處理過程為:
1.將要標注的圖片放到data/images里。
2.用labelimg標注,標注結果放到data/labels里。
3.進入yolo文件夾(否則路徑不對),運行yolo文件夾下的data_process.py來劃分數據,生成訓練集等路徑。
踩了以下坑,作個匯總以作為注意事項。
1.train.py的config我更改過。之前當使用預訓練時,會報keyerror:"assets"的錯誤。(據我觀察,這基本就是.pt文件路徑不對的問題,請檢查自己參數里的路徑是否寫對了)。
2.train.txt等等里面的路徑最好還是寫絕對路徑,用os.getcwd和join拼接即可。
3.如果要用cpu訓練,把utils/loss.py里面的780多行那幾個device gpu:0務必改成cpu:0.
4.如果要使用預訓練,請修改cfg/training/yolov7.yaml里的nc為對應數量。
5.訓練前記得刪除dataset文件夾里的cache!
6.yaml不要寫漢語!!!會gbk錯誤