手机版

一次不成功的深度学习实践——微信跳转

时间:2021-12-11 来源:互联网 编辑:宝哥软件园 浏览:

最近微信的跳跳小程序火了,所以前天我们更新了微信,玩了几个游戏。最多,如果我们手动达到200左右就不行了。

一次不成功的深度学习实践 - 微信跳一跳(图1)

后来,我打算用代码写一个辅助工具。查了一下Github,已经有人做了。17年12月29日的项目,5天不到5K星,未来还会有更多,简直可怕。

github.com/wangshub/we…

具体思路类似:

用adb调试手机获取截图;从截图中识别棋子和目标区块的中心点位置;根据距离计算,长按时间,系数与屏幕分辨率有关;使用adb模拟长按完成跳跃。唉,真可惜,错过了一个好项目。

既然别人已经做到了,那就尝试一些不一样的东西,通过深度学习来解决。

基本思路

的基本流程类似。唯一不同的是如何得到棋子和目标棋子的中心位置。

如果长按时间只取决于棋子和目标棋子的水平位置,那么你只需要知道它们的水平坐标。

在截图中检测棋子等物体,可视为物体检测问题。这里,假设有七种类型的对象:

棋蛋块:包括污水垃圾、魔方魔术、店铺、音乐盒音乐普通块:包括矩形块rect和圆形块circle

模型实现

。我手动标记了500个截图。基于ssd_mobilenet_v1_coco模型和TensorFlow对象检测API,训练好的模型是这样运行的。

一次不成功的深度学习实践 - 微信跳一跳(图2)

可以看到截图中的棋子、魔方、矩形块、圆形块都已经检测出来,每个检测结果包括三个部分:

用矩形标记的对象的位置对应于四个ymin、xmin、ymax、xmax;品类,为上述七大品类之一;检测置信度越高,模型对检测结果越有信心。这不仅仅是一个简单的规则检测,而是真正看到截图中有哪些对象,每个对象是什么。

因此,接下来,我们只需要从检测结果中获取棋子的位置和顶部非棋子对象即目标块的位置。

有了物体的边界轮廓,取中点即可得到棋子和目标块的水平坐标,这里归一化,即屏幕宽度为1,距离在0到1之间。然后将距离乘以一个系数,作为长按时间,模拟执行。

运行结果

看起来很不错。实际分数是多少?

只能达到几百点。有什么问题?

主要原因是标注数据太少,模型训练不够,检测结果不够准确,有时无法检测到棋子和目标块。一旦出现这种问题,分数就会被打破。

尝试了以下方法,将一张截图进行了不同方向的翻译,得到了9张截图,希望提高测试结果的召回率,但还是有无法检测到的情况,或许这个问题只能通过更多的标注数据来解决。

规则检测

型号训练了20W轮,但还是有一些无法检测到的情况。很郁闷,就写一个基于规则的简单代码吧。

写代码不到20分钟,用OpenCV提取边缘,然后检测棋子和目标块的水平中心位置。结果是这样的。

一次不成功的深度学习实践 - 微信跳一跳(图3)

原来,最终的分数比之前的模型高很多.

深度学习呢?

一次不成功的深度学习实践 - 微信跳一跳(图4)

总结

当面临以下情况时,基于手动经验定义规则比使用深度学习训练模型更加省力和有效:

问题本身比较简单,不需要复杂的抽象;标注数据有限,难以对模型进行充分训练;对错误的惩罚非常高,错误是不能容忍的。即使模型在99%的情况下都能完美工作,1%的错误会立即直接结束游戏,这还不如硬代码的规则可靠。当然,如果我们能够共同努力,获得更多的标注数据,或许还是有希望的。

Github上的代码:github.com/Honlan/wech…

不说了,我继续刷分,用不到一百行的代码写完以后再说.

版权声明:一次不成功的深度学习实践——微信跳转是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。