注:我们的 Airtest 官方公众号(AirtestProject)会持续更新大家对于 Airtest 感兴趣的问题,欢迎有需要的同学关注并查看我们更多的内容。
如想向我们反馈关于 AirtestProject 想了解的问题,欢迎到公众号后台留言
我们先从 1 个最简单的touch(Template())
的语句来看看,Airtest 在进行图片识别的过程中,会用到什么识别算法:
上图我们截取了执行 touch 语句的部分日志(截图不存在于当前设备画面中),可以看到,在识别图像的过程中,Airtest 尝试用了SURFMatching
、TemplateMatching
和BRISKMatching
这几个算法去查找,并且还分别告诉了我们这几个算法的执行结果是什么。
值得注意的是,在TemplateMatching
算法的执行结果里面,有一个'confidence': 0.4422764182090759
,这个其实就是算法的可信度。
之前在 “截图识别成功率太低,究竟搞如何补救” 这篇推文中,我们介绍过如何合理调整阙值来提高图片识别成功率 ,那个阈值实际上是算法执行成功之后的可信度阈值(默认为 0.7),如果算法识别的可信度(也就是confidence
)超过了我们设置的阈值,就会认为识别成功,否则认为失败。
在 airtest 框架中集成了不同种类的图像识别算法。 其中包括模板匹配(也就是上文的TemplateMatching
)、以及基于特征点的图像识别方法(包含了上文的SURFMatching
和BRISKMatching
)。这两种识别方法的特点和区别如下:
"tpl"
##### 特征点匹配["kaze", "brisk", "akaze", "orb", "sift", "surf", "brief"]
在这里我们还需要解释一下:
1.无法跨分辨率识别,意思是一旦换一台不同分辨率的设备就可能识别失败;
2.一定有相对最佳的匹配结果,即是不管怎么说也会给你找一个结果出来,虽然可能差别很大。比如上文例子中,我们使用了当前设备不存在的截图让程序去查找,屏幕上根本没有结果,TemplateMatching
算法也找出了一个可信度为 0.4 的结果。
method_list = ["kaze", "brisk", "akaze", "orb", "sift", "surf", "brief"]
# 针对一张图片,绘制该张图片的CPU和内存使用情况.截屏[2907, 1403] 截图[1079, 804]
search_file, screen_file = "sample\\high_dpi\\tpl1551940579340.png", "sample\\high_dpi\\tpl1551944272194.png"
dir_path, file_name = "result", "high_dpi.json"
test_and_profile_and_plot(search_file, screen_file, dir_path, file_name, method_list)
注:测试代码详见 airtest 源码目录下的 airtest/benchmark/benchmark.py
性能解析:
method_list = ["kaze", "brisk", "akaze", "orb", "sift", "surf", "brief"]
# 测试多张图片,写入性能测试数据
test_and_profile_all_images(method_list)
# 对比绘制多张图片的结果
plot_profiled_all_images_table(method_list)
性能解析:
所以做单图识别的时候,如果对识别精确度要求很高,且不在乎对内存和 CPU 的使用率时,可以选择 kave;如果对精确度要求没那么高时,选择像 surf 和 brisk 这些算法,就不会占用过多的内存和 CPU。
针对多张图片:
sift 的识别效果最好,它占用的 CPU 也比较少,但占用内存较多;
surf 的识别效果也很好,它占用的内存也比较少,但占用的 CPU 很高;
akave 和 brisk 的效果还行,且占用内存和 CPU 也不是很多;
orb 依旧是占用 CPU 和内存最少,但效果最差的那一个;
所以做多图识别,对精确度要求高且不在意内存占用率的,可以选择 sift;而对精确度要求高且在意内存占用率的,可以选择 surf;对于精确度要求不是很高的,选用 akave 和 brisk 不会占用过多的内存和 CPU。
对性能对比感兴趣的同学可以到我们开源项目 airtest 文件夹里的 benchmark 目录下,用benchmark.py
跑一下自己的例子来看看。
Airtest 默认设置的算法是CVSTRATEGY = ["surf", "tpl", "brisk"]
,每次查找图片的时候,airtest 就会按照这个设置好的算法顺序去执行,直到找出一个符合设定阈值的识别结果,或者是一直循环查找,直到超时。
当我们执行了 1 条 touch 语句(截图不存在于当前设备画面中),查找图片时执行算法的日志如下:
可以看到,airtest 按照默认设置的算法顺序去执行,从surf
到tpl
再到brisk
,且因为当前设备不存在该截图,它就一直循环查找,直到超时。
而当要找的截图存在于当前设备画面时,日志记录如下:
airtest 按照默认的算法顺序,先执行了surf
,然后成功匹配了一个符合设定阙值的结果,程序就认为识别成功了。
那么,当我们想要改变这个算法顺序或者自定义我们想要使用的图像识别算法时该如何做呢?举个例子:
如果我们使用的都是同样分辨率的设备,并且想要匹配速度快一些,我们可以将tpl
调整到最前面。设置如下:
from airtest.core.settings import Settings as ST
ST.CVSTRATEGY = ["tpl", "sift","brisk"]
最后,如果大家对 Airtest 有疑问、BUG、建议,请到https://github.com/AirtestProject/AirtestIDE/issues 发布 issue,我们会有专人解答。同时,我们还提供了官方 QQ 群给大家沟通交流,目前 1 群已满,欢迎大家加入 2 群: