使用Keras训练自动驾驶模型

现在您已经可以可靠地驾驶汽车,可以使用Keras来训练一个神经网络以模仿您的驾驶行为。以下是步骤:

收集数据

确保您收集到良好、干净的数据。神经网络将学习所训练数据中的内容,因此不良数据会导致模型不佳。如果您的数据中包含驶离赛道的片段,那么训练模型的某个方面将反映这一点。理想情况下,您会驾驶得完美无误,不会记录任何错误的数据。然而,这并不现实,但有办法在错误发生时轻松删除错误数据。

一种有用的避免收集错误数据的技术是在出错时使用控制器上的擦除记录按钮。因此,如果发生碰撞,立即将记录切换为关闭,并选择擦除记录按钮以删除最后100条记录。如果在您的myconfig.py文件中设置AUTO_RECORD_ON_THROTTLE = True,那么情况会更加简单;在这种情况下,当您加速时,记录将自动启动,并在您停止加速时停止。因此,在使用擦除记录按钮的同时,您可以记录成千上万条记录,而无需返回并使用donkey tubclean命令清理数据。

除了实际的错误之外,您记录的数据的一致性也很重要。数据的变化越大,您就需要更多的数据来获得良好的模型。当您驾驶时越一致,数据就越一致,因此神经网络将能够更有效地将输入与输出相关联。对于油门,一致性特别难以实现;在赛道上的每个位置精确复制油门非常困难。一种策略(我使用的策略)是找到您可以在整个赛道上或至少大部分赛道上保持的最大油门,然后只使用该油门;在您的myconfig.py文件中设置JOYSTICK_MAX_THROTTLE为该油门值,然后在收集数据时可以在大部分赛道上全速行驶。

  1. 练习在赛道上驾驶几次。
  2. 当您确信可以连续驾驶10圈而几乎没有错误时,重新启动manage.py的Python进程以创建新的数据记录会话。如果使用Web控制器,请按下“开始记录”按钮;或者,如上所述,使用AUTO_RECORD_ON_THROTTLE = True,以便摇杆在有任何非零油门时自动记录。
  3. 如果发生碰撞或驶离赛道,请立即按下“停止车辆”按钮并停止记录。如果使用的是操纵杆,请点击擦除最后100条记录的按钮(20 Hz驱动循环中的5秒)。
  4. 在收集到10-20圈的良好数据(5-20k张图像)后,可以在SSH会话中使用Ctrl-c停止您的车辆。
  5. 您收集的数据位于mycar数据文件夹中。
  6. 如果记录了错误数据,可以使用donkey tubclean来编辑数据并删除错误。

将数据从您的汽车传输到计算机

由于树莓派的性能有限,我们需要将数据传输到PC计算机进行训练。Jetson Nano的性能更强大,但训练速度仍然相对较慢。如果需要,可以跳过此传输步骤,在Nano上进行训练。

使用图形用户界面(GUI)进行训练

在您的桌面上,使用Donkey UI应用程序是最简单的进行训练的方法。 Tub_manager UI

如果您想使用命令行进行训练,请继续阅读...

使用命令行进行训练

在主机PC上的新终端会话中,使用rsync命令从树莓派复制您汽车的文件夹。

rsync -rv --progress --partial pi@<your_pi_ip_address>:~/mycar/data/  ~/mycar/data/

训练模型

  • 在同一个终端中,现在可以通过将数据的路径作为参数传递来运行最新数据的训练脚本。您还可以选择传递路径掩码,例如./data/*以收集多个清单。例如,在主机PC上的mycar文件夹中:
~\mycar$ donkey train --tub ./data --model ./models/mypilot.h5

您可以使用逗号分隔的列表--tub=foo/data,bar/data指定多个tub,或者只使用空格,例如--tub foo/data bar/data。有关训练模型的更多信息,请参阅训练模型

  • 您可以使用--type参数在训练过程中创建不同类型的模型。您还可以选择在myconfig.py中更改默认模型类型DEFAULT_MODEL_TYPE。在指定新的模型类型时,请确保在运行模型或在其他工具(如绘图或性能分析)中使用模型时提供该类型。有关不同模型类型的更多信息,请查看Keras Parts。模型将被放置在models/文件夹中。您也可以省略--model标志,模型名称将自动使用模式pilot_YY-MM-DD_N.h5创建。

  • 如果您使用的版本大于等于4.3.0,则模型将自动以tflite格式创建,以进行快速推断,生成一个./models/mypilot.tflite文件。可以通过在myconfig.py文件中设置CREATE_TF_LITE = False来禁止创建tflite。此外,如果设置了CREATE_TENSOR_RT = True(默认为False),还会生成一个tensorrt模型,该模型应该适用于所有平台。在树莓派上,tflite模型将是最快的。

注意: 在版本4.2中存在一个回归问题,您只需在模型参数中提供模型名称,例如--model mypilot.h5。这个问题在版本4.2.1中得到解决,请更新到该版本。

  • 图像增强 在版本大于等于4.3.0中,您还可以使用图像增强来进行训练。图像增强是一种技术,通过改变(增强)数据(在本例中为图像),来创建数据的变化。其目的有两个:一是在数据不充足时扩展数据;二是创建一个在推断时对数据变化更具鲁棒性的模型。在我们的情况下,我们希望处理各种光照条件。目前支持的增强方式是AUGMENTATIONS = ['MULTIPLY', 'BLUR'],它们生成亮度修改并应用高斯模糊。这些增强方式可以单独或同时使用。增强方式仅在训练时应用,驾驶自动驾驶时不应用。

  • 图像转换 在版本大于等于4.3.0中,您还可以使用图像转换,如裁剪或梯形遮罩。裁剪和遮罩 类似,都会“擦除”图像上的像素。这样做是为了去除不重要的像素,并且可能会添加不需要的细节,使模型在不同的不需要的细节下表现不佳。裁剪可以擦除图像的顶部、底部、左侧和/或右侧的像素。梯形遮罩更加灵活,可以使用梯形遮罩来屏蔽像素,以考虑图像中的透视。要裁剪图像或应用梯形遮罩,您可以提供TRANSFORMATIONS = ['CROP']TRANSFORMATIONS = ['TRAPEZE']。通常情况下,您将只使用裁剪或梯形遮罩中的一种,而不是同时使用两种。在训练和驾驶自动驾驶时,转换必须以相同的方式应用;确保在训练机器和Donkey Car上的转换配置相同。

将模型复制回汽车

  • 在上一步中,我们成功训练了一个模型。现在是时候将模型移回到树莓派上,以便我们可以测试它是否能够自动驾驶。

  • 再次使用rsync将训练好的模型复制回汽车。

rsync -rv --progress --partial ~/mycar/models/ pi@<your_ip_address>:~/mycar/models/
  • 确保将汽车放置在赛道上,以便它准备好行驶。

  • 现在,您可以重新启动汽车,并将训练好的模型传递给它以进行自动驾驶。

python manage.py drive --model ~/mycar/models/mypilot.h5
  • 但是,如果您从tflite模式开始,您将看到更好的性能。
python manage.py drive --model ~/mycar/models/mypilot.tflite --type tflite_linear
  • 汽车应该开始自动驾驶了,恭喜!

在Jetson Nano上使用TensorRT

详细信息请阅读此文档

以下是一些训练提示:

  1. 模式与驾驶员:恭喜您取得的进展。在运行上述命令后,首先要注意的是查看模式与驾驶员菜单中的选项。这可能会很令人困惑。下面是不同选项的含义:

a. 用户模式:正如您猜测的那样,这是您控制方向盘和油门的模式。

b. 本地角度模式:这个选项可能不太明显,但是这是训练模型(上面的mypilot)控制方向盘的地方。"本地"指的是在树莓派上本地托管的训练模型。

c. 本地驾驶员模式:这是训练模型(mypilot)同时控制方向盘和油门的模式。目前,据说它的可靠性不太高。

还要注意检查最大油门油门模式选项,并尝试调整一些设置。这对于训练非常有帮助。

  1. 构建简单的赛道:这方面的文档不是很完善,但是理论上来说,汽车应该能够适应任何类型的赛道进行训练。刚开始,可能不需要构建一个带有条纹中心车道的双车道赛道。可以尝试使用没有中心线的单车道,或者只是一个环形的单条线!至少,您将能够进行端到端的测试,并验证软件流水线的正确功能。当然,作为下一步,您可能希望创建一个更标准的赛道,并参加离您最近的聚会

  2. 寻求帮助:尽量找一两个朋友帮忙。这对于建造赛道非常有帮助,因为独自建造双车道赛道比看起来要困难得多!此外,您可以使用彩带而不是胶带来节省资源(和胶带)。它们仍然需要一些胶带来固定,但是您可以重复使用它们,并且可以更轻松地铺设(尽管如果您在户外工作,风可能会使初始铺设变得困难)。

关于训练行为模型的行为:

  • 确保在训练和在机器人上运行时,myconfig.py中的TRAIN_BEHAVIORS = True

  • 在机器人上设置一个RGB LED来指示哪个状态处于活动状态。在config.py中启用。在运行机器人时验证L1 PS3按钮是否更改状态LED指示器(即左上肩按钮)。

  • 默认情况下有两个状态。如果需要,可以在config.py底部调整状态的数量。将BEHAVIOR_LIST重命名或更改为任意数量的标签。确保BEHAVIOR_LED_COLORS中有相同数量的RGB颜色。确保在PC和机器人上都反映任何更改。

  • 现在开始训练:使用L1肩按钮激活任何状态。然后按照您希望汽车在该状态下行驶的方式驾驶。切换状态,然后过渡到新的稳定状态行为。

  • 对于双车道的情况,分别在两条车道中驾驶33%,并在两条车道之间的过渡中驾驶33%。在更改车道之前触发状态转换非常重要。

  • 检查数据文件中的记录。打开一个.json文件。除了方向盘和油门之外,您还应该有关于行为向量的一些附加状态信息以及在该帧上激活的状态。这对于正确训练非常重要。

  • 将数据移动到PC并按照正常方式进行训练,在PC上确保myconfig.py中的TRAIN_BEHAVIORS = True,否则额外的状态信息将被忽略。

  • 将训练好的模型移回机器人。现在将机器人放置在初始状态的位置。使用给定的模型启动机器人:

python manage.py drive --model=models/my_beh.h5 --type=behavior
  • 现在按选择键切换到所需的AI模式。除了训练后的油门之外,还可以使用恒定油门。

在驾驶过程中,您现在可以使用L1切换状态,并观察它能否以及在多大程度上复制您的稳定状态行为和过渡。

确保包含相当多的从一个状态到另一个状态的过渡示例。至少50个,但最好是100个。