DeepPiCa1:如何建立一个深度学习,自动驾驶机器人汽车的预算

介绍

如今,特斯拉,谷歌,优步和通用汽车都在努力创造自己的自动驾驶汽车,可以在现实世界的道路上行驶。许多分析师预测,在未来5年内,我们将开始在我们的城市中运行全自动驾驶汽车,并且在30年内,几乎所有汽车都将完全自主。使用大家伙使用的一些相同技术来制造你自己的自动驾驶汽车不是很酷吗?在本文和接下来的几篇文章中,我将指导您如何从头开始构建自己的物理,深度学习,自动驾驶机器人汽车。您将能够在一周内检测并跟踪车道,识别并响应交通标志和路上的人。以下是您最终产品的预览。


来自DeepPiCar的DashCam的车道跟随(左)和交通标志和人员检测(右)

我们的路线图

第2部分:我将列出要购买的硬件以及如何设置它们。简而言之,您将需要一个Raspberry Pi板(50美元),SunFounder PiCar套件(115美元),Google的Edge TPU(75美元)以及一些配件,以及每个部件在后续文章中的重要性。这些材料的总成本约为250-300美元。我们还将安装Raspberry Pi和PiCar所需的所有软件驱动程序。

Raspberry Pi 3 B +(左),SunFounder PiCar-V(中),Google Edge TPU(右)

第3部分:我们将设置所需的所有计算机视觉和深度学习软件。我们使用的主要软件工具是Python(用于机器学习/ AI任务的事实上的编程语言),OpenCV(一个功能强大的计算机视觉包)和Tensorflow(谷歌流行的深度学习框架)。注意我们在这里使用的所有软件都是免费的开源软件

第4部分:通过(繁琐的)硬件和软件设置,我们将直接进入FUN部分!我们的第一个项目是使用python和OpenCV教DeepPiCar通过检测车道线并相应地转向,在绕行的单车道道路上自主导航。

第5部分:我们将训练DeepPiCar自动导航,而不必像我们在第一个项目中那样明确地编写逻辑来控制它。这是通过使用“行为克隆”来实现的,我们只使用道路视频和每个视频帧的正确转向角来训练DeepPiCar自行驾驶。该实施的灵感来自NVIDIA的DAVE-2全尺寸自动驾驶汽车,它使用深度卷积神经网络来检测道路特征并做出正确的转向决策。

最后,在第6部分:我们将使用深度学习技术,如单镜头多盒物体检测转移学习,教DeepPiCar检测道路上的各种(微型)交通标志和行人。然后我们将教它停在红灯和停车标志,继续绿灯,停下来等待行人过马路,并根据张贴的速度标志等改变其速度限制。

条件

以下是这些文章的先决条件:

  • 首要的是愿意修补和破坏事物。与汽车模拟器不同,汽车模拟器中的一切都是确定性且完全可重复的,真实世界的模型汽车可能无法预测,您必须愿意亲自动手并开始修补硬件和软件。
  • 基本的Python编程技巧。我假设您知道如何在python中读取python代码和编写函数,if语句和循环。我的大部分代码都有详细记录,特别是难以理解的部分。
  • 基本的Linux操作系统知识。我将假设您知道如何在Linux中的Bash shell中运行命令,这是Raspberry Pi的操作系统。我的文章将告诉您确切的运行命令,运行它们的原因以及输出结果。
  • 最后,购买所有硬件和工作PC(Windows / Mac或Linux)需要大约250到300美元。同样,所有使用的软件都是免费的。

进一步思考[可选]

这是可选的阅读,因为我试图涵盖我在文章中需要知道的所有内容。但是,如果你想深入学习深度学习(双关语),除了我在整篇文章中提供的链接之外,还有一些资源需要检查。

Andrew Ng关于Coursera的机器学习和深度学习课程。正是这些课程点燃了我对机器学习和人工智能的热情,并给了我创建DeepPiCar的灵感。

  • 机器学习(免费):本课程涵盖传统的机器学习技术,如线性回归,逻辑回归和支持向量机等,以及神经网络。它创建于2012年,所以它使用的一些工具,即Matlab / Octave,已经过时了,并没有谈论深度学习。但它教给你的概念非常宝贵。你只需要高中水平的数学和一些基本的编程技巧来完成课程,而Ng博士非常好地解释了像反向传播这样的困难概念。完成本课程大约需要3个月。
  • 深度学习5门课程专业(如果你想获得证书,免费或50美元/月):该课程于2018年初推出。因此它涵盖了迄今为止所有最新的人工智能研究,如完全连接的神经网络,卷积神经网络(CNN)和序列模型(RNN / LSTM)。这个课程对我来说是一种享受。作为一名工程师,我总是想知道一些很酷的小工具是如何工作的,比如Siri如何回答你的问题,以及汽车如何识别路上的物品等等。现在我知道了。完成这个5门课程专业需要大约3-4个月。

下一步是什么

这是第一篇文章的全部内容。我会在第2部分见到你,我们会弄脏手,一起制造一辆机器人车!

以下是整个指南的链接:

第1部分:概述(本文)

第2部分:Raspberry Pi设置和PiCar组装

第3部分:让PiCar看到并思考

第4部分:通过OpenCV进行自主车道导航

第5部分:通过深度学习进行自主车道导航

第6部分:交通标志和行人检测和处理

AI赛车联盟的成功启动

我们为AI Racing League举办了一场令人难以置信的首场比赛。观众包括来自AI社区,研究人员,教师和学生的利益相关者。

昨天我们成功启动了新的明尼苏达州AI赛车联盟!这是一次故意的“软启动”,只有极少的宣传和营销,因为我们不想让我们的第一次活动不堪重负。优先考虑了双城区STEM领导层中有影响力的人,我们将重点放在邀请能够接触到妇女和少数民族社区的人们身上。这也是在一个工作日,所以我们意识到许多人不能休息一天,这限制了许多人的参与。

该活动在明尼苏达州国际学校的体育馆举行。特别感谢Zach Sheffert建立联系。这是一个很棒的设施,我们有足够的空间来分散和测试非常受欢迎的DonkeyCars自我注意:教人们如何在开始驾驶前限制最高速度

我们的赞助商是Optum Tech University(OTU)。无论保罗马利尼科尔·斯旺森 OTU的做了巨大的工作量,使在很短时间内量这一事件的成功。OTU为10辆DonkeyCars购买了零件,打印了轨道,完成了所有后勤工作,甚至付了咖啡和午餐!他们在两周内完成了这一切!

我们吸引了来自Optum和其他公司的志愿者。Optum Advanced Technology Collaborative的许多员工帮助组装汽车并成为我们的第一轮导师。我们的夏季实习生和Optum 技术开发计划的成员积极参与。

我们的第一个活动的目标是向人们介绍课堂上围绕AI的想法。我们希望活动有趣而灵活,即使教师和利益相关者只能在活动中停留一小时。我们与CodeSavvyMNCodes等组织合作,确保我们与有影响力的利益相关者建立联系。

当参与者进入健身房时,他们可以选择进入一组“分组表”,或者他们可以直接加入其中一个让DonkeyCar上班的团队。我们有以下突破表:

  1. 硬件 – 我们有两个表格显示样品Raspberry Pi和Nvidia Nano硬件以及样品伺服器,电机,电池和脉冲宽度调制的可视化演示。
  2. Python – 用于通过http://trinket.io教授Python的笔记本电脑的表。
  3. UNIX Shell – 包含示例UNIX shell演示的表。
  4. GPU服务器 – 用于显示我们的GPU服务器如何用于从图像进行培训的表格。
  5. Jupyter笔记本电脑 – 带有PC的桌子,向人们展示如何编写Jupyter笔记本来分析他们的图像文件。
  6. 计算机视觉 – 具有许多计算机视觉演示的表格,例如人脸识别。Nvidia Nano实时运行这些演示。
  7. 机器学习 – 包含机器学习步骤的总体图表以及如何使用TensorFlow库的表格。

虽然我们在许多表格上都有很多活动 – 其中一些表缺乏足够的训练导师和材料 – 所以我们仍然有大量的内容和培训可供使用。

我们还有一些表格,参与者在校准DonkeyCars时,将车辆用于赛道周围的试驾,试图收集训练数据并训练他们的模型。说实话,我们遇到了一些技术挑战,只有一辆车得到了充分的培训。然而,每个人似乎都玩得很开心,我想很多人都知道这些事件可以带来什么。

我们要求参与者填写“概念卡”表格,在这些表格中他们可以命名一个概念并描述学习目标和资源可能是什么。我们正在收集这些内容,以开始为其他活动构建可重用的学习组件。我们现在处于“汇报”阶段,并将整理一份任务清单,以使下一次活动更加顺利。

特别感谢所有参与的人,特别是Jon HerkeRob RossmillerParker EricksonSean LearyPaith Philemon为这次活动的辛勤工作而努力。我应该提一下Rob的团队是第一辆完成第一圈的车,所以他们在技术上是我们学习比赛的“赢家”!

我们还要向DonkeyCar 社区成员表示衷心的感谢。如果没有您的辛勤工作以及您愿意分享您的代码,文档和您的经验,这项活动将永远不可能实现!我们希望通过创建一组便携式概念资源来回馈,这些资源可以加载到现代学习管理系统(LMS)中,该系统使用AI来推荐有趣的学习AI的方法。有点像递归!

我们在这里为AI Racing League的CoderDojoTC GitHub回购发布资源。拉请求正在被接受!您可以随意将项目添加到任务列表中,以查找您希望查看的任何新概念。

Donkey Car3 – 不到250美元资金就能学习自动驾驶

学习驾驶Donkey Car的概念图。
绿色是初始的概念,蓝色的中间概念, 黑色是高层次的“完成”概念。

这是系列的第3部分。以下是第1部分和第2部分的链接。经过几天的挣扎,我终于让我的驴车在地下室的轨道周围自动驾驶!这里有一个简短的视频:

所以这就是让我失望的原因。当我将我的模型从我的Mac上传到Pi并运行“驱动器”命令时,加载模型时出错。我一直在重新运行这些步骤并得到了同样的错误。我花了几天才意识到我在Donkey Car上运行旧版TensorFlow(1.8)和更新版本我的MacBook Pro上的TensorFlow 1.12版本。我还在Donkey Car帮助Slack频道上发布了一个问题,他们在使用较新的TensorFlow版本1.12构建的模型上确认不会在较旧版本的TensorFlow上运行。一旦我弄清楚如何在我的Mac上降级TensorFlow(一线pip shell命令),我重新训练,用SCP将我的新模型转移到Pi,我的车开始运行……那是在我意识到我之后将相机镜头盖打开……

我从一个约16K图像的相对较小的训练集开始。TensorFlow 1.12的训练时间为55分钟,TensorFlow 1.8的时间为75分钟。1.8发布于2018年4月。让我们希望DonkeyCar图像很快升级,这样我们都可以利用这些性能改进!我也只是在赛道周围逆时针方向使用了一套测试装置。在真正的比赛中,我会用顺时针和逆时针方向训练赛车。但这也会增加构建模型的时间。

虽然汽车可以绕过轨道,但很容易被地板上的灯光和侧面的其他白色物体的反射所欺骗。这是因为我在地板上只使用了一条白色胶带。这对视觉系统来说还不够用。但是,我不认为我的妻子真的要我画一条宽大的黑色“道路”,中间有黄色条纹,就像官方的Donkey Car轨道一样。

当我终于让汽车在自动模式下工作时,它非常令人满意。但是也有点“怪异”。我实际上“教”了一个小大脑来跟随地板上的线。它几乎似乎模仿我糟糕的驾驶。它甚至学会了如何在直道上加速,并且在紧凑的曲线上减速。真的很酷!

虽然我在TensorFlow和Keras的工作中做过一些工作,但很多步骤都有点抽象。一旦我开始玩驴车,事情就更容易理解了。系统的优势及其弱点都变得清晰。我还意识到,在训练系统(我的MacBook)和推理系统(Pi)之间同步Python和TensorFlow库是一个关键步骤。

在完成所有步骤后,我现在了解了大部分组件,并且我正在构建一个“概念图”,其他人可以使用它来帮助理解他们需要知道什么概念才能让他们的Donkey Car运行。

我现在正在回顾我学到的所有步骤,并将这些步骤与我为当地CoderDojo俱乐部制作概念卡的先前工作相结合。这是博客文章顶部的数字。概念图中的每个方框最终将成为1/2张层压纸,正面有活动和问题,背面有答案。这些在CoderDojo中被称为“寿司卡”,因为它们是比特大小的学习点。以下是“电动机”概念卡的示例图像:

AI赛车联盟的电动概念卡。

我的朋友Jon Herke也有兴趣使用Donkey Cars建立一个“AI赛车联盟”,旨在教孩子们关于人工智能和机器人技术。请继续关注我们是否可以为hackdays建立一个基础和一个为期10周,每周4小时的夏令营类型计划。我们希望让女孩和弱势青年参与这些计划。如果您有兴趣帮助我们入门,请告诉我们。

Donkey Car2 – 构建,校准和生成培训数据

这是我组装的驴车。我所拥有的chasis不符合我订购的3D部分,所以我不得不用一些有机玻璃即兴创作。

这是关于Donkey Car的3部分系列的第2部分。这是第1部分第3部分。在第1部分中,我谈到了如何基于Raspberry Pi启动并运行新的Donkey Car,并使相机连接正常工作。我用RPi Cam Web界面测试了相机,并在我们家的一楼开车,以感受汽车的感觉以及它如何导航。

来自RPi Cam Web界面的示例图像

在这种模式下,Pi只是在Web服务器后面的便携式摄像机,将视频图像传输到其网页。RC汽车完全由汽车附带的2.4 Ghz控制器控制。要运行RPi Cam Web Interface软件,我只需打开Pi上的终端并从github站点下载代码。然后我运行了启动Web服务器的startup.sh脚本。

我感兴趣的是,相机拍摄的图像与网页上出现的图像之间有多大的延迟。延迟可以忽略不计,这让我只需通过观看网页上的图像来驾驶汽车。这意味着相机和Pi之间的输入/输出速度很快,因为图像通过WiFi芯片转换为Web浏览器。它基本上证明了Pi中有足够的马力来进行实时远程视频驱动。

然后我断开连接器与RC汽车附带的2.4GHz接收器,并将连接移动到我从亚马逊订购的伺服控制器。虽然这个伺服控制器板设计用于控制多达16个伺服系统,但我们只需要使用两个伺服系统。一次是速度,一次是转弯。我还必须将四条线从伺服控制器连接到Pi 40 Pin GPIO总线。这些连接的照片如下:

四条线用于在Pi和伺服控制器之间进行通信。黑色为地,红色为+ 5v,黄色和橙色线为SCL(时钟)和SDA(数据)。它们在伺服控制器上清晰标记,您可以看到Pi GPIO接口上的引脚分布。

下一步是转向和加速度计的校准。要做到这一点,我必须SSH到Pi并运行校准。这个过程有点棘手,因为许多电子速度控制器(ESC)有点不同。据记载毛驴车网站在这里。因为我的“停止”频率不正确,我仍然无法让汽车进入倒车状态。最终结果是我们有一个配置文件,可以编码油门的参数和汽车的转向。

一旦完成,我就准备开车绕过测试跑道了。令我妻子懊恼的是,我把地下室的家具搬到了房间的一侧,在地下室的地板上放了一些白色的电工胶带。我们在地板上放了一层很酷的环氧树脂涂层,但白色胶带的对比度很好。

我的驴车示例训练轨道

你还可以看到地板上灯光的很多反射。我们的训练过程必须学会忽略光反射,只能对地板上的白色胶带“注意”。注意力是深度学习的一个重要概念。

然后,我从墙上插头上取下了Pi,并使用我在亚马逊上购买的新型6800 mAH电源组为其供电。我用了一些磁带来固定平台下的电源组。我应该注意,来自ESC的GND和VCC导线确实为RC汽车中使用的2.4GHz接收器中的数字电路供电。然而,这个电流不足以为Pi供电。作为测试,我在Pi运行时将USP电流表连接到汽车上。结果如下图所示:

当前拍摄照片时,USB电流表显示Pi绘图约300mA的图像。在实践中,它的电流范围为300至500mA – 比ESP设计提供的电流大得多。

生成培训数据

一旦我们将所有汽车组装好,我们就可以生成训练数据集了。然后我做了一个SSH进入Pi并启动了驱动程序:

$ python manage.py drive

这是一个python程序,它启动一个Web服务器,显示摄像头上的内容,它还为您提供了一些捕获训练集的控件。一旦驱动程序开始,您可以转到任何Web浏览器并使用端口8887键入您的汽车的IP地址。现在是困难的部分。我不得不在赛道上开车10次以建立一个训练集!

问题是虽然我可以用键盘键控制汽车,但很难驾驶。我也试过网络界面“指针”,但这也很难引导。最后,我拿出手机,在手机浏览器中拉出了Donkey Car的网页。网络浏览器足够智能,可以检测到手机的前倾和侧向倾斜,并将其转换为速度和转弯。非常聪明!通过大约一个小时的练习,我可以绕过课程。然后我按下“开始录音”,大约10圈后我按下“停止录音”。完成此操作后,我可以通过SSH进入Donkey Car并将目录更改为“tub”文件夹。在该文件夹中有大约30K .jpg和.json文件。每个JSON文件都具有对图像的引用以及时间戳,加速和转向作为浮点数。这是我们的培训数据。

以下是JSON文件的示例:

{
“user / angle”:0.18989955357142868,
“user / throttle”:0.7175781250000001,
“user / mode”:“user”,
“cam / image_array”:“1000_cam-image_array_.jpg”,
“timestamp”:“2019-01- 05 17:09:35.184483“
}

这是与该JSON文件对应的图像:

样品160X120像素图像用于训练驴车

然后我将Donkey Car中的图像复制到我的笔记本电脑进行培训。我将在第3部分介绍

Donkey Car1 -用DIY机器人构建AI社区

用DIY机器人构建AI社区:第1部分 – 驴车

使用DIY机器人构建AI社区

这是关于Donkey Car的3部分系列中的第一部。以下是第2 部分第3 部分的链接。

我已经通过CoderDojo计划建立了用于教孩子计算机科学近四年的机器人。这是一次有益的经历,我学到了很多关于构建Arduino套件和简单机器人的知识。我一直在为8-18岁的孩子创造“学习阶梯”,而我的机器人则被5岁以下的儿童在The Works Museum使用。围绕DIY项目构建STEM课程很有趣,也是寻找社区的好方法。你可以在Moving RainbowCoderDojo Robots网站上看到我的一些工作。

随着新的一年,我决定扩展我的舒适区,包括基于Raspberry Pi,Python和机器学习的更复杂的机器人。我的朋友Arun Batchu也通过购买非常酷的NVIDIA Jetson Xavier开发套件来鼓励这一点。不幸的是,我的小机器人不足以运行这个价值90亿的晶体管系统。我认为这对我来说是一个很好的方式来了解最新的图像识别和边缘计算的热门话题。建立一个本地DIY机器人小组也是在明尼阿波利斯地区建立一个更强大的AI社区的一种方式。

对于那些不熟悉Donkey Car项目的人来说,它是一个开源DIY项目,让人们学习实时图像识别和一些AI的基础知识。这辆车的零件大约250美元。这比我的Arduino机器人贵10倍,但它也更强大。在湾区,有超过2,500人参加了DIY Robocars聚会,Donkey Car Slack工作区几乎有多少人在汽车,赛道,算法,机器学习模型和相关主题上有数千个帖子。我们在明尼苏达州还没有像这样的社区,但我希望改变这个!

以下是我开始制作驴车的工作日记。所以他们说…我们参加了比赛!

我在Swarm64的伟大人物的最后一次MinneAnalytics会议上“天赋”了一个Raspberry Pi 3 B + Kit,其中包括Paul McCullugh和Thomas Richter。Swarm64使用FPGA为RDBMS系统提供了出色的加速器。如果你需要一个更快的关系数据库给他们一个电话!

Raspberry Pi套件包括带有PI OS的32GB micro SD卡,电源砖,GPIO分线器以及外壳以及其他一些部件。我添加了一个27美元的SainSmart广角鱼眼摄像头和一个PCA9685 16通道12位PWM伺服电机驱动器以及一辆新的90美元RC车(我还没有测试过)。我使用GPIO使用Thonny Python IDE对LED进行了闪烁测试,并找到了用于控制LED灯条的DMA库。我还在圣路易斯公园的Microcenter购买了两张额外的32GB SD卡,每张 4.99美元。这比我在亚马逊上找到的要少。微中心真的很摇滚!我建议你买几张微型SD卡,这样你就可以进行备份了。

在Arduino的“C / C ++”工作多年之后,我对Pi开始的难度感到有些惊讶。有许多库需要以正确的顺序安装,需要考虑许多版本的Python。Thonney Python IDE很不错,但它缺少我们需要用TensorFlow认真工作的大多数库。好消息是,一旦库设置编码变得非常快。如果您正在使用物理设备进行硬件编程,那么当您对代码进行更改并且必须将其上传到Arduino时,就没有“滞后”。程序立即运行!我认为这可以加快开发速度,特别是当你有大型程序时。

现在进入Donkey Car … Donkey Car网站做得非常好,但它假设UNIX和Pi的背景非常强大。当他们发出指示时,我不清楚我应该在我的新Pi或远程计算机上运行。我花了大约两天时间试图让各种Python和TensorFlow库在Pi上本地工作。虽然我在进步中学到了很多东西,但事实证明这是一个死路一条。只有2GB或RAM的Pi太小了,无法在没有英雄努力的情况下编译庞大的TensorFlow-Keras系统。即使在具有16GB内存的Mac上,我也遇到了基于Bazel的TensorFlow编译系统的bug。Bazel构建框架本身非常复杂,您需要Bazel来编译TensorFlow怪物。做只是没有削减它。我正要放弃。如果像我这样拥有25年UNIX经验的人无法安装这个东西,我怎么能希望培养我14岁的学生呢?

然后我开始意识到,在Donkey汽车上完成的所有事情都假设了一个无头Pi(没有监视器,只是一个SSH访问),并使用他们的磁盘映像,这些映像由Linux和Pi专家精心制作了三年。你需要启动他们的Pi图像,其他一切都有效!你不能将Pi用作开发系统。TensorFlow文档确实这样说,但我没有RTFM。

我努力了解如何基于Donkey图像(包含磁盘映像的zip文件)为Pi构建启动映像。在尝试了NOOBS系统后,我意识到balenaEtcher应用程序正是我所需要的。该应用程序在Windows或Mac上使用非常简单。您只需从Donkey Car网站下载图像zip文件,将新SD卡放入并运行belenaEtcher应用程序。它会提示您输入图像文件(无需解压缩zip文件),它会自动找到SD驱动器然后我点击“Flash”。噗!在短短几分钟内,我就有了经过验证的磁盘映像。

重新启动新SD到我的Pi后,我可以登录并更改wifi设置。再一次重启,我准备好进入我的新驴车。我还设置了静态IP地址,因此每次都会重新连接到同一个IP地址。“/ home / pi / env”目录下的文件计数显示了近13,000个文件。如果你想的复杂细节我把它们放在一个启用评论,谷歌文档文件在这里。随意为该文件添加注释。

我将在发布更新时发布更新,并在其他部分到达后发布。我需要它们来做校准步骤。