End-to-end Driving via Conditional Imitation Learning 论文笔记

论文翻译参考:https://blog.csdn.net/weixin_40523230/article/details/90300337

一、为什么提出条件模仿学习

模仿学习应用在自动驾驶的弊端:经典模仿学习的目标函数如下公式(1),是一个observation->action的映射,可以解决道路追踪的问题,但是在复杂环境中是很难的,因为同样的环境转向或者控制可能不同,比如同样在一个十字路口,右转和左转取决于目的地,没有加条件的经典模仿学习训练出来的agent可能会在十字路口做出武断的决定,乘客无法干涉。

 

为了解决上述问题,我们需要在经典模仿学习的基础上加上一些条件,如下图所示,向量h建模专家的内部状态,h会和ob共同决定动作at,向量h可以包含关于专家意图、目标和先验知识的信息。

我们通过这种方式把h传入控制器:c = c(h)。训练时,命令c由专家提供。c不需要代表“潜在状态h的所有内容”,而应该偏向于和“专家决策的有关的信息”。在测试时,可以使用指令来影响控制器的行为;这个指令可以来自人工或者规划模块。以命令为条件的模仿学习”的目标是

这种命令条件模仿学习结构如下图所示:

 

二、条件模仿学习结构

2.1 两个结构对比

如下图所示,作者提出了两种融合条件的结构,a是将条件直接作为输入,b是将条件作为选择branch的开关(每个分支是左转、右转或者直行,所有分支共享感知模块,实验表明b结构表现得更好)。

 

2.2 b分支网络结构细节

观测值o:当前观测到的图像,200x88像素

测量m:当前汽车的速度 (在物理系统中速度估计是非常嘈杂和我们避免使用它们)。

所有网络都由具有相同架构的模块组成(例如,ConvNe架构在所有条件下都是相同的),不同之处在于模块和分支的配置。

图像模块由8个卷积层和2个全连通层组成。

卷积核的大小在第一层为5,在下一层为3。第1、3、5层卷积的步长为2。通道的数量从第一个卷积层的32个增加到最后一个卷积层的256个。全连通层各包含512个单元。除图像模块外的所有模块都实现为标准的多层感知器。在所有隐层后使用ReLU,卷积层后进行批处理归一化,全连通隐层后使用50% dropout,卷积层后使用20% dropout。

动作:二维矢量,a =(转向角,加速度)

每个样本的损失函数定义为如下公式(6):

 

所有模型使用Adam solver进行训练

每批120个样本

初始学习率为0.0002。

对于命令条件模型。构建minibatch以包含与每个命令相同数量的样本。

三、数据收集和扩充(Augmentation

3.1 训练数据分布

三个摄像头(中,左、右)收集图像数据

从左右相机上录下的影像,以及中间合成的重新投影的影像,都被当做训练数据。

为了进一步扩充训练数据集,我们记录了一些数据,同时将模拟逐渐偏离期望轨迹的时间相关噪声注入到专家的控制信号中,让专家从这些干扰中恢复。在训练中,我们使用驾驶员对注入噪音的纠正反应(而不是噪音本身)。这为控制器提供了从漂移和意外干扰中恢复的演示,但不会以偏离期望行为的演示污染训练集。

3.2 数据扩充

在数据量较少时进行数据扩充对于良好的泛化是至关重要的。在网络训练中,我们进行在线增强。对于要呈现给网络的每个图像,我们应用具有随机采样大小的一组变换的随机子集。转换包括对比度、亮度和色调的变化,以及添加高斯模糊、高斯噪声、盐和胡椒噪声和区域删除(屏蔽图像中随机的一组矩形,每个矩形大约占图像面积的1%)。没有应用诸如平移或旋转之类的几何扩展,因为控制命令对这些转换不是不变的。

四、实验

分别进行了两组实验,一组在CARLA上进行了虚拟实验,一组使用1/5比例的小卡车进行现实世界的实验。

4.1基本说明

4.1.1 观测

在这两种情况下,观测(图像)都是由一个中央相机和两个侧向相机记录的,它们相对于中心旋转了30度。

 

4.1.2 行为

记录的控制信号为二维:转向角和加速度。

转向角在-1和1之间缩放,极值分别对应于完全左和完全右。

加速度也在-1和1之间缩放,其中1表示完全向前加速度,-1表示完全反向加速度。

 

4.1.3 命令

除了观察(图像)和操作(控制信号)之外,还记录驱动程序提供的命令。

一组四个命令:继续(沿着路走),左转(在下一个十字路口左转),直走(在下一个十字路口直走),右转(在下一个十字路口右转)。

 

在训练数据收集过程中,当接近十字路口时,驾驶员使用物理方向盘上的按钮(模拟驾驶时)或遥控器上的按钮(操作物理卡车时)来指示与预期行动方向相对应的命令。当预期的操

4.2carla虚拟实验

在town1训练,town2测试。

实验设置:使用CARLA模拟器可以在情景设置中运行评估。在每一个episode中,agent在一个新位置初始化,并必须开车到一个给定的目的地,这是拓扑规划器给出的高级转向命令。如果agent在固定的时间间隔内达到目标,则视为成功。除了成功率之外,我们还通过记录没有违规(碰撞或转向车道以外)行驶的平均距离来衡量驾驶质量。为了进行评估,我们在每个城镇使用了50对至少相隔1公里的起始点和目标点。

为了收集训练数据,人类驾驶员被呈现在800 x 600像素分辨率的第一人称环境视图(中央摄像头)中。司机将车速控制在每小时60公里以下,并努力避免与汽车和行人相撞,但却无视交通灯和停车标志。我们记录了来自三个模拟相机的图像,以及其他测量数据,如速度和汽车的位置,这些图像被裁剪以删除部分天空。CARLA还提供了额外的信息,如行驶的距离、碰撞和违规行为的发生,如漂移到对面车道或人行道上。此信息用于评估不同的控制器。训练数据集包括2小时的人类驾驶在城镇1,其中只有10%(大约12分钟)包含注入噪音的演示。

物理卡车部分有点复杂,我看不懂,感觉也没必要看懂我认为就略过了。

 

上图对比试验结果

Non-conditional是经典模仿学习,没有添加任何条件

Goal-conditional是将目的地作为条件

Ours branched是前文提到的分支条件模仿学习结构,即图三中的b,

Ours cmd. input 是图三中的a结构

Ours no noise 是指使用没有噪声的数据训练

Ours no aug是指没有进行数据扩充

Our shallow net是指使用更浅层的网络

从成功率来看,是b结构条件模仿学习表现最好。违规驾驶之间的平均距离来看在town1中b结构被经典模仿学习超越了,文中的解释是非条件模型的驱动更干净,因为它不受朝着目标行进的约束,因此通常在每个十字路口采用更简单的路线。表格底部的三个消融研究表明,无论是噪声还是数据扩充还是深层次的网络都是有必要的。

4.3物理世界小车实验

实验设置:训练数据集包括在居民区通过远程控制驾驶卡车2小时。

图中显示了一幅地图,其中显示了对车辆进行评估的路线。这条路线总共包括14个十字路口,左、直和右十字路口的数量大致相同。

我们根据错过的交叉点、干预措施和完成的时间来衡量小车的表现。如果机器人车辆第一次错过十字路口。它被改变路线以获得第二次转弯的机会。如果它第二次成功转弯,这不算错过的十字路口,而是增加了完成路线所需的时间。然而,如果车辆第二次错过十字路口,这将被视为错过,我们会进行干预,手动驾驶车辆通过路口。除了错过的交叉路口,如果车辆离开道路超过5秒或与障碍物相撞,我们也会进行干预。所有模型均在阴天条件下进行评估。大部分培训数据是在晴天收集的。

实验结果如上图所示,model的解释同虚拟世界实验。missed turn是错过转弯,指连续两次错过。intervention指干预,time是到达目的地花费的时间。可以看到文章提出的分支网络结构表现最好。

除了天气的泛化评估外,还进行了环境的泛化评估,如图9所示,在非常不同的环境中进行了测试,在图中所示的三个环境中运行卡车,卡车能够在所有测试环境中始终跟随车道,并响应命令。

 

五、总结

文章主要就是提出了加入命令条件的条件模仿学习网络结构。

在两组对比试验中提出的结构都表现得最好,消融研究表明噪声和数据扩充以及较深的网络结构都是有必要的,且提升性能明显的,物理世界的测试证明了该结构在现实世界中也能很好的应用,作者认为更复杂、更高容量的架构以及更大的数据集将是支持大规模城市自动驾驶的必要条件。

 

六、我的疑惑

“我们的工作还没有涉及到使用自然语言的自动车辆的人类导航:一种已经在文献[5]、[14]、[24]、[34]、[35]中探索过的人类机器人通信模式。我们把与自动驾驶车辆进行非结构化的自然语言交流作为未来工作的一个重要方向。”

这句话怎么理解?什么是非结构化的自然语言交流。

 

 

 

 

 

 

 

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
image-to-Image Translation with Conditional Adversarial Networks(条件对抗网络的图像到图像转换)是一种用于图像转换的深度学习方法。它通过训练一个生成器网络和一个判别器网络来实现图像的转换。生成器网络将输入图像转换为目标图像,而判别器网络则试图区分生成的图像和真实的目标图像。 这种方法的关键是使用对抗性训练。生成器网络和判别器网络相互竞争,以提高生成器网络生成逼真图像的能力。生成器网络通过最小化判别器网络对生成的图像的判别误差来学习生成逼真的图像。判别器网络则通过最大化对生成的图像和真实图像的判别能力来学习区分真实图像和生成图像。 在条件对抗网络中,生成器网络和判别器网络都接收额外的条件输入,以指导图像转换的过程。这个条件输入可以是任何与图像转换任务相关的信息,例如标签、语义分割图或其他图像。 通过训练生成器网络和判别器网络,条件对抗网络可以实现各种图像转换任务,例如将黑白图像转换为彩色图像、将马的图像转换为斑马的图像等。 这是一个使用条件对抗网络进行图像到图像转换的示例代码: ```python import tensorflow as tf from tensorflow.keras import layers # 定义生成器网络 def build_generator(): # 定义生成器网络结构 generator = tf.keras.Sequential() generator.add(layers.Conv2DTranspose(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(32, (4, 4), strides=(2, 2), padding='same')) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(3, (4, 4), strides=(2, 2), padding='same', activation='tanh')) return generator # 定义判别器网络 def build_discriminator(): # 定义判别器网络结构 discriminator = tf.keras.Sequential() discriminator.add(layers.Conv2D(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(128, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(256, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(1, (4, 4), strides=(1, 1), padding='same')) return discriminator # 定义条件对抗网络 class cGAN(tf.keras.Model): def __init__(self, generator, discriminator): super(cGAN, self).__init__() self.generator = generator self.discriminator = discriminator def compile(self, g_optimizer, d_optimizer, loss_fn): super(cGAN, self).compile() self.g_optimizer = g_optimizer self.d_optimizer = d_optimizer self.loss_fn = loss_fn def train_step(self, real_images, labels): # 生成器网络生成假图像 with tf.GradientTape() as tape: fake_images = self.generator([real_images, labels], training=True) # 判别器网络判别真实图像和假图像 real_output = self.discriminator([real_images, labels], training=True) fake_output = self.discriminator([fake_images, labels], training=True) # 计算生成器和判别器的损失 g_loss = self.loss_fn(fake_output, tf.ones_like(fake_output)) d_loss_real = self.loss_fn(real_output, tf.ones_like(real_output)) d_loss_fake = self.loss_fn(fake_output, tf.zeros_like(fake_output)) d_loss = d_loss_real + d_loss_fake # 更新生成器和判别器的参数 g_gradients = tape.gradient(g_loss, self.generator.trainable_variables) d_gradients = tape.gradient(d_loss, self.discriminator.trainable_variables) self.g_optimizer.apply_gradients(zip(g_gradients, self.generator.trainable_variables)) self.d_optimizer.apply_gradients(zip(d_gradients, self.discriminator.trainable_variables)) return {"g_loss": g_loss, "d_loss": d_loss} # 创建生成器和判别器 generator = build_generator() discriminator = build_discriminator() # 创建条件对抗网络 cgan = cGAN(generator, discriminator) # 编译条件对抗网络 cgan.compile( g_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), d_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), loss_fn=tf.keras.losses.BinaryCrossentropy(from_logits=True) ) # 训练条件对抗网络 cgan.fit(dataset, epochs=100) # 使用生成器网络进行图像转换 input_image = ... label = ... output_image = generator([input_image, label]) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值