
如想向我们反馈关于AirtestProject想知道的疑问,欢迎到公众号后台留言

我们先从1个最简单的touch(Template())的短语来看看,Airtest在进行截图识别的过程中,会用到什么识别算法:

上图我们截取了执行touch语句的个别日志(截图不存在于当前设备画面中)图像识别算法总结,可以看见,在辨识图像的过程中,Airtest尝试用了SURFMatching、TemplateMatching和BRISKMatching这几个算法去查找,并且还分别告诉了我们这几个算法的执行结果是哪个。
值得注意的是,在TemplateMatching算法的执行结果里面,有一个'confidence': 0.4422764182090759,这个似乎就是算法的可信度。
之前在“截图识别成功率太低,究竟搞如何补救”这篇推文中,我们介绍过怎么合理调整阙值来提高图片识别成功率 ,那个阈值实际上是算法执行顺利但是的可信度阈值(默认为0.7),如果算法识别的可信度(也就是confidence)超过了我们设定的阀值,就会觉得识别成功,否则认为失败。

在airtest框架中集成了不同种类的图像辨识算法。 其中包含模板匹配(也就是上文的TemplateMatching)、以及基于特征点的图像辨识方式(包含了上文的SURFMatching和BRISKMatching)。这两种识别方式的特征跟区分如下:
在这里我们还必须解释一下:
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


CPU:时间:特征点对数量:
性能解析:
最大CPU:识别效果:
所以做单图识别的之后,如果对识别精确度要求很大,且不在乎对内存和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、建议图像识别算法总结,请到 发布issue,我们会有专人解答。同时,我们还提供了官方QQ群给你们沟通交流,目前1群已满,欢迎各位加入2群:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-143314-1.html
是不是喊得