上一篇文章,简单介绍了一下Python框架下如何去玩跳一跳 AlphaJump - 如何用机器学习去玩微信小游戏跳一跳(一)。
主要通过判断下一跳的位置和棋子的距离来计算屏幕按压时间,使得棋子可以精准的抵达下一跳的位置。
不同屏幕对应的系数并不一样,这里给出1080*1920下的参数和公式
这一篇主要介绍如何使用Tensorflow的物体识别的API去检测跳一跳中的物体以及搭建自己的识别别框架用于。
由于之前不小心搞坏了linux环境以及最近特别多的漏洞需要各种研究分析一直没机会处理,最近终于用闲暇时间在window上搭建起来。赶紧把文补上。先来上一下基础环境配置
在你准备好python3.5 以及 tensorflow 后。就可以开始安装object_detection 了。由于涉及的类和库非常的多,分离起来十分困难,直接下载tensorflow下的models。以后学习研究也非常方便。
官方的安装说明 installation
也可以按照我的来
添加PYTHONPATH环境变量
测试
python models/research/object_detection/builders/model_builder_test.py
此时如果提示 ImportError: No module named 'object_detection' 在该文件头部添加以下三行
-
import sys
sys.path.append("E:/models/research/object_detection")
sys.path.append("E:/models/research")
Ran 11 tests in 0.047s
OK
测试通过 此时准备工作基本完整完成,接下来要搭建我们识别程序的框架。我在这篇文章中说过 使用TensorFlow自动识别验证码(一) 深度学习的基本思路是
我们框架也是依据此来建立目录
为了简单,我这里把图片的物体分为两种
但 tensorflow 并不能直接识别图片,需要一种叫tfrecord格式的才可以进入模型训练。
在目录 models\research\object_detection\dataset_tools 下提供了多种的格式转换工具。
这里我选择的 datitran 使用的采样方式 。
我这里一共手工标注了250张的图片。 把这些图片和XML分成两份,一份34,一份216 分别放到
把 在 datitran 下载回来的 xml_to_csv.py 文件放到 objectdecting_wechatjump 目录下
把 models\research\object_detection\dataset_tools 下的 create_pascal_tf_record.py 稍作修改
至此 我们的采样数据完成了,接下来是创建一个识别模型
这里我们不需要自己创建识别模型,因为我们用的就是tensorflow基于COCO数据集提供的几种识别模型 下载地址
这里我们选择最快的 ssd_mobilenet_v1_coco
下载回来后解压,文件列表如下
saved_model[dir]
checkpoint
frozen_inference_graph.pb
model.ckpt.data-00000-of-00001
model.ckpt.index
model.ckpt.meta
这是一个识别模型最终的输出结果。我们最后训练也会导出同样的文件结构。
其中frozen_inference_graph.pb就是训练结果,里面已经包含了多种的识别。
model.ckpt
前缀的文件就是训练模型,我们把
三个文件放到 objectdecting_wechatjump\modle\train_set目录下作为我们训练的初始模型。
在train_set 新建 object-detection.pbtxt
仿照 models\research\object_detection\data 下的pbtxt格式
写上刚才的物体标签
item {
id: 1
name: 'movtarget'
}
item {
id: 2
name: 'jumptarget'
}
保存为 object-detection.pbtxt 也放到 objectdecting_wechatjump\modle\train_set 目录下。
到models\research\object_detection\samples\configs 目录下 把训练配置参数配置文件 ssd_mobilenet_v1_pets.config 复制到 objectdecting_wechatjump\modle\train_set 下
修改以下参数
本来此处,我们的训练模型已经配置完成,可以进入下一步的训练阶段。
但实际上,开始训练的时候往往训练一阵子就内存耗光直接奔溃了程序,无法继续。
查阅了好多资料和源码后,最终发现配置项中需要添加和修改如下参数:
在 train_config: 中
至此,辛苦的活都做完了。接下来就是训练模型阶段。
我们先来看一下当前目录的情况
我们的识别框架基本成型,训练模型非常简单,直接调用原生的训练文件train.py即可
执行 python models/research/object_detection/train.py
开始后会显示步数和lost信息
使用 tensorboard --logdir="objectdecting_wechatjump/modle/train" 可以看到界面的训练情况
在目录 objectdecting/modle/train 下 我们已经可以看到模型生成了
在我的970训练了1个多小时后,步数抵达到了24425,来试试导出模型 测试一下
把 models\research\object_detection\sexport_inference_graph.py的导出文件 拷贝到
objectdecting_wechatjump目录下 。
执行 python export_inference_graph.py
参数
导出完成后,如图,和我们下载的ssd_mobilenet_v1的模型一样的结构
接下来我们写一下验证文档,总体思路是
保存为checkmodel.py 。 具体我就不贴代码了 ,稍后会在我的github上同步。github.com/wstart
测试结果如下
基本上完整识别了所有的目标。只需要取Y轴最高的jumptarget和movtarget的中心点,然后通过时间计算系数,就可以完美的跳了。 最高纪录好像22000,后来就停了,不过微信已经把我加入黑名单了,没办法更新分数。
使用tensorflow物体识别可以快速定位移动物体。但是不是最后的一步,定位到物体后还需要检测一下物体是否标准,再去确定中心点的位置。否则很容易因为识别误差问题导致计算中心点识别导致崩盘。
要获取大量的图样,前期需要采集足够多的样本,训练的进度才高。除了一开始的基础框架要跳的足够远以外,起码要500以上,才会出现小圆点,还可以通过破解小程序包,修改源代码来给自己生成奇葩的样本。
tensorflow使用的属于 RCNN 这种算法还是源于CNN。原理可以参考 使用TensorFlow自动识别验证码(三)--- CNN模型的基础知识概述以及模型优化
最新的物体检测算法是YOLO(You only look once),号称实时物体检测,等待测试。环境部署十分简单。 等下一次小游戏上线再测试。
后续代码 测试图 模型等会更新到我的github上, wechat_AlphaJump