前言

好久不见。眼熟我的朋友可能知道,我近期一直在做图像识别相关的一些内容,也陆陆续续写了一点分享:

承蒙大家厚爱,在收获加精的同时,也收获了很多朋友的反馈。根据这些反馈,最近我一直在思考的问题是,这项技术到底应该用什么形式落地才是最优解。

起因

这还要从 fitch 项目(详见基于图像识别的 UI 自动化解决方案)说起。

为了满足我个人的强迫症需求,整个项目采用了彻底的组件化设计,所有的组件都能够独自存在、独立应对各自负责的功能,或被其他项目直接使用。虽然最后完成的结果还算符合预期,但联调的过程非常漫长,工作量不小。然而,这个项目也仅仅满足了 android 端的需要,而 ios 以及后续更多平台因为一些其他原因,一开始并没有在我的计划内;除此之外,还有算法调优、设备兼容等一系列的问题需要解决。相比公司级的成熟开源项目(比如 airtest 吧)的生态与进度,我个人的时间与精力都非常有限,这未免让人感觉有点无力。

非常感谢 @codeskyblueissue,让我重新想起了 findit 这个项目。这个时候我才开始发现,实际上这个东西才是图像识别框架的核心,也是最重要的部分,同时也是阻碍很多人接触与参与这个领域的门槛。而业务框架的形态到底应该是什么样,其实应该交给真正业务的使用者来设计,他们才是更了解也更清楚业务形态的人。在这之后,我重新对这个项目进行了重构与扩展,为它新增了大量的新特性,让它真正成为了一个独立项目,用于为更多开发者提供图像识别的服务。

findit 是什么

早期的 findit 是一个非常小的组件,主要用于支持 fitch 的图像识别功能。通过早期的 commit 记录可以发现,那个时候这个组件仅有 100+ 行代码,也只支持较简单的模板匹配功能。

经过重新设计,目前该工具将主要作为图像识别服务出现,用于在目标图像中寻找模板图片的位置。在当前版本,findit 已经能够以 本地形态或远程形态 出现,适应不同环境的需要,为不同的框架提供图像识别服务。

一个简单的例子

例如你有两张图片,分别是微信图标:

与包含微信图标的手机截图:

那么,你只需要短短几行代码:

import pprint
from findit import FindIt

fi = FindIt()
fi.load_template('wechat_logo', pic_path='pics/wechat_logo.png')

result = fi.find(
    target_pic_name='screen',
    target_pic_path='pics/screen.png',
)

pprint.pprint(result)

就可以得到:

{'data': { 'wechat_logo': {'FeatureEngine': (524.6688232421875, 364.54248046875),
                           'TemplateEngine': (505.5, 374.5)}},
 'target_name': 'screen',
 'target_path': 'pics/screen.png'}

通过上述数据可以知道,微信图标最可能出现的点位:

这一切 findit 都将替你完成。你只需要在你的框架里调用它。

进阶的例子可以参考 demo

远程部署能力

为了后续更好的应用,findit 的理论形态应该是配置在服务器上。主要有两个问题:

通过配置,findit-client 能够连接到本地或者远程的 findit-server,以适应不同的需求。换言之,你可以在其他设备上使用 client 直接调用远程的 findit,而本地无需 opencv 环境。这种做法使得你能够在更低配置的客户机(例如树莓派等)上使用 findit 服务。由于 client 的设计只依赖于 http 请求,你甚至可以使用你喜欢的任何语言来编写 client!

同样的,findit 提供了完善的 docker 与 docker-compose 支持,使得整套部署流程非常非常简单!
使用方法与部署可以参考这里

项目主页

https://github.com/williamfzc/findit

文档

这次的项目真的提供了认真的文档。

https://williamfzc.github.io/findit/#/

相关算法参考

findit 主要用到了 feature matching 与 template matching 。

后续

这个项目将是我的重点维护项目之一。

由于图片识别效果与源图片本身有一定的关联,可能对于个别图片会有问题,欢迎带上图片反馈给我以提高整体质量!

有问题与建议欢迎留言或者 issue 给我,或者你感兴趣的话,欢迎 PR 加入我们。


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