性能测试工具 图像分类、AI 与全自动性能测试

williamfzc · July 22, 2019 · Last by thanksdanny replied at August 15, 2019 · 6184 hits
本帖已被设为精华帖!

前言

我又来啦。

在之前一年里,我陆陆续续分享了一些图像识别在测试领域内的应用实践,功能测试与性能测试都有涉及。前段时间写了 让所有人都能用图像识别做 UI 自动化基于图像识别的 UI 自动化解决方案 之后 ,随着他逐渐稳定下来,在功能测试的这一块的个人目标终于基本算是完成了。

在性能测试方向,近期也有不少同学一直很关注这项技术在性能测试上的应用。这是之前陆陆续续做的两个版本:

尽管后来的版本已经基本可用(后来随着迭代,效率变得太低了,又变得不太可用了),但总感觉,这不是一个最理想的版本。

经过这段时间,我终于做好了一个更加符合我预期的方案: stagesep-x

为什么又开新坑

与之前的版本相比,它原理完全不同,使用场景也不完全一致。所以我选择另外开一个项目而不是继续迭代。

stagesepx 能做什么

在软件工程领域,视频是一种较为通用的UI(现象)描述方法。它能够记录下用户到底做了哪些操作,以及界面发生了什么事情。例如,下面的例子描述了从桌面打开chrome进入amazon主页的过程:

openAmazonFromChrome.gif

stagesepx能够自动侦测并提取视频中的稳定或不稳定的阶段(例子中,stagesepx认为视频中包含三个稳定的阶段,分别是点击前、点击时与页面加载完成后):

stage-min.png

然后,自动得到每个阶段对应的时间区间:

stage_trend.png

例如,从图中可以看出:

  • 视频开始直到 0.76s 时维持在阶段0
  • 在 0.76s 时从阶段0切换到阶段1
  • 在 0.92s 时从阶段1切换到阶段0,随后进入变化状态(当stagesepx无法将帧分为某特定类别、或帧不在待分析范围内时,会被标记为 -1,一般会在页面发生变化的过程中出现)
  • 在 1.16s 时到达阶段2
  • ...

以此类推,我们能够对视频的每个阶段进行非常细致的评估。通过观察视频也可以发现,识别效果与实际完全一致。

在运行过程中,stagesepx强大的快照功能能够让你很轻松地知道每个阶段到底发生了什么:

thumbnail.png

而所有的一切只需要一个视频,无需前置模板、无需提前学习。

应用举例

所有stagesepx需要的只是一个视频,而且它本质上只跟视频有关联,并没有任何特定的使用场景!所以,你可以尽情发挥你的想象力,用它帮助你实现更多的功能。

APP

  • 前面提到的应用启动速度计算
  • 那么同理,页面切换速度等方面都可以应用
  • 除了性能,你可以使用切割器对视频切割后,用诸如findit等图像识别方案对功能性进行校验
  • 除了应用,游戏这种无法用传统测试方法的场景更是它的主场
  • ...

除了APP?

  • 除了移动端,当然PC、网页也可以同理计算出结果
  • 甚至任何视频?

pen.gif

你可以直接得到出笔进入与移除的耗时!

pen_chart.png

Do whatever you want:)

使用

安装

Python >= 3.6

pip install stagesepx 

例子

sample code中提供了详细的注释。你绝对可以看懂。

传送门

还想要更多功能?

当然,stagesepx不仅如此。但在开始下面的阅读之前,你需要了解 切割器(cutter)与 分类器(classifier)。stagesepx主要由这两个概念组成。

切割器

顾名思义,切割器的功能是将一个视频按照一定的规律切割成多个部分。他负责视频阶段划分与采样,作为数据采集者为其他工具(例如AI模型)提供自动化的数据支持。它应该提供友好的接口或其他形式为外部(包括分类器)提供支持。例如,pick_and_save方法完全是为了能够使数据直接被 keras 利用而设计的。

切割器的定位是预处理,降低其他模块的运作成本及重复度。得到稳定区间之后,我们可以知道视频中有几个稳定阶段、提取稳定阶段对应的帧等等。在此基础上,你可以很轻松地对阶段进行图片采样(例子中为每个阶段采集3张图片,一共有3个稳定阶段,分别名为0、1、2)后保存起来,以备他用(例如AI训练、功能检测等等):

sample_after_cut.png

分类器

针对上面的例子,分类器应运而生。它主要是加载(在AI分类器上可能是学习)一些分类好的图片,并据此对帧(图片)进行分类。

例如,当加载上述例子中稳定阶段对应的帧后,分类器即可将视频进行帧级别的分类,得到每个阶段的准确耗时。

stage

分类器的定位是对视频进行帧级别、高准确度的图片分类,并能够利用采样结果。它应该有不同的存在形态(例如机器学习模型)、以达到不同的分类效果。例如,你可以在前几次视频中用采样得到的数据训练你的AI模型,当它收敛之后在你未来的分析中你就可以直接利用训练好的模型进行分类,而不需要前置的采样过程了。stagesep2本质上是一个分类器。

不同形态的分类器

stagesepx提供了两种不同类型的分类器,用于处理切割后的结果:

  • 传统的 SSIM 分类器无需训练且较为轻量化,多用于阶段较少、较为简单的视频;
  • SVM + HoG分类器在阶段复杂的视频上表现较好,你可以用不同的视频对它进行训练逐步提高它的识别效果,使其足够被用于生产环境;

目前基于CNN的分类器已经初步完成,在稳定后会加入 :)但目前来看,前两个分类器在较短视频上的应用已经足够了(可能需要调优,但原理上是够用的)。

事实上,stagesepx在设计上更加鼓励开发者根据自己的实际需要设计并使用自己的分类器,以达到最好的效果。

丰富的图表

想得到耗时?stagesepx已经帮你计算好了:

stage_time_cost.png

快照功能能够让你很直观地知道每个阶段的情况:

thumbnail.png

...

优异的性能表现

在效率方面,吸取了 stagesep2 的教训(他真的很慢,而这一点让他很难被用于生产环境),在项目规划期我们就将性能的优先级提高。对于该视频而言,可以从日志中看到,它的耗时在惊人的300毫秒左右(windows7 i7-6700 3.4GHz 16G):

2019-07-17 10:52:03.429 | INFO     | stagesepx.cutter:cut:200 - start cutting: test.mp4
...
2019-07-17 10:52:03.792 | INFO | stagesepx.cutter:cut:203 - cut finished: test.mp4

除了常规的基于图像本身的优化手段,stagesepx主要利用采样机制进行性能优化,它指把时间域或空间域的连续量转化成离散量的过程。由于分类器的精确度要求较高,该机制更多被用于切割器部分,用于加速切割过程。它在计算量方面优化幅度是非常可观的,以5帧的步长为例,它相比优化前节省了80%的计算量。

当然,采样相比连续计算会存在一定的误差,如果你的视频变化较为激烈或者你希望有较高的准确度,你也可以关闭采样功能。

更强的稳定性

stagesep2存在的另一个问题是,对视频本身的要求较高,抗干扰能力不强。这主要是它本身使用的模块(template matching、OCR等)导致的,旋转、分辨率、光照都会对识别效果造成影响;由于它强依赖预先准备好的模板图片,如果模板图片的录制环境与视频有所差异,很容易导致误判的发生。

而SSIM本身的抗干扰能力相对较强。如果使用默认的SSIM分类器,所有的数据(训练集与测试集)都来源于同一个视频,保证了环境的一致性,规避了不同环境(例如旋转、光照、分辨率等)带来的影响,大幅度降低了误判的发生。

Bug Report

可想而知的,要考虑到所有的场景是非常困难的,在项目前期很难做到。

有什么建议或者遇到问题可以通过issue反馈给我 :)

项目地址

https://github.com/williamfzc/stagesepx

共收到 33 条回复 时间 点赞
恒温 将本帖设为了精华贴 22 Jul 23:25

这个很有意思

simple 回复

😁

4Floor has been deleted

你的分类器模型训练 用GPU训练用例多久的时间

余鹏 回复

这完全取决于训练集的大小跟你选择的特征。
现在的SVM分类器用的是sklearn的版本,理论上性能与sklearn是一致的,我没有测过GPU的(对于单视频来说训练速度已经很快了,感觉没有测的必要),你可以试试看呢。https://scikit-learn.org/stable/modules/classes.html#module-sklearn.svm

来了,老哥~
我试试看好用不😊

应用页本身有动画,有办法区分么

zangtian2 回复

动画是个比较难解决的问题,现在的容错机制可以满足一些比较常规的动画(例如跑马灯)。
如果应用页带有比较复杂的动画(例如有视频插入),最佳方案还是手动采集一些图片去训练模型,然后再用模型来分析视频。

慢慢读完了这篇帖子,内容非常的新颖,也有一些新的启发,做新的东西都是很了不起的。 首先说一下优点,只由视频来确定表层的性能因素,我可以理解为跨平台了,因为无论哪个平台记录的表象,都可以最终由视频来输出确立。 然后 我想说一下我的疑惑,视频算是一种介质,但如果我作为测试,我可能会更想确立内因,比如在Android上,我确立某个场景发生了Jank,可以分析SufaceFlinger去得到这类信息(app开始绘制时间, Sync把帧给至硬件时间,显示到屏幕上的时间),这里跟你的<点击前、点击时与页面加载完成后>这个概念是不相同的。那么这个工具的主要用途我可以认为是:可以从导出的视频中,找到哪里可能存在性能问题吗?

williamfzc #11 · July 25, 2019 作者
战 神 回复

既然所有的信息都来自于视频,那么这个工具自然是不可能得到超出这个视频的信息。所以你提到的内因确立不属于这个工具的范畴内了。当然,以android为例,你可以在录制过程中同步记录日志去进一步定位问题所在,或者别的你喜欢的方式。

可以从导出的视频中,找到哪里可能存在性能问题吗?

用途的话,在上面的应用举例应该说得挺清楚的,这取决于你怎么使用了。性能方向的话我觉得比较适合做性能数据采集跟benchmark,定位问题的话光视频不是很够。最好是跟app自身的埋点或者日志结合起来用。

这种方案针对一些动态加载场景如果有效的检测结束帧?

williamfzc #13 · July 29, 2019 作者
testly 回复

能举个例子吗?因为动态加载这个概念还挺泛的,我不知道你具体指的是哪一种

williamfzc 回复

页面存在轮播切换 gif 等

williamfzc #15 · July 29, 2019 作者
testly 回复

轮播图是可以的。图好像被压缩了,传不了html将就着看看吧 😂

补两个大图


williamfzc 回复

轮播不一致不会产生新的分类? 分类结果应该被拟合才对?

williamfzc #17 · July 29, 2019 作者
testly 回复

首先呢,设计的初衷是希望能尽可能找出所有分类的,因为需求不唯一,例如有些人的测试主体就是轮播图。在此基础上,开发者可以通过修改配置来定制自己的功能。

如果要拟合的话,有两种方式:

  • 降低阈值,使得轮播过程不被认为处于变化中。但这种方式会影响其他阶段的识别,并不推荐
  • 手动调整切割结果,重新训练模型。

正常切割之后会生成一系列分类好的图片,如果你希望将2阶段与3阶段拟合,你可以将3中的图片丢到2中,然后将3文件夹删除。这样做之后分类器会将他们分为同一类。

当然,这个过程显得很不智能。但是在训练完成后,你大可以将训练好的模型保存下来。以后你可以直接用这个模型来分析视频,而无需前置的切割过程。

williamfzc 回复

额,我的意思其实复杂场景下依靠全局样式去做聚类会有局限性,一旦页面持续变化区域较大分类算法精度就不够准确,就类似前后帧的对比算法一样控制阀值也不靠谱。
我个人认为要做这一类的加载过程的判断,真正核心要解决的是通过算法感知页面内容的变化, 不仅是全局且要细化到局部。

williamfzc #19 · July 29, 2019 作者
testly 回复

加了你QQ~

testly 回复

不要把算法想的多万能啊。
传统算法就模板匹配在固定场景下还凑合,泛化能力呵呵哒。
从源拉下来图片然后做模板匹配,不断迭代试试看呢?

山无陵天地合我都要点这个赞。

之前基于opencv读取过视频每帧的相对时间,用的CAP_PROP_POS_MSEC 发现不准,和一些商用软件采集每帧的相对时间不一样,楼主有遇到这个问题么

williamfzc #23 · July 30, 2019 作者
linzhi 回复

是有的,我感觉跟录制的方式也有关。像是手机摄像头、高速相机就比较正常,软件方式录制出来的视频就怪怪的。

williamfzc 回复

我用一个软件录制的视频,用opencvCAP_PROP_POS_MSEC 取的时间不对,所以算不稳定两帧之间的时间差就是错的。。。

试验了下 手机拍摄的 opencv获取的帧时间和软件获取是一样的,看来这类自动化场景最好不要用第三方录屏软件

williamfzc #26 · July 30, 2019 作者
linzhi 回复

是的,如果要精确一般都是通过摄像头来确保帧率的稳定。软件层面的话,至今我也没找到一个很好的解决方案。

williamfzc 回复

嗯 导致这个问题根本原因还是软件录制的帧不稳定,每一帧的时长其实不恒定。但是有的商业软件搞定了这种情况,用opencv一直找不到解决方法,实在不行,视频源只能是外部拍摄了

williamfzc #28 · July 30, 2019 作者
linzhi 回复

是什么商业软件能透露下吗😁

williamfzc 回复

Avidemux 2.6 (32-bit) 人工逐帧看的 可以看每帧相对时间

请教下这个跟机器学习结合的话,是用的sklearn么

thanksdanny 回复

内置的话是的。如果要对cutter保存的图片进行图像分类,你也可以用其他你喜欢的(例如keras)。

williamfzc 回复

好的 感谢 !!我再研究研究一下

williamfzc 回复

想了解下训练到后期,识别一个视频出结果需要多长时间。我试着跑了下,分析完一个视频也要半个钟,所以好奇训练好后会到什么程度😁

thanksdanny 回复

留个联系方式吧.. 这样沟通效率太低😇

Author only
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up