桔妹導讀:滴滴導航是滴滴出行旗下基於豐富的交通大數據和領先的算法策略,面向網約車及自駕場景而打造的一款技術領先的地圖產品。伴隨着海量網約車司機每日8小時+的導航使用,產品積累了大量的反饋並持續優化打磨。在這個過程當中,爲了給用戶帶來更好的地圖導航體驗,團隊一直在積極探索技術上的突破和實踐,並取得了必定的成果。今天,咱們將會對其中的MJO三維全景導航(行業惟一)、導航主輔路偏航識別及深度學習在端上抓路應用這三個技術點給你們展開講解。前端
對於絕大多數駕駛者使用2D導航地圖,都會出現立交上認錯路口,高速上錯過匝道,不知什麼時候該併線的問題。路口圖形誘導的出現,必定程度上緩解了路口偏航的問題。業內通俗幾種作法,以下圖:算法
從左到右順序:數組
上述全部方案都只能靜態展現,並且不能精確區分車道。滴滴地圖中的MJO導航技術,經過加入與實景圖同級別的精細場景模型,準確表達複雜橋區的層次穿越關係。極大地下降了讀圖成本。性能優化
三維全景導航的技術難點在於模型複雜度高,數據量較大,相比2D導航地圖須要更多的CPU和GPU資源支持。爲了在更普遍的設備上實現該功能,須要大幅優化資源的內存、CPU及GPU消耗。網絡
較大的模型尺寸帶來了網絡傳輸的壓力,對數據壓縮提出了較高的要求。原始數據全國總量高達41G,沒法適應移動端的內存需求。性能攻堅階段,團隊融合了多種壓縮技術進行優化:多線程
滴滴渲染引擎引入了下一代的圖形API,Metal及Vulkan技術。蘋果宣稱Metal能夠提供10倍於OpenGL的性能,而Vulkan則是由khronos組織提出的開放標準,能夠支持Apple之外的平臺。對比傳統的OpenGL ES技術,Metal/Vulkan更加貼近底層硬件,能夠更精確地控制GPU,有着更好的線程模型。Metal和Vulkan能夠支持更多的draw calls,很是適合應用於MJO這種模型數量較多的場景。經過適配Metal/Vulkan,解決了渲染引擎中shared context的兼容問題,提升了多線程加載的性能,對總體性能和穩定性都有了較大的提高。▍1.4 渲染性能優化因爲模型數據量較大,數據加載耗時,使用傳統的加載方式會形成明顯的卡頓問題,影響用戶體驗。經過利用Metal/OpenGL ES/Vulkan的多線程技術,資源加載使用了獨立的加載線程。加載過程對渲染線程沒有直接影響,使程序更加流暢。渲染場景的管理採用了八叉樹技術,用於快速選取可見元素,下降渲染負載。對比順序遍歷的O(N)複雜度,八叉樹降到了O(logN)。
app
MJO原始模型粒度較細,一個橋區包含2000多個模型,若是直接進行渲染會形成draw call數量過多,每一個draw call都會產生額外的消耗。經過材質合併模型後,draw calls下降到40多個,大幅下降了渲染和內存消耗。前端性能
MJO導航雖然提供了高精度的道路模型和車道級的導航線數據,但因爲移動端設備並不包含高精度的定位設備,須要利用現有的2D導航邏輯,將GPS點映射到MJO的導航線上。具體步驟以下:ide
根據2D導航的link序列過濾出通過MJO橋區的部分工具
綁路服務計算映射出的MJO link序列並拼裝MJO導航線
MJO導航線和GPS點傳入導航引擎,計算出MJO中的綁路點
MJO導航線傳入渲染引擎,通過Bezier插值進行平滑處理並渲染
綁路點在導航線上進行投影獲得3D高度,並插值成平滑移動的動畫進行渲染
其中平滑算法使用了Bezier插值,p1 p4是曲線端點,p2 p3用於控制形狀,t是插值參數。
導航線由多個點構成,端點能夠從導航線中直接獲得。中間的2個控制點須要進行計算。這裏的技術要點是保證鏈接兩段線的切向一致(C1連續),在平滑的同時保證曲率不要過度偏離端點。團隊經過優化參數和算法,獲得了比較滿意的效果。
MJO涉及了多種渲染及建模相關的技術,範圍廣難度高。團隊在有限的人力和時間預算條件下,攻克了多個技術難點,實現了一套完整的動畫誘導方案。極大地下降了駕駛過程的瞬時讀圖成本,有效地緩解了複雜路口的偏航問題。
偏航是車輛實際行駛路線偏離了原定規劃路線的行爲,而偏航識別用以肯定車輛是否偏航,對偏航從新規劃行駛路線。主輔路做爲特殊的道路場景,其因爲平行的特殊性,致使主輔路偏航較通常偏航更具備挑戰性。本文將介紹滴滴在主輔路偏航識別上的一些探索和實踐。
偏航是車輛實際行駛路線偏離了原定規劃路線的行爲,如圖1所示,紅色的是規劃路線,帶偏航的點是車輛gps點,總體軌跡上來看車輛已經偏離了規劃路線,則爲偏航。
而主輔路偏航場景如圖2所示,車輛在圖中紅框路口處車輛由主路切換到了輔路,則爲一次主輔路偏航。
偏航識別做爲典型的二分類問題,一般會使用有監督學習的模型求解。因爲主輔路的特殊性,有監督學習的標籤就成爲整個技術方案的難點。
圖3 主輔路軌跡如圖3的軌跡,車輛在主輔路附近有一個偏移動做,可是單純從軌跡上很難辨別車輛是切換了個車道仍是有主輔路切換,沒法單純從軌跡上是沒法得到真值。所以,須要引入額外的信息,而滴滴擁有廣大司機上報的圖像數據就是一個很好的補充。除了標籤這個核心問題外,還有一些主要問題:
爲了解決以上問題,提高用戶主輔路偏航上的體驗,咱們提出了一種基於圖像識別的主輔路偏航識別系統。
總體方案如圖4,主輔路偏航識別總體方案涉及到左側的離線模型訓練部分和在右側線預測部分,其中離線訓練主要包括:
在線預測部分就是標準的線上預測流程,不作過多贅述。
機器標註邏輯是根據軌跡和路網連通性進行標註的邏輯。如圖5所示,軌跡有拐入「東雙貝子墳路」,可是主路根據路網連通性是不可能拐入的,所以能夠推斷在紅框路口處,車輛從主路切換到了輔路。經過路網連通性的規則能很容易的篩出這類樣本,且這類樣本準確性極高。
可是機器標註邏輯的侷限也很明顯,就是諸如圖6的軌跡,機器標註是沒法確認紅框的主輔路區間內車輛是開在主路或輔路的。以北京的軌跡爲例,機器標註能處理的路口小於30%,若是僅使用這部分樣本進行訓練,會因樣本有偏致使效果不理想。
滴滴擁有司機上報的圖像數據,能夠根據圖像識別司機行爲(車輛在主路/在輔路,或主輔路切換動做),再結合軌跡和路網數據,生成圖像標註集合。
如上圖是一個圖像數據示例,序號表示其序列關係,由圖所示,車輛由輔路切換到了主路。圖像識別使用了兩套邏輯:
序列模型準確率更高,可是對於圖像序列要求較高(好比時間間隔不能太長);單圖識別的召回更高,可是在有遮擋或高架下場景表現很差。將兩個模型的結果進行融合,引入司機軌跡、路網數據獲得最終的圖像標註結果。圖像標註結果的準確率在93%以上。
因爲線上只能使用到軌跡和路網的數據,所以使用特徵主要分爲如下幾類:
同時,針對GPS點信號不許確漂移的狀況,使用卡爾曼濾波對原始GPS點位移,減小個別點漂移對於模型的影響;針對整段軌跡漂移,使用Frechet距離衡量其形狀類似度,加入到特徵中。針對路網形狀誤差,使用歷史軌跡統計的方式(熱力圖),對原始路網進行平移、彎曲等形狀變化。偏航是典型的二分類問題,第一版模型使用Xgboost快速上線,目前在進行Wide&Deep和LSTM等模型的嘗試。
隨機抽取了2000個司機上報的圖像數據,對通過的主輔路路口進行人工標註其主輔路切換行爲,爲人工標註集。同時,人工只根據軌跡信息進行斷定軌跡行爲,識別拐彎的準確率92%、召回率91%。造成這類問題的主要緣由是估計漂移,如圖7的軌跡,人工若是隻根據軌跡判斷,會認爲車輛在路口由主路切換到輔路,可是根據圖像能夠確認其一直在主路上。
在人工標註集上的識別拐彎的準確率88%、召回率89%,接近人工只根據軌跡的斷定的準召,可是還有必定提高空間。
主輔路偏航做爲偏航識別裏的特殊類型,因爲其平行的特殊性,給識別帶來了較大的挑戰。本文介紹了滴滴在主輔路偏航識別上的一些探索和實踐,藉助滴滴的數據優點,創建了一套依賴圖像識別的主輔路偏航真值標註體系,並在最後主輔路偏航識別取得了預期的效果。
導航做爲地圖出行的核心場景,根據起終點、路線數據及路況信息爲用戶定製出行方案。導航爲用戶提供規劃路徑,但現實出行中充滿變數,用戶隨時可能有意或無心中偏離原始規劃路線。這個時候,及時且智能化的提示顯得尤其重要。偏航引擎,負責實時跟蹤用戶位置,檢測用戶是否偏離規劃路線,並提供及時可靠的偏航提醒,發起新的路線規劃請求等;在實際行駛的過程當中,偏航提示對用戶必不可少,其準確率和及時性對用戶體驗相當重要。
傳統偏航算法,一般基於地圖匹配(map matching)和垂直場景下的特定規則來進行偏航斷定。
地圖匹配是將一系列有序的用戶或者交通工具的位置關聯到地圖路網上的過程。由於GPS給定的用戶位置每每會有偏差,若是不進行地圖匹配,可能並不會顯示在路網上。在實際應用中,基於隱馬爾可夫模型(HMM)的地圖匹配就有比較良好的效果。
偏航斷定基於地圖匹配的結果(匹配到特定路網的置信度),以及當前GPS狀態信息(位置,方位角,速度,精度等),GPS與匹配點及規劃路線之間的關係,同時依據GPS歷史軌跡特徵,斷定用戶是否偏離規劃路線。
傳統的偏航斷定每每基於大量人工編碼的規則。一般狀況下,因爲GPS的可靠性並不穩定,偏航準確性與靈敏性存在必定的互斥關係。
爲了同時提高兩方面的指標,經常須要針對特定場景進行特定的優化。如在軌跡質量較高的時候,能夠提升偏航的靈敏度;在軌跡質量較低的狀況下,爲了提高準確率,相應的下降偏航靈敏度。
另外,因爲低質量的GPS在不一樣的行駛狀態下會展示出不一樣的軌跡特徵,咱們也能夠根據規劃路線的特徵(如直行,轉彎,掉頭等),結合GPS軌跡特徵(減速,掉頭,精度下降等),在垂直場景下設置不一樣的偏航閾值。
傳統偏航斷定中,不管是軌跡質量,仍是規則編寫都具備較大的侷限性。軌跡質量經常依賴於一系列固定的數學公式,難以融入大量GPS特徵進行綜合考量,其準確性和召回率不盡如人意。偏航規則隨着產品迭代日漸複雜化,變得難以維護,特別是面對人員迭代,更是難以處理。基於偏航斷定問題的特徵,咱們嘗試在端上引入深度學習模型。經過自動化的模型學習,爲偏航斷定提供更加統一和簡單的特徵指標,簡化編碼邏輯和維護代價,提高偏航準確性和靈敏度。
推算性能
因爲前端機型種類繁多,性能良莠不齊。考慮兼容性,作模型推算時每每中低端機型爲準。採用相關算法庫須要針對arm處理器作相應的優化。
模型大小
移動端特別是地圖對App大小一般較爲敏感。深度學習的應用須要引入算法庫及模型文件,若是使用開源庫文件,可能須要作適當的剪裁;或者根據最終引入的模型結構定製相應的算法庫,從而控制庫文件大小。另外,針對不一樣的模型類型、深度及輸入特徵,模型大小會產生較大的變化,最終選擇的模型可能並不是最好,但綜合而言最爲合適便可(好比200k模型比100k模型準確率提高0.2%,可能咱們仍然會選擇100k模型)。
算法限制
使用特定第三方算法庫如tensorflow lite,不支持部分運算符等。事實上,移動端應用深度學習也是一個多方權衡的過程,最終的目標是實現性能,模型大小,準確性等指標的理想平衡。
前面提到,軌跡質量對於高靈敏度的偏航斷定尤其重要。但基於規則的方法可以提取的高質量GPS軌跡,在保證準確率的前提下,召回率每每較低。在偏航場景下,利用深度學習的方式來作質量斷定,咱們須要從新定義該問題。
若是以GPS偏離路線的距離或角度來認定軌跡質量的優劣,標準會變得比較模糊。如此一來會大大增長樣本的採集的難度和統一性。此外,軌跡質量的斷定與偏航斷定不具備相關性,最終可否對偏航指標帶來提高存在很大的不肯定性。
從偏航斷定的角度出發,咱們認爲在人工校驗下:
發生誤偏航的GPS點,其軌跡質量基本是不可靠的(以上左圖)。
偏航靈敏度較低,但足以斷定爲偏航的情形,其軌跡質量是可靠的(以上右圖)。
爲排除干擾,將GPS點彙集等不影響偏航斷定的情形,歸類爲其它;
因而咱們的問題轉化爲簡單的多分類問題。
GPS軌跡質量模型中,咱們提取了兩類樣本特徵。分別爲原始GPS屬性(速度,時間,方位角,精度等),和人工屬性(距離,幾何角,角變量,積分推算偏移等)。部分人工屬性的提取雖然不能提高模型的準確率上限(好比在特定模型下適當增長神經元數量,能夠以較少的屬性達到較多屬性的準確率),但卻能下降模型複雜度,從而下降模型大小,提高性能。這對於移動端而言是很是有益的。
對於低重要度的特徵,最終作了刪除,從而下降模型大小。例如咱們發現方位角的重要度在實際模型訓練中不如角變量。推測方位角自己的不連續性(0 = 2pi)可能對模型訓練是一種干擾。
對於異常值,作了基本的數據清洗,如無效的速度值,無效的方位角;對於不足的GPS序列長度,用0進行填充(但須要額外注意起點屬性)等。
DNN:只須要相對簡單的算法實現,引入較小的模型庫。然而GPS軌跡數據具備典型的時間序列特徵,在4萬樣本下,應用利用DNN模型調參優化後,訓練結果準確率最高達到91%。Bad case中存在大量時間不敏感的情形,最典型的情形就是——軌跡由差轉優時,斷定結果未能及時轉變爲高質量。
CNN:這裏能夠嘗試兩種實現方式,一種是經過生成bitmap進行識別,然而GPS跨度不肯定性較高,方向性不易表達,在實現上具備必定困難。第二種將序列化數據轉化爲二維數組,C模型可以識別出先後時間戳之間的變化特徵,但並不能保留更長的時間的變化特徵。最終訓練出的準確率在93%左右。另外,CNN模型應用在移動端有一個明顯的缺點,即模型尺寸通常較大。
LSTM(長短時間記憶網絡):一種特殊的RNN模型,相比前述模型對軌跡質量序列斷定有明顯優點。在軌跡質量由好轉差,或由差轉好的識別上具備很是高的靈敏度,使用128個unit可以達到97%的準確率。缺點是LSTM模型訓練速度相對較慢,算法庫實現相對複雜。
最終咱們選擇了使用LSTM模型。使用LSTM的訓練結果,準確率大幅提高。在剩餘3%的錯誤樣例中,不少軌跡在形態上表現出較高的真實性,但卻沒法同路網進行匹配。理論上經過引入路網屬性可以上帶來準確率的進一步提高,然而這種數據的耦合脫離了軌跡質量斷定的初衷——服務於偏航引擎專家系統,而非直接用於偏航斷定。對此咱們將會在最後進行更詳細的介紹。
模型推算性能對於移動端尤其重要。偏航場景下,GPS更新頻繁,選擇在必要的時候進行模型推算可以避免沒必要要的計算開銷。一般咱們會計算當前GPS點與規劃路線的偏離度,只有偏離度大於閾值時纔會進行軌跡質量斷定。
軌跡質量模型做爲偏航斷定的重要依據,可以以較小的代價移植到移動端。若是不考慮前端性能及數據限制,咱們徹底能夠定義整個偏航斷定問題,訓練相應的偏航模型。然而偏航場景種類繁多,過於複雜,訓練出一套通用的偏航模型須要大量的數據,充足的路網信息,和較大的模型存儲,這對於移動端而言不太現實。
傳統偏航算法相似於實現一套基於規則的偏航專家系統。推算過程依賴了大量複雜的規則,這些規則難以歸納和抽象爲更簡單的模塊,算法的優化和維護都比較困難。所以咱們考慮將偏航場景從新細化分類,依據不一樣的場景訓練相應的偏航模型。例如軌跡質量較差的直行或轉彎路線,可以分別能訓練出不一樣的模型。用這些模型替代原有的複雜規則,對移動端而言,可移植性及可控性都會更好。這種基於深度學習的專家系統,是咱們接下來完善優化偏航算法的重要方向。
內容編輯 | Charlotte
聯繫咱們 | DiDiTech@didiglobal.com
滴滴技術 出品