下面的内容就都是程序啊论文啊代码啊

  新智元原创

  作者:小猴机器人

  【新智元导读】上周GeoHot开源代码那篇文章一发,反响还是很强烈的,好多兄弟问我这事儿靠谱么,代码怎么样,论文怎么样,索性上周末抽时间找了赵李二位无人车老司机,跟GeoHot和他实习生勾兑了一下细节,然后我们仨复现了一下,然而今天才腾出空来整合一下分析。本文做了三件事:具体怎么复现、论文有啥看点以及代码核心在哪。这代码离实际上能用还差很多,所以不用担心一波人拿这个唬投资人。

  关注号后回复0813获得80G数据云盘下载链接。

  【特约编辑】小猴机器人,人工智能博士,自动驾驶技术爱好者,参与多个自动驾驶项目研发,有丰富的行业经验,尤其对决策规划控制方面了解深入。

  GeoHot智驾系统开源这件事情还是很多人关注的,也问了很多问题,其中包括渐进式线的车企,直接L4的互联网企业,很多创业团队和风投。先回答一个问到最多的问题:这代码离实际上能用还差很多。

  下面的内容就都是程序啊论文啊代码啊,不感兴趣的可以撤退了。

  具体怎么复现

  先扯两句倒腾数据的情况,一般对于国外这种项目,下载很大的压缩包,普通人用浏览器、迅雷或者云盘等常规办法是很难快速拿到的,主要原因有两个,一个是直连速度太慢,另一个是往往国外网盘都需要代理访问。因此我一般习惯是在国外临时开一个VPS做中继,具体来讲就是AWS或者随便有海外机房的云服务提供商那里按小时买一个16M带宽主机,反正用一天就了,最后不到五十块,成功拖回到赵师傅在学校的服务器上。有三个倒腾数据的命令值得一提:wget的continue断点续传模式,resync的-P断点续传模式,screen–r把进程丢后台。

  具体来讲,先来配置,赵师傅的服务器是这样的,所以跑的还挺快。

  GeoHot原本的转向控制是个回归模型,整个训练大概用了六小时,而回归问题在深度学习中还尚且没有得到彻底解决,因此赵师傅给改了一下变成一个36桶的离散分类问题,softmax没跟loss层整合,分类用的是one-hot。

  上图绿色是驾驶员数据,红色是模型输出数据。从最终的结果来看,两种方式在训练集上都表现不错,但测试集上都不太好。

  主要原因可能是80G数据中有很多低速型的数据,会影响训练效果,比如上图中停在边的例子。

  赵师傅分析了一下九个视频中车速的情况,觉得后续尝试可以专门找车速大于一定阈值的片段,或者把低速模型跟高速模型分开,同时考虑速度和转向的训练。

  论文有啥看点

  然后哥几个讨论了一下论文,还扯了之前一些相关的工作吧。

  首先,Geohot给出了两种在comma.ai数据集上的尝试,第一种是直接从图像回归驾驶员的操作(方向盘转角),第二种是预测(猜测)下一帧时车辆前置摄像头看到的图像。第一个任务一般被称为steeringangleprediction,这个任务最早可以追溯到DeanA.Pomerleau在1989年和1992年发表的两篇文章(见下图)。当时还没有使用卷积网,使用的图像输入分辨率也很低,更没有标准的大规模公开数据集。

  2005年Lecun的一项工作试图用卷积网解决这个问题,但是其数据集有以下几点值得改进的地方(以当前的自动驾驶标准看):(1)不公开;(2)不是在公上拍摄的(off-road)。并且该文章并没有给出严格的定量实验,只是提供了如下的定性结果(蓝色输出,红色真值):

  综上,总的来说,comma.ai是第一个公开的大规模的有着详细标注的可以用来研究steeringangleprediction的数据集。Geohot的文章给出了一些初步的探索,但并不是其强调的重点。

  然后,Geohot的文章主要专注于解决第二个任务,即预测(猜测)下一帧时车辆前置摄像头看到的图像。该系统结合了RNN和GAN。GAN在计算机视觉领域中一般都以反卷网的形式存在,用以生成稠密的输出。Geohot的文章在这个任务上有很强的原创性,但是并没有给出严谨的定量实验,就目前的情况来看,其理论价值大于实用价值。

  最后,关于别人家的工作,除了steeringangleprediction(对应下图的behaviorreflex)以外,还有两种可能的方式用以学习自动驾驶,一种是把自动驾驶为其他的子任务,例如行人和汽车检测、车道线检测、场景语义分割等,在下图中被称为mediatedperception。另一种由princetonvision组提出,在下图中被称为directperception,可以理解为把自动驾驶拆分为一些语义层级较高的子任务(下下图所示)。此项工作在虚拟的赛车游戏中进行训练,在真实数据集kitti上汇报了有关前车距离的定量实验。

  代码核心在哪

  最后就是着半夜看了看代码,主要都是带看。代码中使用了基于tensorflow后台的Keras进行CNN网络的构造。steering回归模型是一个单帧处理的网络,比较简单:

  使用一个三层卷积网络加两层全链接,输入一幅图像,最后全链接输出要回归的steering角度。如前文所讲到的,这种简单的单帧回归难以对同一场景不同的steering情况进行学习。

  文章中的generator模型则相对复杂,其中`models/autoencoder.py`定义了GAN网络下的生成网络和判别网络等模块。

  Encoder网络使用了VAE模型,类似于一个卷积回归网络对图像进行基层卷积操作之后,使用全链接构造回归输出,输出结果为VAE编码的mean结果和扰动sigma方差。

  生成网络部分比较简单,用全链接将输入的code转换为2Dmap,然后使用Deconv反卷积逐层上采样放大,最终得到生成图像。

  Discriminator网络也比较简单,卷积层操作后使用全链接回归输出,输出结果为判别结果,中间的隐层结果也一并输出。

  损失函数都比较直观,可以和原文中的内容进行对应,提一下`kl_loss`的计算:

  对于一个N(mean,sigma^2)的分布和N(0,1)计算KL散度即可得到该式。该式的计算网上有很多资料,比如可参考