Atari 游戏训练 -- 2. 基于jupyter,图片处理 + state更新 + 经验回放数据初始化

2023-11-03

帧图片处理 openCV

step1.图片灰度处理

图片灰度处理后,三通道(RGB) ===>> 单通道

两种方式:

  1. 常用的公式对三通道进行处理:ray = R0.299 + G0.587 + B*0.114
  2. openCV 直接灰度处理:img_grey=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
step2.图片剪切,减去非游戏区域
step3.缩小图片至84*84

#别问我图片为什么不灰

import gym
import time
import cv2 
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt         
import matplotlib.image as mpimg   


#chage the image size from 210*160*3 to 84*84
#change the RGB image into grey image

def preprocess(obs):
    img = obs.astype(np.float32)
    
    #step1: a common formula converting  converting RGB images into gray images: 
    #ray = R*0.299 + G*0.587 + B*0.114
    img_grey = img[:, :, 0] * 0.299 + img[:, :, 1] * 0.587 + img[:, :, 2] * 0.114  #shape = (210,160,1)  
    #img_grey=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    print('img_grey shape =', np.shape(img_grey))
    plt.imshow(img_grey) 
    plt.show()
    
    #step2: Crop out the non-game area of the image 
    image_gameArea = img_grey[0:172,:]      #shape = (172,160,1)  
    print('image_gameArea shape =', np.shape(image_gameArea))
    plt.imshow(image_gameArea) 
    plt.show()
    
    #step3: reduce the scale of the picture into 84*84
    image_small = cv2.resize(image_gameArea, (84, 84), interpolation=cv2.INTER_AREA)  # shape(84,84)
    print('image_small shape =', np.shape(image_small))
    plt.imshow(image_small) 
    plt.show()

在这里插入图片描述


state的初始化和迭代

设置定义:
observation:一帧图片
state: state是最近的、连续的4帧图片叠加。
在这里插入图片描述

为什么要叠加4帧图片呢?因为有的游戏需要提取移动趋势特征,比如有两帧相同的图片(相同的observation),游戏角色在相同的位置,但是运动趋势不一样,一个是从左往右移动到这个位置,一个是从右往左移动到这个位置,提取游戏角色的移动趋势特征更有利于训练出准确的动作预测。

由上图可见,state会做为CNN的输入,经过多层卷集处理,输出是各个action对应的Q-value.后面文章会详细说明。

当刚加载游戏时,游戏处于第一帧图片时,这时自然是没有前3帧,怎么办呢?把这一帧图片复制4份叠加。

def init_state(self, obs):
        x = self.preprocess(obs) 
        state_initial = np.stack((x, x, x, x), axis=0)      # shape(4, 84, 84)      
        #print('shape_ state_initial  =', np.shape(state_initial)) 
        return state_initial

之后就不断迭代state:
在每做完一个动作后,会产生reward和next observation,把这个observation添加进state,然后最老的那个observation剔除出去,组成next state

    def next_state(self, state, obs):
        x = self.preprocess(obs)
        #state  = np.reshape(state, (4,84,84))
        next_state = np.append(state[1:, :, :], np.expand_dims(x, 0), axis=0)    # shape(4, 84, 84)
        #print('shape_next_state  =', np.shape(next_state))      
        return next_state

用于经验回放 的经验库的初始化 replay experience initialization

经验回放之后的文章会介绍,这里先说经验数据需要哪些字段
如果你学过Q-learning(Reinforcement Learning 的一种方式), 你就会知道在其学习过程中,会需要: state, action, reward, next_state,这里也一样(就是多个个游戏是否结束的状态done)。

当然一样啦,因为经验回放就是用于Deep Q-learning Network 的学习的。

for epis in range(experience):        
    action = env.action_space.sample()
    obs, reward, done, _ = env.step(action)
    next_state = state_update(state,obs)          #shape_next_state  = (4, 84, 84)
    memory.append((state, action, reward, next_state, done))

附上完整代码,可以跑的那种

import gym
import time
import cv2 
import torch
import torch.nn as nn
import numpy as np
from collections import deque
import matplotlib.pyplot as plt         
import matplotlib.image as mpimg   


#chage the image size from 210*160*3 to 84*84
#change the RGB image into grey image

def preprocess(obs):
    img = obs.astype(np.float32)
    
    # a common formula converting  converting RGB images into gray images: ray = R*0.299 + G*0.587 + B*0.114
    img_grey = img[:, :, 0] * 0.299 + img[:, :, 1] * 0.587 + img[:, :, 2] * 0.114            #shape = (210,160,1)   
    #print('img_grey shape =', np.shape(img_grey))
    #plt.imshow(img_grey) 
    #plt.show()
    
    #Crop out the non-game area of the image 
    image_gameArea = resized_screen = img_grey[0:172,:]      #shape = (172,160,1)  
    #print('image_gameArea shape =', np.shape(image_gameArea))
    #plt.imshow(image_gameArea) 
    #plt.show()
    
    #reduce the scale of the picture into 84*84
    image_small = cv2.resize(image_gameArea, (84, 84), interpolation=cv2.INTER_AREA)   # shape(84,84)
    #print('image_small shape =', np.shape(image_small))
    #plt.imshow(image_small) 
    #plt.show()

    return image_small.astype(np.float32) / 255.0



def init_state(obs):
    x = preprocess(obs) 
    state_initial = np.stack((x, x, x, x), axis=0)      # shape(4, 84, 84)      
    #print('shape_ state_initial  =', np.shape(state_initial)) 
    return state_initial


def state_update(state, obs):
    x = preprocess(obs)
    #state  = np.reshape(state, (4,84,84))
    next_state = np.append(state[1:, :, :], np.expand_dims(x, 0), axis=0)    # shape(4, 84, 84)
    #print('shape_next_state  =', np.shape(next_state))      
    return next_state
    
    
    
experience = 1000  
memory = deque(maxlen=experience)    
env = gym.make('MsPacman-v0')
#print(env.observation_space)

obs = env.reset()  
state = init_state(obs)
#print('state  =', np.shape(state))
            
for epis in range(experience):        
    action = env.action_space.sample()
    obs, reward, done, _ = env.step(action)
    next_state = state_update(state,obs)          #shape_next_state  = (4, 84, 84)
    memory.append((state, action, reward, next_state, done))
        
        
    if done:
        print('done')
        obs = env.reset()               
        state = init_state(obs)             
    else:
        state = next_state
            
    time.sleep(0.05) # sleep for 1 second to observe the whole process
    env.render()      

env.close()


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Atari 游戏训练 -- 2. 基于jupyter,图片处理 + state更新 + 经验回放数据初始化 的相关文章

  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我

随机推荐

  • Python: 删除已安装的模块或包 及 python工具pip的安装和使用

    Python 删除已安装的模块或包 modules or packages 王志 新浪博客 http blog sina com cn s blog 4ddef8f80102v1p8 html 方法一 使用pip 安装pip wget ht
  • MakeItTalk: 让图像开口说话!

    点击上方 机器学习与生成对抗网络 关注 星标 获取有趣 好玩的前沿干货 文自 机器之心 参与 魔王 未经授权 不得二次转载 不仅让真人图像开口说话 油画 素描 漫画等都能动起来 给出一张面部图像和一段音频 能做什么 AI 有办法 比如让图像
  • 基于Pytest+Allure+Excel的接口自动化测试框架

    1 Allure 简介 简介 Allure 框架是一个灵活的 轻量级的 支持多语言的测试报告工具 它不仅以 Web 的方式展示了简介的测试结果 而且允许参与开发过程的每个人可以从日常执行的测试中 最大限度地提取有用信息 Allure 是由
  • 迪赛智慧数——折线图(基本折线图):历届冬奥会中国代表团奖牌榜

    效果图 数据源 静态数据 column 年份 金牌 银牌 铜牌 data 1992 0 3 0 1994 0 1 2 1998 0 6 2 2002 2 2 4 2006 2 4 5 2010 5 2 4 2014 3 4 2 2018 1
  • chrome浏览器无法打开网页怎么办

    chrome浏览器无法打开网页怎么办 第一步 找到 网络 鼠标右键点击 点 属性 进入 网络和共享中心 第二步 点击 internet选项 第三步 点击 连接 点击 局域网设置 第四步 代理服务器点击 取消 如图所示
  • 哈工大2021秋数据结构期末试题

    题目来源 https blog csdn net weixin 52027058 article details 121578432 已经获得该学弟转载的权限 初衷也是希望能够帮助到更多的同学
  • arcgis 发布wmts服务,弹出“服务器未做好发布准备”错误,解法。

    arcgis 发布wmts服务 总弹出 服务器未做好发布准备 之后 到arcgis server manage中找到服务发布工具启动 1 访问并登录管理器 http localhost 6080 arcgis manager 2 找到sys
  • 编译原理-简洁笔记 (一)

    编译原理 文章目录 编译原理 计算机程序语言及编译 编译器在语言处理系统中的位置 编译系统的结构 词法分析 语法分析 概述 语义分析 概述 中间代码生成 文法 上下文无关文法分析树 正则表达式 有穷自动机 计算机程序语言及编译 高级语言 数
  • 各版本Opencv对应的各版本Python安装包

    各版本Opencv的对应的各版本Python安装包 https www lfd uci edu gohlke pythonlibs opencv
  • Windows 10 自带的远程协助工具 快速助手

    概述 之前一直是使用 Teamviewer 来作为远程协助工具 但是最近发现控制端必须要登录账号才能使用 而且还有设备数量上的限制 所以就打算另找一个软件来代替 无意中发现了 原来在 Windows 10中已经内置了一个远程协助的工具 这下
  • 自学C语言(10)define定义常量和宏 内存 指针变量

    文章前言 学的太多 更新的太少了哈哈 总不能把学的忘记了 回顾知识 继续总结 文章目录 一 define定义常量和宏 1 define定义标识符常量 2 define定义宏 二 内存 内存 如何产生地址 计算机32位 二进制 计算机64位
  • css3——transform:rotate(旋转)、scale(缩放)、skew(拉伸)、translate(平移)、transform-origin

    注意 transform是复合属性 拆开写会替代 先平移再旋转和先旋转再平移的结果是不同的 1 CSS3 转换 transform属性可以对元素进行移动 缩放 转动 拉长或拉伸 注意 Internet Explorer 9 要求前缀 ms
  • git配置公私秘钥-小乌龟TortoiseGit

    1 大致步骤简述 1 需要将公钥放到gitLab上 私钥自己保存 2 使用puttygen exe来生成秘钥对 3 在gitLab上设置中配置SSH公钥 一串ssh rsa开头的 2 标题详细步骤 1 生产公私秘钥 安装好git后 右键打开
  • 数据预处理和特征工程

    数据预处理 从数据中检测 纠正 删除损坏的不准确的或者不适用于模型记录的过程 目的 让数据更加适应模型 匹配模型需求 特征工程 将原始数据转换为更能代表预测模型的潜在问题的特征工程 可以通过挑选最相关特征 提取特征以及创造特征来实现 其中创
  • UEeditor 使用 和图片上传

    首先 页面引入UEditor 下载地址 http ueditor baidu com website 页面引入很简单 这里加两个div的原因 是因为在使用中碰到了一个问题 UEditor把我外层的div样式过滤掉了 UEditor会把引入的
  • Android系统编译模块化

    mm指从当前目录开始编译 mmm是从指定目录下搜寻Android mk编译 模块编译完成后 回到source code所在根目录运行make snod进行打包 repo init u https aosp tuna tsinghua edu
  • mysql添加字段

    MySQL添加字段有两种方式 使用 ALTER TABLE 语句或使用 MySQL Workbench 工具 下面分别介绍这两种方法 使用 ALTER TABLE 语句添加字段 ALTER TABLE 语句可以用于修改表结构 包括添加 删除
  • Vue大屏可视化

    文章目录 前言 一 什么是可视化 二 参考资料 1 站酷 2 DataV组件库 3 DataV组件库示例Demo 三 项目实战 总结 前言 自己也使用Vue挺长时间了 之前一直做可视化相关的领域 但也不全是 考虑到如果有一些可视化模板示例可
  • 浅谈APT攻击

    如今高级持续性威胁 Advanced Persistent Threat APT 已成为人尽皆知的 时髦术语 越来越多的企业开始对其高度关注 政府部门也面临着遭受APT攻击的危险 在安全顾问的每一篇分析报告中都会提及它的 大名 众多企业机构
  • Atari 游戏训练 -- 2. 基于jupyter,图片处理 + state更新 + 经验回放数据初始化

    帧图片处理 openCV step1 图片灰度处理 图片灰度处理后 三通道 RGB gt gt 单通道 两种方式 常用的公式对三通道进行处理 ray R0 299 G0 587 B 0 114 openCV 直接灰度处理 img grey