开发者学堂课程【深度学习与自动驾驶:自动驾驶中的卷积神经网络(3)】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/533/detail/7156
自动驾驶中的卷积神经网络(3)
内容介绍:
一、Visual Odometry
二、Object Detection
三、End-to-End Natural Language Generation
一、Visual Odometry
1、6-DOF: freed of movement
(1)Changes in position:
① Forward/backward: surge
② Left/right: sway
③ Up/down: heave
(2)Orientation:
Pitch, Yaw, Roll
2、Source
(1)Monocular: I moved 1 unit
(2)Stereo: I moved 1 meter
(3)Mono = Stereo for far away objects
PS: For tiny robots everything is "far away" relative to inter-camera distance
但当你进入真实世界会发生各种情况,这些方法是否依然靠谱,回到定位问题,深度学习的作用。视觉测距,它使用视频图像的单目或立体输入,确定你在世界上的方向,也就是车的朝向,然后你只需关注前方道路的视频,你还可以从Stereo中得到每个物体距你多远的信息。
3、SLAM: Simultaneous Localization and Mapping
What works: SIFT and optical flow
很多人做过这类研究,关于发现外部场景的独特特征,并且根据这些特征的轨迹来定位,当特征维度足够多,就变成了一个优化问题,你可以追踪这条线的逐帧变化,然后综合考虑你在三维空间的变化,还有其他传感器也有用,比如GPS,虽然不很完美但很精确,是帮助你定位的另一个信号,另外还有IWU加速度计,还有陀螺仪告诉你加速度,有六度自由度。
4、Visual Odometry in Parts
(1)(Stereo) Undistortion, Rectification
(2)(Stereo) Disparity Map Computation
(3)Feature Detection (e.g., SIFT, FAST)
(4)Feature Tracking (e.g., KLT: Kanade-Lucas-Tomasi)
(5)Trajectory Estimation
① Use rigid parts of the scene (requires outlier/inlier detection)
② For mono, need more info* like camera orientation and height of off the ground
关于移动物体,也就是车,如何在空间中移动。可以用最优化的方式去做,给定一些特征,比如sift,立体输入纠正,有两张图,为每张图计算深度图,为每个像素,计算对像素深度的最佳估计,相对相机的三维位置,然后计算差异图,也就是距离,然后检测出场景的特有特征,Sift很常见,它是检测独特特征的流行算法,随着时间的推移,可以跟踪这些特征,这样可以从视频中得到三维空间轨迹,对轨迹的估计,有很多假设,比如假设物体是刚体,所以如果一个大的物体从你面前经过,你需要确定它是什么,要找出场景中的移动物体,那些是固定的。
5、End-to-End Visual Odometry
或者可以作弊,用端到端神经网络,端到端意味着什么?称之为作弊,因为省去了很多特征上费的苦功,只需用原始输入,从任何传感器,它从立体视觉摄像机获取立体输入,从而获得两个图像,两个图像的序列,输出是空间中的轨迹,做了SLAM的苦功,找到特征,定位,追踪特征,找到轨迹,只用训练神经网络,借助一些基准事实,来自更精准的传感器,比如激光雷达,在立体视觉输入上训练,输出是空间中的轨迹,对于速率有易外的卷积神经网络,不过效果不大好。
二、Object Detection
1、Past approaches: cascades classifiers (Haar-like features)
2、Where deep learning can help: :recognition, classification, detection
SLAM是深度学习表现不如传统方法的地方之一,深度学习能帮助的是理解场景,识别其中的物体,它检测场景的不同部分,给它们分类,并用光流确定它们的运动,之前的物体识别方法。
3、Scene Understanding:
Where is everyone else ?
比如识别信号灯 TensorFlow 里的分类和检测,或者用每辆车的特征或者其他人工特征,现在可以利用卷积神经网络来代替这些特征的提取,还有 SegNet 的TensorFlow 实现,这个利用神经网络,优点是利用相似类型的网络来解决不同的问题,并且取决于于问题的复杂性可以得到非常好的效果,对网络进行卷积,意味着输入和输出都是一张图像并且是单目图像,输出是一张分割后的窗片,不同的颜色区域代表着逐像素预测后的物体,这里没有用到空间信息,没有用到时间信息,这里是分别处理每一帧,能够将道路从树木,行人,车辆等其他事物申提取出来,这是基于激光雷达技术所提供的,有关场景的当体视觉三维信息。是在场是中填充物体,填充所预测的最可能的物体。
4、Road Texture and Condition from Audio
可以利用循环卷积网络并利用时闻信息来处理视频和音频,例如,可以处理幻灯片底部所展示的,干燥路面和潮湿路面经过时发出的声的频谱图,可以将频谱图视为一张图片,利用循环卷利神经网络并结合时间信息进行处理,让频谱图持续滑动并输入网络中,这在处理简单任务时表现十分优异,尤其是干湿道路的区分上,这是一个小却重要的任务,还有很多类似的任务,为了了解道路的质地质量特性,道路的湿滑程度是其中非常重要的一点,当没有下雨然而道路非常湿滑,这点信息上常重要。
5、Previous approaches: optimization-based control
Where deep learning can help: reinforcement learning
路线规划,右边是 Sertec Karaman 的工作。课程项目用到的是相同的方法,与CHris Gerdes对高速行驶中的赛车做规划追踪使用的方法类似,沿着复杂的曲线,可以利用优化来解决这个控制问题,或者可以利用强化学习,通过大量的模拟来得到能够顺利曲线转弯,并学习哪些路径不能转弯,这能够同时优化,你转弯时的速度,以及车辆的安全,为课程项目所使用的方法是相同的。
6、Driver state:
What's the driver up to?
驾驶员的状态,这是驾驶员,他在那边坐着,那么在这种特定的情形下,你在做非常简单的任务,检测头部和眼睛的位置,头部和眼睛的姿势。这些能够确定所谓的,驾驶员的视线,也就是驾驶员正在注视的区域,从左到右,左边是一些简单的问题,右边是计算机视觉中一些困难的问题,左边是身体和头部的姿势,物体越大越容易被检测,物体的方向也就越容易被检测,然后是瞳孔直径,检测瞳孔的特性,位置,大小,然后是微扫视,极其微小的振动,眼睛的颤动,都能用来确定驾驶员当前的状态。
7、Gaze Region and Autopilot State
一些是计算机视觉能解决的,而有些不是,对驾驶员当前注视区域的检测,这里展示了特斯拉摄像头数据,Don 在驾驶这辆特斯拉,要检测他在注视六个区域中的哪一个,将其转化为一个分类问题,即左,右,后视镜,仪表盘,中控面板,以及前方道路,需要确定这六个区域中的哪一个,是驾驶员正在注视的方向,这很重要“不关心驾驶员注视的具体的X,Y,Z坐标信息,关心的是他是否看着道路,他们是在低头看手机还是看着前方道路?可以利用卷积神经网络来有效地回答这一问题。
8、Driver Emotion
你还可以通过CNN的提取看到驾驶员的情绪,可以将复杂的情绪转化为满意或不满意的二元问题,这是一个驾驶员与车载语音导航系统交互的视频,自我报告,这是最难的部分之一,如果你从事情感计算,一个从计算角度研究情绪的领域,如果你在这个领域工作,你会知道情感的途释是一件非常有挑战性的工作,如果标注基准数据仅仅根据这个男的在笑,因此标记为开心或者他在皱眉就标记为伤心,大多数从事情感计算的人都这样做,在这个例子中让人们自我报告,询问人们不满意的程度从1到10进行打分,图片上方的Dan提交了“1”代表他满意现在的交互,下方图片的司机报告“9“他对交互很沮丧,注意这里Dan的脸显得非常冷且僵硬,这代表他很满意。但下面视频中,虽然不满,但驾驶员在微笑,这提醒不应太信任人的本能反应,关于特征工程,必须相信数据,相信基本事实,最能反映现场发生了什么事情的实际语义。
三、End-to-End Natural Language Generation
1、Natural language processing to enable it to communicate successfully
2、Knowledge representation to store information provided before or during the interrogation
3、Automated reasoning to use the stored information to answer questions and to draw new conclusions
端到端的驾驶项目和教程,如果驾驶像一个谈话,如果驾驶像一个天然的语言交谈,那么可以认为端到端的驾驶,是跳过图灵测试的组成部分。
4、Autonomous Driving: End-to-End
作为一个端到端自然语言生成,将外部传感器数据作为输入,输出车辆的控制。中间过程就是魔术发生的地方。
5、Stairway to Automation
用一个神经网络来完成,这张图展示自动驾驶汽车路径,这说明有基准事实的大量数据集,如果制定的驾驶任务,简单地输入外部图像,并产生转向命令,加速命令,那么有很多基准事实,有大量的司机在道路上每天驾驶,提供基准事实,因为他们的驾驶操作保证他们活着,所以如果收集这些数据,它们就成为基准事实,所以如果有可能学习,可以收集手动控制车辆的数据,并使用该数据来训练算法来控制无人车。
6、End to End Learning for Self-Driving Cars
首批做这个的有NVDIA他们训练外部图像,前方道路的图像,和神经网络,一个简单的卷积神经网络,取得图像。输幽转向命令,而且一定程度造成功学习到基本的导航转弯,曲线,甚至停止,或急转弯。这个工作很简单,
底部是输入,顶部是输入,输入是66×200像素图像RGB,显示在左边是原始输入,你裁剪一点点,调整大小为66×200,这就是的代码所提供的,在浏览器和TensorFlow运行时都是,它有几个卷积层,几个完全连接层,和输出,这是一个回归网络,它不产生与猫犬的分类,它产生转向指令。如何转动方向盘,剩下的就是魔术,在人的输入之上进行训练。
7、End-to-End Driving with ConvnetJS
这个项目是系统的 ConvNetJS 的实现,在浏览器中运行。这是课程项目,不像DeepTraffic,这是现实,这是真正的车辆实况输入。然后在实际游戏中,实际模拟是 DeepTesla.JS,页面上方是神经网络损失函数的可视化,它一直在训练,然后是输入限制200x66,有一个卷积层,池化层,输出是回归层,单个神经元,这是一个微缩版 DeepTiny,是 Nvidia 的架构的缩小版,然后你可以想像在实时视频上运行这个网络。
自动驾驶系统和司机的真实数据,输入是蓝色,网络的输出是白色,而绿色表示的是图像的裁剪,然后调整大小以生成66×200的输入,再一次,令人惊讶的是,它在浏览器里运行,在真实世界视频中训练,所以你可以在你的车里也用到它,可以训练神经网络像你一样开车,代码是 ConvNetJS。
8、End-to-end Steering
(1)By the end of this lecture, you'll be able to train a model
that can steer a vehicle
(2)Our input to our network will be a single image of the
forward roadway from a Tesla
(3)Our output will be a steering wheel value between -20 and20
和 TensorFlow 中实现,输入是一个单一的图像,这是 DeepTesla.JS. 输出是-20到20之间的方向盘值,是用度来计量的,记录下,上千小时,但向公众提供10段特斯拉公路驾驶的视频剪辑,一半是由自动驾驶仪提供,一半是人类驾驶,车轮的数值从一个完美同步的 CAN 获取,从 CAN 收集所有信息,它包含了方向盘数值并同步到视频中,裁剪选取窗口,刚刚提到的绿色部分。然后将其作为对网络的输入,和DeepTraffic 中的红色小车在假想车流中穿梭不同,这里包括真实世界杂乱的照明情况。
这个简单的转向任务中,大部分的任务是待在车道里,待在车道标线内,用端到端的方式学会做这件事。
8、ConvNetJS Overview
(1)ConvNetJS is a Javascript implementation for using and training neural networks within the browser
(2)lt supports simple networks with several different layer types and training algorithms
(3)Constructing and training a network can be performed
in very few lines of code, great for demonstrations
ConvNetJS 是卷积神经网络 CNIN的JavaScrtpt 实现,它支持真实的任意网络,所有的神经网络都很简单,因为它在 Javascrpt 中运行,所以不能使用 GPU,网络越大,它的计算量就越大,不像 Deepiraffic,它不是一个比赛,但是如果你是一个注册这门课的学生,你就必须提交代码。
问题:所需要的数据量,对于某一特定任务所需的数据量,是否有一般的经验法则?
一般都必须要有神经网络有着很好的记忆,所以你必须让训练中的每一个案例代表,所感兴趣的一个网络,并且尽可能的多一些,也就是说如果你想要一幅图,如果你想区分猫和狗的区别,你想至少有1000只猫和1000只狗,驾驶有两点问题:第一,大部分时间车况看上去都是一样的,你真正关心的是什么时候和平时不同,这些全都是边界案例,神经网络不擅长的是从普通情况到边界情况、到极端值。所以能成功地站在高速公路上数千小时并不意味着,你能避开一个突然跑到你车前的行人,驾驶的另一点是你必须达到一个相当高的精度和区分猫狗不一样,误判意味着会死人,生命悬于你在车道上驾驶汽车的能力,最好有接近100%的精确率,这里还有一个设计网络的框,有一个衡量网络性能的可视化结果。展示了网络在每一个卷积层和全连接层上提取的特征,还有重新开始训练的能力。
可视化该网络在真实视频中的性能,这个输入层,即卷积层。
图片可视化的右下角有个巧妙设计的条码,这是一种通过视频同步多个数据流的方式,这是一种通过视频同步多个数据流的方式,这能简单地处理多个数据流的多模态数据,尤其是当它们非同步,当训练神经网络的一发组成部分是洗牌的数据,必须用巧妙的方式洗牌数据,达到视频没有任何一个小方面过拟合,而保持数据的完全同步,所以他没有做链接方向盘和视频的艰苦工作,而是把方向盘作为条形码放在图片上方。
最后可以看到网络运行,随着时间的推移,它逐渐学会正确驾驶。
这是一种与TensorFlow端到端驾驶相同的过程,GitHub上有可用的代码,这需要一个或任意数量的视频在上面训练,然后产生一个可视化来比较实际方向盘和预测方盘。方向盘在与人类驾驶或自动驾驶系统一致时变为绿色,当它不一致时将变成红色,希望这不要太频繁。
9、Build the Model: Convolutional Layers
这是在TensorFlow中完成的细节,这是普通卷积神经网络。指定一组层,卷积层,全连接层,训练模型,这样你就可以批量迭代图像。
在一组测试图像上运行这个模型,得到这个结果。
在 ipython notebook 上有一个关于这个的教程,这可能是开始做卷积神经网络的最好方式,它关注的是,最简单的图像识别的问题,对于交通灯的分类。有这些交通灯的图像,做了大量的找数据的工作,你要做的是,建立一个卷积网络,能区别颜色,并在看到红色黄色绿色时启动。