Python-代码阅读(1)-funcs.py

1.图像处理的类 ImageProcess

import numpy as np
import sys
import tensorflow as tf  # 导入 TensorFlow 库,用于实现深度学习模型
# convert raw Atari RGB image of size 210x160x3 into 84x84 grayscale image
class ImageProcess():
    def __init__(self):
        with tf.variable_scope("state_processor"):
            self.input_state = tf.placeholder(shape=[210, 160, 3], dtype=tf.uint8)
            self.output = tf.image.rgb_to_grayscale(self.input_state)
            self.output = tf.image.crop_to_bounding_box(self.output, 34, 0, 160, 160)
            self.output = tf.image.resize_images(self.output, [84, 84], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
            self.output = tf.squeeze(self.output)
    def process(self, sess, state):
        return sess.run(self.output, { self.input_state: state })

2.代码阅读

这段代码定义了一个用于图像处理的类 ImageProcess,包含以下几个方法:

①__init__(self): 类的初始化方法,使用 TensorFlow 创建了一个图像处理的计算图。其中包括了一个输入占位符 self.input_state,用于接收输入的原始 Atari RGB 图像;然后将输入图像转换为灰度图像,裁剪图像并缩放为 84x84 的尺寸;最后使用 tf.squeeze 方法去除灰度图像的维度为 1 的维度,以得到处理后的图像 self.output

②process(self, sess, state): 图像处理方法,接收一个 TensorFlow 会话 sess 和一个原始 Atari RGB 图像 state 作为输入。使用 sess.run 方法将输入图像传入计算图中的 self.output,并返回处理后的图像。

这段代码主要用于将原始的 Atari RGB 图像转换为灰度图像,并进行裁剪和缩放,以用于深度强化学习中的神经网络输入。

2.1 tf.variable_scope 函数

with tf.variable_scope("state_processor"):

tf.variable_scope 是 TensorFlow 中用于定义变量作用域的函数。它可以用来对变量进行命名和管理,以便在训练过程中可以复用或共享变量。

在这段代码中,通过 tf.variable_scope("state_processor") 创建了一个名为 "state_processor" 的变量作用域。在这个作用域中,定义了一系列图像处理的操作,包括输入占位符、图像转换为灰度、裁剪和缩放等操作。这样在后续使用这些操作时,可以通过作用域名称来引用这些变量,以便在训练过程中可以复用这些变量,或者在需要时可以共享这些变量。

在 TensorFlow 中,变量作用域还可以用来控制变量的命名空间和作用范围,从而更好地组织和管理模型的参数。例如,可以通过 tf.variable_scope 来指定变量的命名空间,从而可以在训练和推理阶段使用不同的变量值。同时,还可以使用 tf.variable_scope 来定义变量的作用范围,限制变量在某些范围内的可见性,以便更好地控制参数共享的粒度。

2.2 placeholder 

self.input_state = tf.placeholder(shape=[210, 160, 3], dtype=tf.uint8)

self.input_state 是一个 TensorFlow 占位符(placeholder),用于在图像处理过程中接受输入状态数据。具体而言,它是一个形状为 [210, 160, 3] 的三维张量占位符,数据类型为 tf.uint8,表示输入状态数据的形状为高度 210 像素、宽度 160 像素和通道数 3(RGB图像)。

在 TensorFlow 中,占位符是一种特殊的张量,用于在图计算过程中传递外部输入数据。在这里,self.input_state 占位符用于接受输入状态数据,然后将其传递给图像处理过程中的不同操作,例如灰度化、裁剪和缩放等操作。在调用 process 方法时,需要通过字典 { self.input_state: state } 将输入状态数据 state 传递给 self.input_state 占位符,从而将输入状态输入到网络中进行处理。

2.3 tf.image.rgb_to_grayscale 函数

self.output = tf.image.rgb_to_grayscale(self.input_state)

tf.image.rgb_to_grayscale 是 TensorFlow 中的一个图像处理函数,用于将 RGB 彩色图像转换为灰度图像。

在这段代码中,self.input_state 是一个形状为 [210, 160, 3] 的输入图像占位符,表示一个 RGB 彩色图像,其中 210 表示图像的高度,160 表示图像的宽度,3 表示图像的通道数(R、G、B)。tf.image.rgb_to_grayscale 函数接收一个 RGB 图像作为输入,然后将其转换为灰度图像。转换为灰度图像后,self.output 存储了灰度图像的结果,其形状为 [210, 160],通道数变为 1,表示灰度图像只有一个通道。这样可以减少模型的复杂性,从而加速模型的训练和推理过程。

2.4 tf.image.crop_to_bounding_box函数

self.output = tf.image.crop_to_bounding_box(self.output, 34, 0, 160, 160)

tf.image.crop_to_bounding_box 是 TensorFlow 中的一个图像处理函数,用于对图像进行裁剪,只保留指定区域内的像素。

在这段代码中,self.output 存储了经过灰度化处理后的图像,其形状为 [210, 160]tf.image.crop_to_bounding_box 函数接收四个参数:

  • self.output:输入的图像,即待裁剪的灰度图像;
  • 34:表示裁剪后的图像的上边界起始位置,距离图像顶部 34 个像素的位置;
  • 0:表示裁剪后的图像的左边界起始位置,距离图像左侧 0 个像素的位置;
  • 160:表示裁剪后的图像的高度,即裁剪后图像的行数;
  • 160:表示裁剪后的图像的宽度,即裁剪后图像的列数。

经过 tf.image.crop_to_bounding_box 处理后,self.output 中的图像被裁剪为 160x160 的大小,并且去除了上边界的 34 个像素,只保留了裁剪区域内的图像内容。裁剪操作可以用于去除图像中的无关区域,从而减小输入图像的大小,降低模型的计算量。

2.5 tf.image.resize_images函数

self.output = tf.image.resize_images(self.output, [84, 84], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)

tf.image.resize_images 是 TensorFlow 中的一个图像处理函数,用于对图像进行缩放操作,调整图像的大小。

在这段代码中,self.output 存储了经过灰度化和裁剪处理后的图像,其形状为 [160, 160]tf.image.resize_images 函数接收三个参数:

  • self.output:输入的图像,即待缩放的图像;
  • [84, 84]:目标图像的大小,即缩放后图像的高度和宽度,这里设置为 [84, 84]
  • method=tf.image.ResizeMethod.NEAREST_NEIGHBOR:缩放方法,这里设置为最近邻插值法(Nearest Neighbor Interpolation),即将目标图像中的每个像素的值设置为其最近邻像素的值。

经过 tf.image.resize_images 处理后,self.output 中的图像被缩放为 84x84 的大小,从而将图像的尺寸降低到更小的尺寸,以便作为输入输入到模型中进行处理。缩放操作可以用于将图像调整为固定的尺寸,从而满足模型的输入要求或者统一输入数据的尺寸。

2.6 tf.squeeze函数

self.output = tf.squeeze(self.output)

tf.squeeze 是 TensorFlow 中的一个函数,用于从张量中删除尺寸为 1 的维度,从而将张量的维度降低。

在这段代码中,self.output 存储了经过灰度化、裁剪和缩放处理后的图像,其形状为 [84, 84]。由于这里的图像已经是灰度图像且没有通道维度(维度为 1),因此使用 tf.squeeze 函数将张量中的维度为 1 的维度去除,从而将图像的形状降为 [84, 84]

这种操作通常在输入数据预处理阶段进行,以将输入数据的维度调整为符合模型输入要求的形状。在这段代码中,tf.squeeze 函数的作用是确保输入到模型的图像数据的形状符合模型对输入数据的要求。

2.7 process 方法

    def process(self, sess, state):
        return sess.run(self.output, { self.input_state: state })

process 方法接受一个 TensorFlow 会话 (sess) 和一个输入状态 (state) 作为输入。它使用 TensorFlow 会话运行 self.output 张量,并通过字典 { self.input_state: state } 将输入状态 state 传递给 self.input_state 占位符,从而将输入状态输入到网络中进行处理。

具体而言,self.output 是经过灰度化、裁剪和缩放处理后的图像张量,其形状为 [84, 84],并且已经通过 tf.squeeze 函数去除了维度为 1 的维度。state 是一个输入状态,其形状应该与 self.input_state 占位符的形状一致,即 [210, 160, 3]。在调用 sess.run 方法时,通过将 state 输入到 self.input_state 占位符,将输入状态传递给网络进行处理,并返回处理后的图像数据。

注意:在调用 process 方法之前,需要先创建一个 TensorFlow 会话 (sess) 并初始化相关的变量,例如通过 tf.global_variables_initializer() 进行全局变量的初始化。然后,可以通过调用 process 方法并传递输入状态 (state) 来获取经过处理的图像数据。


http://www.niftyadmin.cn/n/232946.html

相关文章

应届生通过Java培训班转行IT有前途吗?

借用邓小平同志曾说过的一句话:科学技术是第一生产力。IT行业作为科技行业中的一员,不管是在自身的发展,还是支持其他行业的发展中都扮演了不可或缺的角色,“互联网”是社会发展的趋势,前途是无限的。而计算机语言是目…

“坑“在亚马逊,我懂了,亚马逊避坑经验分享

新手卖家在亚马逊上容易掉进哪些坑呢?东哥最近和一些卖家朋友聊了聊,发现大家都或多或少踩过亚马逊的坑,导致店铺运营不顺利,效果不佳,赚不到钱。今天东哥就总结了一些亚马逊容易踩的坑,帮助新手卖家们避坑…

赛狐ERP | 亚马逊选品方法与策略详解:如何挑选最优质的产品?

亚马逊作为全球电商巨头,其产品种类之丰富也是无人能及。然而,在如此繁杂的商品体系下,如何选品成为了摆在商家面前的一道难题。本文将从亚马逊选品的目标、方法、策略三个方面进行详细介绍。 一、选品的目标 在进行选择之前,必…

Python|矿产卫片Excel经纬度坐标数据转换为shp点数据——OGR库实现

1.实验需求 基于Excel表格里面的经纬度坐标数据,自动生成点shp矢量文件,并添加属性信息。 2.编程思路详解 ①使用Pandas库读取原始矿产图斑列表表格; xlsx_path = uC:\\Users\\YaoJun\\Desktop\\矿产图斑列表.xlsx #sheet_name默认为0,即读取第一个sheet的数据 df = pd.…

20并发编程

并发编程 并发:指程序的多个部分在同一时间内执行并行:指程序的多个部分在同一时间内在多个处理器上执行。 并发编程中的线程 线程是一种轻量级的进程,他于同一进程中的其他线程共享相同的地址空间和其他资源,但是每个线程都有…

Python3 安装后问题(yum/https)

Python3 安装后yum命令报错 问题: “File "/usr/bin/yum", line 30except KeyboardInterrupt, e:^SyntaxError: invalid syntax”分析: 原 python命令软连接指向linux默认安装的python2.x版本、 安装python3时将原python命令的软连接指向了…

C++基础语法(内存管理)

我们在学习C语言的时候,可以在栈区中使用内存空间,但栈区的空间毕竟很有限而且随着栈的销毁,该栈里的数据都会被销毁掉。因此我们学习了堆,堆的空间比栈要大很多很多,并且堆区空间的数据,只要我们不主动释放…

九龙证券|啤酒龙头一季度净利暴增逾70倍!钛白粉开启年内第三次涨价

业内人士遍及认为,随着下流需求逐渐改进,钛白粉职业景气量有望恢复。 燕京啤酒昨日晚间发布一季度成绩预告,公司2023年一季度预计完成归母净利润6200万至6600万元,同比增加7076.76%至7539.77%。对于成绩变动的原因,燕京…