当前位置: 首页 > 科技观察

我用AI和CV玩“跳一跳”,超越了张小龙6000+最高分

时间:2023-03-21 19:02:31 科技观察

我用AI和CV玩起了“一跳一跳”,超越了张小龙6000+的最高分,一副直到***不放弃的架势。而在《Jump》***这款游戏上线一个多月后,众多大神也开始陆续登场。获得数千分并不困难。“微信之父”张小龙也在2018微信公开课PRO上公开了自己玩微信小游戏“跳”的成绩,称自己的最好成绩达到了6000+。他还说,当他演奏《跳跃》时,没有紧张和心跳加快,而是感到平静,享受这个过程。作为没有(zhi)、没有(hui)、没有(zhuan)能力(zhuan)的AI程序员,我们在想,能不能用人工智能(AI)和计算机视觉(CV)来玩这个游戏呢?为此,我们开发了微信跳转自动跳转算法,重新定义了玩跳转的正确姿势。我们的算法不仅远超人类的水平,而且在速度和准确度上也远超所有已知的算法。可以说是跳界中的佼佼者。下面让我们详细介绍一下。我们的算法。算法第一步是对手机屏幕进行截图,控制手机的触摸操作。我们的Github仓库详细介绍了Android和iOS手机的配置方法。Github地址:https://github.com/Prinsphield/Wechat_AutoJump只需将手机连接电脑,按照教程完成配置即可。拿到截图后,就是一个简单的视觉问题。我们需要找到的是小人的位置和下次需要跳的桌子中心。如图所示,绿点代表小人当前位置,红点代表目标位置。多尺度搜索(MultiscaleSearch)有很多方法可以解决这个问题。为了快速快速的上榜,我一开始使用的方法是多尺度搜索。随便找了张图,把反派剪了出来,像下面这样。另外,我注意到小人在屏幕不同位置的尺寸略有不同,所以我设计了一个多尺度搜索,匹配不同的尺寸,选择置信度高的那个***。多尺度搜索的代码如下所示:defmulti_scale_search(pivot,screen,range=0.3,num=10):H,W=screen.shape[:2]h,w=pivot.shape[:2]found=Noneforscaleinnp.linspace(1-range,1+range,num)[::-1]:resized=cv2.resize(screen,(int(W*scale),int(H*scale)))r=W/float(resized.shape[1])ifresized.shape[0]=res.max())pos_h,pos_w=list(zip(*loc))[0]iffoundisNoneorres.max()>found[-1]:found=(pos_h,pos_w,r,res.max())iffoundisNone:return(0,0,0,0,0)pos_h,pos_w,r,score=foundstart_h,start_w=int(pos_h*r),int(pos_w*r)end_h,end_w=int((pos_h+h)*r),int((pos_w+w)*r)return[start_h,start_w,end_h,end_w,score]试试吧,效果还不错,应该说是又快又好,我从来没有找错过所有实验中的恶棍。但是这里位置框的底部中心不是反派的位置,真正的位置在上面一点。同理,目标台面也可以通过这种方式进行搜索,但是我们需要收集一些不同的台面,比如圆形,方形,便利店,井盖,棱柱等等。由于数量多、尺度多的原因,速度会变慢。这时候就需要想办法加速了。首先可以注意到,目标位置总是在小人位置的上方,所以可以操作的一件事是找到小人位置后,丢弃小人位置下方的部分,这样可以减少搜索空间。但这还不够,我们还需要进一步探索游戏中的故事。木偶和靶台基本以画面中心为中心对称。这为缩小搜索空间提供了一个很好的主意。假设屏幕分辨率为(1280,720),小人底部位置为(h1,w1),则关于中心的对称点位置为(1280-h1,720-w1),一个边以这个点为中心,在一个300长的方格内,如果我们去多尺度搜索目标位置,会很快,而且很准。效果如下图所示。蓝色框为(300,300)的搜索区域,红色框为搜索到的表格,矩形中心为目标点坐标。AcceleratedTricksObsceneSkills(Fast-Search)玩游戏需要仔细观察。我们可以发现,如果小人上次跳到了桌子中央,那么下一次目标桌子的中央就会出现一个白点,就像刚才的图一样。比较细心的人会发现,白点的RGB值是(245,245,245),这让我找到了一种非常简单高效的直接搜索白点的方法。注意白点是一个连通区域,像素值(245,245,245)的像素个数稳定在280-310之间,所以我们可以借此直接找到目标的位置。这个方法只能在上一次跳到中心的时候用,不过没关系,我们每次都可以试试这个耗时的方法,不行再考虑多尺度搜索。话虽如此,我们的方法非常有效,基本上是一个永动机。下面是我玩手机大概一个半小时,跳了859次的状态。我们的方法正确地计算出了小人的位置和目标位置,但是我选择了狗绳,因为电话卡已经没有了。以下是效果演示:视频链接:https://v.vzuu.com/video/932359600779309056到这里了吗?那么我们和业余玩家有什么区别呢?现在进入严肃的学习时间,非战斗人员请迅速撤离。CNNCoarse-to-Fine模型考虑到iOS设备截屏方案的局限性(WebDriverAgent获取的截图经过压缩,图像像素损坏,不再是原来的像素值,原因不明.了解更详细的朋友欢迎提出改进建议)Fast-search不能用。同时,为了兼容多分辨率设备,我们使用卷积神经网络来构建更快、更鲁棒的目标检测模型。下面分四个部分介绍我们的算法:数据采集与预处理、粗模型、精模型、Cascade。数据收集和预处理基于我们非常精确的多尺度搜索和快速搜索模型,我们收集了7个实验数据,总共约3000个屏幕截图,每个屏幕截图都标有目标位置。对于每张图片,我们都进行了两种不同的预处理方法,分别用它们来训练Coarse模型和Fine模型。下面分别介绍两种不同的预处理方法。粗略的模型数据预处理因为每张图片中真正对当前判断有意义的区域只在屏幕中央,也就是人和目标物体所在的位置,所以每张截图的上下两部分是没有意义的.因此,我们将采集到的1280*720大小的图像沿x方向上下截取为320*720,只保留中心的640*720图像作为训练数据。我们观察到,在游戏中,每次小人落在目标的中心,下一个目标的中心就会出现一个白点。考虑到训练数据中fast-search会产生大量带有白点的数据,为了防止白点对网络训练的干扰,我们对每张图片都进行了去白点操作。具体方法是用白点周围的白点纯色像素填充白点区域。Fine模型数据预处理为了进一步提高模型的准确率,我们建立了Fine模型的数据集。对于训练集中的每张图像,在目标点附近截取320*320大小的一块作为训练数据。为了防止网络学习琐碎的结果,我们为每张图像添加了50像素的随机偏移量。Fine模型数据也进行了去白点操作。Coarsemodel我们把这个问题看成一个回归问题,Coarsemodel使用卷积神经网络来回归目标的位置。defforward(self,img,is_training,keep_prob,name='coarse'):withtf.name_scope(name):withtf.variable_scope(name):out=self.conv2d('conv1',img,[3,3,self.input_channel,16],2)#out=tf.layers.batch_normalization(out,name='bn1',training=is_training)out=tf.nn.relu(out,name='relu1')out=self.make_conv_bn_relu('conv2',out,[3,3,16,32],1,is_training)out=tf.nn.max_pool(out,[1,2,2,1],[1,2,2,1],padding='SAME')out=self.make_conv_bn_relu('conv3',out,[5,5,32,64],1,is_training)out=tf.nn.max_pool(out,[1,2,2,1],[1,2,2,1],padding='SAME')out=self.make_conv_bn_relu('conv4',out,[7,7,64,128],1,is_training)out=tf.nn.max_pool(out,[1,2,2,1],[1,2,2,1],padding='SAME')out=self.make_conv_bn_relu('conv5',out,[9,9,128,256],1,is_training)out=tf.nn.max_pool(out,[1,2,2,1],[1,2,2,1],padding='SAME')out=tf.reshape(out,[-1,256*20*23])out=self.make_fc('fc1',out,[256*20*23,256],keep_prob)out=self.make_fc('fc2',out,[256,2],keep_prob)10小时后returnoutCoarse模型的训练在t上实现了6个像素的精度测试集,实际测试精度在10个像素左右,在测试机上(MacBookProRetina,15英寸,2015年中,2.2GHzIntelCorei7),推理时间为0.4秒。这个模型可以轻松得到1k以上的分数,已经远远超过了人类水平和大多数自动算法的水平,足以满足日常娱乐,但如果你认为我们就到此为止就大错特错了。Fine模型Fine模型的结构与Coarse模型相似,只是参数数量稍多。Fine模型充当对Coarse模型的细化操作。defforward(self,img,is_training,keep_prob,name='fine'):withtf.name_scope(name):withtf.variable_scope(name):out=self.conv2d('conv1',img,[3,3,self.input_channel,16],2)#out=tf.layers.batch_normalization(out,name='bn1',training=is_training)out=tf.nn.relu(out,name='relu1')out=self.make_conv_bn_relu('conv2',out,[3,3,16,64],1,is_training)out=tf.nn.max_pool(out,[1,2,2,1],[1,2,2,1],padding='SAME')out=self.make_conv_bn_relu('conv3',out,[5,5,64,128],1,is_training)out=tf.nn.max_pool(out,[1,2,2,1],[1,2,2,1],padding='SAME')out=self.make_conv_bn_relu('conv4',out,[7,7,128,256],1,is_training)out=tf.nn.max_pool(out,[1,2,2,1],[1,2,2,1],padding='SAME')out=self.make_conv_bn_relu('conv5',out,[9,9,256,512],1,is_training)out=tf.nn.max_pool(out,[1,2,2,1],[1,2,2,1],padding='SAME')out=tf.reshape(out,[-1,512*10*10])out=self.make_fc('fc1',out,[512*10*10,512],keep_prob)out=self.make_fc('fc2',out,[512,2],keep_prob)returnout经过10个小时的训练,Fine模型测试集精度达到了0.5个像素,实际测试精度在1个像素左右。在测试机上设备上的推理时间为0.2秒。Cascade的整体精度约为1个像素,时间为0.6秒。总结为了解决这个问题,我们使用AI和CV技术提出了适用于iOS和Android设备的完整解决方案。具有一点技术背景的用户可以成功配置并运行它。我们提出了三种算法来解决这个问题:Multiscale-Search、Fast-Search和CNNCoarse-to-Fine。三种算法相互配合,实现快速准确的搜索和跳转。用户可以根据自己的设备进行微调。跳跃参数可以接近实现“永动机”。说到这里,好像可以宣布我们的工作终止了这个问题,微信小游戏跳转GameOver!友情提示:适度游戏益脑,沉迷游戏伤身。技术手段的乐趣在于技术本身,而不在于游戏排行榜。希望大家理性对待游戏排行榜和本文提出的技术,用游戏来娱乐自己的生活。免责声明:本文提出的算法和开源代码符合MIT开源协议,将算法用于商业用途所造成的一切后果由用户自行承担。Git仓库地址:https://github.com/Prinsphield/Wechat_AutoJumphttps://github.com/Richard-An/Wechat_AutoJump