用SerpentAI游戏代理框架,结合Yolo和Tensorflow技术的小项目

一、绪论

(一)研究背景

如今,人工智能正在火速切入各个领域,比如电商、金融、交通、医疗、教育、安防,国内外各大公司纷纷成立相关AI研究院,加速AI的发展速度。国务院印发《新一代人工智能发展规划》(以下简称《规划》),提出了面向2030年我国新一代人工智能发展的指导思想、战略目标、重点任务和保障措施,部署构筑我国人工智能发展的先发优势,加快建设创新型国家和世界科技强国。其次也明确了我国新一代人工智能发展的战略目标:到2020年,人工智能总体技术和应用与世界先进水平同步,人工智能产业成为新的重要经济增长点。

对于和生活密不可分的游戏来说,也在AI领域上取得一步步发展。在广义上说,大多数游戏都包含一些人工智能(AI)的运用。例如,开发人员多年来都使用AI来给游戏中无数的人物以生命力,从经典的街机游戏Pac Man的鬼魂到第一人称射击游戏中的机器人,还有很多其他游戏。各种各样的游戏类型和游戏人物对什么是游戏AI给出了一个相当广泛的解释。事实上,AI也在其他传统的科学领域得到广泛的运用。

(二)研究意义

可以想象游戏AI应用领域的广泛程度,所以也就诞生这个项目,利用当下最火之一的深度强化学习技术,结合serpentai框架、以yolo算法为核心算法的游戏智能化项目。在游戏中,我们不一定对给参与游戏的机器方以人水平的智能感兴趣。也许我们可通过写代码来控制非人类的生物,比如龙、机器人,甚至老鼠。另外,谁说我们必须赋予机器方智慧呢?不赋予机器方智慧以增加游戏内容的多样性和丰富性。虽然游戏AI经常被呼吁解决相当复杂的问题,但我们可以利用AI去尝试给机器方以个性模样、不同的性格,或塑造情感和各种性情,如,害怕,焦虑,等等。

在我看来,游戏AI目前还是比较傻的,至少还没有想象中的“智能”,他是按照人给的定义,完成某种特定的行为,并且记忆这种行为,以至于实现最终的目标,也就是对高度定制化的智能游戏体验,这也会是我们努力的方向。

二、系统环境搭建

(一)Darkflow配置

1.由于darkflow实现了将darknet翻译成tensorflow,这样就可以用当下流行的深度学习框架tensorflow来加载darknet训练好的模型,并使用tensorflow重新训练,输出tensorflow graph模型。以下是在ubuntu环境下安装配置darkflow。

2.需要安转cython for python3,安装命令为:sudo pip3 install Cython--install-option="--no-cython-compile"

3.下载darkflow:git clonehttps://github.com/thtrieu/darkflow,如图2.1。

图2.1 下载darkflow

 4.cd darkflow进入darkflow目录,并安装:python3 setup.py build_ext –inplace,如图2.2。

5.pip3 install .

图2.2 安装darkflow

 (二)SerpentAI配置

1.由于整个框架需要在anaconda下进行,所以要先安装anaconda,Windows下安装Anaconda3,这里安装在I:\Anaconda3。一步步点击下一步即可安装成功。同时也把visual studip 2013安装完成,如图2.3。

图2.3 安装anconda

2.打开anconda prompt为Serpent.AI 创建一个Conda虚拟环境,命令如下:conda create --name serpent python=3.6,如图2.4。

图2.4 创建虚拟环境

3.为 SerpentAI 项目创建一个目录,命令如下:mkdir SerpentAI && cd

SerpentAI

4.如图2.5,启动 Conda 虚拟环境,命令如下:activate serpent

图2.5 启动虚拟环境成功

5.开始安装 Serpent.AI返回你原来为自己创建的Serpent.AI 项目目录,

确保你在Conda 虚拟环境下。如图2.6,运行命令 pip install SerpentAI,等待系统自动安装完毕,出现setup success即说明安装成功。

图2.6 安装serpentai完毕

三、Yolo算法设计与实现

(一)算法背景

近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast

R-CNN, Faster R-CNN),它们是two-stage的,需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal,然后再在Region Proposal上做分类与回归。而另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个CNN网络直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。

YOLO的速度非常快,也正是由于这个特点,我们团队一致决定基于yolo算法展开项目。因为在玩游戏时候,每一帧的图像都是不一样的,背景也可能有较大差别,所以选择yolo,可以快速识别出场景及人物,进而完成规定的任务。还有就是与Fast R-CNN相比,YOLO在误检测(将背景检测为物体)方面的错误率能降低一半多。此次游戏是DNF(地下城与勇士),背景有时候会和人物比较接近,这时候yolo的优势又体现出来了。YOLO可以学到物体的generalizable representations,可以理解为泛化能力强。在DNF游戏中,要识别出第几关,以及有怪没怪,来判断英雄的行为,可谓是有点难度呢。

(二)yolo解析

接下来,是从理论角度分析yolo本文介绍的是Yolo算法,其全称是You Only Look Once: Unified, Real-Time Object Detection,其实个人觉得这个题目取得非常好,基本上把Yolo算法的特点概括全了:You Only Look Once说的是只需要一次CNN运算,Unified指的是这是一个统一的框架,提供end-to-end的预测,而Real-Time体现是Yolo算法速度快。这里我们谈的是Yolo-v1版本算法,其性能是差于后来的SSD算法的,但是Yolo后来也继续进行改进,产生了Yolo-9000算法。这里主要讲述Yolo-v1算法的原理,特别是算法的训练与预测中详细细节,最后将给出如何使用TensorFlow实现Yolo算法。

YOLO检测网络包括24个卷积层和2个全连接层,如图3.1所示。其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是 使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。

图3.1 yolo网络图

YOLO之前的物体检测系统使用分类器来完成物体检测任务。为了检测一个物体,这些物体检测系统要在一张测试图的不同位置和不同尺寸的bounding box上使用该物体的分类器去评估是否有该物体。如DPM系统,要使用一个滑窗(sliding window)在整张图像上均匀滑动,用分类器评估是否有物体。在DPM之后提出的其他方法,如R-CNN方法使用region proposal来生成整张图像中可能包含待检测物体的potential bounding boxes,然后用分类器来评估这些boxes,接着通过post-processing来改善bounding boxes,消除重复的检测目标,并基于整个场景中的其他物体重新对boxes进行打分。整个流程执行下来很慢,而且因为这些环节都是分开训练的,检测性能很难进行优化。这里设计了YOLO(you only look once),将物体检测任务当做回归问题(regression problem)来处理,直接通过整张图片的所有像素得到bounding

box的坐标、box中包含物体的置信度和class

probabilities。通过YOLO,每张图像只需要看一眼就能得出图像中都有哪些物体和这些物体的位置。如图3.2。

图3.2 yolo模型原理图

四、核心代码设计与实现

(一)serpent_DNF_game的实现

from serpent.game import Game

from .api.api import DNFAPI

from serpent.utilities import Singleton


class SerpentDNFGame(Game, metaclass=Singleton):

    def__init__(self, **kwargs):

       kwargs["platform"] = "executable"

       kwargs["window_name"] = "地下城与勇士"

        #kwargs["window_name"] = "地下城与勇士登录程序"       

       kwargs["executable_path"] = "D:/DNF/TCLS/Client.exe"

(二)serpent_DNF_game_agent的实现

from serpent.game_agent import GameAgent

import offshoot

from serpent.input_controller import KeyboardKey

from serpent.input_controller import MouseButton

fromserpent.machine_learning.context_classification.context_classifiers.cnn_inception_v3_context_classifierimport \CNNInceptionV3ContextClassifier

from random import random, randrange

import csv

fromserpent.machine_learning.darkflow.darkflow.net.build import TFNet

import cv2


import skimage.transform

import skimage.util

import uuid

import skimage.io

import numpy as np

import time


class SerpentDNFGameAgent(GameAgent):

    def__init__(self, **kwargs):

       super().__init__(**kwargs)

       self.frame_handlers["PLAY"] = self.handle_play

       self.frame_handler_setups["PLAY"] = self.setup_play


       self.analytics_client = None

       self.has_paused = False

        #self.pre_contexts = []

       self.pre_context = ''

       plugin_path =offshoot.config["file_paths"]["plugins"]

       self.options = {'model': "./cfg/yolo-voc-dnf-17-3.cfg",'load': -1, "threshold": 0.005}


       self.before = ['sbd', 'ar', 'scbd', 'scbr', 'hm', 'gp', 'gps']

       self.stages = ['m1w', 'm1wo', 'm2w', 'm2wo', 'm3w', 'm3wo', 'm4w','m4wo', 'm5w', 'm5wo', 'm6w', 'm6wo', 'm7w']

       self.go_right = False

       self.index = 0

       self.labels = []

五、模型训练与测试

(一)模型训练与测试

1.配置好 serpentai之后,将class SerpentDNFGame进行一些参数的修改如图5.1:

kwargs["platform"]= "executable"

kwargs["window_name"]

= "地下城与勇士"

# kwargs["window_name"]

= "地下城与勇士登录程序"

kwargs["executable_path"]= "D:/DNF/TCLS/Client.exe"

#启动游戏程序的路径

图5.1 修改配置文件

2.修改好serpent_DNF_game.py文件后,就可以在框架下启动游戏,启动命令提示符,启动虚拟环境,输入 serpent launch DNF,就会出现如图5.2界面,游戏启动,且移动到左上角位置。

图5.2 游戏测试界面

 3.前面介绍了配置以及理论,接下来最重要的一部分便是对数据集的训练了,训练处model,以便于英雄自动识别出当前的状态,再写脚本控制英雄做出相应的行为。

执行训练命令即可出现如图5.3数据训练界面:

flow --modelcfg/yolo-tiny-dnf.cfg –load bin/yolo-tiny.weights

图5.3 数据训练界面

 4.将训练好的model,加载到程序书写好的脚本中,如下图5.4进行的修改SerpentDNFGameAgent:

classSerpentDNFGameAgent(GameAgent):

    def__init__(self, **kwargs):

        super().__init__(**kwargs)

        self.frame_handlers["PLAY"] =self.handle_play

       self.frame_handler_setups["PLAY"] = self.setup_play

        self.analytics_client = None

        self.has_paused = False

        #self.pre_contexts = []

        self.pre_context = ''

        plugin_path =offshoot.config["file_paths"]["plugins"]

        self.options = {'model':"./cfg/yolo-voc-dnf-17-3.cfg", 'load': -1, "threshold":0.005}

图5.4 修改配置文件

5.启动游戏,输入命令:serpent play DNF

SerpentPlayDNFGameAgent 便会出现如图5.5游戏界面。

图5.5 加载训练模型游戏测试

六、总结

这个项目总的来说是用serpentai游戏代理框架,结合yolo目标检测算法,以及深度强化学习的应用技术而进行的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容