1. 程式人生 > 實用技巧 >基於影象處理和tensorflow實現GTA5的車輛自動駕駛——第九節獲取影象資料

基於影象處理和tensorflow實現GTA5的車輛自動駕駛——第九節獲取影象資料

程式碼已放到碼雲

https://gitee.com/photographer_adam/Based-on-image-processing-and-tensorflow-to-realize-GTA5-vehicle-automatic-driving

作者主要說了一下幾點

  1. 截止到上一節的偽AI,影象處理部分應該是結束了。作者不想深入做影象處理方面,從本節開始他準備使用神經網路訓練
  2. 優化了程式碼

強烈建議從本節開始新建檔案建立py檔案,為了和以前的部分分開

製作訓練集

  1. 利用pywin32獲取視窗的資料集
  2. 利用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]`

把訓練集結合起來並儲存

注:

  1. 倒計時完成後會對視窗進行記錄
  2. 當得到2000幀後結束迴圈,並把200幀的訓練集test.npy儲存下來
  3. 儘量在有左轉右轉的地方進行跑,這樣左轉右轉的資料會多些
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