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

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

利用图像识别与 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 条回复 时间 点赞

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

codeskyblue 回复

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

williamfzc 回复

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

codeskyblue 回复

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

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

williamfzc 回复

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

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

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

hahahhah 尴尬

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

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

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

bs111 回复

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

codeskyblue 回复

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

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

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

williamfzc 回复

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

williamfzc 回复

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

king.yu 回复

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

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

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

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

williamfzc 让所有人都能用图像识别做 UI 自动化 中提及了此贴 05月19日 22:06
williamfzc 图像分类、AI 与全自动性能测试 中提及了此贴 07月22日 21:48
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册