【智驾深谈】George Hotz 开源代码复现与分析(80G数据云盘下载)

本文主要是介绍【智驾深谈】George Hotz 开源代码复现与分析(80G数据云盘下载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


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


  • 对于大公司来讲,车企做渐进式ADAS其实都是工况分解而来,流行使用状态机,深度模型是个黑盒子他们肯定不喜欢。


  • 互联网企业愿意尝试新方法,但这个系统其实还需要在车辆控制方面做大量的改进才能够跟现有系统对标。


  • 对于创业团队来讲,这个系统是个很好的参考,可以学习一下深度学习,以及comma.ai是如何短时间内聚焦并发力赢得投资人青睐的。


  • 而对于风投来讲,要谨慎看待,AI创业团队有的很靠谱,而不靠谱的会特别不靠谱,比如直接用人家代码跑别的数据做展示,不冷静的投资人很可能会被忽悠投一笔。


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


具体怎么复现


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


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


  • Ubuntu 14.04

  • Python 2.7

  • nVidia Geforce Titan X (12GB Memory)


软件的安装顺序建议Anaconda,tensorflow,keras,具体如下:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


然后在Python中 import tensorflow看看是不是成功了


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

然后赵师傅做了几件事:


  • GeoHot代码:在训练集上train了一个转向控制模型

  • GeoHot代码:在测试集上validate了一下

  • 赵师傅改进:在训练集上train了一个离散分类转向控制模型

  • 赵师傅改进:在测试集上validate了一下


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy

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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

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


论文有啥看点


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


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


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


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


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


代码核心在哪


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


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

 

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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


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


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

 

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

 

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

对于一个N(mean, sigma^2)的分布和N(0, 1)计算KL散度即可得到该式。该式的计算网上有很多资料,比如可参考:https://home.zhaw.ch/~dueo/bbs/files/vae.pdf

 

另外值得一提的是文中`Dis(Gen(Enc(x))`的计算,`Gen(Enc(x))`对应了代码中的


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

其中`Z2`是一个N(0, 1)分布的采样。因为要强制encoder的输出是N(0, 1),且分布中的所有编码都可产生逼真的图像,因此每次训练中生成一个分布中的样本,也即`E_mean + Z2 * E_logsigma`,约束其解码判别结果`D_dec_fake`与`F_dec_fake`逼真。在上面提到的VAE参考资料中,也可以找到这一采样优化方法的相关介绍。


结语


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

人家车也在路上跑了,数据也采集了,输入输出也同步了,代码也开源了,论文也公开了,GitHub回答问题还那么及时,我们也都给放到百度云了,没什么槽点了吧……


文章转自新智元公众号,原文链接

这篇关于【智驾深谈】George Hotz 开源代码复现与分析(80G数据云盘下载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/483571

相关文章

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.