【自动驾驶】13. Apollo交通信号灯感知
Apollo交通信號燈感知
本文檔詳細的介紹了Apollo2.0中交通信號感知模塊的工作原理。
簡介
交通信號燈感知模塊通過使用攝像頭提供精確全面的路面交通信號燈狀態。
通常情況下,交通信號燈有3種狀態:
- 紅
- 黃
- 綠
然而當信號燈不能正常工作時,它可能是黑色的或者閃爍著紅燈或黃燈。有時候在攝像頭的視野內找不到信號燈,從而導致無法正確檢測信號燈狀態。
為了覆蓋全部的情況,交通信號燈感知模塊提供了5種信號燈狀態輸出:
- 紅
- 黃
- 綠
- 黑
- 未知
該模塊的高精地圖功能反復的檢測車輛前方是否有信號燈出現。在給定車輛的位置后,可以通過查詢高精地圖獲取信號燈的邊界,并用邊界上的4個點來表示信號燈。如果存在信號燈,則信號燈位置信息將從世界坐標系投射到圖片坐標系。
Apollo已經證明了僅僅使用一個固定視野的攝像頭無法識別所有的信號燈。存在這種限制的原因是:
- 感知范圍應該大于100米
- 信號燈的高度和路口的寬度變化范圍很大
結果是Apollo2.0使用了2個攝像頭來擴大感知范圍。
-
一個遠距攝像頭,焦距是25毫米,被用來觀察前方遠距離的信號燈。遠距攝像頭捕獲的信號燈在圖片上展現的非常大而且容易被檢測。但是遠距攝像頭的視野有限制,如果路線不夠直或者車輛太過于靠近信號燈,經常無法拍攝到信號燈。
-
一個廣角攝像頭。焦距是6毫米,是對遠距攝像頭視野不足的補充。
該模塊會根據當前信號燈的投射狀態決定使用哪個攝像頭。雖然只有兩個攝像頭,但是該模塊的算法被設計的可以控制多個攝像頭。
下述圖片展示了使用遠距攝像頭(上圖)和廣角攝像頭(下圖)檢測到信號燈的圖片。
數據管道
數據管道有兩個主要的部分,會在下面章節中介紹
- 預處理階段
- 信號燈投射
- 攝像頭選擇
- 圖像和信號燈緩存同步
- 處理階段
- 調整—提供精確的信號燈邊界盒
- 識別—提供每個邊界盒的顏色
- 修正—根據時間順序關系修正顏色
預處理階段
沒有必要在每一幀的圖像中去檢測信號燈。信號燈的變化頻率是很低的而且計算機的資源也有限。通常,從不同攝像頭輸入的圖像信息會幾乎同時的到達,但是只有一個會進入管道的處理階段。因此圖像的遴選和匹配是很必要的。
輸入輸出
本章節介紹了預處理階段的輸入輸出數據。輸入數據可以通過訂閱Apollo相關模塊數據來獲得,或者直接讀取本地的存儲文件。輸出數據被傳輸到下一層的處理階段。
輸入數據
-
可以通過訂閱以下topic來獲取不同攝像頭的圖像數據:
- /apollo/sensor/camera/traffic/image_long
- /apollo/sensor/camera/traffic/image_short
-
定位信息,通過查詢以下topic獲得:
- /tf
-
高精地圖
-
校準結果
輸出數據
- 被選擇的攝像頭輸出的的圖像信息
- 從世界坐標系投射到圖像坐標系的信號燈邊界盒
攝像頭選擇
使用一個唯一的ID和其邊界上的4個點來表示信號燈,每個點都是世界坐標系中的3維坐標點。
下例展示了一個典型的信號燈記錄信息signal info。給出車輛位置后,4個邊界點可以通過查詢高精地圖獲得。
signal info: id {id: "xxx" } boundary {point { x: ... y: ... z: ... }point { x: ... y: ... z: ... }point { x: ... y: ... z: ... }point { x: ... y: ... z: ... } }3維世界坐標系中的邊界點隨后被投射到每個攝像頭圖像的2維坐標系。對每個信號燈而言,遠距攝像頭圖像上展示的4個投射點區域更大,這比廣角攝像頭更容易檢測信號燈。最后會選擇具有最長的焦距且能夠看到所有信號燈的攝像頭圖片作為輸出圖像。投射到該圖像上的信號邊界盒將作為輸出的邊界盒。
被選擇的攝像頭的ID和時間戳緩存在隊列中:
struct ImageLights {CarPose pose;CameraId camera_id;double timestamp;size_t num_signal;... other ... };至此,我們需要的所有信息包括定位信息、校準結果和高精地圖。因為投射不依賴于圖像的內容,所以選擇可以在任何時間完成。在圖像信息到達時進行選擇僅僅是為了簡單。而且,并不是圖像信息一到達就要進行選擇,通常會設置選擇的時間間隔。
圖像同步
圖像信息包含了攝像頭ID和時間戳。攝像頭ID和時間戳的組合用來找到可能存在的緩存信息。如果能在緩存區找到和該圖像的攝像頭ID一樣且時間戳相差很小的緩存信息,則該圖像會被傳輸到處理階段。所有不合適的緩存信息會被丟棄。
處理階段
該階段分為3個步驟,每個步驟重點執行一個任務:
- 調整 — 在ROI中檢測信號燈邊界盒
- 識別 — 鑒別邊界盒的顏色
- 修正 — 根據信號燈顏色的時間順序關系修正顏色
輸入輸出
本章節介紹處理階段的輸入和輸出數據。輸入數據從預處理階段獲得,輸出數據作為鑒別信號燈的結果。
輸入數據
- 被選擇的攝像頭圖像信息
- 一組邊界盒信息
輸出數據
- 一組帶有顏色標簽的邊界盒信息
調整
被定位信息、校準信息和高精地圖信息影響的投射點 不是完全可靠的 。通過投射的信號燈位置計算的一個大的興趣區域(Region of Interest ROI)被用來確定信號燈精確的邊界盒。
在下述圖片中,藍色的長方形表示被投射的信號燈的邊界盒,實際上和信號燈的準確位置有一定的偏差。大的黃色長方形是ROI。
信號燈檢測是一個常規的卷積神經網絡檢測任務,它接收帶有ROI信息的圖像作為輸入數據,順序輸出邊界盒。輸出結果中的信號燈數量可能多于輸入數據。
Apollo會根據輸入信號燈的位置、形狀及檢測的評分選擇合適的信號燈。如果CNN在ROI內找不到任何的信號燈,則輸入數據中的信號燈將被標記為未知,且跳過剩下的兩個步驟。
識別
信號燈識別是一個常規的卷積神經網絡鑒別任務,它接收帶有ROI信息的圖像和一組邊界盒信息作為輸入數據。輸出數據是一個$4\times n$ vector, 表示每個邊界盒是黑色、紅色、黃色和綠色的概率。 當且僅當概率足夠大時,有最大概率的類別會被識別為信號燈的狀態。否則信號燈狀態被設置為未知,表示狀態未確定。
修正
因為信號燈可能會閃爍或者被遮擋,并且識別階段也 并不是 完美的,輸出的信號燈狀態可能不是真正的狀態。修正信號燈狀態是很有必要的。
如果修正器接收到一個確定的信號燈狀態例如紅色或者綠色,則修正器保存該狀態并直接輸出。如果接收到黑色或者未知,修正器會檢測狀態保存列表。如果信號燈狀態已經確定持續了一段時間,那么將保存的狀態輸出。否則將黑色或者未知輸出。
因為時間順序關系的存在,黃色只會在綠色之后紅色之前出現,所以為了安全的考慮,在綠色出現之前任何紅色之后的黃色都會被設置為紅色。
總結
以上是生活随笔為你收集整理的【自动驾驶】13. Apollo交通信号灯感知的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【自动驾驶】16.计算机视觉:相机成像原
- 下一篇: 【自动驾驶】10.百度Apollo平台