【FlappyBird小游戏】编写AI逻辑(一)——RL系统和数据预处理

提示:如果本文对您有帮助,欢迎点赞支持!


文章目录

前言

一、强化学习系统

二、帧数据的预处理

1、抓取帧图像

2、预处理初始状态

3、预处理下一状态


前言

我们的目标是训练小鸟尽可能地保持存活通过更多的管道障碍物从而最大化游戏得分。当很难完全罗列预定的行为进行编程时,就可采用强化学习方式。

我们计划设计一个强化学习系统,其中Q函数通过一个卷积神经网络(深度Q网络)来模拟,其输入是原始像素,输出是一个评估未来奖励的价值函数,通过该价值函数来指导智能体采取动作。深度Q网络的训练是提取游戏运行的图像,并输出从可采取的操作集合中提取的必要执行动作。这相当于一个分类问题,不过与常见的分类问题不同,这里无法使用带标记的数据来训练模型,而是可以采用强化学习,根据执行游戏并基于所观察到的奖励来评价一个给定状态下的动作,以此来进行模型训练。

一、强化学习系统

强化学习系统设计

类别

简介

程序实现

环境

Flappy Bird游戏环境

 使用Pygame库进行实现

智能体

具备AI大脑的Bird对象

 使用Nature DQN的算法进行训练

动作

煽动翅膀向上飞(a=1)或不做任何动作受重力下坠(a=0 )

 使用OneHot编码的数组形式,[1,0]表示a=0,[0,1]表示a=1

状态

若干(HistoryLength=4)帧画面

使用opencv-python库进行帧画面预处理,其最终shape=[80,80,4]

奖励函数

小鸟通过管道则得到一个奖励rewardPass=0.1; 

小鸟死亡结束则得到一个奖励rewardDie=-1.0;

小鸟每帧存活则得到一个奖励rewardAlive=0.1。

——

二、帧数据的预处理

1、抓取帧图像

获取基于PyGame的游戏窗口的每一帧渲染的画面:

image_data = pygame.surfarray.array3d(pygame.display.get_surface())

其中pygame.display.get_surface() 用于获取当前显示的Surface对象,其中Surface对象是Pygame 中用于表示图像的对象。

pygame.surfarray.array3d() 将像素的RGB的颜色整数值拷贝到是一个三维数组中。

2、预处理初始状态

初始状态是抓取的第1帧图像,但是我们的状态需要连续4帧,这里我们直接将第一帧图像重复4次作为获取的游戏初始状态:

# 预处理函数,获取初始状态
def get_init_state(self, x_rgb):
    x_rgb = cv2.resize(x_rgb, (80, 80))  # 将RGB图像进行缩放
    x_gray = cv2.cvtColor(x_rgb, cv2.COLOR_BGR2GRAY)  # 将RGB图像转换为灰度图像
    ret, x_t = cv2.threshold(x_gray, 1, 255, cv2.THRESH_BINARY)  # 将灰度图像进行二值处理,将大于等于1的索引变化为255,等于0的不变
    state = np.stack((x_t, x_t, x_t, x_t), axis=2)  # 将一帧图像拼接,使得图片的维度为[80, 80, 4]
    return state

其中np.stack((x_t, x_t, x_t, x_t), axis=2)将一帧图像拼接,使得图片的维度为[80, 80, 4],其中参数(x_t, x_t, x_t, x_t) 表示需要进行串接的图片, axis = 2 表示在第三个维度上进行串接操作。

3、预处理下一状态

同样获取游戏下一状态的相关函数如下:

# 预处理函数,将当前状态和新一帧画面处理成新状态
def get_next_state(self, state, x_rgb):
    x_rgb = cv2.resize(x_rgb, (80, 80))  # 将RGB图像进行缩放
    x_gray = cv2.cvtColor(x_rgb, cv2.COLOR_BGR2GRAY)  # 将RGB图像转换为灰度图像
    ret, x_t = cv2.threshold(x_gray, 1, 255, cv2.THRESH_BINARY)  # 将灰度图像进行二值处理,将大于等于1的索引变化为255,等于0的不变
    x_t = np.reshape(x_t, (80, 80, 1))  # 将维度转换为(80, 80, 1)
    next_state = np.append(x_t, state[:, :, :3], axis=2)  # 与上一个图片状态的前3帧图片进行串接操作
    return next_state

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔法攻城狮MRL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值