发布在即!企业 AIGC 应用程度测评,3 步定制专属评估报告。抢首批测评权益>>> 了解详情
写点什么

通过 Apache MXNet,为您的自动驾驶车辆应用行为克隆技术

  • 2019-11-05
  • 本文字数:3561 字

    阅读完需:约 12 分钟

通过 Apache MXNet,为您的自动驾驶车辆应用行为克隆技术

在我们无人驾驶车辆系列的第一篇博客文章中,您制作了一辆 Donkey 车并将导航服务器部署到了 Amazon EC2 实例上。在第二篇博客文章中,您学习了如何驾驶 Donkey 车辆,Donkey 车辆也学习了如何自行驾驶。在第三篇博客文章中,您学习了如何通过 AWS IoT 将 Donkey 车辆的遥测数据流式传输到 AWS 的过程。


在这篇博文中,我们将深入探讨实现车辆自行驾驶的深度学习框架,并介绍采用卷积神经网络 (CNN) 的行为克隆概念。CNN 是一项面向计算机视觉任务的先进建模技术,可帮助解答车辆可能会遇到的问题,例如,“我前面是轨道还是圆锥形路标?”




  1. 在 AWS 上制造一辆无人驾驶车辆,并参加 re:Invent 机器人车拉力赛

  2. 《制作无人驾驶车辆》第 2 部分:驾驶您的车辆

  3. 《制作无人驾驶车辆》第 3 部分:连接您的无人驾驶车辆

  4. 《制作无人驾驶车辆》第 4 部分:通过 Apache MXNet,为您的自动驾驶车辆应用行为克隆技术



P2 上的 Donkey 训练数据设置

我们已在博客文章 2 中详细演练了如何运行训练。但是,让我们在这里回顾一下关键步骤和命令:


  1. 将数据从 Pi 复制到 Amazon EC2 实例:

  2. Bash


   $ rsync -rva --progress -e "ssh -i /path/to/key/DonkeyKP-us-east-1.pem" /home/pi/d2// ec2-user@ec2-your-ip.compute-1.amazonaws.com:~/d2/data/
复制代码


  1. 启动训练过程:

  2. Bash


   $ python ~/d2/manage.py train --model /path/to/myfirstpilot
复制代码


  1. 将训练过的模型复制回 Pi:

  2. Bash


   $: rsync -rva --progress -e "ssh -i /path/to/key/DonkeyKP-us-east-1.pem" ec2-user@ec2-your-ip.compute-1.amazonaws.com:~/d2/models/ /home/pi/d2/models/
复制代码

模型幕后

在本部分中,我将讨论模型学习的内容以及它如何能够自行驾驶。目前制作的 Donkey 车辆使用 Keras 作为其默认的深度学习框架。AWS 正在添加面向 Apache MXNet、Gluon 和 PyTorch 等其他框架的支持。在这篇博文中,我们将使用 Apache MXNet 来深入分析实现自动驾驶的模型的内部工作原理。如前所述,我们使用名为行为克隆的技术来实现车辆的自动驾驶。基本上,此模型基于训练数据学习驾驶,而训练数据则是通过环绕轨道行驶收集而来的。保证大部分数据都很“干净”非常重要,也就是说,假定我们的目标始终未偏离轨道,那么训练数据中车辆脱离轨道或转弯错误的图像就不会太多。就像驾驶员控制方向盘,保证车辆在车道上行驶一样,我们将制作一个会根据当前场景确定转向角的模型,引导我们将问题模型化为“根据输入图像,我们需要采用哪种转向角?”。实际驾驶情况更复杂,因为涉及到了加速和变速齿轮等更多组件。为了简单起见,我们在开始的时候先把油门固定到某个百分比,然后再让车辆行驶。在实践中我们发现,对于备用训练数据,25-30% 的油门已被证明是 Donkey 车辆的最佳行驶速度。


为实现这一目标,我们将使用名为卷积神经网络 (CNN) 的深度学习技术。CNN 已成为面向计算机视觉问题的实际网络。CNN 由多个卷积层组成,其中每个节点都与一个名为感受野的小窗口关联。这可以让我们提取图像中的局部特征。像“图像中是否有轨道或人?”这样的问题就可以通过使用先前计算出来的这些局部特征进行计算。您可以在此处找到有关 CNN 工作原理的详细说明。

数据集

在这篇博文中我将使用一个数据集,这个数据集是车辆环绕轨道行驶大约 15 分钟收集来的。如前所述,我们会先过滤一下,将车辆明显不在轨道上的图像丢弃。Donkey 软件已经提供了一个基于浏览器的 UI,用来删除“坏”的图像 (命令:


donkey tubclean <包含 Tub 的文件夹>)。与此类似的、车辆在轨道上行驶的图像数据集可在此处获取


制作 CNN 模型

通过 im2rec.py 工具,我们将图像数据集转换为二进制文件,以便提高处理速度。要了解有关 Apache MXNet 内部工作原理的更多信息,请参阅教程页面。


Bash


import mxnet as mximport numpy as np
data = mx.symbol.Variable(name="data")
body = mx.sym.Convolution(data=data, num_filter=24, kernel=(5, 5), stride=(2,2)) body = mx.sym.Activation(data=body, act_type='relu', name='relu1')body = mx.symbol.Pooling(data=body, kernel=(2, 2), stride=(2,2), pool_type='max')
body = mx.sym.Convolution(data=body, num_filter=32, kernel=(5, 5), stride=(2,2))body = mx.sym.Activation(data=body, act_type='relu')body = mx.symbol.Pooling(data=body, kernel=(2, 2), stride=(2,2), pool_type='max')
flatten = mx.symbol.Flatten(data=body)
body = mx.symbol.FullyConnected(data=flatten, name='fc0', num_hidden=32)body = mx.sym.Activation(data=body, act_type='relu', name='relu6')body = mx.sym.Dropout(data=body, p=0.1)
body = mx.symbol.FullyConnected(data=body, name='fc1', num_hidden=16)body = mx.sym.Activation(data=body, act_type='relu', name='relu7')
out = mx.symbol.FullyConnected(data=body, name='fc2', num_hidden=1)out = mx.symbol.LinearRegressionOutput(data=out, name="softmax")
复制代码


考虑到我们需要确定车辆的转向角,我们将使用单输出的线性回归输出层。为评估训练过程执行的进度如何,我们可以使用平均绝对误差 (MAE) 作为评估指标。由于不同角度之间的距离在 Euclidean 系统中是可以判断的,因而 MAE 对于优化损失来说是一个不错的指标。

训练模型

我们的 S3 存储桶中提供了可以在训练中使用的二进制文件。


Bash


# Get Iterators
def get_iterators(batch_size, data_shape=(3, 120, 160)): train = mx.io.ImageRecordIter( path_imgrec = 'train.rec', data_name = 'data', label_name = 'softmax_label', batch_size = batch_size, data_shape = data_shape, shuffle = True, rand_crop = True, rand_mirror = True) val = mx.io.ImageRecordIter( path_imgrec = 'valid.rec', data_name = 'data', label_name = 'softmax_label', batch_size = batch_size, data_shape = data_shape, rand_crop = False, rand_mirror = False) return (train, val)
batch_size = 16train_iter, val_iter = get_iterators(batch_size)
#Training
batch_size = 8num_gpus = 1num_epoch = 10mod = mx.mod.Module(out, context=[mx.gpu(i) for i in range(num_gpus)])mod.fit(train_data=train_iter, eval_data=val_iter, eval_metric='mae', optimizer='adam', optimizer_params={'learning_rate': 0.0001}, num_epoch=num_epoch, batch_end_callback = mx.callback.Speedometer(batch_size, 100), )
复制代码

评估和模拟器

现在,我们已经训练完模型,可以将它部署在车辆上进行试驾。我们的验证集中的 MAE 错误很少,说明我们对模型的训练和泛化效果不错。但是,如果我们能在部署之前就从视觉上了解车辆将会如何行驶,那就太棒了。为实现这一点,我将使用模拟器来查看车辆会如何在轨道上行驶。


Bash


import os  import time%matplotlib inlinefrom IPython import displayimport matplotlib.patches as patches
PATH = 'trainingdata/'all_files = sorted(os.listdir(PATH))sym, arg_params, aux_params = mx.model.load_checkpoint('my-car', num_epoch)mod = mx.mod.Module(symbol=sym) fig, ax = plt.subplots(1)for fname in all_files: org_img = Image.open(PATH + fname) img = np.array(org_img) img = np.swapaxes(img, 0, 2) img = np.swapaxes(img, 1, 2) img = img[np.newaxis, :] mod.forward(Batch(data=[mx.nd.array(img)])) exp = mod.get_outputs()[0].asnumpy()[0] angle = 180*exp left = 80 * exp + 80 rect = patches.Rectangle((left, 85),20,30, angle=angle, linewidth=2,edgecolor='r',facecolor='none') patch = ax.add_patch(rect) display.clear_output(wait=True) display.display(plt.gcf()) plt.imshow(org_img) time.sleep(0.1) patch.remove()
复制代码


结论

我们的无人驾驶车辆系列到此结束。我们期待在 re:Invent 2017 年机器人车拉力赛上与您相遇,这是一场有关深度学习、无人驾驶车辆以及 Amazon AI 和 IoT 服务方面亲身体验的、为期两天的黑客马拉松赛。我们鼓励您继续完成以下 Donkey 车辆并加入社区


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/building-an-autonomous-vehicle-part-4-using-behavioral-cloning-with-apache-mxnet-for-your-self-driving-car/


公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2019-11-05 08:00485

评论

发布
暂无评论
发现更多内容

实用机器学习笔记二十八:迁移学习

打工人!

学习笔记 迁移学习 机器学习算法 3月月更

确保数据中心物理安全的五种方法

Ethereal

聊聊 Pulsar:编译 Pulsar 源码并搭建源码环境

老周聊架构

云原生 Apache Pulsar 3月月更

Nacos源码分析(一)之线程池的巧妙设计,可以薅到自己的项目里

刘祥

SpringCloud Alibaba

Java基础重要面试题(二)

逆锋起笔

java面试 java基础 3月月更

手绘流程图,教你WSL2与Docker容器无缝互相迁移

华为云开发者联盟

Docker 容器 WSL2 迁移

终端常用快捷键

刁架构

终端 快捷键 iterm2

在线MySQL,SQL Server建表语句生成JSON测试数据工具

入门小站

工具

融云 IM +RTC 重磅优惠上线!15 天免费体验,1 年服务买一赠一

融云 RongCloud

ICT的圣杯(二):数字生活的另类想象

脑极体

一文详解Redis键过期策略

华为云开发者联盟

redis key 惰性删除 定期删除 键过期

欧拉的奇异之旅·共赴开源时代

白洞计划

如何设计良好的技术项目文档结构

老张

项目管理 交付质量

CVE-2022-22947 远程代码执行漏洞复现分析

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

千字带你了解什么是 RPC 协议

踏雪痕

RPC 3月程序媛福利 3月月更

持续集成容器篇:Docker与自动化打包

Docker 架构 持续集成 jenkins 持续交付

如何捕获和分析 JavaScript Error

喀拉峻

前端

创建 Node.js 视频流应用之后端

devpoint

node.js Video Express 3月月更

融云获 CSDN 技术影响力之星评选「年度技术品牌奖」

融云 RongCloud

写给后端开发工程师的H5前端开发知识

得物技术

前端 Web 可视化 后端开发 交互

无影云电脑支持企业快速实现居家办公

阿里云弹性计算

远程办公 数据安全 无影云电脑

兴业+民生上岸面试经验分享

暖蓝笔记

3月程序媛福利 3月月更

图解|从根儿上理解MySQL的索引

蝉沐风

MySQL 索引 B+树

iuap助力澳洋集团打造主数据管理平台

用友BIP

用友 用友iuap

WMS系统与ERP仓储管理的差异

源字节1号

开源 后端 前端开发 WMS系统 ERP系统

使用基于 WebRTC 的 JavaScript API 在浏览器环境里调用本机摄像头

Jerry Wang

JavaScript 前端 WebRTC 摄像头 3月月更

智能问答机器人

DS小龙哥

智能问答机器人 3月月更 智能对话机器人

如何在 Python 中反转字符串?

Ethereal

Python 递归函数返回值为 None 的解决办法

AlwaysBeta

Python 递归

对微博系统中“微博评论”的高性能高可用计算架构的一点思考

晨亮

「架构实战营」

网络协议之:socket协议详解之Unix domain Socket

程序那些事

socket Netty 程序那些事 3月月更

通过 Apache MXNet,为您的自动驾驶车辆应用行为克隆技术_其他_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章