论文分享_06_23

A Language for Scenario Specification and Scene Generation

摘要

人工智能的飞速发展必然会带来很多需要解决的问题。比如:我们需要训练神经网络模型,使得模型在一些稀有事件中也能正确应对;或者需要在很多不同条件下训练神经网络系统;当神经网络预测出现错误时,也需要找出根本原因,然后对模型进行再次训练,从而提升模型的性能。

解决以上这些问题的传统方法是从环境中收集更多的数据,对系统进行再训练,直到其性能达到足够的水平为止。但是收集真实世界的数据可能是缓慢和昂贵的,因为在使用之前必须对数据进行预处理和正确标记。并且可能很难收集概率很小但又需要进行训练的数据,例如车祸。

现在已经有一些方法来研究合成数据,但是合成数据面临的一个挑战是,需要生成有意义的数据。所以我们需要一些方法来引导数据生成,使得这些数据产生的场景有意义,符合真实情况。作者认为概率编程语言(PPLs)为这个问题提供了一个自然的解决方案。使用PPLs,系统的设计者就可以构造不同的数据分布,并从这些分布中获取用于训练和测试的具体输入数据。

贡献

这篇文章的主要贡献是:

  1. 设计了一种概率编程语言scenic,用于描述概率场景分布;
  2. 提出了使用概率编程语言设计和分析感知系统的方法,特别是基于ML的感知系统;
  3. 使用Scenic语言进行案例研究,以分析和提高用于自动驾驶的深度神经网络的准确性。

作者的核心思想是将一般的操作场景使用概率编程语言形式化的表示出来(scenic program),得到一个概率分布场景,然后从这些分布中进行采样(scenic sampler),从而得到一些具体的环境配置(scenes)。将这些具体的环境配置放入模拟器(simulator)中去模拟运行,获取图像或其他传感器数据,用于测试和训练感知系统。如果这些生成的数据中有反例,则返回到scenic program这一步重复操作,可以找到导致失败的具体原因。

例子

下面作者通过一些例子来直观地描述了Scenic语言。

这个代码描述了一辆车的场景,这辆车能被另一辆车所观看到,第一行是导入一个gta库gtaLib, GTA是一个游戏,将Scenic产生的信息导入GTA游戏的库中,就会生成满足条件的图像。这个库gtalib包含了与我们的案例研究相关的所有内容:汽车这个类、以及汽车和道路位置的信息。

第二行创建了一个Car,并将其分配给指定的ego对象,这是场景的一个参考点,也就是ego头上有个摄像头,这个场景图像就是从ego对象的角度呈现的。最后第三行创建了一辆额外的汽车,可以从第二行的ego对象中看见它。这里的Car的朝向和ego对象摄像头的朝向都是沿着道路的,这是因为在Scenic中并未指定的属性就是这个库里默认的。Scenic介绍了一些Car的默认属性如:

这里的road是一个区域,用于指定gta产生的场景中哪些点位于道路上。RoadDirection是一个向量场,表示的是该点所在路段的道路方向。在X@F得到在F点处的字段X的方向,所以汽车行驶方向的默认值是它所在位置的道路方向。默认的位置也就是这个self.position,是这条道路上随即均匀分布的一个点。

比如我们可以写下面这行代码创建了一辆车,位于ego这个对象的摄像头前面的20到40米之间随机的一个位置,向左或向右随机偏移10米以内。X@Y创建了来自XY坐标系的一个向量。

假设为了更加现实,我们不要求汽车头朝向与道路完全一致,而是在5度的偏移之内。我们可以尝试这样的代码。

但是这并不是我们想要的,因为这里的facing语句是在全局坐标系下面的,也就是朝向正北方向偏移±5度。这里就可以使用X relative to Y这个语句,它可以将向量和朝向解释为在各种局部坐标系中,而不是全局坐标系。

Scenic还有一个特征就是拥有灵活可读的说明符。比如

Scenic还允许用户自定义需求,生成一些任意的条件。比如下面的代码:在这里,我们使用了X can see Y这个谓词,在本例中,它是检查ego汽车是否在第二辆车的30度锥形可见范围内。如果我们不需要所有时间都有这个条件成立,我们就可以使用一个软约束来指定它保持这个性质的最小概率。

就会生成这样一些图片:

如果我们有一个从真实世界数据中获取的具体场景,并且希望快速生成这个场景的变体,就可以使用Scenic语言的mutate功能。比如生成了一辆车辆信息,可以在最后一行加上mutate语句为出租车的位置和方向添加噪声,同时仍然强制执行所有内置的默认要求。噪音的标准差也可以被缩放。

实验

在实验部分,他们通过编写DeepGTAV这个插件将Scenic生成的场景导入GTAV这个游戏中。该插件调用GTAV的内部功能,创建具有所需位置、颜色等的汽车,并设置摄像机的位置、时间和天气。实验使用了一种用于自动驾驶的卷积神经网络SqeezeDet,他们使用精确性和召回率来度量神经网络在图像上的预测精度。

        精度=真正例/(真正例+假正例),举个例子就是就是所有判为雨天的图片中,真正的雨天图片的比例。

        召回率=真正例 /(真正例+假反例)。也就是所有的雨天图片中,被正确判为雨天图片的比例。

他们首先编写一个描述1-4辆汽车的场景(不包括摄像机),指定汽车朝向在道路方向的10°以内。他们从每个场景中生成了1000个图像,生成了一个由4000张图像组成的训练集,其他配置如下表给出:

结果如表下所示:

实验结果表明,正如预期的那样,该模型在晴天比雨夜表现得更好。训练中可能没有足够的雨夜例子,事实上,在默认的天气分布下,下雨的可能性要小于晴天。这说明了专门生成的测试集可以突出特定模型的弱点和优点。下面他们将使用Scenic重新设计训练集,提高模型性能。

对于一开始的训练集,他们选择了一个合成的数据集Driving in the Matrix,这个数据集可以训练神经网络,使得即使用现实生活中的图片去测试训练之后的网络,也可以获得良好的性能。作者的目的在于用Scenic生成一些训练集来训练神经网络,使得性能得到进一步的提升。

这是一些实验配置:

       他们通过Scenic编写了这样一种场景:将一辆汽车放在另一辆车后面遮挡住它,但是并不完全遮挡,从摄像机中可以看到被遮挡汽车的一部分。从这个场景生成图像,就得到了一个训练集 250张图像和测试集 200张图像.然后作者在这个训练集上训练五千次之后,分别对模型在和上面进行测试,他们还使用了经典的数据增强方法来生成图片。可以看到虽然这个数据集上包括了很多汽车重叠的图象,但是在数据集上的效果并不好。(如下表第一行所示)

接下来他们为了提高模型的性能,将Scenic中生成的250张有重叠车辆的图片替换matrix数据集的5%的图片,重新对神经网络进行训练,将重叠车辆场景进行过度表示。这个表格的第二行就是重新训练的结果,可以看到就算只改变了5%的训练集数据,也能使得模型得精度和召回率在数据集上有明显得提升,并且保持原始数据集上的性能保持不变。这表明Scenic可以用一些简单的方法快速获得更有效的训练集.

Scenic可以用来寻找场景的哪些特征是导致失败的原因。他们从第一个实验中选择了一个场景,是从后面偏移某个很小的角度看一辆车的场景,它被错误地归类为三辆车(因此准确率为33.3%,召回率为100%)。他们使用控制变量法编写了一些场景,使得场景的大部分特征都是固定的,但允许其他特征发生变化。比如场景(1)改变了汽车的模型和颜色,(2) 改变了场景的背景; (3)利用Scenic的突变特性为汽车的位置、标题和颜色添加了少量的噪声等等。对于每个场景,他们生成了150个图像并对它们进行了测试。结果如表格所示。改变模型和颜色对性能的改善最大,表明它们与错误分类最相关,而局部位置和方向不太重要,全局位置(即背景)最不重要。

他们还发现当建立好汽车模型之后,与摄像头的距离(5和8)和观测角度(5和6)对性能的提升并没有很大的影响,所以他们在第一次实验中专门设计了一辆通用的汽车模型,只生产靠近摄像头的汽车。并且还创建了一些在shallow angle下观察汽车的图片。并将原始的四千张训练数据集中替换了400张为上述图片,然后进行训练,还将测试集增加到了四百张。然后他们就用这些场景来重新训练网络模型,以期望提高在测试集上面的性能。

下图是实验结果,他们发现用靠近摄像机的图片代替10%的原始数据集可以显著地提高神经网络预测的精度,而用shallow angle的图片对模型性能的提升没有很明显,他们猜测是对角度范围的过拟合导致的。然后数据增强反而降低了模型的性能,他们猜测可能是由于数据增强会导致图像发生轻微的变化。这个例子可以说明Scenic可以通过控制变量来生成相应的数据集对模型进行重新训练,从而提高模型的性能。

总结

        作者展示了如何使用Scenic生成用于深度学习的合成数据集。具体来说,他们使用Scenic生成专门的训练集来提高神经网络(给定固定训练集的大小)的性能,远远超过了以往基于PPLs的合成数据生成方法所能达到的效果。在接下来,他们会将Scenic语言运用到一些更广泛的场景和模拟器中去,还会为Scenic增添一些新的功能,比如允许用户自定义说明符,以及用Scenic去描述3D场景等等。