最近,微信小游戏跳一跳可以说是火遍了全国,从小孩子到大孩子仿佛每一个人都在刷跳一跳,作为无(zhi)所(hui)不(ban)能(zhuan)的 AI 程序员,我们在想,能不能用人工智能(AI)和计算机视觉(CV)的方法来玩一玩这个游戏?

于是,我们开发了微信跳一跳 Auto-Jump 算法,重新定义了玩跳一跳的正确姿势,我们的算法不仅远远超越了人类的水平,在速度和准确度上也远远超越了目前已知的所有算法,可以说是跳一跳界的 state-of-the-art,下面我们详细介绍我们的算法。

算法的第一步是获取手机屏幕的截图并可以控制手机的触控操作,我们的 github 仓库里详细介绍了针对 Android 和 IOS 手机的配置方法。

Github 地址:

https://github.com/Prinsphield/Wechat_AutoJump

你只需要按照将手机连接电脑,按照教程执行就可以完成配置。在获取到屏幕截图之后,就是个简单的视觉问题。我们需要找的就是小人的位置和下一次需要跳的台面的中心。

如图所示,绿色的点代表小人当前的位置,红点代表目标位置。

多尺度搜索 Multiscale Search

这个问题可以有非常多的方法去解,为了糙快猛地刷上榜,我一开始用的方式是多尺度搜索。我随便找了一张图,把小人抠出来,就像下面这样。

另外,我注意到小人在屏幕的不同位置,大小略有不同,所以我设计了多尺度的搜索,用不同大小的进行匹配,最后选取置信度(confidence score)最高的。

多尺度搜索的代码长这样:

我们来试一试,效果还不错,应该说是又快又好,我所有的实验中找小人从来没有失误。

不过这里的位置框的底部中心并不是小人的位置,真实的位置是在那之上一些。

同理,目标台面也可以用这种办法搜索,但是我们需要收集一些不同的台面,有圆形的,方形的,便利店,井盖,棱柱等等。由于数量一多,加上多尺度的原因,速度上会慢下来。

这时候,我们就需要想办法加速了。首先可以注意到目标位置始终在小人的位置的上面,所以可以操作的一点就是在找到小人位置之后把小人位置以下的部分都舍弃掉,这样可以减少搜索空间。

但是这还是不够,我们需要进一步去挖掘游戏里的故事。小人和目标台面基本上是关于屏幕中心对称的位置的。这提供了一个非常好的思路去缩小搜索空间。

假设屏幕分辨率是(1280,720)的,小人底部的位置是(h1, w1),那么关于中心对称点的位置就是(1280 - h1,720 - w1),以这个点为中心的一个边长 300 的正方形内,我们再去多尺度搜索目标位置,就会又快有准了。

效果见下图,蓝色框是(300,300)的搜索区域,红色框是搜到的台面,矩形中心就是目标点的坐标了。

加速的奇技淫巧(Fast-Search)

玩游戏需要细心观察。我们可以发现,小人上一次如果跳到台面中心,那么下一次目标台面的中心会有一个白点,就像刚才所展示的图里的。

更加细心的人会发现,白点的 RGB 值是(245,245,245),这就让我找到了一个非常简单并且高效的方式,就是直接去搜索这个白点,注意到白点是一个连通区域,像素值为(245,245,245)的像素个数稳定在 280-310 之间,所以我们可以利用这个去直接找到目标的位置。

这种方式只在前一次跳到中心的时候可以用,不过没有关系,我们每次都可以试一试这个不花时间的方法,不行再考虑多尺度搜索。

讲到这里,我们的方法已经可以运行的非常出色了,基本上是一个永动机。下面是用我的手机玩了一个半小时左右,跳了 859 次的状态,我们的方法正确的计算出来了小人的位置和目标位置,不过我选择狗带了,因为手机卡的已经不行了。

以下是效果演示:

到这里就结束了吗?那我们和业余玩家有什么区别?下面进入正经的学术时间,非战斗人员请迅速撤离。

CNN Coarse-to-Fine 模型

考虑到 iOS 设备由于屏幕抓取方案的限制(WebDriverAgent 获得的截图经过了压缩,图像像素受损,不再是原来的像素值,原因不详,欢迎了解详情的小伙伴提出改进意见)无法使用 fast-search,同时为了兼容多分辨率设备,我们使用卷积神经网络构建了一个更快更鲁棒的目标检测模型。

下面分数据采集与预处理,coarse 模型,fine 模型,cascade 四部分介绍我们的算法。

数据采集与预处理

基于我们非常准确的 multiscale-search 和 fast-search 模型,我们采集了 7 次实验数据,共计大约 3000 张屏幕截图,每一张截图均带有目标位置标注,对于每一张图,我们进行了两种不同的预处理方式,并分别用于训练 coarse 模型和 fine 模型,下面分别介绍两种不同的预处理方式。

Coarse 模型数据预处理

由于每一张图像中真正对于当前判断有意义的区域只在屏幕中央位置,即人和目标物体所在的位置,因此,每一张截图的上下两部分都是没有意义的。

于是,我们将采集到的大小为 1280*720 的图像沿 x 方向上下各截去 320*720 大小,只保留中心 640*720 的图像作为训练数据。

我们观察到,游戏中,每一次当小人落在目标物中心位置时,下一个目标物的中心会出现一个白色的圆点。

考虑到训练数据中 fast-search 会产生大量有白点的数据,为了杜绝白色圆点对网络训练的干扰,我们对每一张图进行了去白点操作,具体做法是,用白点周围的纯色像素填充白点区域。

Fine 模型数据预处理

为了进一步提升模型的精度,我们为 fine 模型建立了数据集,对训练集中的每一张图,在目标点附近截取 320*320 大小的一块作为训练数据。

为了防止网络学到 trivial 的结果,我们对每一张图增加了 50 像素的随机偏移。fine 模型数据同样进行了去白点操作。

Coarse 模型

我们把这一问题看成了回归问题,coarse 模型使用一个卷积神经网络回归目标的位置。

经过十小时的训练,coarse 模型在测试集上达到了 6 像素的精度,实际测试精度大约为 10 像素,在测试机器(MacBook Pro Retina, 15-inch, Mid 2015, 2.2 GHz Intel Core i7)上 inference 时间 0.4 秒。

这一模型可以很轻松的拿到超过 1k 的分数,这已经远远超过了人类水平和绝大多数自动算法的水平,日常娱乐完全够用,不过,你认为我们就此为止那就大错特错了。

Fine 模型

Fine 模型结构与 coarse 模型类似,参数量稍大,fine 模型作为对 coarse 模型的 refine 操作。

经过十小时训练,fine 模型测试集精度达到了 0.5 像素,实际测试精度大约为 1 像素,在测试机器上的 inference 时间 0.2 秒。

Cascade

总体精度 1 像素左右,时间 0.6 秒。

总结

针对这一问题,我们利用 AI 和 CV 技术,提出了合适适用于 iOS 和 Android 设备的完整解决方案,稍有技术背景的用户都可以实现成功配置、运行。

我们提出了 Multiscale-Search,Fast-Search 和 CNN Coarse-to-Fine 三种解决这一问题的算法,三种算法相互配合,可以实现快速准确的搜索、跳跃,用户针对自己的设备稍加调整跳跃参数即可接近实现「永动机」。

讲到这里,似乎可以宣布,我们的工作 terminate 了这个问题,微信小游戏跳一跳 Game Over!

友情提示:适度游戏益脑,沉迷游戏伤身,技术手段的乐趣在于技术本身而不在游戏排名,希望大家理性对待游戏排名和本文提出的技术,用游戏娱乐自己的生活。

声明:本文提出的算法及开源代码符合 MIT 开源协议,以商业目的使用该算法造成的一切后果须由使用者本人承担。

原文链接:https://zhuanlan.zhihu.com/p/32636329

AI玩微信跳一跳的正确姿势:跳一跳Auto-Jump算法详解相关推荐

  1. AI 玩微信跳一跳的正确姿势:跳一跳 Auto-Jump 算法详解

    作者丨安捷 & 肖泰洪 学校丨北京大学硕士生 研究方向丨计算机视觉 本文经授权转载自知乎专栏「学术兴趣小组」. 最近,微信小游戏跳一跳可以说是火遍了全国,从小孩子到大孩子仿佛每一个人都在刷跳一 ...

  2. AI 绘画Stable Diffusion 研究(五)sd文生图功能详解(下)

    大家好,我是风雨无阻. 上一篇文章详细介绍了sd文生图的功能及使用注意事项,感兴趣的朋友可以前往查看:AI 绘画Stable Diffusion 研究(四)sd文生图功能详解(上) . 那今天这篇文章 ...

  3. 开发者该如何抓住微信小游戏的风口?听Cocos创始人王哲详解(上篇)

    在微信小游戏真正爆发之前,你该做好这些基础知识储备. 微信小游戏在2017年12月28日正式上线.相对于传统的H5游戏,小游戏的优势十分明显,拥有微信庞大的用户量以及更好的兼容性,在天生适合微信社交生 ...

  4. 微信小程序开发学习笔记006--微信小程序组件详解02

    技术交流QQ群:170933152 案例7:开关选择器 案例8:各种图标 案例9:页面跳转 案例10:多媒体音视频 案例11:嵌入地图 案例12:画布:在上面可以画柱状图等等. 今天继续讲组件: 登录 ...

  5. 什么是微信小程序【重点学习系列---干货十足--一文详解】

    引言 本文主要从什么是微信小程序.微信小程序的介绍.小程序开发流程.小程序代码构成.小程序安装使用.配置分析.开发特点.实战项目等多角度手把手带你详解微信小程序. 文章目录 引言 第一章-什么是微信小 ...

  6. PLSQL Developer概念学习系列之如何正确登录连接上Oracle(图文详解)

    不多说,直接上干货! 进入PLSQL Developer 1.双击 2.得到 比如,我这里安装的是 全网最详细的Windows系统里Oracle 11g R2 Database服务器端(64bit)的 ...

  7. 微信小程序 php毛玻璃,微信小程序 CSS filter(滤镜)的使用示例详解

    之前在看七月老师的视频的时候,看到了有一个样式是 -webkit-filter ,不知道是什么(我没咋学过CSS,嘿嘿,所以不知道是啥),于是查了一下,原来是滤镜吖.但是在微信小程序里使用的时候,下面 ...

  8. wxml报错原因_微信小程序开发教程(八)视图层——.wxml详解

    框架的视图层由WXMKL(WeiXin Markup language)与WXSS(WeiXin Style Sheet)编写,由组件进行展示. 对于微信小程序而言,视图层就是所有.wxml文件与.w ...

  9. AI玩微信跳一跳的正确姿势:一不小心就超越了最高分,瞬间称霸了朋友圈~

    前言 大家好!我是梨子同学! 希望大家多多支持我!哈哈 为了感谢每一个关注我的小可爱:

最新文章

  1. 拒绝了我们的连接请求_职场上,我们该如何巧妙而优雅的拒绝同事忙的请求呢?...
  2. apache mysql php实现最大负载的方法_如何架设高性能nginx+php+mysql搭配的服务器,解决高并发问题...
  3. python 时间序列预测 币价_python时间序列预测股票走势
  4. C# 基础知识 (三).主子对话框数值传递
  5. 【C语言】第二章 信息编码与数据类型 题解
  6. Adobe illustrator 调整画板大小 - 连载17
  7. Vue.js项目去除url中的#/ - 解决篇
  8. Halcon 学习总结——制作标定板(函数gen_caltab)
  9. 牛客小白月赛9: D. 树上求和(dfs序+线段树)
  10. Transformer为啥在NER上表现不好
  11. php$.ajax(),使用PHP的jQuery $.ajax()
  12. redhat7 虚拟机 取消屏幕保护或自动休眠时间
  13. 记录解决流氓软件无法删除-被资源管理器打开以及被xx程序打开导致无法删除
  14. 各大邮箱发送数量限制整理
  15. (HTML)浏览器将多个空格压缩为一个空格
  16. 计算机网络的共享如何关闭,怎么查看并关闭网络共享
  17. ios 关于MBProgressHUD简单实用
  18. 西安市经开区-公司设立流程-公司名称审核
  19. cordova 调起拨打电话
  20. 如何正确地给固态硬盘(SSD)分区

热门文章

  1. oracle 查看cpu 个数,查看CPU核数
  2. latex添加参考文献、加入doi链接
  3. [转]微信小程序开发:从小白开发出通过自拍预测年龄和颜值的小程序
  4. 创业做亚马逊测评到底可以吗?有市场吗?靠谱吗?
  5. 世界上最卑劣的国家---新加坡
  6. cad设计草图_如何以草图展示您的设计
  7. 第五章:最后一步准备,1.8的Json模型、状态描述机制详解
  8. 人像抠图怎么抠出来?这几种抠图方法一看就会
  9. [unix]secureCRT使用常见命令
  10. Iphone安装铃声