在Unity环境中用强化学习训练Donkey Car

作者:Felix Yu

编译:Bing

Donkey Car是一种为模型车开源的DIY自动驾驶平台,它利用一个带有相机的树莓派单片机,让模型车可在赛道上自动驾驶,Donkey Car会学习你的驾驶方法,在训练后懂得自动驾驶。对于那些没有背景知识的人来说,该平台能提供你所需要的必要细节,它既包含硬件也带有软件。阅读完这一教程,你也可以无需硬件背景知识组装一辆自己的自动驾驶汽车。

现在,训练汽车进行自动驾驶最常见的方法就是行为克隆和路线跟随。在高级层面,行为克隆是利用卷积神经网络学习汽车前方摄像机所拍摄的图像之间的映射,并通过监督学习控制角度和throttle values。而路线跟随是利用计算机视觉技术跟踪路线,并且利用一个PID控制器让小车跟着该路线。我尝试了两种方法,它们都很有用!

用行为克隆训练Donkey Car避开障碍物

用强化学习训练Donkey Car

重要的一点是,Donkey Car的目标是搭建一辆在比赛中跑的最快的车(能以最快速度跑完一圈)。我认为强化学习是训练的好方法,只需设计一种奖励,让汽车的速度达到最快,并且让它能一直保持在轨道内即可。听上去很简单对吧?但事实上,很多研究表示在实体目标上训练强化学习是很困难的。强化学习主要通过试错法训练,放在汽车身上,我们只能保佑车子不会在一次次的实验中撞碎。另外,训练时长也是一个问题,通常,强化学习智能体都要训练个几百回合才能掌握些许规律。所以,强化学习很少用在现实物体中。

模拟现实

最近有一些科学家们研究对现实进行模拟,即先用强化学习在虚拟模拟器上训练小车,然后将其迁移到现实世界里。例如,最近OpenAI就训练了一个灵活的机械手臂,可以做出多种动作,整个过程就是在虚拟中训练的。除此之外,谷歌大脑也曾训练过一个四足机器人,可以用模拟现实的技术学习灵活的动作。在虚拟器中学习控制策略,然后再将其部署到真正的机器人上。这样看来,若想用强化学习训练Donkey Car,一个可行方案就是先用模拟器训练,再把学到的策略用在真的小车上。

OpenAI训练的机械手

Donkey Car模拟器

第一步是先为Donkey Car建造一个高保真度的模拟器。幸运的是,Donkey Car社区里一位爱好者在Unity中创建好了一个模拟器。但是它设计的目的主要针对行为学习(即将相机中的图片保存在对应的控制角度和throttle values文件中以进行监督学习),但是和强化学习无关。我希望的是有一个类似OpenAI Gym那样的交互界面,可以用reset( )重置环境、对其进行操作。所以,我决定在现有的Unity模拟器基础上对其进行修改,让它更适合强化学习。

4.1 创建一种能用Python和Unity沟通的方法

因为我们要用Python书写强化学习代码,所以我们首先要找到一种方法能让Python在Unity环境中使用。结果我发现这现有的模拟器也是用Python代码进行沟通的,但它是通过Websocket协议进行的,Weosocket和HTTP不同,它支持服务器和客户端之间进行双向通信。在我们的案例中,我们的Python“服务器”可以直接向Unity推送信息(方向和油门),而我们的Unity“客户端”也可以反向对服务器推送信息(状态和反馈)。

除了Websocket,我还考虑使用gRPC,这是一种高性能服务器-客户端通信框架,用谷歌在2016年八月开源。Unity将其用于机器学习智能体接口通信的协议。但是它的设置有点麻烦,并不高效,所以我还是选择Websocket。

4.2 为Donkey Car创建一个定制化的环境

下一步是创建一个类似于OpenAI gym的交互界面,用于训练强化学习算法。之前训练过强化学习算法的人可能对各种API的使用很熟悉。常见的就是reset( )、step( )、is_game_over( )等。我们可以将OpenAI gym的种类进行扩展,然后用上面的方法创建自己的gym环境。

最终成果能和OpenAI gym相媲美,我们科用类似的指令与Donkey环境交互:

env = gym.make("donkey-v0")
state = env.reset()
action = get_action()
state, action, rewards, next_state = env.step(action)

环境同样可以让我们设置frame_skipping,并且用headless模式训练智能体(也就是无需Unity GUI)。

同时,Tawn Kramer还有3中Unity场景可用:生成道路、仓库和Sparkfun AVC,都可以用于训练。在我们开始运行自己的强化学习算法之前,我们要么自己搭建Donkey Car的Unity环境,要么下载预先搭建好的环境可执行程序。具体的环境设置和训练指导可以在我的GitHub中找到:github.com/flyyufelix/donkey_rl

4.3 用DDQN训练Donkey Car

准备好了对强化学习友好的环境,我们现在就可以搭建自己的强化学习算法啦!我采取的是用Keras书写的Double Deep Q学习算法,这是DeepMind开发的经典强化学习算法,易于测试,编写简单。我已经在OpenAI gym中的cartpole和VizDoom中测试了,所以如果有什么问题,应该是Unity环境的问题,算法没有问题。关于DQN的文章,大家可以参考我之前的博文。flyyufelix.github.io/2017/10/12/dqn-vs-pg.html

4.3.1 状态空间

我们用Donkey Car前方安装的摄像机所拍摄的像素照片,执行以下转换:

  1. 将尺寸从(120, 160)改为(80, 80)
  2. 变为灰度图像
  3. 框架堆叠:去前面几个步骤中的4个框架堆在一起

最后的状态维度应该是(1, 80, 80, 4)。

4.3.2 动作空间

现实和虚拟世界中的Donkey Car都是将持续的方向控制和油门数值作为输入。为了简介,我们将油门数值设为常量(例如0.7),仅仅改变控制方向。控制方向的值从-1到1,但是,DQN只能处理分离的动作,所以我将方向的值分为15个种类。

4.3.3 Q网络框架

我们的Q网络是一个3层卷积神经网络,以堆叠的框架状态为输入,输出表示方向值分类的15个值。

4.3.4 奖励

奖励是有关汽车偏离中线程度的函数,它由Unity环境所提供。奖励函数用以下公式表达:

其中max_cte是一个归一化常数,所以奖励的范围在0到1之间。如果abs(cte)大于max_cte,循环即终止。

4.3.5 其他重要变量

Frame skipping设置为2以稳定训练。Memory replay buffer的值为10000.Target Q网络在最终训练时会更新。CNN训练时的Batch size为64。贪婪函数用于探索。Epsilon初始值为1,逐渐在10000次训练后会成为0.02。

4.3.6 结果

经过上面的设置,在单个CPU和一个GTX 1080 GPU上,我训练了DDQN差不多100次。整个训练用了2到3个小时。可以从上面的视频中看到,小车跑得很好!

去除背景噪声

我们想让我们的强化学习智能体只根据路线的位置和方向进行决策输出(即方向控制),不要受环境中的其他因素影响。但是,由于我们的输入是全像素的图像,它可能对背景模式过度拟合,而无法认出行进路线。这在现实中尤其重要,因为旁边的车道可能会有障碍物(例如桌子、椅子、行人等)。如果我们想从虚拟世界将学习策略进行迁移,我们应该让智能体顾略背景中的噪音,只关注于车道。

为了解决这个问题,我创建了一个预处理通道,可以将行车路线从原始像素图像中分离出去,再输入到CNN中。分割过程受@ldesegur/a-lane-detection-approach-for-self-driving-vehicles-c5ae1679f7ee” title=”这篇博文”>这篇博文的启发。这一过程概括如下:

  1. 用Canny Edge检测器检测并提取所有边框
  2. 用Hough直线转换确定所有直线
  3. 将直线分成positive sloped和negative sloped两类
  4. 删除所有不属于车道的直线

最终转换出的图片应该有最多2条直线,具体情况如下:

接着我把分割后的图像重新调整到(80, 80)的,将4个连续的框架堆叠在一起,用它们作为新的输入状态。我使用新状态再次训练了DDQN,生成的强化学习智能体可以学习良好策略进行驾驶!

然而,我注意到不仅仅训练时间会变长,学习策略也会变得不稳定,车子会经常在转弯的时候摇晃。我想可能是因为在训练的时候丢掉了有用的背景信息。不然的话,智能体应该不会过度拟合。

下一步

在这篇文章中,我们介绍了一种能和OpenAI gym相比的环境,用来训练Unity模拟器中的Donkey Car。还用DDQN训练它自动成功地自动驾驶。接下来,我计划让小车通过训练加速到最大值,并且将这一策略迁移到现实中。

新手学堂之电池选购常识

任何模型车,都不可避免的需要使用电池,本文介绍一些常见模型车用的主流电池知识。
FunRC Studio原创资料,只发RCFANS,如需转载务必注明出处。

本文旨在为新手解决电池的常识问题。

电池的选购不外乎几个方面:
电池类型 / 电压 / 容量 / 放电C数 / 外形尺寸 / 插头类型

电池类型常见的有: NiCd / NIMh / LiPo / LiFe

    NiCd,镍镉电池,老掉牙的类型,造价低廉,容量低,污染大,带记忆效应,现在只能在一些廉价的套装车上找到,强烈不推荐
    NiMh,镍氢电池,在AA和AAA电池中,nimh绝对是主流,但是在遥控模型的电池中,绝对有廉颇老矣的感觉
    LiPo,锂聚合物电池,是现在模型中的主流类型,使用广泛,各种型号琳琅满目,是本文需要介绍的重点
    LiFe,锂铁电池,不算太主流,一般用在遥控器,或者油车接受电,很少用做电车的动力电

NiCd由于太老了,已经没有介绍的必要。不建议玩家选购。
NiMh则还有用武之地,例如油车接受电,很多都还是6V的电压,单节电压1.2V的镍氢电用5节串联起来,就组成了6V电池组刚好。
    而电车上,NiMh则是6节串联,成为7.2V电池组。也有一些大脚车是使用7节串联组成8.4V的。
LiFe使用场合目前不多,单节电压3.3V,多数为圆柱形,2S封装成6.6V的情形多见,主要用于遥控发射电,或者油车接受电。

本文重点介绍模型车上用的最广泛的LiPo 锂聚合物电池。

LiPo,全称Lithium-Polymer Battery,锂聚合物电池外壳为软包,由Li-ion锂离子电池进化而来。
    锂离子单节电压3.6V,由于活性太高,爆炸几率较大,目前已几乎让LiPo取代,现在我们手机使用的几乎都是LiPo。

电压:LiPo单节电芯标称电压为3.7V,充满电时,目前主流电芯均为4.2V单节,目前模型上高压电芯开始逐渐显现,高压电芯充满为4.35V单节。
    每节电芯的电压3.7V我们称之为1S,但是我们的车子往往3.7V是不够的,主流电池电压都是需要7.4V,于是把电芯串联起来,提高电压就行了。
    而多少S则是把多少个3.7V串联起来,电压就是3.7V乘以多少S,例如2S就是3.7*2=7.4V;3S就是3.7*3=11.1V,以此类推。

锂电池还涉及到封装的问题,买电池时会看到有些写着2S1P,有些写着2S2P,这又是什么意思呢?
    2S就是上面说过的了,2S=3.7*2=7.4V,那么2P又是什么呢?
    由于工艺/体积/成本等限制,每个电芯的容量有限,如何最简单地提升容量呢?就是把2个同型号的电芯并联起来,就是多少P的概念。
    例如2个电芯并联起来组成1个3.7V,就称之为2P;而假如用3个电芯并联起来组成一个3.7V,那么就是3P了。
    于是,2S2P,可以理解为有4个一样的电芯,先把其中2块并联起来,组成1S,然后把另外2块并联起来,组成另外1S,再把这2个1S串联起来,成为2S,这个电池就称为2S2P
    例如一个电芯只有3.7V,2000MAH,那么就可以通过2S2P的形式,组成7.4V 4000MAH的电池。
    至于购买时,我们是建议购买1P的产品,例如2S1P,3S1P之类的。这样的电池出现问题的几率相对低一些。但是对于一些极限顶级电池来说,可能没有1P的选择,因为1P受限于技术/工艺限制,未必做得出来。于是2P之类的就成为了不得已的选择。

容量:每个电池都有自己的额定容量,电池的容量就像汽车的油箱大小,容量越高,能使用的时间就越长,条件允许的情况下,当然是买容量大的。
    但是也不是必须都选择容量大的,因为有些时候我们会特意选择容量小的以对车架进行减重,提升车架性能。因为容量小意味着重量一般都会轻一些。

容量的鉴定:电池的容量,往往只是产品外壳的一个标签。实际里面有多少我们如何得知?
    有些玩家在使用电池后,拿电池进行充电,例如一个5000MAH的电池,玩完之后,一充,怎么只有3000MAH?
    这个未必是电池容量不足,这可能只是因为你只用掉了3000MAH而已。

    电池的容量,如上面所写,就像汽车的油缸,如果一个5000MAH的电池,你只用掉了3000MAH就拿去充电,那么你肯定只能充进去3000MAH。极端的例子就是假设你刚充满,用都没用,你又拿去充电,那么你可能只能充0MAH。

    容量的鉴定方法:需要一台带放电功能的充电器。先将电池充满电,然后使用充电器的放电功能,将放电截止电压设置为3.0V/cell(每节3.0V),然后开始放电。
        到放电完成,看充电器上显示放出了多少容量,基本就是电池容量的90~95%左右。很少可以达到100%,因为按照电池厂的正常标法,大部分都是指充满到2.75V/cell(单节2.75V)下测出的容量,加上电池用过之后都会有损耗。所以如果要测量电池容量,最好在新买的时候就测量。
        (充电器显示放出多少容量,最终也只能大概参考,因为充电器本身也未必100%准确,但是误差一般不会太大。如果经过这个方法测量的数值与你电池的标签相差太远,那么这个标签就是很有水份的了,一些杂牌常见。而好的品牌很少会这样砸自己招牌,所以好的品牌往往都会贵一些,因为不会怎么虚标)

放电C数:也就是放电能力。C数越大,表示电池能在越短的时间内放完自身的容量。
    1C,就是在1个小时内放完自身容量。多少C,就是在多少份之一的小时内放完自身容量。例如60C就是1/60小时,也就是1分钟内,放完自身容量。
    C数越大的电池,其性能越高,价格越贵。
    对于同一台车来说,C数大的电池,与C数小的电池使用上的区别是:C数越大,其起步越暴力,尾速高一些,电池玩完之后发热越小。

    如何鉴定电池C数:一般玩家没有办法鉴定,因此网上很多虚标的电池,就是冲着新手去的。那些便宜,容量大,C数高,却很便宜的电池,往往就是为新手准备。很简单:新手没用过好的电池,他们不知道有什么区别。
        以下是比较简单的(对比法)鉴定方法:使用大品牌的电池进行对比。同C数接近容量,操作的手法与动力相同的情况下,发热大的电池,C数低,发热小的电池C数高。如果某杂牌40C玩起来发热比一些大品牌的30C还要热,那么并不是这个大品牌故意标低C数,而是杂牌恶意标高C数而已。

    放电C数的小猫腻:正常品牌标C数,都是标电池能长期持续工作的C数。但是一些小品牌,可能会标瞬间电流(常见是持续3~5秒),瞬间电流往往能达到持续电流的1.5~2倍。玩家在选购时应该注意。

说完C数,说一下放电电流:C数可以理解为一个单位,并不是电流。电流还要跟容量搭配。C数乘以容量才是放电电流。
    例如5000MAH 30C的电池,其放电电流为5000*30=150000MA,也就是150A,同理,一个3000MAH 50C的电池,放电电流也是一样的,150A。区别是:3000MAH能用的时间会更短。

    有些玩家可能会问:我的电调只有120A,或者60A,我买个有150A电流的电池,我的电调会烧掉吗?答案当然不会了。你家外面的供电线动辄有几千千瓦,你的电脑可能只有300瓦,你把300瓦的电脑接到几千千瓦的线上,电脑有烧掉了吗?

    因此,电池的放电电流只是电池具备的能力,但是实际使用时,消耗的电流大小则是由电调和马达决定的。只要买比你电调和马达消耗的电流大的电池就可以了,大多少都可以,只要你资金足。

外形与尺寸:玩家只要按照自己的要求去购买对应尺寸和形状的就可以了。LiPo大部分都是长条形,但是有一些旧车型则是圆柱形的,那么只能选择镍氢电或者圆柱形容量较低的锂电型号。

插头类型:主流是T插头,田宫插,JST插头,XT60插头,JST插头,香蕉插头(99%的4MM香蕉插加1%的5MM香蕉插),其他如小田宫,XT90之类的也有,但相对很少
    插头的选择,就根据自己动力设备的插头去选择对应的就可以了,记住目前主流是T插,如买错插头,则会造成用电设备与电池无法连接。

关于LIPO电池的保养:
    为什么一些比赛玩家或者老手的电池怎么玩都不涨,新手的很容易就发涨了呢?
        可能的原因有:新手可能被误导或者被无良商家瞒骗买了虚标的产品,或者不懂搭配的商家给搭配了不符合使用条件的电池,甚至是玩家自己根本不懂然后乱买这几种情况,都可能造成电池发涨之类的问题。

    最大的原因在于:保养。

        主要有充电,使用,以及存放三种情况

        充电:锂电池,除1S外,2S及以上的电池,都一定要使用锂电平衡充电器,插上锂电上的白色平衡小插头,使用平衡充电模式。多个S的电池,多少都会因为生产时,造成每片电芯的容量会有少许误差,这些误差就会造成电池在用过之后,电压出现不平衡,少则0.01V,多则可能有1V之大,越好的电池,差别越小,越差的电池,差别越大。而锂电平衡冲,则是在充电时平衡电压,让电压高的不要超电压,让电压低的迅速补充电压。

            充电涉及到充电电流的问题,建议电流是电池容量的一半至2倍的电流为妥,也就是0.5C~2C之间,例如5000MAH的电池,0.5C就是5000*0.5=2500MA=2.5A,2C就是5000*2=10000MAH=10A,那么这个电池最好使用2.5A~10A之间的电流。完全不用担心电流大了对电池有什么负面影响,现在的大品牌电池随便都能支持5C~6C的电流,区区10A 8A对于好的电池来说根本微不足道。

        使用:使用时,无论何时,都一定要记得设置好锂电保护电压,不要让单节电芯的电压低于2.75V这个极限电压。低于这个电压,会对电池容量和放电能力产生负面影响。一般建议将锂电保护电压设置到3.0V~3.2V之间就可以了。多数电调的保护电压都是指电池在短时间内达到保护值,就会切断输出。因此电调保护之后,电压是会有回升的。假设设置了3.0V,保护之后我们测量电压可能有3.4V也不奇怪。
            网上一些玩家说电池电压不要低于3.7V,这个是毫无必要的。对于模型电池来说,因为C数大,容量大,其极限也更高,玩到3.0V每节对电池来说毫不足道。重点是后面说的存放。

        存放:存放状态对于一个电池来说至关重要。锂电不使用,或者不充电,都是处于存放状态,占一个电池寿命的最多时间。只要做到存放时,电池的单节电压处于3.85V左右,那么对电池来说就是最佳的。也就是说,如果你的电池不是在车上使用,也不是在充电器上充放电的时候,都要尽快让电池的电压变成3.85V每节,这样的电池寿命最长。
            尽快要多快?用完之后,等电池凉快了就充电到3.85V就可以了。然后到你下次要使用之前,再把电池充满。3.85V的电池要充满也很快的,不要贪方便提前一晚就充好电。可能你今晚充满的电池,到明天中午想用的时候,发现电池已经微涨了,也毫不奇怪的。
            但是如果我刚充满了,今天又不用了,怎么办?这还要问吗?马上放电啊,放到3.85V每节,然后等下次要使用的时候再充满吧。如果这点保养都做不好,那电池提前说88就不是电池的错了。

            友情提示:如果电池用完了,一定要记得从电调上拔掉插头哦,不然电调会偷偷的把电池的电压榨干的。

                如果不小心过放(电压低于2.75V)了咋办?如果充电器还能正常识别,那没问题,赶紧充到保存电压。但是如果充电器不认这个电池了,说电压低,那就要人肉加电压让电池起死回生了。操作方法:把锂电池的平衡插头不接到充电器,只接电池的正负极那2根粗线,然后用镍氢或者镍镉电模式,小电流冲几分钟,仔细看电压变化,当电压高于3V每节的时候(假如2S就是总6V),就可以用回正常的锂电平衡冲啦!
                    如果是简易平衡充电器,没有镍氢电模式,但是又无法识别了怎么办?那就要暴力加电压了。假设2S 7.4V的无法识别了,要让电池电压回升到6V以上,不超过8.4V,那么就找个直流电压器,电压在6~8.4V之间的,如果没有,就用几个五号电池串起来变成这个电压值,然后直接正极对正极,负极对负极接到你的锂电池上等片刻就OK了。注意正负极对准啊,接反后果不堪设想。

论坛也有些帖子,教导大家说锂电池新买的时候还要激活。其实这是毫无必要的,现在的锂电池容量大,C数高,寿命有限,每一次循环,就是电池少一次寿命。新到手的电池完全不会比所谓激活过的电池性能差。激活既无必要,又浪费时间。

帮助我每周五天学习Machine Learning的技巧

我每天学习 Machine Learning 9个月,然后找到了工作。怎么样?像这样…

男子戴着耳机,坐在电脑桌前

我退出了Apple。开始网络创业,失败了。我的心不在其中。

我想学习机器学习。它让我很兴奋。我要学习这一切。我不需要编写所有规则,机器会为我学习它。但我没有工作。

兴奋不会为事情付出代价。

我在周末开始驾驶优步来支付学费。

我喜欢结识新朋友,但我讨厌一直开车。交通,停止,启动,加油,我认为我有足够的燃料,空气,空调,换档,你不应该这样,你应该这样,所有这一切。

我研究过机器学习。一整天,一周五天。这很难。它仍然很难。

优步周末。本周机器学习。那是我的惯例。我必须学习。我必须学习这个,我不能继续开车,我不知道我的目标是什么,但我知道这不是开车。一个星期六晚上,我赚了280美元,罚款290美元。 – 晚上10美元。

在我自己创建的AI硕士学位 9个月后,我找到了一份工作。这是我有过的最好的工作。

我每天如何学习?

像这样。

1.减少搜索空间

机器学习很广泛。有代码,有数学,有概率,有统计数据,有数据,有算法。

并且不乏学习资源。拥有太多选项与没有选项相同。

如果你认真学习,那么就要为自己设置课程。 不要花费数周时间询问是否应该学习Python或R,而是选择Coursera或edX课程,从数学或代码开始,花一周时间计划一个粗略的计划,然后再遵循它。

对我来说,这是创建我自己的AI硕士学位。我决定先学习代码,Python就是我的语言。我搜索了不同的课程和书籍,并把我最感兴趣的书放在一起。我为每个人做的最好的道路是什么?可能不是。但这是我的,这就是为什么它有效。

一旦我有了课程,我就有了一条可以追随的道路,没有更多的浪费时间来决定什么是最好的方法。我可以起床,坐下来学习我需要(想要)学习的东西。

它也不严格。如果出现了引起我兴趣的事情,我会跟着它,并在我去的时候学习我需要的东西。

如果您是在线学习而不是通过大学学习,那么您应该走自己的路。

2.修复你的环境

你祖父的第一个橙色农场失败了。

土壤很好。种子在那里。所有设备也是如此。

发生了什么?

太冷了。橘子需要温暖的温度才能生长。你的祖父有种植橙子的技能,但他们没有机会在寒冷的气候中生长。

当他搬到一个温暖的城市时,他开始了另一个橙色农场。

12个月后,你的祖父正在镇上供应最好的橙汁。

学习就像种植橘子一样。

你可以拥有一台笔记本电脑,一个互联网连接,最好的书籍,但仍然没有动力去学习。

为什么?

因为你的环境已经关闭。

你的房间充满了分心。

你试着和朋友一起学习,但他们并不像你那样专注。

Whatsapp每7分钟一次。

你能做什么?

我把房间变成了一个研究天堂。清理它。把我的手机放在另一个房间的抽屉里,关掉所有地方的通知。

我告诉了我的朋友。我的电话一直持续到下午4点,我会跟你说话。他说没关系。

在朋友时间,朋友很棒,但学习时间是学习时间。没有你的手机不能一整天?试试一个小时。任何你看不到的抽屉都会起作用。请勿打扰默认。

修复您的环境,让知识流动。

3.设置系统,以便您始终获胜

问题13让我难过。我被卡住了。

我想昨天完成,但不能。

现在是时候学习,但我知道你昨天有多努力,无处可去。

我把它推迟了。我知道我应该读书。但是我把它推迟了。

这是一个循环。

Aghhhhhhh。我以前见过这个循环。我知道。但它仍然存在。

那堆书盯着我看。问题13.我设置了一个计时器。25分钟。我知道我可能无法解决问题,但我可以坐下25分钟尝试。

4分钟,这是地狱。燃烧地狱。我继续往前走。24分钟,我不想停下来。

计时器熄灭,我又设置了另一个。然后另一个。经过3次会议,我解决了这个问题。我告诉自己,我是世界上最好的工程师。这是谎言,但无关紧要。即使是一个小里程碑也是一个里程碑。

你不能总是控制你是否在学习上取得进步。但是你可以控制你花在一些东西上的时间。

可以控制:每天四个25分钟的会话。

无法控制:完成每天开始的每项任务。

设置系统,以便您始终获胜。

4.有时什么都不做

我得出结论。学习是最终的技能。如果我能学会更好地学习,我可以做得更好。我可以学习机器学习,我可以成为一个更好的程序员,我可以学习写得更好。我想,我必须改进我的学习。我立刻开始了。

我做了Coursera学习如何学习课程。其中一个主题是专注于扩散思维。

当你完成一项任务时,会集中思考

当你没有考虑任何事情时,就会出现分散思维

最好的学习发生在这两者的交叉。这就是为什么你在淋浴时有一些最好的想法。因为没有别的事情发生。

当你让分散的思维接管时,它会让你的大脑空间将所有吸收的东西联系在一起。

问题是,为了使它正常工作,你需要时间。

如果您已经设置了系统,那么您可以进行四次25分钟的重点工作,然后再去散步。小睡一会儿。坐下来思考你学到了什么。

一旦你开始不经常做任何事情,你会发现很多东西都是有价值的,因为空的空间。一个房间是四个围绕空间的墙,一个轮胎除了空气之外什么都没有,一艘船因空的空间而漂浮。

你的学习程序可以做更多的事情。

5.接受失败

学习很失败。

你学到了一件事,第二天就忘记了。

然后另一个忘了它。

另一个。

忘记了。

你整个周末都在学习,周一去上班,没有人知道。

有人问我如何深刻地记得书中的东西?我说我没有。如果我很幸运,我会记得我读过一本书的1%。当1%与另外1%的其他东西交叉时,神奇就会发生。这让我觉得自己像专家点连接器。

经过一年的学习,你会发现还有更多东西需要学习。

什么时候结束?

它没有。它总是第一天。

拥抱失败。

6.这个有3年历史的原则

前几天我在公园。

有一个小男孩跑来跑去度过他的生命。向上滑动,滑下,在树上,从树上,在泥土中,从泥土中,上山,下山。

他笑着跳起来然后又笑了起来。

他的妈妈过来接他。

“来吧,查理,我们得走了。”

当她把他带走时,他一直笑着挥舞着他的蓝色塑料铲。

是什么让他着迷?

他在玩。他很开心。整个世界都是新的。我们的文化在工作和娱乐之间存在严格的分歧。研究被认为是有效的。

你应该学习以获得更多的工作。你应该努力赚钱。这笔钱给你带来休闲时间。一旦你买了休闲时间,那么只有这样你才能像查理一样笑着跑来跑去。

如果你的头脑研究是有效的,那将是地狱。因为总有更多要学习。你知道它是怎么回事,所有工作都没有。

但是假设,你有学习的想法是经历一个主题然后到下一个主题的过程。

连接游戏等不同的东西。

如果你是查理走下幻灯片,你会开始对它有同样的感觉。

你学到了一件事,你用它来学习别的东西,你被卡住,你克服它,你学到了另一件事。然后你就跳出舞来吧。

我了解到,如果你有像表格,列或数据框架这样的结构化数据,像CatBoost,XGBoost和LightGBM这样的集合算法效果最好。对于非结构化数据,如图像,视频,自然语言和音频,深度学习和/或转移学习应该是您的首选模型。

我连接了点。我告诉自己我是专家点连接器。从点到下一个跳舞。

这样做,你将完成一个比你开始时更有活力的学习课程。

这是一个有3年历史的原则。把一切视为游戏。

这就足够了。

这是我睡觉的时间。

这是一个奖励。

7.睡觉

睡眠不好意味着学习不好。

你可能还不够。

我不是。驾驶优步的最佳资金是周五和周六晚上。人们出去吃饭,聚会,去夜总会,我没有,我开车。我要去,直到凌晨2点,凌晨3点,回家睡觉,直到太阳以7-8把我叫醒。我有两天的火车残骸。星期一会来,我会在不同的时区。周二变得更好,到了周三我回到了我需要的地方。那个周期将在周五重复。

这种破碎的睡眠时间表是不可接受的。我的目标是更好地学习。睡眠可以清洁大脑并使大脑中的新连接发生。我在晚上10点,晚上11点开车离开,回到家,得到了7-9个小时。更少的钱,更多的学习。

不要交换睡眠更多的学习时间。反其道而行之。

机器学习很广泛。

要好好学习,要好好学习,你需要提醒自己。

  • 减少搜索空间
  • 修复您的环境
  • 拥抱失败
  • 有时什么也不做
  • 将学习视为游戏
  • 良好的睡眠以便更好的学习

晚安。


有疑问或建议吗?我的Twitter DM是开放的。你也可以在mrdbourke.com上找到这样的帖子,以及我在YouTube上做这些事情的视频

PS如果你从这篇文章中获得了价值,你可能会喜欢这个视频。

关于自学机器学习的思考?提醒自己这6件事

我是一名自学成才的机器学习工程师,如果我重新开始,这就是我告诉自己的

我大部分自学的地方都在那里。照片来自:Daniel Bourke在YouTube上

视觉上学得更好?YouTube上有这篇文章的视频版本

我们在澳大利亚举办了一次关于机器人技术的聚会,这是一个问题时间。

有人问了一个问题。

“我如何从不同的背景进入人工智能和机器学习?”

尼克转身叫了我的名字。

“丹·伯克在哪里?”

我在后台与Alex交谈。我走了过来。

“他在这里,”尼克继续道,“Dan来自健康科学背景,他研究营养,然后驾驶Uber,在线学习机器学习,现在已经和Max Kelsen一起成为一年的机器学习工程师。”

尼克是布里斯班科技公司Max Kelsen的首席执行官兼联合创始人。

我站着不停地听着。

“他记录了他的在线旅程,如果你有任何问题,我相信他会很乐意提供帮助。”

问题结束了,我回到了食物。

Ankit过来了。他告诉我他正在努力利用机器学习来更好地理解学生学习的项目。他将讲座出勤率,在线学习门户上花费的时间,测验结果以及其他一些内容结合起来。他甚至建立了一个前端Web门户来与结果进行交互。

Ankit的作品激发了我的灵感。这让我想做得更好。

然后又有几个人开始过来并询问有关如何进入机器学习的问题。全部来自不同领域。

这是困难的部分。我仍然认为自己是初学者。

但最好的导师是在你面前1 – 2年的人。刚刚经历过你将要经历的事情的人。任何更长的时间,建议变得模糊。当它新鲜时你想要它。

我的兄弟正在进入机器学习。这就是我一直对他说的话(如果我重新开始的话,还有我自己)。

A)获得一些Python基础(3-4个月)

这种语言并不重要。它可能是R,Java,Python等等。重要的是挑选一个并坚持下去。

如果你刚开始,你会发现Python很难出错。

如果你想进入应用机器学习,代码是强制性的。

从网上挑选一个基础课程,并坚持几个月。奖励积分如果它同时适用于教授数据科学。DataCamp非常适合这种情况。

有时会变得很难,但这就是重点。学习编程语言就像学习另一种语言和另一种思维方式一样。

但你以前做过。记得你3岁的时候?可能不是。但是你身边的人都在使用你以前从未听过的文字和声音。过了一会儿,你也开始使用它们了。

B)当你还没有准备好时开始制作东西

尽快应用你所学到的知识。

无论你完成了多少门课程,你都永远不会100%准备好。

不要被引诱完成更多课程作为能力的标志。

如果我回去重新开始,这是我改变的一件事。

找到自己的项目,通过错误来学习和学习。

回到你3岁的自我。你说的每个第三个字都错了。没有句子结构,也没有语法。一切都刚刚出来。

C)那里有很多,所以减少杂乱

那里有很多课程。他们都很棒。

很难找到一个坏的。

但这就是事情。由于有这么多,很难选择。另一个可以阻挡你的陷阱。

为了解决这个问题,我获得了自己的AI硕士学位。我自己的定制跟踪。

如果需要,您可以复制它。但我鼓励你花几天时间研究自己,看看什么对你最好。

作为一个提醒,我发现的三个资源与我日常工作最相符的是,动手机器学习书fastai机器学习课程Coursera上应用数据科学与Python课程

在您有几个月的Python经验之后,为这些书签添加书签。

D)研究是必要的,但如果你不能应用它是毫无意义的

你会看到每天都有关于新机器学习方法的文章和论文。

别理他们。

没有办法跟上他们所有这一切,它只能阻止你回到基础设置。

大多数最好的机器学习技术已经存在了几十年。改变的是计算能力和数据可用性的增加。

不要被新的分心。

如果你刚开始,坚持先找到你的基础。然后根据您的项目需求扩展您的知识。

E)每天一点点

3岁你是一个学习机(机器学习者?)。

几年之后,你几乎没有言语,几十年来一直在说话的人。

怎么样?

因为你每天练习一点。

然后复利就开始了。

每天增加1%=年底增加3700%。

如果你错过了一天,无论如何,生活就会发生。尽可能恢复。

很快你就会开始讲数据语言了。

F)不要因为不知道某事而殴打自己

“你有没有建立过推荐引擎?”

“没有。”

“我们有一个项目需要一个作为概念证明,你认为你可以搞清楚吗?”

“当然。”

大多数人认为高中或大学后学习停止。它没有。

上面的情景发生在另一周。我从来没有建立过推荐引擎。然后我做了。

如果你以前做过的事情失败了,那么失败也不错。你一直在走路,但是当你自己绊倒时,你并没有打败自己。它发生了。你继续走路。

但是,在新事物上失败是很困难的。你以前从未这样做过。

学习机器学习类似这样。

第一年:你太烂了。

第二年:你比前一年好,但是你觉得你更糟糕,因为你意识到你有多少不知道。

第3年:???? (我不在那里)

拥抱吮吸。

不知道有什么东西可以帮助你学习更多东西会让自己多少钱?

零。

学习新东西需要时间。每一天都是第一天。

学习不是线性的。

你3岁的孩子如何反应不懂一个字?

你笑了 把手放在空中,然后爬一会儿。

现在一样。除了你可以走路。

¹如果没有所有创造过课程并分享他们所学知识的优秀人才,我所做的所有工作和我所学到的东西都是不可能实现的。

有更多问题吗?在TwitterLinkedInYouTube上联系

这篇文章最初作为Quora的答案出现。

DeepPiCar2:Raspberry Pi设置和PiCar组装

组装PiCar硬件并安装所有软件驱动程序。让它在客厅里运行

执行摘要

欢迎回来!在本指南中,我们将首先介绍要购买的硬件以及我们需要它们的原因。接下来,我们将对它们进行设置,以便在本文末尾我们将在客厅中运行PiCar。

硬件供应清单

  • 1 x Raspberry Pi 3型号B +套件,带2.5A电源(50美元)这是DeepPiCar的大脑。这款最新型号的Raspberry Pi配备1.4Ghz 64位四核处理器,双频wifi,蓝牙,4个USB端口和一个HDMI端口。我推荐这个套件(仅在Raspberry Pi板上),因为它带有一个电源适配器,你需要在进行非驱动编码和测试时插入,以及两个芯片散热器,这将阻止你的Raspberry Pi CPU过热。
  • 1 x 64 GB micro SD卡(8美元)这是Raspberry Pi操作系统和我们所有软件的存储位置。任何品牌的micro SD卡都应该可以正常工作。你可能只有一个人躺在你的房子周围。32GB也应该没问题。我选择了64 GB,因为我计划在我的汽车行驶时记录大量视频,以便稍后分析其行为,并使用视频在以后的项目中进行深度学习培训。
  • 1 x SunFounder PiCar-V套件(115美元)这是DeepPiCar的主体。确保你得到如上所示的Model V(又名Version 2.0)。除了Raspberry Pi和电池外,它还配备了机器人汽车所需的一切。市场上有很多Raspberry Pi车载套件,我之所以选择这款车载套件是因为它配备了开源python API来控制汽车,而其他供应商则拥有其专有的API或基于C的API。众所周知,python现在是机器学习和深度学习的首选语言。此外,开源很重要,因为如果我们发现API中的错误而不必等待制造商提供软件更新,我们可能会自己修改汽车API的内部。
  • 4 x 18650电池和1 x电池充电器(20美元)您可以获得任何18650电池和兼容充电器。这些电池适用于高耗电应用,例如驱动Raspberry Pi板和PiCar。PiCar只需要两个电池,但你总是想要另外一对新电池,这样你就可以随时保持你的车在轨道上运行。我建议晚上给两套充电,这样你就不必担心测试过程中电池没电了。
  • 1个Google Edge TPU USB加速器(75美元)每个英雄都需要一个伙伴。谷歌的边缘TPU(Edge意味着它适用于移动和嵌入式设备,而TPU代表Tensor处理单元)是Raspberry Pi板的绝佳附件。虽然Pi CPU在很小的捆绑中包含了大量的计算能力,但它并不是为深度学习而设计的。另一方面,Google新发布的Edge TPU(2019年3月)专门用于运行用TensorFlow编写的深度学习模型。在本系列的第6部分中,我们将在TensorFlow中构建一个实时交通标志检测模型。这个模型深200多层!仅在Raspberry Pi的CPU上运行此模型只能处理每秒1帧(FPS),这几乎不是实时的。此外,它消耗100%的CPU并使所有其他程序无响应。但在Edge TPU的帮助下,我们现在可以处理12个FPS,这对于实时工作来说已经足够了。我们的CPU保持冷却,可用于执行其他处理任务,如控制汽车。
  • 套迷你交通标志(15美元)和一些乐高小雕像。如果您的年轻人在游戏室中有一些玩具标志和乐高小雕像,您可能不需要购买它们。你可以使用你发现的任何标志来训练模型,只要确保它们不是太大了
  • (可选)1 x 170度广角USB相机(40美元)。这是一个可选配件。我买了它来取代SunFounder PiCar附带的相机,这样汽车就可以拥有广阔的视野。相机很棒,但不像我喜欢的广角,它不能看到前轮前面3-4英寸的车道线。我最初使用相机拍摄了第4部分中的代码。在尝试了几个镜头后,我发现这款广角相机的精度和稳定性大大提高了。控制硬件和软件(与在汽车模拟器中运行汽车相比)是很好的,因为如果单独通过软件无法轻易解决问题,您可以采用硬件修复。
  • USB键盘/鼠标和带HDMI输入的显示器。在Pi的初始设置阶段,您只需要这些。之后,我们可以通过VNC或Putty远程控制Pi。
  • 运行Windows / Mac或Linux的台式机或笔记本电脑,我将在此处称之为“PC”。我们将使用此PC远程访问并将代码部署到Pi计算机。

有时候,我的惊喜是Raspberry Pi,我们汽车的大脑只有30美元左右,比我们的许多其他配件便宜。事实上,随着时间的推移,硬件变得越来越便宜,而且软件完全免费且丰富。难道我们不是生活在一个伟大的时代吗?!

这是组装完成后的最终产品。我在这里使用广角相机。

Raspberry Pi设置

Raspberry Pi操作系统设置(1小时)

  • 按照这个优秀的分步指南,将NOOBS Raspbian操作系统(各种Linux)安装到micro SD卡上。它需要大约20分钟和大约4GB的磁盘空间。安装并重新启动后,您应该看到如下所示的完整GUI桌面。这感觉就像你在Windows或Mac GUI环境中,不是吗?
  • 在安装过程中,Pi会要求您更改默认用户的密码pirasp例如,我们将密码设置为。
  • 初始安装后,Pi可能需要升级到最新的软件。这可能需要10-15分钟。

设置远程访问

设置远程访问允许Pi计算机无头运行(即没有显示器/键盘/鼠标),这使我们无需一直连接显示器和键盘/鼠标。该视频提供了有关如何设置SSH和VNC远程访问的非常好的教程。无论如何,这是步骤。

  • 打开终端应用程序,如下所示。终端应用程序是一个非常重要的程序,因为后面文章中的大多数命令都将从终端输入。
  • 通过运行找到Pi的IP地址ifconfig。在这种情况下,我的Pi的IP地址是192.168.1.120
pi @ raspberrypi:〜$ ifconfig | grep wlan0 -A1
wlan0:flags = 4163 <UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.120 netmask 255.255.255.0 broadcast 192.168.1.255
  • sudo raspi-config在终端中运行以启动“Raspberry Pi软件配置工具”。系统可能会提示您输入用户密码pi
  • 启用S​​SH服务器:选择5. Interface Options– > SSH– >Enable
  • 启用VNC服务器:选择5. Interface Options– > VNC– >Enable
  • 下载RealVNC Viewer并将其安装到您的PC上。
  • 使用Real VNC Viewer连接到Pi的IP地址。您将看到与Pi正在运行的桌面相同的桌面。
  • 此时,您可以安全地断开显示器/键盘/鼠标与Pi计算机的连接,只需插入电源适配器即可。

设置远程文件访问

由于我们的Pi将无头运行,我们希望能够从远程计算机访问Pi的文件系统,以便我们可以轻松地将文件传输到Pi计算机或从Pi计算机传输文件。我们将在Pi上安装Samba文件服务器。

pi @ raspberrypi:〜$ sudo apt-get update && sudo apt-get upgrade -y
获取:1 http://archive.raspberrypi.org/debian stretch InRelease [25.4 kB] 
软件包[45.0 kB] 
[省略...] 
解压缩lxplug-ptbatt(0.5)over(0.4)... 
设置lxplug-ptbatt(0.5)... 
pi @ 




raspberrypi :〜$ sudo apt-get install samba samba-common-bin -y读取包列表...完成构建依赖树        [省略...] 处理libc-bin的触发器(2.24-11 + deb9u4)... 处理触发器为systemd(232-25 + deb9u11)... pi @ raspberrypi :〜$ sudo rm / etc /samba/smb.conf pi @ raspberrypi:〜$ sudo nano /etc/samba/smb.conf

然后将以下行粘贴到nano编辑器中

[global] 
netbios name = Pi
服务器字符串= PiCar文件系统
工作组= WORKGROUP

[HOMEPI]
路径= / home / pi
comment =无评论
browsable = yes
writable =是
创建掩码= 0777
目录掩码= 0777
public = no

通过Ctrl-X保存并退出nano,单击是以保存更改。

然后设置Samba服务器密码。为简单起见,我们将使用与raspSamba服务器密码相同的内容。设置密码后,重新启动Samba服务器。

#create samba密码
pi @ raspberrypi:〜$ sudo smbpasswd -a pi
新的SMB密码:
重新输入新的SMB密码:
添加了用户pi。#re restart samba server
pi @ raspberrypi:〜$ sudo service smbd restart

此时,您应该能够通过Pi的IP地址(My Pi的IP为192.168.1.120)从PC连接到Pi计算机。转到您的PC(Windows),打开命令提示符(cmd.exe)并键入:

#将Pi主目录挂载到R:PC上的驱动器
C:> net use r:\ 192.168.1.120 homepi
命令成功完成。
C: Users dctia> r:C:> dir r:
驱动器R中的
卷是HOMEPI 卷序列号是61E3-70FF 目录R: 05/02/2019 03:57 PM <DIR>。
04/08/2019 04:48 AM <DIR> ..
04/08/2019 05:43 AM <DIR> Desktop
04/08/2019 05:43 AM <DIR> Documents
04/08/2019 05:43 AM < DIR>下载
04/08/2019 05:15 AM <DIR> MagPi
04/08/2019 05:43 AM <DIR> Music
05/02/2019 03:43 PM <DIR>图片
04/08/2019 05:43 AM <DIR> Public
04/08/2019 05:43 AM <DIR>模板
04/08/2019 05:43 AM <DIR>视频
0文件0字节
11 Dir(s )22,864,379,904字节免费

事实上,这是我们的Pi计算机文件系统,我们可以从它的文件管理器中看到。这将非常有用,因为我们可以直接从我们的PC编辑驻留在Pi上的文件。例如,我们可以使用PyCharm IDE首先在Pi上编辑Python程序,然后使用Pi的终端(通过VNC)来运行这些程序。

如果你有一台Mac,这里是如何连接到Pi的文件服务器。按Command-K打开“连接到服务器”窗口。输入网络驱动器路径(替换为Pi的IP地址),即smb://192.168.1.120/homepi,然后单击“连接”。输入登录名/密码,即pi / rasp,然后单击“确定”以安装网络驱动器。然后,驱动器现在将显示在桌面和Finder窗口侧栏中。有关Mac上更深入的网络连接说明,请查看此优秀文章

安装USB摄像头

USB摄像头的设备驱动程序应该已经配备了Raspian OS。我们将安装摄像机查看器,以便我们可以看到实时视频。

  • 将USB相机从PiCar套件中取出并插入Pi计算机的USB端口
  • sudo apt-get install cheese从终端运行安装“奶酪”,相机查看器。
pi @ raspberrypi:〜$ sudo apt-get install cheese -y
读取包列表...完成
构建依赖关系树
读取状态信息...完成
....
cheese是最新版本(3.22.1-1)。
  • 通过Raspberry Pi button(Top Left Corner)– > Sound & Video– > 启动奶酪应用程序Cheese您应该看到如上图所示的实时视频源。

SunFounder PiCar-V软件配置(偏离手册)

在组装PiCar之前,我们需要安装PiCar的python API。SunFounder发布了其Python API的服务器版本和客户端版本。客户端API代码用于远程控制PiCar,在您的PC上运行,它使用Python版本3.服务器API代码在PiCar上运行,遗憾的是,它使用的是Python版本2,这是一个过时的版本。由于我们编写的自驱动程序将专门在PiCar上运行,因此PiCar Server API也必须在Python 3中运行。幸运的是,SunFounder的所有API代码都是Github上的开源代码,我制作了一个分支并将整个仓库(服务器和客户端)更新为Python 3.(我将很快将我的更改提交给SunFounder,因此它可以合并回到主要回购,一经SunFounder批准。)

暂时,运行以下命令(粗体),而不是SunFounder手册中的软件命令。您不必在本手册的第20-26页上运行命令。

#将所有对python(版本2)的调用路由到python3,
#pip(版本2)到pip3,即使在sudo模式下
#note:`sudo abcd`在管理员模式下运行`abcd`命令
alias python = python3
alias pip = pip3
alias sudo ='sudo'
#下载修补的PiCar-V驱动程序API,并运行它的设置
pi @ raspberrypi :〜$ cd pi @ raspberrypi:〜$ git clone https://github.com/dctian/SunFounder_PiCar.git
克隆到' SunFounder_PiCar'...
remote:枚举对象:9,完成。
remote:计数对象:100%(9/9),完成。
remote:压缩对象:100%(9/9),完成。
remote:总计276(delta 0),重用2(delta 0),pack-reused 267
接收物体:100%(276/276),53.33 KiB | 0字节/秒,完成。
解决增量:100%(171/171),完成。
pi @ raspberrypi:〜$ cd~ / SunFounder_PiCar / picar /

pi @ raspberrypi:〜/ SunFounder_PiCar / picar $ git clone https://github.com/dctian/SunFounder_PCA9685.git
克隆到'SunFounder_PCA9685'...
remote:枚举对象:7,完成了。
remote:计数对象:100%(7/7),完成。
remote:压缩对象:100%(5/5),完成。
远程:总计87(delta 2),重用6(delta 2),pack-
reused 80 Unpacking对象:100%(87/87),完成。pi @ raspberrypi:〜/ SunFounder_PiCar / picar $ cd~ / SunFounder_PiCar /
pi @ raspberrypi:〜/ SunFounder_PiCar $ sudo python setup.py install
将SunFounder-PiCar 1.0.1添加到easy-install.pth文件
中将picar脚本安装到/ usr / local / bin
[省略....] #下载修补后的PiCar-V应用程序
#并安装相关软件
pi @ raspberrypi:〜/ SunFounder_PiCar / picar $ cd
pi @ raspberrypi :〜$ git clone https://github.com/dctian/SunFounder_PiCar-V.git
克隆到'SunFounder_PiCar-V'...
remote:枚举对象:969,完成。
remote:总计969(delta 0),重用0(delta 0),pack-
reused 969 接收对象:100%(969/969),9.46 MiB | 849.00 KiB / s,完成。
解决增量:100%(432/432),完成。pi @ raspberrypi:〜$ cd SunFounder_PiCar -V pi @ raspberrypi:〜/ SunFounder_PiCar-V $sudo ./install_dependencies
将sunFounder-PiCar 1.0.1添加到easy-install.pth文件
中将picar脚本安装到/ usr / local / bin 安装/usr/local/lib/python2.7/dist-packages/SunFounder_PiCar-1.0.1- py2.7.egg
处理SunFounder-PiCar的依赖关系== 1.0.1
完成SunFounder-PiCar的处理依赖关系== 1.0.1
完成
将MJPG-Streamer复制到备用位置。完成
Enalbe I2C。完成安装结果:
django成功
python-smbus成功
python-opencv成功
libjpeg8-dev成功
你需要更改的东西可能需要重启才能生效。
你想立即重启吗?(是/否)是的

回答是,提示重启时。重新启动后,应安装所有必需的硬件驱动程序。我们将在汽车装配后测试它们。

PiCar大会

装配过程密切重新组装构建复杂的乐高套装,整个过程大约需要2个小时,手眼协调很多,并且很有趣。(您甚至可能在施工阶段让您的年轻人参与其中。)PiCar Kit附带一份印刷的逐步说明手册。但我推荐这两个额外的资源。

  • 教学手册的PDF版本。打印手册很小,图表可能打印得不是很清楚,而PDF版本非常清晰,可以搜索和放大以获得更多细节。我发现在组装阶段我的笔记本电脑上的PDF非常有帮助。
  • 由SunFounder发布的YouTube 4部分教学视频。不幸的是,这些视频适用于较旧版本的PiCar,因此某些部件(如伺服电机组件)不同。但大多数零件和装配技术都是一样的。因此,如果您对装配手册中的特定图表感到头疼,您可能需要查看视频的相关部分。我希望SunFounder能够为新的PiCar-V套件发布一组新的视频。

旧版PiCar的装配视频(4个部分),一个有用的参考

当橡胶遇上这条路!

现在PiCar的所有基本硬件和软件都已到位,让我们尝试运行它!

  • 通过VNC从PC连接到PiCar
  • 确保有新电池,将开关拨到ON位置并拔下micro USB充电线。请注意,您的VNC远程会话应该仍然有效。
  • 在Pi终端中,运行以下命令(以粗体显示)。你应该:
  1. 看到汽车行驶得更快,然后发出时减速 picar.back_wheel.test()
  2. 当发出时,看到前轮转向左,中间和右侧picar.front_wheel.test()。要停止这些测试,请按Ctrl-C。要退出python程序,请按Ctrl-D。
pi @ raspberrypi:〜/ SunFounder_PiCar / picar $ python3 
Python 3.5.3(默认,2018年9月27日,17:25:39)
[GCC 6.3.0 20170516]关于linux输入
“help”,“copyright”,“credits”或“许可证”了解更多信息。>>> 导入picar
>>> picar.setup() >>> picar.front_wheels.test()
DEBUG“front_wheels.py”:设置调试关闭
DEBUG“front_wheels.py”:设置轮调试关闭
DEBUG“Servo.py” :设置调试关闭
turn_left
turn_straight
turn_right >>> picar.back_wheels.test()
DEBUG“back_wheels.py”:设置调试关闭
DEBUG“TB6612.py”:

DEBUG“PCA9685.py”:设置调试关闭
前进,速度= 0
前进,速度= 1
前进,速度= 2
前进,速度= 3
前进,速度= 4
前进,速度= 5
前进,速度= 6
前进,速度= 7
前进,速度= 8
前进,速度= 9
前进,速度= 10
前进,速度= 11
  • 如果您遇到错误或看不到车轮移动,那么您的硬件连接或软件设置有问题。对于前者,请仔细检查您的电线连接,确保电池充满电。对于后者,请在评论部分发布一条消息,其中包含您遵循的详细步骤和错误消息,我将尽力提供帮助。

下一步是什么

恭喜你,你现在应该有一个PiCar,可以看到(通过奶酪),并运行(通过python 3代码)!它还不是一款深度学习车,但我们正在努力实现这一目标。每当你准备好的时候,请继续前进到第3部分,在那里我们将为PiCar提供计算机视觉和深度学习的超级大国。

以下是整个指南的链接:

第1部分:概述

第2部分:Raspberry Pi设置和PiCar组装(本文)

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

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

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

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

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回购发布资源。拉请求正在被接受!您可以随意将项目添加到任务列表中,以查找您希望查看的任何新概念。