DeepTest-面向深度学习的测试

这是一篇非常优秀的论文,主要论述了面向基于深度学习的自动驾驶系统的测试方法。内容较为丰富,展开很有条理,稍微有一些深度学习和自动驾驶的基础就能读懂。作者观点也极有启发性,很多都可以作为以后科研的灵感。
因此我翻译了这篇论文,希望能和大家多多交流。

摘要

最近,深度神经网络(DNN)的发展促进了由DNN驱动的自动驾驶汽车的发展,使用像照相机、激光雷达等传感器可以在不需要人工干预的情况下开车。包括特斯拉(Tesla)、通用汽车(GM)、福特(Ford)、宝马(BMW)和Waymo/谷歌在内的大多数主要制造商都在研发和测试不同类型的自动驾驶汽车。包括加州、德克萨斯和纽约在内的几个州的立法者通过了新的立法,以快速跟踪在道路上测试和部署自动驾驶车辆的过程。

然而,尽管已经取得了惊人的进步,但与传统软件一样,DNN往往表现出不正确或意想不到的个别案例行为,这可能导致潜在的致命冲突。在真实世界里已经发生了一些相关事故,其中包括一个导致死亡的事故。大多数现有的基于DNN驱动的车辆的测试技术都严重依赖于不同驾驶条件下的测试数据的手动采集,随着对测试条件需求增加,资源的压力越发变大。

在本文中,我们设计、实现和评估了DeepTest,这是一种系统的测试工具,用于自动检测可能导致致命事故的DNN驱动的车辆的错误行为。我们的工具利用现实世界的变化,例如雨、雾、光照条件等来自动生成测试用例。DeepTest通过生成能最大化激活神经元的数量的测试输入来系统地探索DNN逻辑的不同部分。DeepTest在不同的现实驾驶条件下(例如,模糊、下雨、雾等)找到了数千种能导致DNN出错的行为,其中许多导致了在Udacity自动驾驶汽车挑战中三个顶级的DNN潜在的致命事故。

关键字

深度学习,测试,自动驾驶汽车,深层神经网络,自动驾驶汽车,神经元覆盖。

介绍

在过去的10年里,像DNN这样的机器学习技术的进步使得像自动驾驶汽车这样的安全关键的ML系统得以发展。包括特斯拉(Tesla)、通用汽车(GM)、福特(Ford)、宝马(BMW)和Waymo在内的几家主要汽车制造商都在积极测试这些车型。最近的研究结果显示,自动驾驶汽车在实践中已经取得了很多进展,在没有任何人类干预的情况下已经行驶了数百万英里。包括加利福尼亚、德克萨斯和纽约在内的20个州最近也通过了一项法案,允许自动驾驶车辆的测试和部署。

然而,尽管取得了巨大的进步,但就像传统的软件一样,基于DNN的软件,包括用于自动驾驶的软件,经常会显示出不正确/意想不到的行为,从而导致危险的后果,比如致命的碰撞。例如,致命的特斯拉撞车事故是由于未能在明亮的天空中发现一辆白色卡车。现有的检测这些错误行为的机制,很大程度上依赖于手工收集标记的测试数据或特定的、不受控的模拟(unguided simulations)因此忽略了大量的个别案例。由于这些汽车根据不同的传感器(如相机、红外障碍探测器等)对其环境的适应行为,可能输入的空间非常大。因此,不受控的模拟很难找到许多错误行为。

在概念层面上,基于DNN的软件中的这些边缘错误用例(corner-case)类似于传统软件中的逻辑错误。与传统软件开发中的bug检测和补丁周期类似,一旦检测到DNNs的错误行为,可以通过将错误诱导输入添加到训练数据集,并进一步改变模型结构/参数,从而使其失效。然而,这是一个具有挑战性的问题,如谷歌和特斯拉这样的大型软件公司所指出的,他们已经在包括自动驾驶汽车、语音识别、图像搜索等在内的几个生产规模系统中部署了机器学习技术。

我们使用传统软件的经验表明,只使用手工测试用例构建健壮的安全系统是困难的。此外,传统软件和基于DNN的软件的内部结构也存在着根本性的差异。例如,传统的软件程序逻辑是由软件开发人员手工编写的,而基于DNN的软件会自动从大量的数据中学习它的逻辑,并以最少的人为指导。此外,传统程序的逻辑是用控制流语句来表示的,而DNNs在不同的神经元之间的边缘使用权值,而非线性激活函数则用于类似的目的。这些差异使得基于DNN的软件的自动化测试具有一些有趣和新颖的研究问题。

  • 首先,传统的软件测试技术通过最大化分支/代码覆盖率来系统地探索程序逻辑的不同部分,这对于基于dnn的软件来说是不太有用的,因为其内在逻辑没有使用控制流进行编码[70]。
  • 其次,DNNs与用于建模和测试传统程序的模型有本质的不同。跟传统的模型不同,由于DNNs所模拟的函数的非线性的,在DNN中寻找导致高模型覆盖的输入是更具挑战性的。
  • 另外,已经成功地解决 为传统软件生成高覆盖率测试输入的模块理论(SMT)求解器在涉及浮点算术和高度非线性约束的公式中问题很乏,而这些公式恰巧通常用于DNNs。事实上,已经有几个研究项目已经尝试建立定制工具来正式验证DNNs的安全性能。不幸的是,它们中没有一个能很好地适应真实世界的DNNs[48, 51, 71]。
  • 最后,手动为复杂的DNN系统(比如自动驾驶汽车)创建专门的代码是不可行的,因为逻辑太复杂,无法手工编码,因为它涉及到模拟人类驱动程序的逻辑。

在本文中,我们讨论了这些问题并设计了一套系统的测试方法,用于自动检测无人驾驶汽车的基于DNN的软件的错误行为。

  • 首先,我们利用了神经元覆盖的概念。,通过一组测试输入激发的神经元数量,系统地探索DNN逻辑的不同部分。我们从经验上证明,神经元的覆盖率变化与自动驾驶汽车(如转向角)的变化有统计学关联。因此,神经元的覆盖可以作为某种指导机制系统探索不同类型汽车行为和识别错误行为。
  • 接下来,我们演示了不同的图像转换,比如改变对比度/亮度,相机的旋转,以此模拟现实世界在驾驶条件上的差异,这会导致自动驾驶汽车DNNs中不同神经元的激活。我们表明,通过将这些图像转换结合起来,与人工测试输入的覆盖率相比,神经元的覆盖率可以提高。
  • 最后,我们在测试的DNN的多次实验之间使用转换特定变形关系(例如,汽车在不同的照明条件下应该表现相似),以自动检测错误的转角行为。

在Udacity自动驾驶汽车挑战赛中,我们发现在三个顶级的DNNs中有数千个错误行为。

本文的主要贡献是:

  • 针对围绕安全的DNN的系统(如自动汽车),我们提出了一种系统的技术,可以自动生成最大化神经元的覆盖的测试用例。我们通过经验证明,神经元的覆盖变化与自动驾驶汽车的行为变化相关。

  • 我们说明了不同的现实图像转换,例如对比度的变化,雾的存在等,可以用来生成增加神经元覆盖率的合成测试用例。我们利用特定关系来自动检测错误行为。我们的实验还表明,合成图像可以用于再训练,并使DNNs对表现出更好的转向效果。

  • 我们在DeepTest中应用了我们所提出的技术,系统地测试了Udacity驱动挑战中的三个顶级DNN模型,发现了数千种错误行为,其中许多错误行为可能导致潜在的致命冲突,如图1所示。

背景

自主驾驶深度学习

自动车辆的关键部件是由底层深层神经网络(DNN)控制的感知模块。DNN接收来自不同传感器的输入,如相机、光探测和测距传感器(LiDAR)和红外传感器,该传感器测量环境,输出转向角、制动等,以使汽车安全处于安全的低电流状态,如图2所示。本文重点讨论了摄像机输入和转向角输出。

一个典型的前馈DNN由多个处理层组成,它们叠加在一起以提取输入的不同表示。DNN的每一层都越来越抽象输入,例如,从原始像素到语义概念。例如,自动汽车DNN的前几层提取了一些低级特征,如边缘和方向,而较深的层则识别诸如停车标志和其他汽车等物体,而最后几层则输出转向决策(例如,向左或向右)。

DNN的每一层都由一个称为神经元的单个计算单元组成。不同层次的神经元通过边缘相互连接。每条边都有相应的权重(图2中所示)。每个神经元在其输入上应用一个非线性激活函数,并将输出发送给后续的神经元,如图2所示。受欢迎的激活函数包括ReLU(整流线性单元),sigmoid等。DNN的边权值在DNN的训练过程中根据标记的训练数据进行推断。大多数现有的DNNs都是通过反向传播的梯度下降来训练的。一旦训练完毕,DNN可以用于预测,而不会对权重进行任何进一步的改变。

图2展示了自动驾驶汽车感知模块中的一个基本DNN。本质上,DNN是一个线性变换(例如,每条边的权重参数之间的点积和该边缘的源神经元的输出值)和非线性激活(例如,每个神经元中的ReLU)的序列。最近的研究结果表明,经过良好训练的DNN f可以准确地预测与人类驾驶员接近的转向角。

不同DNN的架构

自动车辆中使用的大多数DNNs可以分为两类:前馈卷积神经网络(CNN)和**递归神经网络(RNN)。我们测试的DNNs(见第4节)包括两个CNN和一个RNN。我们提供了下面每个架构的简要描述。

  • CNN的架构
    一个CNN和一个完全连接的DNN之间最大的区别就是一个卷积层的存在。卷积层的神经元只连接到下一层的某些神经元,而不同神经元之间的多重连接也有相同的权重。共享相同权重的连接的集合本质上是一个卷积核。它对上一层的一组神经元的输出应用相同的卷积运算。图3(上一行)演示了三个卷积层的卷积运算。这种简化的体系结构与实践中使用的体系结构类似。

卷积层有两个主要好处。首先,他们通过允许在多个连接之间共享权重,从而极大地减少了可训练的重量,从而显著缩短了训练时间。第二,卷积核的应用是一种自然的图像识别技术,因为它类似于人类视觉系统,它提取视觉输入的分层表示。

  • RNN的架构
    与CNN不同,RNN允许在网络中循环。具体地说,每一层的输出不仅被馈送到下一层,而且还流回上一层。这样的安排使先前输入的预测输出(例如,视频序列的先前帧)也能被考虑用于预测当前输入。图3(下一行)演示了一个简化版本的RNN架构。与其他类型的DNN类似,RNN也利用梯度下降和反向传播进行训练。然而,众所周知,当在RNN中通过多个循环传播时,梯度可能会消失到零或爆炸到非常大的值,因此可能导致一个不准确的模型。长短时记忆(LSTM),一种流行的RNN子群,旨在解决这个消失/爆炸的梯度问题。

方法

我们简要地描述了DeepTest是如何处理下面这些问题的。

  • 如何系统地探索无人驾驶汽车DNN的输入-输出空间?
  • 如何综合现有的实际输入来实现自动化的探索?
  • 如何优化这个过程?
  • 自动创建一个可以检测错误行为的测试oracle,而不需要详细的手工指定?
神经元覆盖的系统测试。

输入输出空间(即一个复杂系统的输入和输出的所有可能的组合)对自动车辆穷尽的探索来说不可能。因此,我们必须设计一种系统的方法,将空间划分为不同的等价类,并通过从每个等价类中选取一个样本来试图覆盖所有等价类。在本文中,我们利用神经元的覆盖率作为一种机制来划分输入空间,假设所有具有相似神经元覆盖的输入都属于相同的等价类。

神经元的覆盖最初是由Pei等人提出的,用于对多个相似的DNN进行导差测试。它被定义在给定输入下,被激活的神经元DNN中神经元的总数量唯一的比值。

如果神经元的输出(由整体层的输出按比例放大)大于dnn的阈值,则认为单个神经元被激活。在本文中,我们使用0.2作为我们所有实验的神经元激活阈值。

与传统软件的代码覆盖导向测试工具类似,DeepTest试图生成能最大限度地增加测试DNN的神经元覆盖率的输入。因为每个神经元的输出影响都会影响DNN的最终输出,最大化神经元的覆盖也会增加输出的多样性。我们在第5节中实证地证明了这一效应。

Pei等人对神经元的覆盖范围仅限于CNN。我们把定义进一步推广到了了包括RNNs在内依赖于对应层的类型的神经元,可以产生不同类型的输出值(即在多维数组中组织的单个值和多个值)。

对于全连接层中的所有神经元,我们可以直接将它们的输出与神经元激活阈值进行比较,因为这些神经元输出单个标量值。 相比之下,因为每个神经元在输入空间里都应用了卷积核卷积层中的神经元输出多维特征映射。 例如,图3.1中的第一层说明了在整个图像(5×5)上应用一个卷积核(大小为3×3),在后续图层中生成大小为3×3的特征映射。 在这种情况下,我们计算输出特征映射的平均值,将神经元的多维输出转换为标量,并将其与神经元激活阈值进行比较。

对于带循环的RNN / LSTM,中间神经元展开产生一系列输出(图3.2)。 为了神经元覆盖计算的目的,我们将展开层中的每个神经元视为单独的神经元。

增加合成图像的覆盖率

如果输入不太可能出现在真实世界中,即使这些输入可能表现出错误行为,那么生成最大化神经元覆盖率的输入可能也不是很有用。 因此,DeepTest专注于通过在种子图像上应用图像转换来生成逼真的合成图像,并模拟不同的现实世界现象,例如相机镜头失真,物体移动,不同的天气条件等。为此,我们调查了九种不同的真实图像转换 亮度,对比度变化,平移,缩放,水平剪切,旋转,模糊,雾气效果和雨水效果)。 这些转换可以分为三组:线性,仿射,和卷积。 正如第5节所述,我们的实验结果表明,所有这些转化都会显着增加神经元对所有测试DNNs的覆盖率。下面,我们将描述转换的细节。

调整亮度和对比度都是线性变换。 图像的亮度取决于该图像的像素值有多大。 图像的亮度可以通过对每个像素的当前值加/减一个常数参数β来调节。 对比度表示图像中不同像素之间亮度的差异。 可以通过将每个像素值乘以恒定参数α来调整图像的对比度。

平移,缩放,水平剪切和旋转都是不同类型的仿射变换。 一个仿射变换是两个图像之间的线性映射(旋转+平移)。 在图像处理中经常使用仿射变换来消除摄像机角度变化造成的失真。 在本文中,我们利用反转变换来反演,即模拟不同的真实世界相机视角或物体的移动,并检查自驱动DNN对这些变化的鲁棒性。

模糊和增加雾/雨效应都是卷积变换,即它们使用不同的变换特定内核对输入像素执行卷积运算。 卷积操作将输入图像的每个像素(由内核加权)添加到其本地邻居。 我们使用四种不同类型的模糊滤波器:平均,高斯,中位数和双边。 我们在输入图像上组合Adobe Photoshop提供的多个滤镜,以模拟逼真的雾和雨效应。

结合转换增加覆盖率

单个图像变换增加神经元覆盖率,一个显而易见的问题是它们是否可以组合以进一步增加神经元覆盖率。 我们的研究结果表明,不同的图像转换倾向于激活不同的神经元,即它们可以堆叠在一起以进一步增加神经元覆盖。 但是,不同变换的所有可能组合的状态空间太大而无法彻底探索。 我们提供了神经元覆盖引导的贪婪搜索技术,可以有效地找到影像转换组合,从而获得更高的覆盖率(请参阅算法1)

该算法将一组种子图像I,变换列表T及其对应参数作为输入。 该算法背后的关键思想是跟踪成功增加给定图像的神经元覆盖范围的转换,并根据给定图像生成更多合成图像的优先次序。这个过程以深度第一的方式重复所有图像。

在测试基于DNN的复杂系统(如自动驾驶汽车)时面临的主要挑战之一是手动创建系统的规格/规范/格式,以便对系统的行为进行检查。为这样的系统创建详细的规范是具有挑战性的,因为它基本上涉及重建人类驾驶员的逻辑。

为了规避这个问题,我们利用在汽车行为在不同合成图像之间的变质关系(metamorphic relations)这里的关键是,即使很难为每个转换后的图像指定自动驾驶汽车的正确行为,人们可以确定汽车面对某些类型的转换中时,所表现的行为之间的关系。例如,自动汽车的转向角度不应该在任何照明/天气条件下,模糊,或任何带有小参数值的仿射转换时,在相同的图像上变化。

因此,如果DNN模型推断输入种子图像$I_{o}$的转向角$\theta_{o}$和通过将变换$T$应用于$I_{o}$而生成的新合成图像It的转向角$\theta_{t}$,则可以定义简单的变形关系,其中$\theta_{o}$和$\theta_{o}$是相同的。

然而因为汽车可以安全地容忍小的变化,对于给定的图像通常没有单个正确的转向角度。 因此,非常严谨的地确定变质关系的话(如上所述)(可能导致大量误报)如果让关系更宽容(可能导致许多假阴性)之间存在权衡关系。 在本文中,我们通过使用下面定义的变形关系在这两个极端之间取得平衡。

为了最大限度地减少误报,我们放松我们的变形关系,并允许原始输入图像的误差范围内的变化。 我们观察到DNN模型对原始图像预测的输出集合${\theta_{o_{1}},\theta_{o_{2}},…,\theta_{o_{n}}}$,这里有一写是小的但有意义的的错误对于他们各自的手动标签${\theta_{1},\theta_{2},…,\theta_{n}}$。 通常使用均方误差(MSE)来测量这样的误差,

利用这个属性,我们重新定义了一种新的变形关系

上述等式假设作为输入的变换图像的模型产生的误差应该在 由原始图像集产生的MSE的λ倍的范围内。 在这里,λ是一个易于理解的参数,可以让我们在假阳性和假阴性之间取得平衡.

应用

应用模型

我们在三个DNN模型中评估了我们的技术,这些模型在Udacity自驾车挑战中获得了最高排名:Rambo(第二名),Chauffeur(第三名)和Epoch(第六名)。 我们选择这三种模型,因为它们的实现基于我们目前的DeepTest原型支持的Keras框架.表3总结了DNN模型和数据集的细节。

如表3的右图所示,转向角被定义为车辆的前进方向(垂直线)与方向盘车轴(即,通常为前轮)的前进方向之间的旋转角度。 负转向角表示左转,正值表示左转。 根据不同汽车的硬件,汽车的最大转向角度会有所不同。 本文中使用的Udacity自驾车挑战数据集最大转向角为+/- 25度。 然后将转向角度缩放1/25,以使预测值落在-1和1之间

Rambo模型由三个CNN组成,其输出使用一个最终层合并。 其中两个CNN受到NVIDIA自主驾驶汽车架构的启发,第三个CNN基于comma.ai的转向模型[9]。 与其他以单个图像作为输入的模型相反,Rambo将三幅连续图像中的差异作为输入。该模型使用Keras 和Theano 框架。

Chauffeur模型包括一个用于从图像中提取特征的CNN模型和一个用于预测转向角度的LSTM模型。 CNN模型的输入是图像,而LSTM模型的输入是由CNN模型从先前的100个连续图像中提取的100个特征的拼接。 Chauffeur使用Keras 和Tensor流框架。

Epoch模型使用一个CNN。 由于Epoch的预训练模型并未公开提供,因此我们使用作者提供的说明对模型进行训练。 我们使用来自Udacity自驾车挑战赛的CH2_002数据集来训练时代模型。 Epoch与Chauffeur类似,使用Keras和Tensor流程框架、

图像转换

在实验中,我们利用了七种不同类型的简单图像变换:平移,缩放,水平剪切,旋转,对比度调整,亮度调整和模糊。 我们使用OpenCV来实现这些转换。 对每个转换使用10个参数。

结果

由于基于DNN的模型与传统软件基本上不同,首先,我们检查神经元覆盖是否是一个很好的能捕获DNN的功能多样性的度量标准。 特别是,我们调查神经元覆盖率是否随着自动驾驶汽车的不同输入输出对而变化。在对DNN的最终输出作出贡献之前,单个神经元的输出需要经过一系列线性和非线性运算。因此,到底多少(如果有的话)神经元的激活会改变最终的输出?这还不是很清楚。我们会在第一个研究问题中解决这个问题。

问题1不同的输入 - 输出对会产生不同的神经元覆盖率吗?

对于每个输入图像,我们测量基础模型和相应输出的神经元覆盖率(如第四节所示,与输入图像相对应,每个模型输出如表3(右)所示的转向方向(左(+ ve)/右(-ve))和转向角。 我们分别分析这两个输出的神经元覆盖率。

  • 转向角度
    由于转向角度是一个连续变量,我们检查神经元覆盖率和转向角之间的Spearman相关性。这是计算两个变量之间单调关联的非参数度量。与正统计意义相关表明转向角随着神经元覆盖率的增加而增加,反之亦然。结果显示,所有模型的Spearman相关性在统计上显着相关。Chauffeur和Rambo模型显示出总体负相关性,Epoch模型显示出强烈的正相关性。这个结果表明神经元覆盖率随着输出转向角的变化而变化,即不同的神经元在不同的输出中被激活。因此,在这种情况下,神经元覆盖率可以很好地估计输入 - 输出对的多样性。此外,我们发现神经元覆盖率与转向角之间的单调相关性也证实了Goodfellow等人的假设,即在实践中,DNN通常是高度线性的。

  • 转向方向
    为了测量神经元覆盖与转向方向之间的关联,我们检查覆盖范围是否在右转向和左转向之间变化。 我们也使用Wilcoxon非参数测试,因为转向方向只能有两个值(左和右)。 我们的研究结果表明,对于所有三种整体模型都显示着统计显着性($p<2.2 * 10^{-16})神经元覆盖率随着转向方向的不同而变化。 有趣的是,对Rambo来说,只有Rambo-S1子模型显示出统计学显着的相关性,但Rambo-S2和Rambo-S3确不是如此。 这些结果表明,与转向角度不同,一些子模型比其他模型更负责改变转向方向。

总体而言,这些结果表明,对于不同的输入 - 输出对,神经元覆盖率完全不同。 因此,神经元覆盖指导(NDG)测试策略可以帮助解决角落病例。

接下来,我们调查通过对现有输入图像应用不同真实图像变换(如表2中所述)生成的合成图像是否可以激活不同的神经元。因此,我们检查:

问题2:不同的逼真图像是否转换激活不同的神经元?

我们从测试集中随机挑选1,000个输入图像,并通过使用七种不同的变换(模糊,亮度,对比度,旋转,缩放,剪切和平移)来转换它们中的每一个。 我们还改变了每个转换的参数,并生成总共70,000个新合成图像。 使用这些合成图像作为输入来运行所有模型,并记录每个输入激活的神经元,然后比较由同一图像生成的不同合成图像激活的神经元。 假设两个变换T1和T2应用于原始图像I时,分别激活两组神经元N1和N1。 我们通过测量他们的Jaccard距离来衡量N1和N2之间的差异

结果表明,除了Chauffeur LSTM以外,对于所有模型,不同的变换都会激活不同的神经元。 正如2.1节讨论的那样,LSTM是一种特殊类型的RNN架构,它保持状态不受以前的输入影响,因此单一变换增加LSTM模型的神经元覆盖率要比其他模型难得多。 在本文中,我们不会进一步探究这个问题。

我们进一步检查单个转换对提高神经元覆盖率的贡献程度。 给定种子图像的所有其他转换。 因此,如果原始图像I经历了7次离散变换:T1,T2,… T7,我们计算由T1激活的神经元的总数,T1∪T2,…, = 1。

结果显示每粒种子图像平均神经元覆盖率的所有变换的累积效应。 我们看到,随着所有模型转换次数的增加,累积覆盖率也在增加。 换句话说,所有的转变都在起作用朝向整体神经元覆盖。

我们还计算了每个图像转换(NT)的神经元覆盖率的百分比变化(NT),对应的种子图像(NO) 于所有研究的模型,变换的图像显着增加了神经元覆盖率
Wilcoxon非参数检验可以确定统计显着性。 这些结果还表明,不同的图像转换会以不同的速率增加神经元覆盖率。

结果2:不同的图像转换往往会激活不同的神经元组

接下来,我们用不同的变换组合变异种子图像(参见第3节)。 由于不同的图像变换激活了不同的神经元集,因此我们试图通过这些变换后的图像输入来增加神经元覆盖率。 为此,我们提出疑问:

问题3: 通过结合不同的图像变换,神经元覆盖能否进一步增加?

我们通过测量两种不同设置中的神经元覆盖来执行这个实验:
(i) 应用一组变换
(ii)通过使用贪心算法组合变换。

  • 累积转换
    由于不同的种子图像激活了不同的神经元集合(参见RQ1),因此多个种子图像共同获得比单一种子图像更高的神经元覆盖率。 因此,我们检查变换的图像是否仍然可以共同增加神经元覆盖率,相比一组种子图像的累积基线覆盖率来说。 我们通过在100张种子图像上应用7次变换和变化10个参数,从100张种子图像生成总共7000张图像。 这导致总共7,000张测试图像。 然后,我们比较这些合成图像的累积神经元覆盖率。这里使用相同的100个种子图像进行公平比较。 结果显示,在所有模型中(Rambo-S3除外),累计覆盖率显着增加。 由于Rambo-S3基线已经实现了97%的覆盖范围,因此转换后的图像仅将覆盖范围增加了(13,080 - 13,008)/ 13,008 = 0.55%。

  • 贪婪转换
    最后,我们通过使用算法1中描述的coverage引导搜索技术来检查是否可以进一步增加累积的神经元覆盖率。我们从100个种子图像中分别生成254、221和864个图像,分别为Chauffeur-CNN、Epoch和Rambo模型,并测量它们的集体神经元覆盖率。
    结果显示,引导的转换总体上实现了88%、51%、64%、70%和98%的全神经元模型,分别用于模型chauffeurl - cnn、Epoch、Rambo-S1、Rambo-S2和Rambo-S3,从而将覆盖范围提高到17% 22%、12%、21%和0.5%
    该方法也能明显地达到较高的神经元覆盖率。

结果3:通过系统地结合不同的图像转换,可以使神经元的覆盖率提高100%。

接下来我们检查合成图像是否会触发自主汽车DNNs中的一些错误行为,以及是否可以使用3.4节中描述的变质关系来检测这些行为。 这导致了以下研究问题:

问题4。我们能不能通过变形关系自动检测出错误行为?

在这里,我们关注的是变换后的图像,它们的输出违背了公式2中的变形关系。我们称这些图像为$I_{err}$,并将其对应的原始图像称为$I_{org}$。我们比较$I_{err}$和$I_{org}$输出之间的偏差,对标人类相应的标签,$I_{err}$比Iorg的偏差大得多。均方误差(MSE)$I_{err}$是0.41, 而相应的$I_{org}$是0.035。这种差异也存在于其他合成图像中,这些合成图像是由复合变换产生的,包括雨、雾,以及在覆盖引导的搜索过程中生成的图像。因此,总的来说,$I_{err}$具有更大的潜力来表现出错误的行为。

然而,对于某些转换(例如旋转),并不是所有的变质关系都可以被认为是错误的,因为正确的转向角度可以根据转换后的图像的内容而变化。例如,当一个图像被大量旋转,比如说30度,它就会自动地在不知道它的内容的情况下自动地修改它的输出行为。为了减少这种误报,我们只报告典型的转换bug(例如,小的旋转、雨、雾等),正确的输出不应该偏离相应的种子图像的标签。因此,我们进一步使用了过滤标准,如下公式,通过检查合成图像的MSE是否接近原始图像的MSE来识别这种转换。

因此,我们只选择遵从公式3的变换来计算错误行为。

结论4:通过神经元覆盖引导合成图像,DeepTest成功地检测了三种低误报模型所预测的超过1000种错误行为。

问题5:用合成图像重新训练DNNs能提高准确度吗?
在这里,我们检查用DeepTest生成的一些合成图像再训练DNN是否有助于使DNN更加健壮。我们使用了HMB_3.bag中的图像,并通过添加了雨和雾效果创建了它们的合成版本。 我们对Epoch模型进行了再培训,随机采样了66%的这些合成投入以及原始训练数据。 我们对其余34%的合成图像及其原始版本评估了原始模型和再培训模型。 在所有情况下,重新训练模型的准确度比原始模型显着提高。

结果5:通过使用DeepTest生成的合成数据对DNN进行再训练,DNN的准确度可以提高高达46%

对有效性的威胁

DeepTest通过在种子图像上应用不同的图像转换来生成逼真的合成图像。但是,这些转变并不是详尽无遗,因此可能无法涵盖所有现实情况。尽管我们的诸如雨和雾效应的变换被设计成现实的,但由于大量不可预知的因素,例如太阳的位置,雨滴的角度和大小,所生成的图片在现实中可能不完全可再现。等等。但是,随着图像处理技术变得越来越复杂,生成的图像将更接近实际。除了转向角之外,用于驾驶自主车辆的完整DNN模型还必须处理制动和加速。我们仅限于测试转向角的准确度,因为我们的测试车型不支持制动和加速。然而,假设模型支持它们,我们的技术应该很容易适用于测试那些输出。

相关工作

驾驶员辅助系统的测试。

Abdessalem等人。提出了一种在自动驾驶汽车中测试高级驾驶辅助系统(ADAS)的技术,该技术在能见度低的位置检测到行人时会向驾驶员发出警告[25]。他们把注意力放在系统和基于专家认定的环境中的的危险工况上,使用多目标元启发式搜索算法来生成测试,(例如,在黑暗中移动行人)。

这项工作与我们之间的关键差异有三个:
(一)我们专注于测试自主汽车DNN中的图像识别和驾驶逻辑,而他们的技术是基于传感器输入测试ADAS系统的警告逻辑;
(二)他们的黑匣子技术取决于手动选择的危险工况,而我们的灰盒技术看起来在DNN模型内部并系统地最大化神经元覆盖。 差异点在于,他们的技术理论上可以用于任意实现,而我们的技术是为DNN定制的;
(三)我们利用变质关系创建测试准则,但他们依靠人工指定来检测错误行为。

机器学习的测试和验证。

评估机器学习系统的传统做法主要是通过手动标记的数据集和特设模拟随机抽取测试输入来衡量其准确性。然而,如果没有模型的内部知识,这种黑箱测试范式不能找到可能导致意外行为的不同角落案例。

Pei等人提出了DeepXplore,这是一种白盒差异化测试算法,用于系统地修改可能触发多个DNN之间不一致的输入。他们将神经元覆盖作为衡量DNNs内部逻辑有多少已经过测试的系统指标。相比之下,我们的灰箱方法在单个DNN中使用神经元覆盖来引导测试生成,并利用变形关系来识别错误的行为,而不需要多个DNN。

最近的另一项工作已经探索了验证DNN防止不同安全特性的可能性。但是,这些技术都不能验证真实世界大小的DNN的丰富属性。相比之下,我们的技术可以系统地测试最先进的DNN以确保安全关键的错误行为,但不提供任何理论保证。

对抗学习。

许多项目在测试时间内成功地攻击了机器学习模型,强迫它发生意想不到的错误。更具体地说,这些攻击集主要是用来发现一些输入,改变很小但是结果差异很大。这些类型的攻击对于影响广泛的任务是?众所周知的,例如图像识别,人脸检测/验证,恶意软件检测和文本分析。之前的一些作品已经探索了抵御这些攻击的防御机制,并且提出了不同的有效性。

总之,这一行工作试图找出一类特定的错误行为,即通过给给定输入添加最小量的噪声来强制错误的预测。相比之下,我们通过最大化神经元覆盖范围并找到一组不同的角落行为来系统地测试给定的DNN。此外,我们特别专注于找出实践中可能出现的实际情况。

测试放大/引申。

对于传统软件的测试用例生成和放大技术,有大量工作是从一些种子输入自动生成测试用例并增加代码覆盖率。 我们不是在这里单独总结它们,而是将感兴趣的读者引用Anand等人的调查,McMinn et al和Pasareanu等。 与这些方法不同,DeepTest被设计为在DNN上运行

变质的测试。

变形测试是一种创建测试准则的方法。
通过检测不同输入的测试程序多次执行的输出,通过检测对领域特定的变质关系不正确的,变形测试识别有缺陷的行为。
例如,p(a,b) = p(a, 0) + p(b, 0),过去用变形测试来测试监督和无监督机器学习分类器。
相比之下,我们在自动驾驶汽车领域的新变质关系,不像以前的分类测试,产生一个连续的转向角度,即这是一个回归任务。

结论

在本文中,我们提出并评估了DNT驱动的自动驾驶汽车自动测试工具DeepTest。 DeepTest使用通过对一组种子图像应用不同真实变换而生成的合成测试图像来最大化DNN的神经元覆盖率。 我们使用领域特定的变形关系来发现DNN的错误行为而没有详细的指定。 通过自定义转换和变形关系,DeepTest可以很容易地适用于测试其他基于DNN的系统。 我们相信DeepTest是建立强大的基于DNN的系统的第一步。

0%