一、項目范圍
該項目是一個高級駕駛輔助系統的原型,專注于感知算法(目標檢測、車道線分割和交通標志分類)。它提供了3個主要功能:
前方碰撞警告
車道偏離警告
交通標志檢測及超速預警
它還提供了「有限的」虛擬硬件訪問權限,作為邁向商業產品的一步:
通過 LAN 中的 GPS 源的 GPS 讀取器
一個 CAN 讀取器,用于從虛擬 can 總線讀取車速和轉向信號
但是,可以使用 GPS 模塊或 CAN 轉 USB 電纜收集 GPS 和 CAN 信號。我將提供一些關于如何設置這些設備的說明。
二。硬件設置
處理該項目所有輸入的中心組件是中央處理器。這臺計算機接收兩個輸入:(i) 來自相機的圖像,以及 (ii) 汽車底盤數據,例如汽車速度和轉向信號。中央處理負責處理這些輸入以在需要時發出警告。在這個項目的范圍內,由于實驗條件有限,我們實施了一個「模擬模塊來提供相機和傳感器讀取器輸入的替代方案」。在商業產品中,傳感器讀取器模塊可以通過 GPS 模塊和 CAN 總線讀取器(例如 CAN 轉 USB 電纜)來實現;可以使用 USB 攝像頭提供攝像頭輸入。
「硬件清單:」
Jetson Nano 開發者套件
Sandisk Ultra 64GB class-10 SD 卡
Wareshare 5寸液晶觸摸屏
Wareshare 8Ω 5W 喇叭
Jetson Nano 2寸5V散熱風扇
透明外殼。
1.如何獲取汽車傳感器(速度,轉向燈)
使用 GPS 模塊
「出于開發和教育目的:」
從您的手機共享 GPS:
從 Google Play 商店下載「共享 GPS應用程序。」
設置您的手機局域網地址,src/sensors/car_gps_reader.cpp并使用此應用程序與您的 Jetson Nano 共享 GPS 信息。這樣,我們就可以獲取GPS信號,估計車速。
使用 USB GPS 接收器
「對于商業產品:」
查看此模塊精度:< 3m。
如何設置CAN總線以讀取車速和轉向信號
「基本信息」
在這個項目中,我們沒有在真車上設置物理 CAN 總線(只是一個使用 socket CAN 的仿真系統)。但是,它可以通過使用 CAN 轉 USB 電纜來實現。
CAN總線的一些信息:
一般信息
如何侵入您的車輛?:hacking-can-bus.pdf
開源 CAN 電纜:CANtact。這將支持您將 CAN 總線連接到 linux 套接字,「我的 ADAS 源代碼已經支持該套接字」。
硬件設計
固件:
在韓國
您還需要 OBD-II 到 DB9 電纜來連接汽車 OBD-II
一旦 CANtact 設備處理了來自車輛的 CAN 消息,它們就會通過 USB B 型端口輸出。因此,這需要 USB-B 到 USB-A 電纜:https://www.amazon.com/AmazonBasics-USB-2-0-Cable-Male/dp/B00NH11KIK
「我們在哪里可以找到要連接的 CAN 總線?」
在這個項目中,我們只使用虛擬 CAN 總線,因此項目源代碼仍然不支持與汽車 CAN 總線的真實連接。不幸的是,雖然 CAN 總線是汽車行業的標準,但如果您想找到您的 can 線在哪里,您通常需要查看汽車電氣圖才能找到內部 CAN 總線。自 1996 年以來,有一個名為 OBD2 的汽車標準,可以提供一種方便的方式連接到 CAN 總線。
「OBD2接口在哪里?」
OBD-II 端口通常位于儀表板下方,方向盤柱下方(下圖中的 1 - 3)。如果端口不在轉向柱下方,請在數字 4 - 9 指示的區域中尋找端口。
「我怎樣才能反轉CAN工程并讀取速度?」
您可以使用 Wireshark 或 candump 查找車速和轉向燈在哪里。CAN總線是沒有加密的,大家可以根據下面的說明嘗試查找。
2. 如何標定相機
將 USB 攝像頭連接到 Jetson Nano 板后,我們需要運行 OpenADAS 軟件來校準攝像頭。校準實際上是基于透視變換的距離估計。這是為距離計算校準相機的便捷方式。
變換參數包括從真實世界距離到鳥瞰圖像空間的米到像素映射,以及鳥瞰圖像到相機圖像之間的透視變換矩陣。為了計算這些參數,我們使用以下解決方案:在汽車前面放一塊紅地毯,測量距離 W1、W2、L1、L2。地毯應該足夠大,并且必須對稱地放置在汽車的長軸上。
單擊設置按鈕以打開相機校準。
在 UI 中輸入 L1、L2、W1、W2。
之后,通過單擊「重新拍攝照片」選擇 4 個點,選擇一個點并移動滑塊。這些點必須以正確的順序拾取。相機標定后,標定文件將被保存data/camera_calib.txt并在每次啟動程序時加載回來。
三、感知模型和算法
1. 物體檢測與交通標志分類模型
該物體檢測模塊負責檢測前方障礙物物體,如其他車輛或行人,以及交通標志。這些結果可用于前方碰撞預警和超速預警。為了提供這些功能,該模塊包含兩個主要組件:基于 CenterNet 的對象檢測神經網絡和基于 ResNet-18 的交通標志分類網絡。因此,我們將在下圖中看到 2 個深度學習模型。
1.1.使用 CenterNet 進行目標檢測
CenterNet 是一種簡單但高效的對象檢測模型。與其他流行的目標檢測模型相比,CenterNet 可以非常有效地適應速度-精度權衡。與其他流行的基于錨框的對象檢測網絡不同,CenterNet 依靠關鍵點檢測器來檢測對象的中心,然后回歸其他屬性。
CenterNet管道 「論文:」作為點的對象 - Xingyi Zhou、Dequan Wang、Philipp Kr?henbühlhttps://arxiv.org/abs/1904.07850。
「訓練」
我使用 CenterNet 作者的官方存儲庫來訓練對象檢測器(進行了一些修改)。請閱讀此處的安裝步驟以安裝培訓所需的環境。
「筆記:」
我建議使用 Anaconda 或 Miniconda 為每個任務創建一個虛擬環境。不要混合你的環境,因為我們必須使用不同的 Python 和包版本。
您「必須使用」PyTorch v0.4.1 并將其設置為此處的說明:https://github.com/xingyizhou/CenterNet/blob/master/readme/INSTALL.md。不保證其他版本有效。
我修改了官方存儲庫以使用 Berkeley DeepDrive (BDD) 數據集](https://bdd-data.berkeley.edu/)。您可以在此處克隆源代碼以開始訓練。在我的存儲庫中,我用10個類訓練了 CenterNet:person、、、、、、、、、和。ridercarbustruckbikemotortraffic lighttraffic signtrain
「使用 TensorRT 進行模型優化」
使用 PyTorch 框架訓練 CenterNet 后,我們獲得 PyTorch 模型格式(.pth)的模型文件。為了優化 NVIDIA Jetson Nano 上的推理速度,我們需要將這些模型轉換為 TensorRT 引擎文件。轉換是通過稱為 ONNX(開放式神經網絡交換)的中間格式完成的。首先使用 PyTorch ONNX 模塊將 PyTorch 模型轉換為 ONNX 格式(步驟 1)。
之后,我們將 ONNX 模型轉換為每個推理平臺的 TensorRT 引擎(步驟 2)。因為從ONNX到TensorRT引擎的轉換時間比較長,所以在我的實現中,我將TensorRT引擎轉換后序列化到硬盤,每次程序啟動時加載。在此步驟中,我們必須注意 TensorRT 引擎在不同計算機硬件上的構建方式不同。所以,
使用此存儲庫將預訓練模型轉換為 ONNX 格式
「筆記:」
創建另一個虛擬環境,這與培訓不同。這個新的 Python 環境應該使用 Pytorch v1.0 或 v1.1。我為上面的這個轉換任務準備了一個存儲庫。您可以使用此處的說明來設置您自己的環境。
您可以從該文件夾convert_to_onnx_mobilenet.py中閱讀(對于 MobileNetv2 主干)和convert_to_onnx_rescdn18.py(對于 ResNet-18 主干)中的一些轉換示例源代碼。
擁有 ONNX 模型后,轉到 OpenADAS 以更新配置文件中新對象檢測模型的路徑:src/configs/config_object_detection.h.您還可以使用此存儲庫進行轉換。
1.2.交通標志分類
由于「BDD 數據集」的限制——它只包含 1 類交通標志(未指定標志類型),我不得不訓練另一個神經網絡來識別標志類型。由于速度和準確性高,因此也選擇了「ResNet-18來完成這項任務。」我使用 Tensorflow 和 Keras 框架訓練了模型。
「數據集」
在這個項目中,我只設計了對最大速度標志進行分類的系統,并將每個速度級別視為一個單獨的對象類。為了收集足夠的訓練數據,我使用了 2 個數據集:Mapillary Traffic Sign Dataset (MTSD) 和 German Traffic Sign Recognition (GRSRB) 數據集。由于 MTSD 是一個交通標志檢測數據集,我使用標志邊界框來裁剪它們以進行分類任務。裁剪后,我合并了 2 個數據集,得到 18,581 個最高限速交通標志圖像分為 13 個類別,以及 879 個末端限速標志(將所有末端限速標志僅視為 1 類)。
此外,我使用來自其他交通標志和物體的 20,000 張裁剪圖像作為“未知”類別。該數據集中共有 15 個類別:最大速度標志(5km/h、10km/h、20km/h、30km/h、40km/h、50km/h、60km/h、70km/h、80km/h , 90 公里/小時, 100 公里/小時, 110km/h、120km/h)、限速終點(EOSL)等標志(OTHER)。之后,這個數據集被分成 3 個子集:訓練集(80%)、驗證集(10%)和測試集(10%)。每個交通標志類別的分布是隨機的。
「訓練步驟」
使用此存儲庫中的源代碼來訓練交通標志分類器
「第一步:初始化環境」
創建anaconda環境:
conda create --name
激活創建的環境并安裝所有要求:
pip install requirements.txt
「第 2 步:訓練模型」
準備如下結構的數據集:
使用以下命令訓練模型:
pythontrain.py
「使用 TensorRT 進行模型優化」
轉換為 UFF
convert_h5_to_pb.py修改和中的模型路徑convert_pb_to_uff.py。
將.h5模型轉換為.pb, 最后.uff:
pipinstallrequirements-h5-to-uff.txt pythonconvert_h5_to_pb.py pythonconvert_pb_to_uff.py
擁有 ONNX 模型后,轉到 OpenADAS 以更新配置文件中新交通標志分類模型的路徑:src/configs/config_sign_classification.h.
2.車道線分割模型
車道線檢測模塊負責檢測車道線和車道偏離情況。然后將該結果用于車道偏離警告。我使用深度神經網絡和霍夫變換線檢測器進行車道線檢測。下面介紹車道線檢測的流程。
車道線檢測流水線
用于車道線分割的 U-Net 模型
U-Net 是一種在生物醫學圖像分割中表現良好的全卷積網絡,它可以用較少的訓練圖像數據展示高精度的分割結果。我將 U-Net 應用于車道線分割問題,并結合霍夫變換以線方程的形式找到車道線。
U網模型
為了在嵌入式硬件上運行輕量級分割模型,我對原始 U-Net 模型進行了兩次修改:
(1) 將decoder filters的數量調整為128, 64, 32, 16, 8個filters,從decoder的頂部到網絡的輸出;
(2) 用 ResNet-18 主干替換原來的主干。
這些修改減少了 U-Net 中的參數數量,并為我們提供了一個可以超過 200 幀每秒 (FPS) 運行的輕量級模型(模型 U-Net ResNet-18 輸入大小 384x382,RTX 2070 GPU 上的 TensorRT float 16 ).
數據集
數據集是從Mapillary Vista 數據集準備的,并進行了一些修改。原始數據集包含訓練集中約 18000 張圖像和驗證集中約 2000 張圖像。我合并這些集合,刪除一些不包含車道線或有太多噪音的圖像。最終數據集有 15303 張圖像。我將這個集合隨機分成三個子集:10712 張圖像用于訓練(~70%),2296 張圖像用于驗證(~15%)和 2295 張圖像用于測試(~15%)。因為 Mapillary Vista 的標簽包含很多對象類,所以我只保留車道線類來生成二值分割掩碼作為新標簽。
Mapillary Vistas 數據集預處理——圖像 A、B 來自 Mapillary Vitas
訓練
使用我的存儲庫訓練 U-Net 進行車道線分割
「第一步:初始化環境」
創建anaconda環境:
conda create --name
激活創建的環境并安裝所有要求:
pip install requirements.txt
「第 2 步:訓練模型」
在目錄中創建新的配置文件list_config請不要修改舊的配置文件,以便我們更好地觀察,模型和訓練歷史將自動保存到saved_models文件夾中。
對于培訓,只需運行:
python model/train.py
或者
./train.sh
使用 TensorRT 進行模型優化
轉換為 UFF
為此任務創建另一個虛擬環境。
convert_h5_to_pb.py修改和中的模型路徑convert_pb_to_uff.py。
.h5將模型轉換為.pb,并最終使用這些命令(請更新和.uff中模型的正確路徑)convert_h5_to_pb.pyconvert_pb_to_uff.py
pipinstallrequirements-h5-to-uff.txt pythonconvert_h5_to_pb.py pythonconvert_pb_to_uff.py
擁有 UFF 模型后,轉到 OpenADAS 以在車道檢測配置文件中更新該新模型的路徑:src/configs/config_lane_detection.h.
使用霍夫變換進行車道線檢測
霍夫變換是一種在圖像處理中非常有效的線檢測算法。該算法的總體思想是創建從圖像空間(A)到新空間(B)的映射,空間(A)中的每條線對應空間中的一個點(B),空間中的每個點(A)對應空間中的正弦曲線 (B)。將 (A) 中的所有點投影到空間 (B) 中的正弦曲線后,我們找到交點密度最高的地方。然后將這些位置投影到 (A) 成線。通過這種方式,霍夫線變換算法可以在圖像空間(A)中找到線。
尋找候選車道線的過程如下圖所示。從線分割網絡產生的分割掩碼,車道線檢測模塊使用概率霍夫變換來檢測原始線段(1)。之后,使用由 Bernard A. Galler 和 Michael J. Fischer 在 1964 年反轉的不相交集/聯合查找森林算法將這些線劃分為組。我們使用線之間的空間距離和角度差將屬于一個線段分組同一條線。經過步驟(2),我們可以看到不同的線組被繪制成不同的顏色。步驟 (3) 接收這些線組作為輸入,并使用具有 L2 距離的最大似然估計在每個組中擬合一條線。
線候選檢測
該系統將車道分割模型與上述車道檢測算法相結合,可以檢測不同環境下的車道線,判斷車道偏離情況。它為車道偏離警告模塊創建可靠的輸入。
4.警告規則
該系統使用基于規則的警告算法。
審核編輯:劉清
-
GPS技術
+關注
關注
0文章
26瀏覽量
10245 -
CAN
+關注
關注
57文章
2720瀏覽量
463399 -
ADAS系統
+關注
關注
4文章
226瀏覽量
25681 -
讀取器
+關注
關注
0文章
45瀏覽量
5233
原文標題:如何搭建一個開源ADAS項目
文章出處:【微信號:智能汽車電子與軟件,微信公眾號:智能汽車電子與軟件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論