如今,人工智能正在火速切入各个领域,比如电商、金融、交通、医疗、教育、安防,国内外各大公司纷纷成立相关AI研究院,加速AI的发展速度。国务院印发《新一代人工智能发展规划》(以下简称《规划》),提出了面向2030年我国新一代人工智能发展的指导思想、战略目标、重点任务和保障措施,部署构筑我国人工智能发展的先发优势,加快建设创新型国家和世界科技强国。其次也明确了我国新一代人工智能发展的战略目标:到2020年,人工智能总体技术和应用与世界先进水平同步,人工智能产业成为新的重要经济增长点。
对于和生活密不可分的游戏来说,也在AI领域上取得一步步发展。在广义上说,大多数游戏都包含一些人工智能(AI)的运用。例如,开发人员多年来都使用AI来给游戏中无数的人物以生命力,从经典的街机游戏Pac Man的鬼魂到第一人称射击游戏中的机器人,还有很多其他游戏。各种各样的游戏类型和游戏人物对什么是游戏AI给出了一个相当广泛的解释。事实上,AI也在其他传统的科学领域得到广泛的运用。
可以想象游戏AI应用领域的广泛程度,所以也就诞生这个项目,利用当下最火之一的深度强化学习技术,结合serpentai框架、以yolo算法为核心算法的游戏智能化项目。在游戏中,我们不一定对给参与游戏的机器方以人水平的智能感兴趣。也许我们可通过写代码来控制非人类的生物,比如龙、机器人,甚至老鼠。另外,谁说我们必须赋予机器方智慧呢?不赋予机器方智慧以增加游戏内容的多样性和丰富性。虽然游戏AI经常被呼吁解决相当复杂的问题,但我们可以利用AI去尝试给机器方以个性模样、不同的性格,或塑造情感和各种性情,如,害怕,焦虑,等等。
在我看来,游戏AI目前还是比较傻的,至少还没有想象中的“智能”,他是按照人给的定义,完成某种特定的行为,并且记忆这种行为,以至于实现最终的目标,也就是对高度定制化的智能游戏体验,这也会是我们努力的方向。
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。
4.cd darkflow进入darkflow目录,并安装:python3 setup.py build_ext –inplace,如图2.2。
5.pip3 install .
1.由于整个框架需要在anaconda下进行,所以要先安装anaconda,Windows下安装Anaconda3,这里安装在I:\Anaconda3。一步步点击下一步即可安装成功。同时也把visual studip 2013安装完成,如图2.3。
2.打开anconda prompt为Serpent.AI 创建一个Conda虚拟环境,命令如下:conda create --name serpent python=3.6,如图2.4。
3.为 SerpentAI 项目创建一个目录,命令如下:mkdir SerpentAI && cd
SerpentAI
4.如图2.5,启动 Conda 虚拟环境,命令如下:activate serpent
5.开始安装 Serpent.AI返回你原来为自己创建的Serpent.AI 项目目录,
确保你在Conda 虚拟环境下。如图2.6,运行命令 pip install SerpentAI,等待系统自动安装完毕,出现setup success即说明安装成功。
三、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卷积层简单替代。
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。
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"
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"
#启动游戏程序的路径
2.修改好serpent_DNF_game.py文件后,就可以在框架下启动游戏,启动命令提示符,启动虚拟环境,输入 serpent launch DNF,就会出现如图5.2界面,游戏启动,且移动到左上角位置。
3.前面介绍了配置以及理论,接下来最重要的一部分便是对数据集的训练了,训练处model,以便于英雄自动识别出当前的状态,再写脚本控制英雄做出相应的行为。
执行训练命令即可出现如图5.3数据训练界面:
flow --modelcfg/yolo-tiny-dnf.cfg –load bin/yolo-tiny.weights
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.启动游戏,输入命令:serpent play DNF
SerpentPlayDNFGameAgent 便会出现如图5.5游戏界面。
这个项目总的来说是用serpentai游戏代理框架,结合yolo目标检测算法,以及深度强化学习的应用技术而进行的。