V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
mrchi
V2EX  ›  分享创造

[炒冷饭] 自己动手做的微信跳一跳机器人,分数 30 万+

  •  1
     
  •   mrchi ·
    mrchi · 2018-09-11 12:14:56 +08:00 · 4032 次点击
    这是一个创建于 2298 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址: https://github.com/chiqj/WechatJump,Python 语言开发,使用 adb + pillow + opencv + sklearn 实现,目前只支持安卓手机。

    这是一个年初就想动手的项目,期间因为时间原因、技术能力原因,到现在算是完成了。在前人的基础上做了些改进,理论上可以无限运行——只要有时间。

    上个分数截图证明自己所言不虚:

    30 万分数

    特性

    与年初的跳一跳机器人相比,进行了以下改进:

    • adb 截图后图像直接传输给上位机,不经过手机存储和 SD 卡;上位机一直在内存中处理图像,减少 IO 耗时,提高效率。
    • 使用上一次截图的目标棋盘(也是本次截图的起始棋盘)作为模版,使用 OpenCV 模版匹配寻找起始棋盘的中心坐标,根据中心坐标和棋子中心坐标的相对位置、上次计算的跳跃距离计算实际跳跃距离。替代其他项目中在“跳跃后视角平移前”进行截图的方法,不需要反复尝试调整合适的 “ Magic Number ”,且每次跳跃只需截图一次。简而言之,省力✌️,提高准确性,提高效率;
    • 为加快运行速度,只在程序初始化时训练模型,但程序运行时输出的数据可用于回归模型训练。
    • 计算两点间距离时,使用两点在跳跃方向(与水平线夹角 30 度)上的投影距离,与欧式距离相比更加精确。即下图中 OB 的距离(图片来源:腾讯 WeTest 团队):

    投影距离

    使用的技术和库

    • OpenCV —— 模版匹配,Canny 边缘检测
    • Pillow —— ImageDraw 模块
    • sklearn —— 线性回归,多项式回归

    回归模型

    线性回归

    线性回归

    多项式回归(degree=7)

    多项式回归

    踩过的坑

    1. 由于图像坐标系从左上角开始,Y 轴在向下的方向上是递增的,所以斜率与普通直角坐标系相反。也就是说,从左下到右上方向的直线实际为负斜率。
    2. OpenCV 模版匹配对缩放图片处理效果不好,导致从小程序文件解包出来的棋子图像无法使用,必须获取当前分辨率下的棋子图像和中心点图像作为模版;

    最后,反对一切使用外挂的行为,该项目只为学习目的,没有加入反作弊代码,以后也不会有:)

    第 1 条附言  ·  2018-09-11 13:07:51 +08:00
    20 条回复    2018-09-11 22:15:34 +08:00
    ShineSmile
        1
    ShineSmile  
       2018-09-11 13:31:34 +08:00 via Android
    newbee.class
    kethylar
        2
    kethylar  
       2018-09-11 14:17:11 +08:00
    newbee.jpg
    mrchi
        3
    mrchi  
    OP
       2018-09-11 14:21:59 +08:00
    @ShineSmile
    @kethylar

    谢谢称赞,欢迎 star/fork/提 issue 哈 😏
    ZiLong
        4
    ZiLong  
       2018-09-11 14:46:11 +08:00
    interesting.rmvb
    swkl86
        5
    swkl86  
       2018-09-11 14:52:13 +08:00 via Android
    Cool.avi
    voidless
        6
    voidless  
       2018-09-11 15:00:52 +08:00
    DIO.WRYYYYY
    carpediemvv
        7
    carpediemvv  
       2018-09-11 15:08:56 +08:00 via Android
    地址挂了?
    mrchi
        8
    mrchi  
    OP
       2018-09-11 15:12:53 +08:00
    @carpediemvv 没有,v2 的网址自动识别把逗号后面的也识别进去了。地址是: https://github.com/chiqj/WechatJump
    xiangchen2011
        9
    xiangchen2011  
       2018-09-11 16:38:51 +08:00
    Hilong
        10
    Hilong  
       2018-09-11 16:47:49 +08:00 via Android
    1949.js
    zcjwxf
        11
    zcjwxf  
       2018-09-11 16:56:14 +08:00
    当年我做这个脚本的时候,边缘检测你知道怎么找的吗?没错!遍历像素点,判断颜色差别率,做出了边缘检测其他都是菜~
    raycool
        12
    raycool  
       2018-09-11 17:01:51 +08:00
    最开始的训练数据怎么来的?手动跳的么
    mrchi
        13
    mrchi  
    OP
       2018-09-11 17:25:53 +08:00
    @zcjwxf 最早开始造轮子的兄弟么?致敬,能有今日的分数都是踩在你们的肩膀上:)
    mrchi
        14
    mrchi  
    OP
       2018-09-11 17:29:26 +08:00
    @raycool 上一版的机器人是在另外地方进行线性回归模型训练,代码里只指定了 k 和 b 两个变量。那个时候 k 和 b 都是猜的,只要能跳的中且能确定位置,就有数据了。
    sangmong
        15
    sangmong  
       2018-09-11 17:44:37 +08:00
    游戏中存在可疑行为,该结果不予显示。。。
    xxxy
        16
    xxxy  
       2018-09-11 17:53:44 +08:00
    有用强化学习做的吗?
    mrchi
        17
    mrchi  
    OP
       2018-09-11 18:05:02 +08:00
    @sangmong 是的,没有反作弊。
    mrchi
        18
    mrchi  
    OP
       2018-09-11 18:06:51 +08:00
    @xxxy 目前还没有,机器学习我才刚刚入门,就只用了比较简单的回归算法。老哥要不要自己实现一个?
    zcjwxf
        19
    zcjwxf  
       2018-09-11 22:04:13 +08:00
    @raycool 这种东西还要训练数据?单纯的线性关系,只要你找对 3 个点(小人底部中心、目标顶部边缘 xy、目标侧边 xy ),然后找出按压时间和距离的系数,我可以告诉你是 2 (不同算法可能是 10 的几次关系),你说的是训练找边缘?
    mrchi
        20
    mrchi  
    OP
       2018-09-11 22:15:34 +08:00
    @zcjwxf 他指的训练数据应该是我项目里带的 training_data.txt ,是用来训练回归模型的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1056 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 22:46 · PVG 06:46 · LAX 14:46 · JFK 17:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.