摘要:本暫且稱之為借鑒了美國死宅的方案,只使用截圖捕捉的畫面以模擬攝像頭數據作為的輸入,并沒有真實的智能駕駛所涉及的傳感器與雷達數據。在游戲中人為駕駛小時,將每一幀圖片以及其所對應的操作向量記錄在數據集張量中。每幀保存一次數據集設置為暫停鍵。
項目介紹
場景足夠豐富,操作足夠簡單,有大量的交通工具和駕駛視角可供選擇,游戲《Grand Theft Auto 5》是一個相對廉價且適合初級人工智能探索的自動駕駛試驗場。
本AI(暫且稱之為ScooterV2)借鑒了美國死宅Harrison Kinsley的Charles方案,只使用截圖捕捉的畫面以模擬攝像頭數據作為AI的輸入,并沒有真實的智能駕駛所涉及的傳感器與雷達數據。AI的決策過程目前只停留在CNN(AlexNet)對單張圖片進行分類選擇操作的階段,尚未引入記憶,無法處理時間序列數據,因而相比于引入循環神經網絡,目前的ScooterV2任然需要大量的數據進行fit訓練(目前已完成的ScooterV3采用了強化學習,不需要任何訓練數據集,但是由于駕駛場景過于復雜,尚未設計出完美的獎勵機制,雖然降低了訓練成本但是效果不如目前的V2版本)。
但由于機能限制和存儲能力限制(其實是因為不想花太多訓練時間,以及經常改方案、丟數據、丟模型),ScooterV2相對于Charles做了一些簡化:
Charles的駕駛載體為民用車(GTA5搶劫神車Kuroma裝甲轎車),視角為引擎蓋視角(為了模擬真實的攝像頭),設計目標為保證在當前道路上保持車道行駛的同時盡量避開障礙物(由于Kuroma裝甲車速度很快,避開障礙物主要以變道的形式完成),且仿制出了許多真實的智能駕駛模塊(前碰撞預警、障礙物探測、行人檢測)。
我做的ScooterV2駛載體為摩托車(DoubleT),視角為第三人稱視角(為了看到更大的場景區域,為了捕捉到的車道線斜率范圍更大,期望以更小的樣本量在更少的時間訓練出足夠好的效果),設計目標為在當前道路上保持車道行駛(使用Mod屏蔽了所有交通和行人),且沒有設計其他模塊(由于機能限制,串聯其它CNN模塊會成倍增加單幀處理時間,使得模型的測試效果不美觀)。
模型的訓練分為三個部分:
數據集制作:監督式學習,數據集分為input data和label,其中輸入數據為經過灰度處理、區域屏蔽和大小縮放的圖像數據,截取自1280720分辨率的GTA5游戲畫面,縮放為16090的大小;標簽數據為每一個圖像樣本對應的1*3規格的操作向量,分別代表向左、向右、前進(Press A/W/D)。在游戲中人為駕駛5小時,將每一幀圖片以及其所對應的操作向量記錄在數據集張量中。數據集分5批錄制完成,對不同操作所對應的圖片進行數量平衡(W:A:D = 8:1:1)打亂數據集后取1000張圖片作為測試集,其他的為訓練集。
訓練模型:創建AlexNet初始網絡,對保存下來的數據集進行擬合。總共進行了約240000次權值更新,學習耗時3天左右。
測試模型,用getkey函數與keycheck函數定義操作向量與按鍵聯系,用訓練好的AlexNet對捕捉到的圖片進行分類預測,執行當前類別對應的按鍵操作以進行駕駛。
制作數據集導入依賴庫:
import numpy as np import cv2 import time from grabscreen import grab_screen from getkeys import key_check import os
cv2進行圖像處理;time用來記錄單幀的處理時間;grab_screen從現有的py文件中導入,作用是截取屏幕上的一定區域;key_check用來處理當前幀的操作按鍵,將其轉化為向量。
定義屏蔽函數:
vertices = np.array([[1,60],[1,89],[159,89],[159,60],[80,35],], np.int32) def roi(img, vertices): mask = np.zeros_like(img) cv2.fillPoly(mask, vertices, 255) masked = cv2.bitwise_and(img, mask) return masked
為了減少圖像無用區域對訓練過程的影響,需要將圖像上方天空區域以及兩側街景進行涂黑屏蔽。
vertices定義了一個區域,roi函數將此區域外的像素用255灰度涂黑。
將操作轉化為標簽向量:
def keys_to_output(keys): output = [0,0,0] if "A" in keys: output[0] = 1 elif "D" in keys: output[2] = 1 else: output[1] = 1 return output
若按鍵A,則標簽向量為[1,0,0];
若按鍵d,則標簽向量為[0,0,1];
否則,則標簽向量為[0,1,0];
數據集錄制:
file_name = "training_data_X.npy" if os.path.isfile(file_name): print("File exists, loading previous data!") training_data = list(np.load(file_name)) else: print("File does not exist, starting fresh!") training_data = []
初始化空數據集,其中"training_data_X.npy"中的X應用數字表示當前錄制批次。
def collect(): for i in list(range(10))[::-1]: print(i+1) time.sleep(1) last_time = time.time() paused = False while True: if not paused: screenshot = grab_screen(region=(0,32,1280,752)) print("Frame took {} seconds".format(time.time()-last_time)) last_time = time.time() screen = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY) screen = cv2.resize(screen, (160,90)) screen = roi(screen, [vertices]) keys = key_check() output = keys_to_output(keys) training_data.append([screen,output]) cv2.imshow("window2",screen) if cv2.waitKey(25) & 0xFF == ord("q"): cv2.destroyAllWindows() break if len(training_data) % 5000 == 0: print(len(training_data)) np.save(file_name,training_data) keys = key_check() if "T" in keys: if paused: paused = False print("unpaused!") time.sleep(1) else: print("Pausing!") paused = True time.sleep(1)
加入倒計時,在執行程序與開始錄制數據集之間留下10秒空余,用以調整姿態與視角。
截取大小為1280*720的游戲區域,并對其進行縮小、灰化和屏蔽操作。
用key_check提取當前操作按鍵,并用函數轉化為標簽向量,與處理過的圖片一起append到數據集中。
每5000幀保存一次數據集;設置T為暫停鍵。
平衡數據:
import numpy as np import pandas as pd from collections import Counter from numpy.random import shuffle train_1 = np.load("training_data_1.npy") print("done1") train_2 = np.load("training_data_2.npy") print("done2") train_3 = np.load("training_data_3.npy") print("done3") train_4 = np.load("training_data_4.npy") print("done4") train_5 = np.load("training_data_5.npy") print("done5") train = np.concatenate([train_1,train_2,train_3,train_4,train_5]) lefts = [] rights = [] forwards = [] shuffle(train) for data in train: img = data[0] choice = data[1] if choice == [1,0,0]: lefts.append([img,choice]) elif choice == [0,1,0]: forwards.append([img,choice]) elif choice == [0,0,1]: rights.append([img,choice]) else: print("no matches") forwards = forwards[:8*len(lefts)][:8*len(rights)] lefts = lefts[:len(forwards)] rights = rights[:len(forwards)] final_data = forwards + lefts + rights shuffle(final_data) np.save("training_data_after_shuffle.npy", final_data)
將5批數據集合并在一起后進行隨機排序,并依據不同的標簽劃分為3個數組,按一定的比例進行截取后合并再進行隨機排序,最后保存為training_data_after_shuffle.npy文件
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40977.html
摘要:智能駕駛源碼詳解二模型簡介本使用進行圖像分類前進左轉右轉。其性能超群,在年圖像識別比賽上展露頭角,是當時的冠軍,由團隊開發,領頭人物為教父。 GTAV智能駕駛源碼詳解(二)——Train the AlexNet 模型簡介: 本AI(ScooterV2)使用AlexNet進行圖像分類(前進、左轉、右轉)。Alexnet是一個經典的卷積神經網絡,有5個卷積層,其后為3個全連接層,最后的輸出...
摘要:目前每年全球有萬人死于車禍,損失,相關于很多國家的,自動駕駛可以很大效率的減少車禍,拯救生命。美國汽車工程師協會和美國高速公路安全局將自動駕駛技術進行了分級。特定場所的高度自動駕駛。這叫基于規則的一種自動駕駛,簡單的。 來自 GitChat 作者:劉盼更多IT技術分享,盡在微信公眾號:GitChat技術雜談 進入 GitChat 閱讀原文我們先以汽車在現代科技領域的演進來開始這次的ch...
摘要:了解華為海思的方案海思的前身是華為的半導體部門,主要產品線包括智能手機處理器麒麟系列,視頻采集和編解碼處理器系列,無線通信方向芯片等。 目錄 一、視頻行業1、視頻...
閱讀 2655·2021-11-24 10:44
閱讀 1896·2021-11-22 13:53
閱讀 1907·2021-09-30 09:47
閱讀 3704·2021-09-22 16:00
閱讀 2431·2021-09-08 09:36
閱讀 2312·2019-08-30 15:53
閱讀 2791·2019-08-30 15:48
閱讀 976·2019-08-30 15:44