openai/gym中的影象預處理
阿新 • • 發佈:2018-12-15
openai/gym中的影象預處理
之前讀強化學習的文章,提到對gym模擬器的影象進行預處理,每4張圖片生成一個(84,84,4)的tensor,但是在網上沒有搜到具體的實現,因此寫一個預處理的函式,用到了cv2,這個模組需要安裝opencv-python這個庫
步驟如下:
- resize:4個圖片,每個圖片的shape為(210,160,3),resize為(84,84,3)
- 灰化:由(84,84,3)變為(84,84,1)
- 歸一化:資料型別從[0,255]的uint8,變為[0.0,1.0]的float32
- concat:將4個圖片連線為1個(84,84,4)的tensor
程式碼如下:
import matplotlib.pyplot as plt
import gym
import numpy as np
import cv2
# 輸入 N個3通道的圖片array
# 輸出:一個array 形狀 (84 84 N)
# 步驟: 1. resize ==>(84 84 3)[uint 0-255]
# 2. gray ==> (84 84 1) [uint 0-255]
# 3. norm ==> (84 84 1) [float32 0.0-1.0]
# 4. concat ===>(84 84 N) [float32 0.0-1.0]
def imgbuffer_process(imgbuffer, out_shape = (84, 84)):
img_list = []
for img in imgbuffer:
tmp = cv2.resize(src=img, dsize=out_shape)
tmp = cv2.cvtColor(tmp, cv2.COLOR_BGR2GRAY)
## 需要將資料型別轉為32F
tmp = cv2.normalize(tmp, tmp, alpha=0.0, beta=1.0, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
# 擴充一個維度
tmp = np.expand_dims(tmp, len(tmp.shape))
img_list.append(tmp)
ret = np.concatenate(tuple(img_list), axis=2)
#print('ret_shape = ' + str(ret.shape))
return ret
def test():
env = gym.make('Breakout-v4')
env.seed(1) # reproducible
# env = env.unwrapped
N_F = env.observation_space.shape[0] # 狀態空間的維度
N_A = env.action_space.n # 動作空間的維度
img_buffer = []
img_buffer_size = 4
s = env.reset()
max_loop = 100000
for i in range(max_loop):
a = np.random.randint(0, N_A - 1)
s_, r, done, info = env.step(a)
env.render()
if len(img_buffer) < img_buffer_size:
img_buffer.append(s_)
continue
else:
img_buffer.pop(0)
img_buffer.append(s_)
img_input = imgbuffer_process(img_buffer)
print('img_input_shape = ' + str(img_input.shape))
plt.subplot(2, 2, 1)
plt.imshow(np.uint8(img_input[:, :, 0] * 255), cmap='gray')
plt.subplot(2, 2, 2)
plt.imshow(np.uint8(img_input[:, :, 1] * 255), cmap='gray')
plt.subplot(2, 2, 3)
plt.imshow(np.uint8(img_input[:, :, 2] * 255), cmap='gray')
plt.subplot(2, 2, 4)
plt.imshow(np.uint8(img_input[:, :, 3] * 255), cmap='gray')
plt.show()
if __name__ == '__main__':
test()