搜狗高级测试经理诸葛东明谈基于AI图像识别输入法性能测试实践

诸葛东明:

大家下午好,非常荣幸在这里跟大家做一个分享,我今天分享的主题主要是基于AI图像识别的输入法性能测试实践,希望分享之后给大家带来一些收获。

在分享之前我先简单做个自我介绍,我叫诸葛东明,来自搜狗公司,主要负责搜狗输入法和搜狗浏览器。本次分享想达成的目标是,第一,把这个过程中遇到的问题以及解决方案分享给大家,另外一个是抛砖引玉,希望跟在座的各位大咖交流测试方面的经验,特别是在测试+AI方面的经验。

我这次分享的内容主要是三部分,第一部分是介绍一下搜狗输入法性能测试的背景是什么,以便于大家理解性能测试的难点。第二部分是性能测试实践过程,大概具有四个阶段,前期的手工测试阶段,到后面的主要基于AI图像识别的阶段,重点在第四部分。最后是关于我在这次实践过程中一些心得和收获。

在介绍之前,我先简单说一下我们性能测试的背景。其实一个输入法要测试的内容还是蛮多的,比如说我们要进行内存占用的测试,看看打字、手写内存占用有没有泄露,它的内存是多少;然后我们也会做耗电量的测试,看看它是不是很耗电;再者也会做稳定性测试,比如长时间打字看看它会不会崩溃。在所有的性能测试有一个非常重要的指标叫按键响应时间,即用户在输入法按下键盘,到右侧显示候选之间的间隔,因为这是一个最常见的场景。

那么这种测试,我们之前是怎么测的,我们早期的时候是使用Hook的方式去Hook系统底层的文字绘制函数,这个方法也测了很久没有什么问题。但是呢,突然有一天,我们合作的厂商给我们反馈一个问题,说你们的输入法测试结果和报告上不一致,你们输入法按键速度,其实实际验证是不如竞品的,也会感觉到一些卡顿。我就想了解一下对方实际的测试方法,原来他们是用高速摄像,大家现在手机上也有,比如iphone上的慢动作,一秒钟120帧,然后使用的是高速摄像的方式把整个输入过程拍摄下来,人工的去看,在按下按键和出现候选词之间有多少帧,以及时间是多少。后来我们实际验证确实是慢的,我们确实不如对手,后来我们很快把这问题解决了,现在输入法没有问题了。但是这个事情促使我们思考这件事情,按键响应时间,我们到底怎么去测试。

之前的方法是用Hook函数的方式获取,但是不代表用户实际的感受,经过我们大量的调研,我们接收了友商的测试方法,因为这代表用户肉眼观测到的结果,是用户直接的体验感受。同时,我们也尝试业界的测试工具,比如说腾讯的工具,其实在这个上面敏感度不大,不能反映问题。另外我们用了一些业界的自动化测试工具,结果也是不能满足测试需求。为什么呢?因为输入的过程在慢动作下看还是一个很长的过程,一般是在十几毫秒到几十毫秒,现有的工具达不到的这样的测试需求,所以后来这个事情我们一直再想怎么解决,一直没有找到好的办法。但项目我们还是要测的,为了满足项目的测试需求,我们大概是这样的一个过程:

在性能测试的时间过程,我们大概经历了四个阶段。

刚才已经简单介绍了,我先说第一个阶段,不怕大家笑话,我们最早测试就是图上所示的,拿一面镜子作为辅助然后把手工测试过程拍下来,用的方法是用手在屏幕上按下哪一时刻记录下来,同时在后台展示出来的,人工找到开始和结束的时间进行数帧得到这些时间。这个是很麻烦的一件事,不管部署环境,还是人工数帧都是费时费力的事情。同时这项测试要进行横向对比,搜狗和其他输入法的对比,还有和搜狗和历史版本的对比,所以工作量是非常大的。

终于有一天,我们的同学受不了,我们就去想到了第二阶段。我们在这个过程做了一些改进,第一个是用工具替代了镜子。在屏幕上按下那一时刻,手机屏幕上会有一个色块显示,手指按下的时候色块变成红色,手指抬起的时候色块恢复成绿色。第二个方法是自动统计数帧。人工标记开始和结束的时刻,由程序自动算出来有多少帧会花费多长时间。但这个过程还是很不方便的,因为找起始点和结束点还是需要人工在一个长视频海量的图片人肉进行,几千张的图片里找到起始和结束,工作量是很大的。

后来,我们就思考用图像识别的方式考虑,这儿为什么写初级呢,就是一个很简单的像素识别方法。我们把视频做出来,通过区域识别找到色块,同时也找到候选区域,看像素点和颜色有没有发生变化。但这个方法还是有一定的欠缺性,当光线或者是拍摄的角度不一样的时候,识别准确率不高,所以后来我们这个测试方法回归到人工测试的方法。

后来,这个过程人工测试又持续做了大概几个月的时间。随着后来AI逐步的兴起,我们就在思考这个过程测试,是不是可以用AI来解决。我们设想是这样,去准备一些关键的图片,然后进行分类,通过机器学习的方法训练得到我们的识别模型,把我们被测试的视频给识别模型去识别,替代人工做的事情。然后这个事情现在的进展还是OK的,我现在给大家展示我们做的情况。因为AI是后台的过程,为了给大家演示过程中有一个直观的感受,我们把识别的过程和前台的程序做了一些配合,它可以把每一个关键点记录下来,在右侧打出它的帧数。左侧是我们拍摄的高速摄像,右边会把关键节点识别出来,然后在右边打出编数记录下来,这个是自动的,这个方法我们也开始使用了,但中间还是经历了很多的困难。我今天在这里主要想给大家介绍的是,在过程中遇到的三个印象最深的问题以及它的解决方案。

在探索过程中遇到的主要问题,第一个是训练数据的问题。第二个是模型选择的问题,接下来我会逐一的进行介绍。

首先在当时做的时候,我们希望让AI像人一样,能够识别测试过程中的每一种状态,所以我们是这样去做的:准备了一万多张的图片,把输入法按下按键做一些分类,然后把图片做一些预处理进行标准化的处理和其他二值化的处理,之后把图片的80%数据拿出来做训练神经网络,之后去做识别验证,能够达到我们识别的准确率就去使用,如果达不到就找对应的问题是什么进而进行数据采集或者参数调整优化。经过一定的迭代,大概一共采集了15000多张图片,准确率达到85%。然后是图上偏右侧的这个部分,把待测视频拿来,通过区域识别判断出起始位置,然后通过训练好的模型来找到候选词显示时间结束位置,进而得到相隔时间。在基础的测试类型下,这种方法是可以使用的。

但是呢,大家通过这个过程中也发现一些问题,左侧这部分的训练数据准备成本很高,可能你手工一个小时就可以测试完毕了,但你用几个小时训练数据,这时间是不是有问题,确实是有时间陈本这样的问题。

后来我们团队去思考这个问题,也做了一些解决方案,解决是什么样的。我们对识别过程去做了一个分析,发现输入法在使用过程中,跟传统业界识别一个狗一个猫是不太一样的,因为输入法输入过程是相对比较稳定的,它的变化很小,一般是光线和角度拍摄的问题,所以我们可以在提供图片的样本基础上,进行自动的拉伸,自动的改变角度,自动的添加一些噪音,然后把这些数据进行扩展。通过这种方法,我们仍然需要准备两千多张图片,但只需要提供很少的样本就可以了。以前需要一种类型准备1000张图片,现在只需要准备10张图片,通过自动化脚本自动扩充到1000张即可。

解决训练数据的问题之后,还有模型识别的问题。比如我们早期按下2,看看候选词出现什么,这就结束了,但是后期的时候我们测试需求发生的变化,测试的场景需要输入我们”women”这一输入串,测试每按下一个按键,它的候选词展示时间的时间间隔的,这样的话原来的模型就不适用了,我们需要采集更多的图片进行重新的训练,这是第一个问题。

然后第二个问题,更致命的问题,因为随着状态增多之后,这个模型识别准确度降低了,甚至以前能识别的后来也识别不出来了。当时对我们来说,还是很大的困难,我们甚至一度质疑,用AI方法是否OK。

其实人生也是这样的,当你遇到一些问题,遇到比较棘手的问题的时候,会质疑之前的或者全盘否定之前的决定。但当你把问题解决之后,其实觉得也没有什么。很幸运我们团队在这个事情上最后把这个问题解决了。

我们是怎么解决的呢?我们重新分析一下,在图像识别过程中,我们到底让机器帮助我们做什么,以前希望是让机器知道识别出来这是什么,现在我们转变的思路,让机器识别什么时候发生变化,一个是让机器明白是什么,一个是让机器明白什么是变化。后者的话其实更具有通用性,比如以下面的四张图为例,这是输入过程的几个节点的截图,在1和2之间是发生变化的,2和3也发生了变化,3和4是一样的。通过团队成员的查找资料,最后找到了SIAMESE这个模型,它就是来做一个判断,两张图片是不是一类的。

选择这个模型之后,问题就解决了吗?其实还是没有解决我们的问题,因为中间遇到了新的问题。什么问题呢?我们发现这个模型在拍摄视频的过程中,在高速摄像下,手机有一个刷新线从上到下显示,人眼现在看看不到,如果你拍慢动作的话是可以看到的。那这个刷新线对输入法的候选词的变化来说,它这个变化是更大的,这就会对我们识别模型有干扰。

后来我们的同学又在想,能不能换一种方法。我们采用的方法,首先使用的是之前的CNN模型,通过多层卷积将图形整体轮廓识别出来之后,再使用SIAMESE模型,看看是否发生了变化。使用这种方法之后,最终达到了现在的效果,识别准确率现在可以达到95%。同时在训练成本上可控,我们随机采集了输入法的50种输入状态,每种状态选十张图片,然后再采用之前的自动扩充脚本,把它扩充到每种状态一千张,一共5万张的图片,然后去训练形成我们的识别模型。而这个模型训练好之后,以后每个版本当你输入串不一样的时候,这个模型不需要重新训练,所以目前我们采用这种方法之后效果还是非常好的。

最后,是一些心得收获和展望。通过我们这次实践,我觉得有四个心得,首先第一个,假如说以后有用户直观感受型的性能测试,可以使用这个方法。第二个是对于重复性高的评测工作,可以考虑使用该方法。第三是事前的分析可以少走许多弯路,对于AI的模型分析很重要;第四个是以解决实际问题为出发点,不能为了迎合AI去做AI。

最后是关于AI未来的展望,其实今天很多老师也分享了AI的未来。我们的梦想是希望以后不管什么应用,我们只需要做一些用户的操作,就能把它的动作学习记录下来,然后交给测试平台自动把每一种状态变化识别出来,得到变化的时间间隔。第二个是兼容性的测试探索,希望AI可以帮助我们在兼容性识别方面做更多的事情。我今天的分享就这么多,谢谢。

提问:老师,您好,是这样的,刚才您讲的测试的历程,利用人工来识别,您后来说的AI的模型,现在距离我们非常远,作为实际测试的角度来讲,你刚才说的一个视频通过颜色代表这个时间到下一个时间展示,是你们自己研发的过程,还是有一个开源的软件呢?

诸葛东明:你的问题是测试过程中也有拍视频的方法,你想了解在这个过程中我们色块按下工具是不是自己做的。我告诉你这是我们自己做的,用来测试的。

提问:比如识别的话,准确率是多少?

诸葛东明:用AI做的话,准确率还是95%以上的,一般的常见输入都能够识别到的。

提问:如果不是AI的,在中间阶段呢?

诸葛东明:第三个阶段,那个最后被我们测试同学已经抛弃了。

提问:抛弃的理由是准确率不是特别适合,还是什么呢?

诸葛东明:首先就是它的准确率不高,中午12点测试时拍摄的视频可以识别,而晚上6点拍摄的视频就识别不了。A同学拍摄的视频可以识别,B同学拍摄的就不行;使用不同的手机拍摄的视频也都是不一样的,所以这个就被我们抛弃掉了。

提问:我想问一下,你刚才说的不是用了一个神经网络的模型吗,你想问一下你怎么判断模型,比较适用于你测试的图像识别,你怎么判断这个模型是比较最优的,从数据源,到训练,能把整个流程说一下,你怎么判断是最优的?

诸葛东明:大致的过程是,我们把每个状态分类,然后把它放在训练模型学习,我们80%是用来训练的,20%是用来检验训练之后是不是能识别出来,大概是这样的过程。

提问:因为你说的这些都知道,我想问的是,比如你判断一个模型,判断准确率或者什么,你们这个百分比是多少呢?

诸葛东明:我们下来之后再详细的聊一下。

提问:问一下,你刚才说色块的变化,是开始和结束两个时间。

诸葛东明:一个是开始,一个是结束,开始用的是色块。

提问:点击的时候是用脚本的点击,脚本从发出指令到执行,色块变化的颜色的点,时间是多少?

诸葛东明:我们大概是16.6毫秒以内。

提问:我们从点击到变化是30秒,这会影响测试的结果吗?

诸葛东明:对于不同的输入法,系统其实都是一样的,都有一个延时,我们想看到的对比是相对的。另外我们希望未来这样的测试可以使用机械臂,通过传感器来做。

提问:你用脚本控制机械臂点击它,发出指令之后点击它,知道那个时间也是有一个时间的。

诸葛东明:是需要不断优化的。

提问:谢谢。

本文来自:2018中国首届云测试峰会,举办方:Testin 云测

Testin云测,让应用更有价值:www.testin.cn

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181121A1K3I200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券