项目地址:https://github.com/williamfzc/stagesepx
官方文档:https://williamfzc.github.io/stagesepx/#/
使用指引:https://github.com/williamfzc/work_with_stagesepx

前言

我又来啦。

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

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

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

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

为什么又开新坑

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

stagesepx 能做什么

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

openAmazonFromChrome.gif

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

stage-min.png

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

stage_trend.png

例如,从图中可以看出:

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

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

thumbnail.png

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

应用举例

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

APP

除了 APP?

[pen.gif

[pen_chart.png

Do whatever you want:)

使用

安装

Python >= 3.6

pip install stagesepx 

例子

还想要更多功能?

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

切割器

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

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

sample_after_cut.png

分类器

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

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

stage

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

不同形态的分类器

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

目前基于 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


↙↙↙阅读原文可查看相关链接,并与作者交流