端到端的黑盒测试(End-to-end black-box testing),测试人员不关心模型内部的工作原理,而只关心输入和输出之间的关系。这种方法有助于确保模型在实际应用场景中能够满足预期要求。
端到端的黑盒测试实施比较简单,主要包括以下几个关键步骤:
1.确定算法指标。
2.设计测试场景、收集样本。
3.测试及结果分析。
下面我们以一个实际的活体检测算法案例来讲解这几个关键步骤。
活体检测是一种常见的AI算法,比如用于银行、支付平台和其他金融机构可以使用活体检测技术进行身份验证,以确保用户在进行转账、支付、贷款等操作时是真实的人。
我们定义了两个算法指标,活体视频通过率以及非活体视频拦截率,其定义如下:
活体视频通过率 = 判断为活体视频个数 / 真人脸视频总数
非活体视频拦截率(假人脸) = (判断为非活体个数+检测人脸失败个数)/ 假人脸视频总数
我们将样本分为两类:正常样本和异常样本。
正常样本覆盖的维度包括:年龄、性别、国籍及民族、拍摄表情、拍摄场所、拍摄光照、拍摄角度、拍摄距离等。
异常样本覆盖的维度包括:纸张类、翻拍类、人脸遮罩(照片)、口罩遮罩、类人脸(如模特)、无人脸视频等。
3.测试及结果分析
这一步主要是通过编写自动化脚本完成对AI算法接口的调用,计算出上述的算法指标。对于分类错误的样本进行分析。
端到端的黑盒测试虽然实施简单,但也有其局限性。
第一,一个AI算法对应的业务功能背后可能是有一系列的AI算法模型串联起来的,当端到端的指标不达标的时候,比较难定位问题的根因。
第二,AI算法是个黑盒子,对AI算法输出的结果比较难解读,无法准确分析成功或失败的原因,这个也就是AI算法的可解释性问题。
下面我们将依次介绍两种方案来解决上述的端到端AI算法测试的局限性。
我们以一个OCR证件识别的案例来讲解AI算法分层测试的基本思路。
图4是一个OCR证件识别算法的基本步骤,每个关键步骤都是由一个AI算法来实现的。
我们拿到一个原始照片后,
第一步:调用二分类算法,来判别该图片是否是一张身份证照片。
第二步:判断图片的角度,进行相应的图片旋转,将其转正。
第三步:进行目标区域检测,将身份证从背景中框选出来。
第四步:进行最后的文本框识别,将图片中有文字的部分框选出来。
第五步:文字识别,输出文本框中的文本信息。
这个过程中,如果我们能够依次计算出每个算法的降级率,那么我们将会迅速的找到整个端到端算法效果差的瓶颈点在哪个算法上。
图4 OCR证件识别算法的基本步骤
分层测试的实施步骤如下:
这一步的目的主要是梳理清楚AI算法的调用层次关系,如:证件ocr识别整体流程中算法一般分为证件分类(二分类层)、证件旋转、目标区域检测(证件区域角点位置检测)、证件内文本框位置识别、文本识别等5个层次,参见图4。同时定义ocr每层算法的评估指标和计算方法。
为了方便自动统计每一层AI算法的输入输出信息,需要对被测OCR工程对象进行轻量级的代码改造,主要是对日志代码增加必要的打印信息,方便对被测对象运行结束后产生的日志进行分析、从中提取每层算法的结果输出,方便计算该层算法的评估指标。
准备测试样本数据,以及相应的标注文件。
对算法分层后,需要规定源标签文件、中间结果标签文件格式与内容、文件命名规范,方便用来后续的每层算法效果精度指标的计算,源文件、中间结果标签文件可以采用json、xml等格式,源文件和中间结果标签文件格式内容基本要保持一致,文件名称需要相互一一对应,格式内容可以定义为如图5所示。其中valid表示二分类算法模型输出值、direction表示证件旋转算法输出值、cardcorner表示目标区域检测算法输出值、ctpntextboundingbox表示文本框位置检测算法输出值、ocrinfo表示文字识别算法输出值。
图5 OCR分层测试标注文件举例
通过编写自动化测试脚本,对每个测试样本进行AI算法的接口调用。
测试完成后,通过编写脚本对日志中的每层算法的输入输出信息进行提取,计算出每层算法的评估指标。最后进行结果分析,可以生成一个算法指标的漏斗模型,如图6和图7所示。
图6是针对香港一代身份证的OCR分层测试的结果,整体的失败率是3.43%,其中目标区域检测的失败率是0.28%,文字识别的失败率是3.15%。文字识别算法将是我们需要优化的重点。
图7是针对香港二代身份证的OCR分层测试的结果,整体的失败率是29.41%,其中旋转的失败率是0.69%,目标区域检测的失败率是6.79%,文字识别的失败率是21.93%。目标区域检测和文字识别这两个算法将是我们需要优化的重点。
图6 香港一代身份证证件OCR漏斗模型
图7 香港二代身份证证件OCR漏斗模型
通过上面的例子我们可以看到通过建立AI算法的分层测试体系,我们可以有如下收益:
1. 快速找到算法瓶颈点,通过建立漏斗模型,我们可以快速的看到哪一层的算法是我们的重点优化对象。
2. 发现算法存在明显的场景偏见。通过不同类型样本的横向对比,发现算法是否存在场景偏见,比如上例中就存在目标区域检测和文字识别这两层对香港二代身份证有偏见问题。
3. 有了这些基础数据后,我们还可以做到常态化的回归比对测试。
(1) 版本间/版本内不同类型样本的效果对比,发现算法是否存在场景偏见
比如:香港二代身份证OCR场景偏见问题
(2)版本间/版本内不同模型迭代的效果对比,发现算法是否存在能力降级
比如:二分类算法在证件角度旋转场景下存在能力降级问题。
蜕变测试
我们首先简单介绍下什么是蜕变测试(Metamorphic Testing)。蜕变测试是一种软件测试方法,用于检测程序在不同输入条件下的行为是否一致。这种方法的核心思想是,通过对原始输入进行某种变换,生成新的输入,然后比较原始输出和新输出之间的关系。如果这种关系满足预期的蜕变关系,那么程序被认为是正确的。
举一个简单的例子,假设我们要测试一个计算平均值的函数 average()。我们可以使用蜕变测试来检查这个函数的正确性。
首先,我们选择一个输入序列,例如 [1, 2, 3, 4, 5],并计算其平均值。在这个例子中,average([1, 2, 3, 4, 5]) 应该返回 3。
接下来,我们对输入序列进行一个变换,例如将每个元素加上一个常数,如 2。新的输入序列为 [3, 4, 5, 6, 7]。我们再次计算平均值,average([3, 4, 5, 6, 7]) 应该返回 5。
现在我们可以检查蜕变关系。在这个例子中,蜕变关系是:如果我们将输入序列的每个元素加上一个常数,那么输出的平均值也应该加上这个常数。因此,我们可以比较原始输出 3 和新输出 5,它们之间的差值正好是我们加上的常数 2。由于蜕变关系满足预期,我们可以认为 average() 函数在这个测试用例下是正确的。
蜕变测试的主要步骤如下:
AI模型的蜕变测试
在深度神经网络(DNN)的上下文中,蜕变测试可以用于评估模型的性能和鲁棒性。由于深度学习模型通常是黑盒系统,很难直接从模型结构中推断其行为。因此,蜕变测试成为一种有效的方法,可以在不依赖预期输出的情况下评估模型的正确性。
在DNN的蜕变测试中,首先需要定义一组蜕变关系,这些关系描述了输入数据和输出结果之间的关系。例如,在图像分类任务中,一个蜕变关系可能是:如果对输入图像进行平移,那么分类结果应该保持不变。然后,通过对比模型在原始输入和经过蜕变关系变换后的输入上的输出,可以检测模型是否满足这些关系。如果模型在某些蜕变关系下的表现不符合预期,那么可能存在错误或者需要进一步优化。
我们以图像分类任务为例,以下是一些可能的蜕变测试手段,它们可以帮助我们检测图像分类模型的稳定性和鲁棒性:
在我们的实际项目中,上述的蜕变手段,帮助我们发现了很多AI算法的问题。比如:
图8,旋转证件图片后,导致证件分类模型出错。图9,将证件和一些背景图片合成,模拟证件在不同的背景下拍摄,发现一些场景导致证件无法被识别,即目标区域检测模型失败。
图8 旋转证件图片导致分类模型出错
图9 复杂背景导致目标区域检测模型失败
当然蜕变测试也存在一些局限性,如: