桔妹导读:滴滴导航是滴滴出行旗下基于丰富的交通大数据和领先的算法策略,面向网约车及自驾场景而打造的一款技术领先的地图产品。伴随着海量网约车司机每日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
滴滴技术 出品