基於影象處理和tensorflow實現GTA5的車輛自動駕駛——第九節獲取影象資料
阿新 • • 發佈:2020-12-16
程式碼已放到碼雲
作者主要說了一下幾點
- 截止到上一節的偽AI,影象處理部分應該是結束了。作者不想深入做影象處理方面,從本節開始他準備使用神經網路訓練
- 優化了程式碼
強烈建議從本節開始新建檔案建立py檔案,為了和以前的部分分開
製作訓練集
- 利用pywin32獲取視窗的資料集
- 利用getkeys.py檔案獲取使用者輸入的按鍵:W(前進),A(左轉),B(右轉),S(後退)
利用pywin32獲取視窗的資料集
注:這個是有人在GitHub上傳了程式碼,以前用的PIL庫獲取影象,但是幀率太低了,作者試了下這個新的程式碼,發現幀率比PIL庫的高,於是採用這個程式碼了
實現程式碼見Gitee專案
使用方法,引用該python檔案,直接呼叫方法就行
from grabscreen import grab_screen
screen = np.array(grab_screen(region=(0, 40, 800, 640)))
獲取的影象轉換為灰度影象(因為灰度影象相比彩色影象資料量少,計算代價較少)
screen = cv2.cvtColor(screen, cv2.COLOR_BGR2GRAY)
獲取的影象改變大小,原來為800*600 轉換為 80, 60。 這樣影象的計算量也變少
screen = cv2.resize(screen, (80, 60))
至此利用pywin32獲取視窗的資料集
步驟完成
利用getkeys.py檔案獲取使用者輸入的按鍵:W(前進),A(左轉),B(右轉),S(後退)
使用方法,引用該python檔案,直接呼叫方法就行
from getkeys import key_check
key = key_check()
# key 為列表,包含使用者press的按鍵(大寫)
本次只考慮 前進,左轉右轉
# [A, W ,D] outPutDatamat = [0, 0, 0] if 'A' in key: outPutDatamat[0] = 1 elif 'W' in key: outPutDatamat[1] = 1 elif 'D' in key: outPutDatamat[2] = 1 # 如果按下了`A`鍵,那麼`outPutDatamat=[1, 0, 0]`
把訓練集結合起來並儲存
注:
- 倒計時完成後會對視窗進行記錄
- 當得到2000幀後結束迴圈,並把200幀的訓練集
test.npy
儲存下來 - 儘量在有左轉右轉的地方進行跑,這樣左轉右轉的資料會多些
i = 3
while i != 0:
print("time:", i)
time.sleep(0.5)
i -= 1
training_data = []
last_time = time.time()
paused = False
print('STARTING!!!')
while True:
if not paused:
screen = np.array(grab_screen(region=(0, 40, 800, 640)))
last_time = time.time()
# run a color convert:
screen = cv2.cvtColor(screen, cv2.COLOR_BGR2GRAY)
# resize to something a bit more acceptable for a CNN
screen = cv2.resize(screen, (80, 60))
# get key datamat
output = get_key()
training_data.append([screen, output])
print(len(training_data))
# cv2.imshow('window', cv2.cvtColor(screen, cv2.COLOR_BGR2RGB))
if len(training_data) % 2000== 0:
np.save('test.npy', np.array(training_data), allow_pickle=True)
break
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
讀取訓練集,檢視是否可以執行
這段程式碼比較簡單,就不解釋了
import time
from grabscreen import grab_screen
import cv2
from getkeys import key_check
import numpy as np
train_data = np.load('test.npy', allow_pickle=True)
for data in train_data:
img = data[0]
choice = data[1]
cv2.imshow('test',img)
print(choice)
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break