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

最近,微信小游戏跳一跳可以说是火遍了全国,从小孩子到大孩子仿佛每一个人都在刷跳一跳,作为无(zhi)所(hui)不(ban)能(zhuan)的AI程序员,我们在想,能不能用人工智能(AI)和计算机视觉(CV)的方法来玩一玩这个游戏?于是,我们开发了微信跳一跳Auto-Jump算法,重新定义了玩跳一跳的正确姿势,我们的算法不仅远远超越了人类的水平,在速度和准确度上也远远超越了目前已知的所有算法,可以说是跳一跳界的state-of-the-art,下面我们详细介绍我们的算法。

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

Prinsphield/Wechat_AutoJumpgithub.com

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

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

” data-caption=”” data-size=”normal” data-rawwidth=”1060″ data-rawheight=”936″ class=”origin_image zh-lightbox-thumb lazy” width=”1060″ data-original=”https://pic3.zhimg.com/v2-b316c887ce6a4165bb35e59c13198a29_r.jpg” data-actualsrc=”https://www.hixianchang.com/wp-content/uploads/2018/20180720/T203208.jpg”>

多尺度搜索(Multiscale Search)

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

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

多尺度搜索的代码长这样

def multi_scale_search(pivot, screen, range=0.3, num=10):    H, W = screen.shape[:2]    h, w = pivot.shape[:2]    found = None    for scale in np.linspace(1-range, 1+range, num)[::-1]:        resized = cv2.resize(screen, (int(W * scale), int(H * scale)))        r = W / float(resized.shape[1])        if resized.shape[0] < h or resized.shape[1] < w:            break        res = cv2.matchTemplate(resized, pivot, cv2.TM_CCOEFF_NORMED)        loc = np.where(res >= res.max())        pos_h, pos_w = list(zip(*loc))[0]        if found is None or res.max() > found[-1]:            found = (pos_h, pos_w, r, res.max())    if found is None: return (0,0,0,0,0)    pos_h, pos_w, r, score = found    start_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]

相关新闻