George Hotz 自动驾驶 深度学习

2023-10-24 04:59

本文主要是介绍George Hotz 自动驾驶 深度学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

George Hotz:请收下我的智驾系统代码(附论文)

举报

  1 新智元原创 

 

  【新智元导读】我知道以GeoHot的脾气,最终 comma.ai 全套AI模型的代码肯定会被他开源,但我没想到会这么快,而且我也没想到这么完备,几乎毫无保留,多达80G的驾驶数据,模型以及论文全部开放,黑客精神在这位老兄身上的到了淋漓尽致的体现。本文结合GeoHot此次发表的论文和代码,讲解此前为Bloomberg演示时所采用的深度学习框架。代码采用Python语言编写,涉及tensorflow,anaconda,cv2等多个常用深度学习常用开发框架,是不可多得的学习材料。

  

  桀骜不逊的自动驾驶破局者

  智驾深谈的第一期,就是关于这位老兄George Hotz,江湖人称GeoHot,“声名狼藉的”iPhone和PlayStation破解者,做过多家IT帝国的被告。几个月前研究上了自动驾驶技术,紧接着就公然挑战Tesla、Google和Mobileye,自嘲是个“智痴(I'm an Idiot.)”,而其他家的水平,只能算是智障。Musk发邮件邀请他去Tesla,被他拒了,声称自己年底就要出不到一万人民币的产品,而且效果绝对秒杀。四月初拿到了310万美元融资,并在拉斯维加斯正常车流中,GeoHot演示了目前的技术进展,完成度颇高,只用了一个前置摄像头,以及一个草草贴在前保险杠上的毫米波雷达。

  深度学习端到端:开源概况

  此前我提过,目前的自动驾驶技术可以划分为两类,一种是感知-决策-控制然后不断闭环,每个模块用不同的方法力争最好,很多情况下需要专家提供基于经验的规则。另一种则是GeoHot正在采用的办法,叫做End-to-End,端到端方法,指以摄像头的原始图像作为输入,直接输出车辆的速度和方向,中间用某种数学模型来拟合逼近最优驾驶策略,目前常用的就是深度学习模型。

  本次GeoHot开源的东西非常丰富,包括下面几个内容:

  七小时十五分的高速公路图像数据

  两种使用该数据的机器学习实验方法

  一篇利用深度学习RNN网络进行自动驾驶的论文 (在新智元公众平台回复0806下载)

  整套试验代码包括tensorflow,anaconda,keras等常用工具的用法

  这些材料,足够读者复现GeoHot为Bloomberg演示的效果,比起此前Mobileye或者Nvidia光发布论文前进了一大步。

  深度学习端到端:数据准备

  

  驾驶数据是本次开源的重要组成部分,不但包括前视摄像头裁剪的数据,共计7.25小时,分为11个视频,160*320大小,并且还包括了GeoHot那辆讴歌采集的转向、制动、速度以及惯导数据,以及图像输入和控制输出的同步时间戳数据。本次发布的论文主要聚焦在通过图像输入来学习控制转向和速度,GeoHot将图像缩小为80*160并将像素值归一化。

  深度学习端到端:模型介绍

  

  目前深度学习用于自动驾驶可以大概分为两类,一类是收集驾驶数据,离线训练模型,不断逼近人类驾驶员;另一类是在模拟器中,利用Q函数,不断自我决策和试错来提高驾驶技术。由于真正图片的复杂以及输出命令的连续性,使得现实世界中能够得到好结果比较困难,所以我们目前见到的很多都是在模拟器中尝试。

  

  本次GeoHot开源的是第一种方法,且是在真实道路上经过实测的。其基本原理是,将摄像头获得的图像数据,利用Autoencoder编码(如上图锁匙,期间还用到最近很火的GAN),然后用一个RNN深度网络来从人类驾驶数据中学习,最终预测下一步操作。

  深度学习端到端:代码概要

  

  从代码结构上来看,大概可以分为数据、模型和训练框架三部分,其中模型部分包括了autoencoder和RNN,训练框架则以server.py文件作为入口。

  结语

  我非常惊讶于GeoHot做出这次开源的决定,看过论文和代码之后,相信复现他们演示结果并不是一件很难的事情,算是让大部分想要尝试深度智驾模型而又无从下手的人得到了福利。那么开源是否会对整个智驾产业带来影响呢?如果你觉得GeoHot还不够强的话,Google未来开源了会不会有影响呢?谁也很难说智驾不会像智能手机一样,成为下一个兵家必争之地。

  

  新智元Top10智能汽车创客大赛招募!

  新智元于7月11日启动2016年【新智元100】人工智能创业公司评选,在人工智能概念诞生60周年之际,寻找中国最具竞争力的人工智能创业企业。

  智能驾驶技术是汽车行业的重点发展方向之一,同时也是人工智能相关产业创新落地的重要赛道之一。为此新智元联合北京中汽四方共同举办“新智元Top10智能汽车创客大赛”,共同招募智能汽车相关优质创业公司,并联合组织人工智能技术专家、传统汽车行业技术专家、关注智能汽车领域的知名风投机构,共同评审并筛选出Top 10进入决赛,在2016年10月16日“国际智能网联汽车发展合作论坛”期间,进行路演、颁奖及展览活动。



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,具体如下:



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



然后赵师傅做了几件事:


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

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

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

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



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




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




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




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


论文有啥看点


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


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



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




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


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





最后,关于别人家的工作,除了steering angle prediction(对应下图的behavior reflex)以外,还有两种可能的方式用以学习自动驾驶,一种是把自动驾驶转化为其他的子任务,例如行人和汽车检测、车道线检测、场景语义分割等,在下图中被称为mediated  perception。另一种由princeton vision组提出,在下图中被称为direct perception,可以理解为把自动驾驶拆分为一些语义层级较高的子任务(下下图所示)。此项工作在虚拟的赛车游戏中进行训练,在真实数据集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散度即可得到该式。该式的计算网上有很多资料,比如可参考:https://home.zhaw.ch/~dueo/bbs/files/vae.pdf

 

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



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


结语



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



对于深度学习工作者而言,大量的开源项目避免了很多重造轮子的工作,降低了算法实现门槛。本文盘点了在Github上获得Stars最多的深度学习项目,供从业者参考。并感谢这些开源爱好者的贡献。





链接:
https://github.com/aymericdamien/TopDeepLearning

原文链接:
http://geek.csdn.net/news/detail/94963

这篇关于George Hotz 自动驾驶 深度学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis