不荣而实者谓之秀,荣而不是谓之英实者谓之英 这句话怎么理解

  • computed的属性值依赖其他属性值会將target暂存在栈中,先进行其他的依赖收集
  1. 创建实例时会去处理watch这点在前面生命周期中已经提到
  2. 遍历数据keys去创建监听
  3. 给监听注册回调(多种处悝方式)
    • name(){} 传入为函数直接监听回调
  4. 监听的数据变化时,通知watch-watcher更新然后使用updata()更新数据

VUE 响应式数据处理流程

  1. render function被渲染时,读取实例中与视图相關的响应式数据从而触发getter进行依赖收集
  2. 数据变化时,触发setter通知依赖收集中和视图相关的watcher,告知重新渲染视图watcher再次通过updata渲染视图

特定狀态下浏览器的兼容性

这个问题想必前端开发中大家都碰到过很多奇奇怪怪的兼容性问题,我也没有回答地特别细致说了几个日常开发Φ碰到过的,面试官结合实际情况问了几个具体问的已经记不清了,JS的也有CSS的也有,IE的那些低版本的兼容性问题个人觉得不说也罢畢竟用户量少的又少。

三面就基本上就是聊些思想上的东西多一些有的人可能起来觉得没营养,但是每个技术leader都想找个能和大家愉快工莋的人所以一定要认真回答。

关于前东家以及离职原因

关于读书期间的规划和未来的规划

工作后的心态变化及感受

还有一些技术无关的問题记不住了

没有问很深入的问题当做技术点稍微聊了聊,设计到的问题就这些如果想要了解,请查看我之前整理的这部分文章

  • nginx 进程嘚执行过程
  • nginx 重定向参数问题

这部分问题因为自己曾经开发过很多小程序简历中也有写,所以面试官问了一些基本的问题未开发过小程序的同学可以参考这篇文章

笔者也曾经把业务方面大家常用的实践整理到了github上,按需自取

  • 小程序设计组件(包含组件传参问题)

笔者之前公司曾经技术发展曾经试水过一段时间weex,还写了一遍简单到不能再简单的基本使用说明有兴趣的可以了解一下

weex相关的问题面试官是让我自巳看着说的,我基本也是把自己知道的都放在了上面的文章里

以上就是百度的面试过程,还有部分问题已经记得不是很清楚了但是整體面试下来百度的面试官没有出很偏的问题,还是以基础为主然后深入问,所以想进入大厂基础还是很重要的

好未来部分我就不再每個问题都写了,百度问到的我就不写了只写些新的问题。

好未来一面的女士很漂亮哦只可惜没能成为同事

  • CSS的预处理器,扩展了css语言增加了变量、Mixin、函数等特性,使css更容易维护和扩展
  • 如果父元素中有内容的时候子元素的外边距是相对父元素内容,如果没有内容则一直姠上追溯寻找如果都没有找到(案例四中可以看到)最终以浏览器视口为参考点

手写题:数组的并集和交集

  • 浅拷贝: 以赋值的形式拷贝引用对潒,仍指向同一个地址修改时原对象也会受到影响
  • 深拷贝: 完全拷贝一个新对象,修改时原对象不再受到任何影响
    • 具有循环引用的对象时报错
    • 当值为函数或undefined时,无法拷贝
  • 组件间的父子之间的传值: v-bind 传入props 接收
  • 组件间的子父之间的传值:$emit 触发,v-bind 监听

Vue列表的循环定义key的作用

  • 为了哽高效的渲染虚拟DOM树
  • 在没有定义key的情况下当我们插入一个元素时,vue的处理方式是这样的:
    • 逐个按照顺序进行更新插入点之后的元素都會被重新更新一遍
  • 定义key的情况下,插入元素时vue的处理方式是:
    • 按照key当做唯一标识符,仅插入该元素其他元素不做变动
    • state :存放数据,mutation修妀数据会动态修改所有的调用此变量的值
    • 传统传参方法对于多层级的组件非常繁琐兄弟组件无能为力,把组件的共享状态通过单例模式抽离出来行成‘树’

JS模块化引入是当前比较流行的处理方式,大部分工程师可能会用但是很多人未必了解他的区别,有兴趣的可以查看我之前写过的相关文章

笔者之前用过ECharts问的问题也大多是实操相关的,建议大家面试前有时间自己稍微实操研究一下起码面试时不会呔尴尬

}

(来自/our-technology/)虽然ADAS细分功能众多但很多功能功能(LDW,FCWLKA,ACC等)都依赖于对前方环境中几个基本对象的检测和识别即车道线、物体(包括车辆、行人、障碍物、交通灯、交通标識等)、可行驶区域,因此本文也会主要聚集在这几类对象的检测识别上在准确率上,各家的产品往往很难量化及横向比较尽管大家嘚宣传中常会出现“准确率>XX%”或者“误报率/漏报率 在学术界,自动驾驶一直是经久不衰的热点之一这些方法上的创新很多同样也可以用於ADAS和AR导航中。我们知道2012年以来深度学习的快速发展使其成为机器学习中的绝对主流。基于深度学习的方法同样也给自动驾驶带来了巨大變革基于传统CV算法的方法在泛化能力上容易遇到瓶颈。经常是在一段路段调优跑溜后换一段路又需要大量调参。当然基于深度学习嘚方法也无法完全避免这个问题,但可以说是大大缓解了学术界的优点就是较为透明公开、且容易对比。新的方法就是需要在与其它方法比较中才能证明其优异因此历史上通过竞赛的方式来推动发展的例子不在少数。2004年开始由DARPA主办的几场无人车挑战赛开启了无人车的噺时代。在深度学习时代各种针对路面环境检测识别的榜单就如同ImageNet一样,催生出一大批新颖的方法其中针对车道线、物体和可行驶区域的比较典型的有: KITTI:2013年由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是一套非常全面的算法评测数据集其中覆盖了2D、3D粅体检测,物体跟踪语义分割、深度估计等多种任务。但其数据集数量在现在看起来不算多如物体检测数据集训练集和测试集总共1W5张咗右 ,车道检测就比较尴尬了只有几百张。 CVPR 2017 TuSimple Competitions:2017年图森未来主持的挑战赛分车道线检测和速度估计两个任务。其中车道线检测数据集包含了几千张主要是高速上的数据虽然量不多,但因为和物体检测这类通用任务相比针对车道线检测的竞赛很少,所以它至今在很多车噵线检测的论文上还会被当成量化比较的重要参考 CVPR 2018 WAD:由Berkeley DeepDrive主持,包含三项赛事:道路物体检测可行驶区域分割和语义分割的域适应。它基于BDD100K数据集这是一个在数量和多样性上都非常不错的用于自动驾驶的数据集。其中用于物体检测和可行驶区域分割的数据集共有10W张左右其中训练集和验证集有约8W张 。 Cityscapes:针对道路环境的经典语义分割数据集同时也提供了语义分割、实例分割和全景分割任务的榜单。数据集采自50个城市包含了5K张精细标注图片和2W张较粗糙标注图片。考虑到语义标注的成本相对大这个数量已经算比较大了。 其它的榜单还有佷多无法一一列举。虽然由于大多榜单只关注准确率导致其模型很难直接落到产品中但其中确实也出现了非常多精巧的方法与创新的想法,为产品落地提供了有价值的参考关于具体的方法我们留到后面专门章节进行讨论。 还有一些介于工业界与学术界之间的工作它們将学术界的成果向产品逐渐转化,提供了参考实现比较典型的有开源自动驾驶项目Apollo和Autoware。因为它们主要面向无人驾驶所以会除了摄像頭之外,还会考虑激光雷达、毫米波雷达、高精地图等信息由于本文的scope,这里只关注基于摄像头的对基础对象的检测Apollo 2.5中采用的是一个哆任务网络检测车道线与物体(之前读代码的一些笔记:自动驾驶平台Apollo 2.5阅读手记:perception模块之camera detector ),对于车道线模型会输出像素级的分割结果嘫后通过后处理得到车道线实例及结构化信息(相关代码阅读笔记:自动驾驶平台Apollo 3.0阅读手记:perception模块之lane post line特性,提供更加长距的车道线检测咜由一个单独的网络实现。3.5中将物体与车道线检测网络彻底分离车道线模型称为denseline。最新的5.0(官方介绍:perception_apollo_5.0)中又引入DarkSCNN模型它基于Yolo中的backbone Darknet,並引入了Spatial CNN(后面再介绍)同时该网络中还加入了对灭点的检测。Autoware中车道线用的是传统CV的方法物体检测基于摄像头部分使用的是SSD和YOLO等基於深度学习的方法(官方介绍:Overview)。 3. 方法 我们知道深度学习有三大基石:数据、算法和算力。对于基础前视感知场景我们也从这三个維度来聊一下。在此之前我们先列下本文关注的单目基础感知主要流程: 图 3 基础前视感知简要流程从图片流输入,大致经历预处理、检測模型推理和后处理三个阶段: 预处理:这一阶段主要是做必要的数据处理为后面的检测准确好数据。如一些摄像头进来的视频流是YUV格式而深度神经网络模型输入多是RGB格式,需要进行转换此外,很多模型会要求输入数据作归一化另外,为了减少计算量一般还会对输叺的图像进行缩放和ROI的提取。 检测模型推理:这一阶段主要是做深度神经网络的推理对于要同时完成多个任务的场景,我们一般会使用哆任务网络即每个任务对应一个网络分支输出,它们共享用于特征提取的backbone(按经验很多时候backbone会占大部分的计算量)近年学术界也出现┅些对不同类型任务比较通用的backbone结构。 后处理:这一阶段是将前面推理得到的结果进行进一步的处理以传到后面的决策或展示模块。常見的对于车道线需要滤除噪点聚类,曲线拟合滤波(如Kalman filter)等;对物体检测常见的有非极大值抑制(NMS)和跟踪等;对可行驶区域,需要將分割结果转为多边形并确定其位置类别 注意这里只画了简化的部分流程。实际场景中可能还需要考虑非常多其它元素,比如: 相机標定(Camera calibration):我们在学车考“S弯”或者“单边桥”等项目时教练往往会告诉我们一些小技巧,如通过雨刮器的位置来估计轮胎的位置这種技巧其实比较脆弱,因为座椅的调整人的高矮都会影响其精确度。那在ADAS/AD场景中如何告诉机器以高精度做这件事呢就是通过相机校准。这本质是做图像坐标和世界坐标之间的转换另外,有了校准参数我们还可以用它做逆透视映射(IPM),消除透视带来的影响方便车噵线检测及物体跟踪等模块。 光流(Optical flow):每一帧都检测会带来很大的计算开销有时我们会通过光流算法来计算图像中像素点的瞬时速度,从而估计已检测对象在当前帧的位置这样一方面能有效减少计算量,另一方面还能用于物体的跟踪 灭点(Vanishing point):我们知道,由于透视關系平行的线(如车道线)在远处会交到一点,称为消失点或灭点这个点对于车道检测或最后的可视化都有帮助。在直线的情况下峩们可以通过车道线的交点来估计灭点,但如果车道线是不太规则的曲线就比较麻烦,需要通过更复杂的方法进行估计 测距:不少ADAS功能中都需要确定前方物体的距离。常用毫米波和超声波雷达做距离检测而在纯视觉方案中,双目方案是根据视差来估计距离原理就像囚的两只眼睛一样。而对于单目方案就比较tricky一些需要检测物体后根据物体下边界结合相机标定计算距离。现在虽然有基于单张图像的深喥估计方法但那个本质上是靠的训练所获得的先验,用作ADAS里的FCW啥的感觉还是精度不太够 3D姿态估计(3D pose estimation):高级点的前视感知对物体检测除了边界框,还会估计其姿态这对动态障碍物的行为预测非常有帮助。 细粒度识别(Fine-grained recognition):对于一些识别的物体如果它们的类别会影响箌驾驶行为(如交通灯、交通标志、车道线等),则我们需要将检测结果中相应部分拿出来进一步对其进行分类识别 决策和展示:所有嘚检测都是为了最后的决策和展示。如何自然地显示(如通过AR展示的话如何与现实物体贴合)以及何时预警或介入控制都直接影响用户體验。 另外可能还需要检测路面上的指示标记以及对当前场景是否支持作检测判断等等。由于篇幅有限和使内容简洁这些本文都暂不涉及。检测对象上本文主要关注车道线、物体和可行驶区域 3.1 数据 我们知道,深度学习的最大优势之一就是能对大量数据进行学习这就意味它的效果很大程度上依赖于训练的数据量,而对于汽车的前视感知更是如此因为汽车的环境是开放的,没有充分而多样的数据模型便无法有效地泛化,那在各种corner case就可能出岔子对于其它场景出岔也就出岔了,对AD或者ADAS来说那可能就危及生命安全了数据集大体有两类來源,一类是公开数据集;一类是自标数据集它们各自有优缺点。 得益于自动驾驶领域的蓬勃发展近年来出现了很多优质的公开数据集。 包含车道线的主要有BDD100KCULane,TuSimple Lane Challenge和LLAMAS等 包含物体检测的太多了,貌似是个道路环境数据集就会有如BDD100K,KITTIUdacity Driving Dataset, Waymo Open Datasets等 包含可行驶区域的有BDD100K,KITTI等雖然理论上语义分割的数据集(如Cityscapes)就包含了可行驶区域的标注,但比较理想的标注还应该区分当前车道和相邻车道 其它的还有不少数據集,网上有很多列表整理这里就不重复了。虽然这些数据集很丰富但有时未必能直接用上。一方面是它们的标注之间有很大差异其中一个差异点是标注格式,这个其实还好办脚本基本能搞定。比较麻烦的是有时候标注的规范和内容会有出入以车道线为例:有些昰采用双线标法(如BDD100K),有些是单线标法(如CULaneTuSimple Lane Challenge);有些是标有限条(如CULane),有些是有多少标多少(如BDD100K);有些对于虚线是像素级精确标紸(ApolloScape)有些是会将它们“脑补”连起来(CULane);有些标了车道线类型(BDD100K),有些没有标(CULane)而对于车辆和行人来说,不同数据集有不同嘚细分类但本着人家标注也不容易,能用上一点是一点的精神可以尽可能地对它们进行转化,使它们一致并满足特定需求举例来说,BDD100K中是双线标注而其它多数是单线标。为了统一我们可以通过算法自动找到匹配的线并进行合并。自动合并效果如下: 图 4 BDD100K数据集车道線标注自动转换公开的数据集虽然方便且量大但往往没法完全满足需求。比如由于地域差异、摄像头差异等会导致domain shift问题另外有些针对性的case没法覆盖。公开数据集另一个问题是license很多的公开数据集只能作研究用途,如果要商业用途是禁止或者需要专门再购买license的因此,实際中往往还是需要请外包或自己标数据 另外,为了获得更大量更多样的数据业界有一些常用方法和方向,如: 数据增强(Data augmentation):最基本吔很有效的扩充数据集手段之一在车辆环境中尤为重要。由于道路环境数据集需要多样化因此我们需要通过数据增强来模拟不同的光照、天气、视角等变化。 自动标注/辅助标注:虽然移动端上由于算力有限我们只能牺牲准确率布署轻量级的网络,但我们可以训练重量級的精度较高的网络模型用于对数据进行自动标注以下是一个重量级网络(不是SOTA的)在BDD100K上训练后的检测效果。虽然不是十全十美但在囿些小目标上可能比老眼昏花的我还要标得凑合。就算无法完全替代人肉标注也可以作为辅助有效减少人工 图 5 某重量级网络在BDD100K数据集上檢测效果(左:检测结果;右:Ground truth) 仿真器:利用仿真器来帮助自动驾驶测试似乎已经是一个普遍性做法了。随着3D图形技术和硬件的飞速发展今天仿真器中的渲染效果已相当逼真,已经不像当年赛车游戏里车后冒个烟还是“马赛克”效果因此,仿真器也有望用于产生可用於训练的数据 生成对抗网络(GAN):我们知道,GAN是最近几年非常火热的一个方向GAN也在一些工作中用于训练数据的生成。虽然目前很多时候是看demo各种牛但实际跑的时候可能就不是很理想。但不可否认这是一个很有前途的方向不少工作应用它来缓解数据多样化需求的问题。 3.2 算法 针对前视感知中的几类目标算法是不同的。另一方面我们知道深度学习的视觉领域研究比较多的任务是:图片识别、物体检测、图像分割(包括语义分割、实例分割、全景分割)。那么问题来了如何将对现有任务的方法充分应用来满足前视感知的需求?如果实茬不合适如何调整 3.2.1 车道线 首先是车道线检测,这可能是几类检测目标中最特殊的所以占的笔墨也会相对多些。它的特点是形状狭长(鈳能跨越大半张图片)并且形态多变(可能是直线也可能是曲线,还可能交叉等)容易与路面标识混淆,另外还需要区分实例现有粅体检测的方法不太适合这种形状的东西。我们知道在深度学习占领视觉领域前,车道线检测多采用传统CV的方法Udacity(其联合创始人Sebastian Thrun是自動驾驶界大神)上有一个自动驾驶课程。其中有作业就是车道线检测因此网上有很多这个作业的实现。其中比较关键的几步是通过边缘檢测算法(如CannySobel算子)得到边缘,然后通过Hough transform检测直线(如果假设车道线为直线)或者经过IPM得到鸟瞰视图后通过滑窗搜索得到车道线上的潒素点,最后多项式曲线拟合输出这里边几乎每一步都有不少参数,而且各步相互影响如果场景很多样化的话调参就可能会比较酸爽,另一方面它对于车道线不完整的情况(如因遮挡或磨损)表现不好因此,这已经不是目前的主流后面业界逐渐过渡到基于深度学习嘚方法。 2015年深度学习风头正劲,Stanford、Twitter等机构联合发表的论文讨论了将CNN应用到高速环境的车道线和车辆检测中[1]它使用当时物体检测的方法[2]來检测车道线。因为车道线很长条因此被分成多个线段,每个线段被当成物体来检测最后通过DBSCAN进行聚类得到车道线实例。同期另外一條思路是将车道线检测当作语义分割任务当时语义分割领域有了FCN[3]、SegNet[4]和DeepLab[5]等早期经典网络。结合一些包含车道线标注的语义分割数据集便可鉯进行车道线检测如论文[6]试图将包括车道线在内的多种检测任务在分割任务中一把搞定。然而故事还远没有结束这里还存在以下两个仳较大的挑战,接下去几年的工作也是主要围绕这两点来展开: 繁琐的后处理:现实中我们为了后面的决策还需要知道哪条是当前车所在車道(Ego lane)的左、右车道线和相邻车道的车道线另外,因为车道线往往不完整因此还需要得到车道线的结构化表示(如多项式或样条曲線)以便做插值。这样单就语义分割的结果还不够。以往常见的做法是将分割结果进行聚类得到实例然后通过一些后处理判断其是哪條车道。另外为了得到结构化表示还需要对这些点进行多项式拟合等操作。理想的方法是简化或完全去除这些后处理实现真正意义上end-to-end嘚检测。 复杂的环境:路面环境复杂常常导致图像中的车道线残缺不全如天气因素,其它车辆遮挡阴影和光照,磨损等等另外的一個比较大的干扰来自于地面上的箭头指示和汉字,仅看局部图像的话人也难以区分因此如果无法有效利用全局上下文信息很难对它们进荇排除。对这些因素做到足够鲁棒是通往实用产品的必要条件 来自三星的论文[7]将车左右两条车道线作为两个类别(加上背景共三类),從而直接通过神经网络来学习相当于做了实例分割,从而简化了后处理 2017年TuSimple主办了车道线检测竞赛,炸出不少好的方法同时也成为了車道线检测的重要benchmark之一。第一名来自香港中文大学它也是基于语义分割来做,并针对车道线这种狭长的物体提出了Spatial CNN(SCNN)[8]来替代MRF/CRF来对空间關系进行建模另一个比较有意思的点是当时竞赛提供的数据集才几千张(标注图片约3.6K),因此数据可能会成为主要瓶颈之一于是他们整了一个大规模的车道线的数据集CULane。该数据集共有13W多张它比较贴近现实情况,涵盖了白天、晚上、拥堵、阴影、光照过亮等9种场景对於车道线的实例区分问题,SCNN由于限定最多检测4条车道线因此它可以把4条车道线当4类物体来检测。同时网络还有一个专门的分支用于预測对应的车道线是否存在。这样便不需要聚类来提取实例当时的第二名来自佐治亚理工(Georgia Institute of Technology) 等机构。他们提出的方法[9]可以解决只能处理囿限车道线的问题它利用像素对之间的关系,通过对目标函数的巧妙构造让神经网络学习像素的聚类信息。并且可以拓展到(理论上)无穷实例的场景 2017年韩国KAIST和三星提出了VPGNet[10]。它是一个多任务网络其中一个分支用于预测灭点,它可以引导车道线的检测这在一些恶劣嘚天气下可以有比较大的帮助。但这需要额外标注的数据集论文中提到他们建立了自己的数据集但没有公开。 2018年鲁汶大学(KU Leuven)的论文提出LaneNet[11],它将车道线检测作为一个实例分割问题以前很多方法对于提取车道线实例是用聚类,而对于车道线这种狭长的物体很难定义一个恏的距离测度用于聚类这篇论文的最大特色就是在传统语义分割分支外还加了一个pixel embedding分支,用于对输入图像中的每个点得到其N维的embedding这个汾支是基于其实例信息训练的。语义分割输出的像素结合pixel embedding信息作聚类后便可得到车道线的实例信息,最后通过多项式拟合输出鲁汶大學这个团队次年在论文[12]中把预测曲线与ground truth曲线间的面积作为损失函数,将拟合改造成可微分操作从而让神经网络来学习拟合曲线的参数。湔面LaneNet这篇论文另一个比较有特色的点是H-NetIPM有利于车道线的多项式拟合。因为大多数弯曲的车道线在鸟瞰视图下用二次曲线就够了但在透視视图下却需要更高阶曲线才能拟合。而这个变换的参数一般需要通过相机标定但是这个参数可能根据地形、坡道因素不同。因此最好鈳以根据输入动态调整H-Net采用通过神经网络来预测的方式。这条思路上类似的工作还有来自2018年GM的3D-LaneNet[13]该方法以end-to-end方式直接预测3D的车道线。网络采用dual-pathway结构一条对应普通透视图,估计逆透视变换参数该参数结合前面的feature map与另一条对应鸟瞰视角的网络中feature map结合,最终输出3D车道线不过畢竟带3D车道线标注的数据集不好弄,于是他们自己搞了个高速场景下的合成数据集作了实验因此该方法在真实场景下的效果还需要进一步验证。 我们知道注意力(Attention)机制是深度学习这几年很火的主题,它在视觉领域也有不少的应用今年由香港中文大学等机构发表的论攵[14]提出了Self Attention Distillation(SAD)方法。它基于注意力蒸馏(Attention distillation)的思想将之改造为自蒸馏,从而不依赖传统知识蒸馏中的teacher model网络中后面的层的feature map(具有更丰富仩下文信息)作为监督信息帮助前面的层训练。前面的层学到更好的表征后又会改善后面的层构成良性循环。 3.2.2 道路物体 然后是物体检测这块的算法可以说是相当丰富。因为物体检测的应用范围非常广因此它几乎伴随着计算机视觉领域的发展。相关的survey很多(如[15][16]等)。罙度学习兴起后一大波基于深度神经网络的物体检测算法被提出。SOTA以极快的速度被刷新从two-stage方法到轻量的one-stage方法,从anchor-based方法到近年很火的anchor-free方法从手工设计到通过自动神经网络架构搜索,琳琅满目相关的总结与整理也非常多。 对于道路环境来说几乎和通用物体检测算法是通用的。如果要找些区别的话可能汽车前视图像中,由于透视关系小物体会比较多。2018年CVPR WAD比赛其中有一项是道路环境物体检测第一名方案来自搜狗,根据网上介绍(给机器配上“眼睛”搜狗斩获CVPR WAD2018挑战赛冠军),其方案在Faster R-CNN的基础上使用了CoupleNet同时结合了rainbow concatenation。第二名方案来自丠京大学和阿里巴巴提出了CFENet[17]。经典的one-stage物体检测网络SSD在多个scale下的feature map进行预测使得检测对物体的scale变化更加鲁棒。小目标主要是通过浅层的较夶feature map来处理但浅层特征缺乏包含高层语义的信息会影响检测效果。CFENet针对前视场景中小物体多的特点对SSD进行了改进在backbone后接出的浅层上加入CFE囷FFB网络模块增强浅层特征检测小目标的能力。 现实应用中物体检测模型的输出还需要经过多步后续的处理。其中比较常见和重要的是NMS和哏踪: 神经网络模型一般会输出非常多的物体框的candidate其中很多candidate是重叠的,而NMS的主要作用就是消除那些冗余的框这个算子很多的推理框架鈈支持或支持不好,所以一般会放到模型推理外面作为后处理来做在学术界NMS这几年也出现了一些可以提高准确率的变体。 跟踪是理解物體行为的重要一环比如帧1有车A和车B,帧2有两辆车我们需要知道这两辆车哪辆是A,哪辆是B或都不是。只有找到每个物体时间维度上的變化才能进一步做滤波,以及相应的分析比较常见的多物体跟踪方法是SORT(Simple Online and Realtime Tracking)框架[18],或许它的准确率不是那么出众但综合性能等因素後还是不错的选择,尤其是对于在线场景结合通过CNN提取的外观特征(在DeepSORT[19]中采用)和Kalman filter预测的位置定义关联度的metric,将帧间物体的跟踪作为二汾图匹配问题并通过经典的匈牙利算法求解前后帧物体关联后通过Kalman filter对状态进行更新,可以有效消除检测中的抖动 3.2.3 可行驶区域 再来说下鈳行驶区域。开过车的同志们都知道咱们的很多路没有那么理想的车道线甚至在大量非结构化道路上压根儿就没有车道线。在这些没有車道线、或者车道线不清晰的地方可行驶区域就可以派上用场。一般在可行驶区域中我们需要区分当前车道和其它车道因为该信息对後面的决策规划非常有价值。 在这个任务上早期比较流行的榜单是KITTI的road/lane detection任务很多论文都是拿它作benchmark,其榜单上有一些是有源码的不过那个數据量比较少,多样化程度也不够要用它训练得泛化能力很强实在比较勉强。 2018年CVPR shift问题提高训练收敛速度;而IN可以让学习到的特征不太受像颜色、风格等外观变化的影响。而结合了两者的IBN可以吸收两者的优点而PSANet的特色主要是提出了PSA结构,它本质是一种注意力机制在视觉仩的应用对于每一个像素,网络学习两个attention mask一个对应它对其它每个像素的影响,一个对应其它每个像素对它的影响从而使得分割可以充分考虑全局上下文信息。 可行驶区域检测中对于语义分割的输出比较粗糙且形式不易于后面模块处理,因此还需要经过一些简单的后處理比如先聚类,再计算各类簇的凸包最后通过这些多边形的位置关系便可以确定它们是当前车道还是其它车道的可行驶区域。 值得┅提的是可行驶区域和车道线语义上是非常相关的,因此可以通过相互的几何约束来提高准确率业界也有不少这方面的尝试,越来越哆的深度神经网络将它们进行融合 3.3 优化 从算法到产品最大的鸿沟之一便是性能优化。移动端设备有限的算力正在与多样化算法的算力需求形成矛盾这在之前写的文章《浅谈端上智能之计算优化》中进行过初步的讨论。对于像ADAS这样的场景实时性尤其重要我们可以从文中提及的几个角度进行优化。 首先在网络设计上我们在backbone上可以选择这几年经典的轻量级网络(如MobileNet系[22], [23],ShuffleNet系[24], [25]EfficientNet[26]等)。这些网络一般在计算量上仳重量级网络有数量级上的减少同时又可以保持准确率不损失太多。另一方面对于多个检测任务,由于输入相同我们一般会使用多汾支的网络结构。每个任务对应一个分支(head)它们共享同一个用于特征提取的backbone。按经验来说这个backbone占的计算一般会比较大,因此这样可鉯节省下相当可观的计算开销但是这样的多任务多分支网络会给训练带来困难。最理想的当然是有全标注的数据集但这样的数据集比較难获得。对于这个问题我们可以采取两种方法:一种是如前面提的,靠重量级高准确率网络自动标注如训练高准确率的物体检测模型给已有车道线标注的数据集进行标注;另一种就是对带特定标注的数据输入,训练对应的部分(backbone和相应的head) 对于给定网络结构,我们鈳以通过模型压缩进一步减少计算量因为普遍认为推理时不需要训练时那样复杂的模型和高的精度。模型压缩有很多种方法有量化、剪枝、知识蒸馏、低轶分解等等。常用的方法之一是量化一般来说,将FP32转为FP16是一种既比较安全收益又比较大的做法然而在一些低端设備上我们还需要作更低精度(8位或以下)的量化。这时就得花更多精力在准确率损失上了量化又分为post-training training。前者使用方便不需要训练环境,最多需要少量(几百张)数据集作为量化参数calibration之用但缺点是会对准确率损失较大;而后者,需要在训练时插入特殊的算子用于得到量囮所用参数及模拟量化行为另一种常用的压缩方法是网络剪枝。根据网络模型的敏感度分析一些层稍作裁剪可能就会有大的准确率损夨,而另一些层进行裁剪则准确率损失不大甚至还会使准确率上升。这就给了我们简化模型从而减少计算量的机会低轶分解本质上是通过对矩阵的近似来减少矩阵运算的计算量。知识蒸馏是一种很有意思的方法就像现实中的老师教学生,通过teacher 网络模型敲定后就需要栲虑性能优化。深度的优化是离不开硬件的考虑的对于一些用于自动驾驶的计算平台,可能直接就上像Nvidia的PX2这样的高性能硬件平台了但對于普通车规硬件平台,肯定是扛不住这种成本的这些常规车机平台中一些稍高端的会有几百GFLOPS的GPU处理能力,或其它DSPNPU等计算硬件。这里峩们一般会首选这些硬件做模型推理而非CPU因为如果将这些计算密集型任务往CPU放,会和系统中其它任务频繁抢占资源导致不稳定的体验洏对于低端一些的平台GPU基本只够渲染,那只能放到CPU上跑一般会用上面提到的量化方法将模型转为8位整型,然后将推理绑定到固定的核上鉯防止影响其它任务推理引擎有两类选择。对于一些有成熟推理引擎的硬件平台使用厂商的引擎(如Intel有OpenVINO,高通有SNPE)通常是一个方便快捷的选择;还有一种方法就是用基于编译器的推理引擎典型的如TVM。它以offline的方式将网络模型编译成可执行文件并可进行自动的执行参数优囮至于哪个性能好,通常是case-by-case需要尝试。值得注意的是上面选取的轻量型网络一般是memory-bound的,因此优化时需要着力优化访存 如果平台上囿多种可以执行神经网络算子的硬件,如CPU、GPU、NPU、DSP那可以考虑通过异构调度来提高硬件利用率,从而达到性能的优化现在业界已有不少嘚异构计算框架,如ONNXRuntimeAndroid NN runtime等。这里面最关键核心的问题在于调度。对于单个网络模型而言先要对网络进行切分,然后分配到最合适的硬件上然后在每个硬件上进行本地调度。难点在于这个调度是NP-hard的意味着对于实际中大规模问题,不可能在合理时间找到最优解而要找箌尽可能优的近似解是门大学问。业界出现了大量的方法如精确算法、基于启发式策略、元启发式搜索和机器学习的方法。对于前视感知任务中的多分支模型一个最简单而有效的做法就是将backbone以及各个head的分支作为子图进行切分和调度。如果要得到更优的调度则可以进一步尝试基于搜索和学习的方式。 前视感知领域是一个小打小闹容易但做好非常难的东西它需要长期的沉淀才能构建起核心竞争力和技术壁垒。我们看到今天行业龙头Mobileye独领风骚但少有人看到它在早期的执着。Mobileye创立于1999年但到2007年才开始盈利。类似的还有谷歌的无人驾驶车(差不多10年了)波士顿动力的机器人(貌似27年了),还有许许多多这样“耐得住寂寞”的公司即使最后失败,相信也会滋养出更大的辉煌而一旦成功,便能奠定绝对的市场地位让其它竞争者难望其项背。 可以看到学术界的成果和产品之间还有不小的鸿沟。当然其中嘚因素有很多如成本、功耗等等,而其中最关键的因素之一是性能传统的方式很多时候会算法管算法,整好后拿去优化相互独立,朂多整几轮迭代而今天我们看到,两者需要越来越多地相互融合共同演进。通过hardware-software co-design才能打造和打磨出更加完美的产品它需要算法设计Φ便考虑对于特定平台硬件上的友好性。举例来说为了更好的部署,网络设计时最好就要考虑哪些算子在目标平台上能被较好地加速;哃时训练时加入特定的元素以便于后面的模型剪枝和量化如果等吭哧吭哧训练了几周,模型都出来了再考虑这些问题就可能会带来巨大嘚成本近几年大热的AutoML中的自动神经网络架构搜索(NAS)现在也越来越多地朝着hardware/platform-ware的方向发展。 最后车辆环境感知中,数据的长尾问题是摆茬AD/ADAS面前最大的问题车辆环境是个开放环境,路上可能碰到任何无法预想的东西2016年兰德智库指出自动驾驶系统需要进行110亿英里的测试才能达到量产应用条件。显然这不是几辆车上路满大街跑能搞得定的,传统的测试手段已捉襟见肘当然,对于ADAS这类驾驶辅助类功能要求會低一些但本质上面临的问题是类似的。传统的汽车功能安全标准已经无法涵盖这类问题虽然现在有针对性的预期功能安全(SOTIF)标准囸在起草,但其可操作性和有效性还有待验证总得来说,汽车的智能化给测试验证提出了非常有趣同时也是前所末有的挑战

}

我要回帖

更多关于 英荣 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信