性能测试工具 利用图像识别与 OCR 进行速度类测试

williamfzc · 2018年09月07日 · 最后由 williamfzc 回复于 2019年04月10日 · 6872 次阅读
本帖已被设为精华帖!

利用图像识别与 OCR 进行速度类测试

本文相关工具:stagesep2

  • 2019-04

  • 2018-11-20

  • 2018-9-10

    • 将 OCR 修改为非必要,只需要具备 python3 环境就可以进行分析了

关于速度类性能测试的一些想法

速度类测试包括了启动速度、页面切换速度等不同类型,其核心思想是根据关键时间点对应用运行状态进行划分,以得到应用在不同状态间消耗的时间以判定运行效率。

其核心技术点是,关键点判定。个人认为可以分为依赖系统与不依赖系统两个方向:

  • 依赖系统:倾向于与应用有更强的耦合,分析的主体通常是应用本身

    • 深入应用,在应用中通过各种方式(通常是 log)打点,最后通过分析日志得到点位
    • 优点是由于深入到源码中,数据采集相对容易一些
    • 缺点是需要修改到源码,并不是很方便。对于一些无法接触源码的项目行不通
  • 不依赖系统:倾向于完全脱离应用进行分析,分析的主体可能是视频、图片等等

    • 通过外置摄像机录制应用的响应过程,对视频进行采样、分帧,利用图像识别的手段得到点位
    • 优点是对于应用本身几乎没有影响,也不需要接触源码,非常干净;且分析对象就是用户实际的体验效果,比起在源码中加 log 更加直观
    • 缺点是技术难度相对比较大,对设备要求也比较高,需要有一套优秀的策略

比较好的策略是两条线都要做,在相辅相成的同时能够互相保证彼此的可靠性达到完全的覆盖。

  • 日志采集是纯系统层面的行为,可能会有系统日志正常但表现异常的情况

  • 图像识别是纯用户层面的行为,对于状态的控制很难达到如日志般精确细致

本文面向图像识别方案展开,力图覆盖更多的实际场景。

主要方案

一般来说,通过图像识别来进行测试分为三个步骤:

  • 图像/视频 采集

    • 这个部分通常由高速摄像机或稳定帧率的外置相机进行拍摄,得到固定帧率的视频
    • 软件录制是不靠谱的,很容易出现帧率不稳定。而如果时间与帧数不能精确对应的话数据会失真
  • 视频处理

    • 提取视频中的信息,输出成为我们需要的形式
    • 也是整个流程最关键的部分
  • 数据分析

    • 将视频处理的结果进行分析,得到结论或生成报告

其中,第一点如果能够将设备固化好是比较好解决的,而数据分析取决于视频处理的结果。

所以针对这种情况,我利用了图像识别与 OCR,编写了一套性能测试工具,用于提取视频中有用的信息。

使用

通过使用stagesep,你可以将一段视频中每一帧的特征提取出来,生成数据供后续分析。

你只需要:

# 导入视频
ssv = stagesep.load_video('res/demo_video.mp4')

# 分析视频
result = stagesep.analyse_video(ssv)

就能够将视频中的特征提取出来!以|,,|为分隔符,分别为:

  • 帧编号

  • 帧对应的视频时间

  • 当前帧包含的文字

    • 如结果为["微信"],代表当前帧中出现了微信字样
    • 可以借此得到视频的不同阶段
  • 与首帧的图像相似度

    • 可以得到开始出现变化的时刻
  • 与末帧的图像相似度

    • 可以得到进入稳态的时刻
  • 当前帧是否存在特征图片

    • 例如,传入一张特征图片,是一个表情包
    • 如果结果为[[0, 0.27060889074688604]],两个参数分别代表:

      • 当前帧没有出现该表情包
      • match_template的结果为 0.27
    • 适合在没有文字的场景下进行阶段界定

1|,,|0.03333333333333333|,,|["Component\u79d2\u5f00"]|,,|1.0|,,|0.8744666747566574|,,|[[0, 0.27060889074688604]]
2|,,|0.06666666666666667|,,|["\u6ef4\u6ef4\u51fa\u884c\u79d2\u5f00", "Component\u79d2\u5f00"]|,,|0.9945336759012924|,,|0.8732500535811166|,,|[[0, 0.2702154980448374]]
3|,,|0.1|,,|["\u6ef4\u6ef4\u51fa\u884c\u79d2\u5f00", "Component\u79d2\u5f00"]|,,|0.9906519049687903|,,|0.8724468661392125|,,|[[0, 0.27054042596336]]
4|,,|0.13333333333333333|,,|["Component\u79d2\u5f00"]|,,|0.988436570914413|,,|0.8721808443349266|,,|[[0, 0.2707208582528737]]
5|,,|0.16666666666666666|,,|["Component\u79d2\u5f00"]|,,|0.9871368443037327|,,|0.8719868653399506|,,|[[0, 0.27088961169977555]]
6|,,|0.2|,,|["Component\u79d2\u5f00"]|,,|0.9859772325311379|,,|0.8717396593736755|,,|[[0, 0.271510313888945]]
7|,,|0.23333333333333334|,,|["\u6ef4\u6ef4\u51fa\u884c\u79d2\u5f00", "Component\u79d2\u5f00"]|,,|0.9853347906343617|,,|0.8714577411208654|,,|[[0, 0.272172863024542]]
8|,,|0.26666666666666666|,,|["\u6ef4\u6ef4\u51fa\u884c\u79d2\u5f00", "Component\u79d2\u5f00"]|,,|0.9851302157674813|,,|0.8715705722879807|,,|[[0, 0.27234378435162576]]
9|,,|0.3|,,|["Component\u79d2\u5f00"]|,,|0.9837414105243203|,,|0.8715590796786445|,,|[[0, 0.273214648246217]]
10|,,|0.3333333333333333|,,|["Component\u79d2\u5f00"]|,,|0.9838234965397075|,,|0.8716437205735402|,,|[[0, 0.27276039086080933]]

每一帧会对应一行数据。

更加具体的使用参考github 主页

相关原理

图像相似度

  • 统一使用 SSIM 进行图像相似度匹配
  • 直接使用skimage提供的方法compare_ssim

相似度变化趋势是规律的,基本符合应用加载流程。

OCR

就目前来看,词数趋势难以自动化地反映问题。

但可以作为后续分析的重要依据。

特征匹配

  • opencv 与 skimage 均提供了match_template方法供使用。目前直接使用 skimage 提供的方法。
  • 算法:Fast Normalized Cross-Correlation,详见这里

可以看到,对于特征的识别效果显著:

关联与依赖

最后

  • 欢迎各种形式的讨论与 PR

  • 欢迎star & fork

共收到 25 条回复 时间 点赞
williamfzc 图像分类、AI 与全自动性能测试 中提及了此贴 07月22日 21:48
williamfzc 让所有人都能用图像识别做 UI 自动化 中提及了此贴 05月19日 22:06

一部分哈,速度类还会包括一些扩展的类似页面切换速度、应用启动速度之类的。
可以啊😄

楼主大大的 速度类测试是指页面的打开速度吗,我也是用 python +uiautomator 作为高速相机,然后用的用的 opencv 的 match_template 做的! 😆 😆 同道中人啊,能加个好友吗

williamfzc 再次利用图像识别与 OCR 进行性能测试 中提及了此贴 03月18日 14:47
simple [精彩盘点] TesterHome 社区 2018 年 度精华帖 中提及了此贴 01月07日 12:08
williamfzc pyminitouch - 用 python 驱动 minitouch 中提及了此贴 12月24日 10:32
simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44
king.yu 回复

OK 后面有空试试看 主要还是担心精确度不高 因为这个毕竟跟 fps 还是强相关 谢谢~~ 😃

williamfzc 回复

看你的需求,可以尝试下反射 “android.view.Surface” or “android.view.SurfaceControl” 的 screenshot 方法,主动控制需求截图的时间段,mix2s 每秒可以截图 100+ 次,不过 bitmap 转化为 base64 有点耗时,可以用作统一处理;只是个小小提议;

williamfzc 回复

需要搭建 srs 推流,整个进度上比手机端延迟 3-4s,看视屏很流畅,手机自带定时器看不出有卡顿。

king.yu 回复

好的~ 主要是我们之前试用过一些软件层面的录制工具,但是发现 fps 不如外部硬件来的稳定。不知道这个如何?

恒温 将本帖设为了精华贴 11月15日 13:13
codeskyblue 回复

手机公司注重体验,我们是 10 毫秒这样的颗粒度慢慢减少,能减就减

bs111 回复

测试 FPS 的话,android 原生就有支持啦,论坛里有挺多别的帖子:这里

赞,有楼主有使用过这个测试 FPS 吗

您好,我们是高速摄像机研发制造企业 --- 合肥富煌君达高科信息技术有限公司,我公司的高速相机几百 ---- 一百万帧的相机都有覆盖,我们自己研发了图像采集软件和图像分析软件与相机进行匹配工作。欢迎来电咨询交流。13856506123

白桔 回复

hahahhah 尴尬

加了 ~
你们换用 c++ 之后效率有很大提升吗?其实 python 用的 opencv 跟 skimage 底层不还是 c++ 嘛 只是用 Python 写一下逻辑 感觉效率没有质的改善?这一块还没有试过
我觉得比较可行的方案还是在可行的范围内降低图像质量 或者在录制的时候先把图片预处理的部分给解决了比较好
不过你们图也太多了。。是在搞机器学习?
现在也是这么弄架子 adb 操作,但是总觉得有些简陋.. 😂

仅楼主可见
williamfzc · #12 · 2018年09月10日 Author
仅楼主可见
仅楼主可见
白桔 回复
  • 一帧对应的就是一张图片啊
  • 如果可以定制入口的话就可以定制一下按钮点击事件,让它做出响应的变化(比如说改掉上面的字,这样 OCR 就可以识别到;如果不可以,就打开一下开发者选项里的显示点击位置,然后把那个圆点截出来作为特征图片进行 match template
williamfzc 回复
  • “一帧分析耗时 1-2s 左右” 是指 1 张图片,还是 1 个录像解出来的一组图片?
  • 视频从点击到有画面开始播放的时间,最近在纠结这个怎么测
白桔 回复
  • 确实现在来看不算差
  • 哈哈哈那个只是举个例子说有这么个 API 啦 项目用肯定是 60+
  • 一帧分析耗时 1-2s 左右 不需要 OCR 的话可以更快些 放晚上跑的话我觉得效率也不是一个硬需求吧 现在反而录制自动化上不好解决
  • 不太明白你说的首帧是指什么?..用户操作的时间点吗
williamfzc 回复
  • 之前用过几个相似度算法,结构相似度算比较可靠的,理论搞的不是很透彻,但实际使用来看对摩尔纹、光线之类的容错还比较令人满意?
  • 看楼主的应该是每秒 30 帧,既然都录像了,建议可以帧数放大点更精确。至少可以和系统 60 帧保持一致,或者为了减小实验误差用慢镜头或高速相机将帧率调的更高。当然,不同场景需求不同
  • 问下楼主这个效率怎么样,单条用例从录制到分析耗时大概多少?
  • 请教下楼主有没有做过视频首帧时间的测试,如何通过这种方式搞?

算法的角度上我觉得结构相似性确实不是最好的选择吧,它一开始是用于评估压缩前后的图像质量变化的,在精确程度上还有待与其他算法比较。😕 这一块研究的不深入,后续再优化看看,有什么建议的话欢迎指教

williamfzc 回复

结构相似性是不是比 点特征值 模式匹配还不可靠?

codeskyblue 回复

有没有必要我觉得还是看实际情况了
如果只是为了统计单一产品在迭代过程中的变化趋势 那我觉得用 uiautomator 也没毛病 反正控制好变量 能有一个大概结果就行
但是如果还需要跟竞品对比 那精确的数据还是很有说服力且重要的吧

另外个人觉得实时计算在这种速度类的测试上并不是很可靠,比如元素的定位耗时不稳定、元素不好获取(游戏、webview 之类)😀

williamfzc 回复

既然肉眼都分辨不出来,测量这么精确有必要吗?而且系统的状况也会对测量有影响的吧

codeskyblue 回复

0.2s 是一个巨大的误差其实 因为有些场景下的启动时间一共就不到 1s 而页面切换时间会更低
而且 uiautomator 如果页面里没有常规控件的话并不能用(例如游戏

关于启动速度,页面切换速度,一直不理解为什么不直接用 uiautomator 自动化工具评估响应时间,跟你说的视频方法误差估计也就 0.2s(人肉预估)

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册