摘要:本暫且稱之為借鑒了美國死宅的方案,只使用截圖捕捉的畫面以模擬攝像頭數(shù)據(jù)作為的輸入,并沒有真實的智能駕駛所涉及的傳感器與雷達數(shù)據(jù)。在游戲中人為駕駛小時,將每一幀圖片以及其所對應的操作向量記錄在數(shù)據(jù)集張量中。每幀保存一次數(shù)據(jù)集設置為暫停鍵。
項目介紹
場景足夠豐富,操作足夠簡單,有大量的交通工具和駕駛視角可供選擇,游戲《Grand Theft Auto 5》是一個相對廉價且適合初級人工智能探索的自動駕駛試驗場。
本AI(暫且稱之為ScooterV2)借鑒了美國死宅Harrison Kinsley的Charles方案,只使用截圖捕捉的畫面以模擬攝像頭數(shù)據(jù)作為AI的輸入,并沒有真實的智能駕駛所涉及的傳感器與雷達數(shù)據(jù)。AI的決策過程目前只停留在CNN(AlexNet)對單張圖片進行分類選擇操作的階段,尚未引入記憶,無法處理時間序列數(shù)據(jù),因而相比于引入循環(huán)神經(jīng)網(wǎng)絡,目前的ScooterV2任然需要大量的數(shù)據(jù)進行fit訓練(目前已完成的ScooterV3采用了強化學習,不需要任何訓練數(shù)據(jù)集,但是由于駕駛場景過于復雜,尚未設計出完美的獎勵機制,雖然降低了訓練成本但是效果不如目前的V2版本)。
但由于機能限制和存儲能力限制(其實是因為不想花太多訓練時間,以及經(jīng)常改方案、丟數(shù)據(jù)、丟模型),ScooterV2相對于Charles做了一些簡化:
Charles的駕駛載體為民用車(GTA5搶劫神車Kuroma裝甲轎車),視角為引擎蓋視角(為了模擬真實的攝像頭),設計目標為保證在當前道路上保持車道行駛的同時盡量避開障礙物(由于Kuroma裝甲車速度很快,避開障礙物主要以變道的形式完成),且仿制出了許多真實的智能駕駛模塊(前碰撞預警、障礙物探測、行人檢測)。
我做的ScooterV2駛載體為摩托車(DoubleT),視角為第三人稱視角(為了看到更大的場景區(qū)域,為了捕捉到的車道線斜率范圍更大,期望以更小的樣本量在更少的時間訓練出足夠好的效果),設計目標為在當前道路上保持車道行駛(使用Mod屏蔽了所有交通和行人),且沒有設計其他模塊(由于機能限制,串聯(lián)其它CNN模塊會成倍增加單幀處理時間,使得模型的測試效果不美觀)。
模型的訓練分為三個部分:
數(shù)據(jù)集制作:監(jiān)督式學習,數(shù)據(jù)集分為input data和label,其中輸入數(shù)據(jù)為經(jīng)過灰度處理、區(qū)域屏蔽和大小縮放的圖像數(shù)據(jù),截取自1280720分辨率的GTA5游戲畫面,縮放為16090的大?。粯撕灁?shù)據(jù)為每一個圖像樣本對應的1*3規(guī)格的操作向量,分別代表向左、向右、前進(Press A/W/D)。在游戲中人為駕駛5小時,將每一幀圖片以及其所對應的操作向量記錄在數(shù)據(jù)集張量中。數(shù)據(jù)集分5批錄制完成,對不同操作所對應的圖片進行數(shù)量平衡(W:A:D = 8:1:1)打亂數(shù)據(jù)集后取1000張圖片作為測試集,其他的為訓練集。
訓練模型:創(chuàng)建AlexNet初始網(wǎng)絡,對保存下來的數(shù)據(jù)集進行擬合??偣策M行了約240000次權(quán)值更新,學習耗時3天左右。
測試模型,用getkey函數(shù)與keycheck函數(shù)定義操作向量與按鍵聯(lián)系,用訓練好的AlexNet對捕捉到的圖片進行分類預測,執(zhí)行當前類別對應的按鍵操作以進行駕駛。
制作數(shù)據(jù)集導入依賴庫:
import numpy as np import cv2 import time from grabscreen import grab_screen from getkeys import key_check import os
cv2進行圖像處理;time用來記錄單幀的處理時間;grab_screen從現(xiàn)有的py文件中導入,作用是截取屏幕上的一定區(qū)域;key_check用來處理當前幀的操作按鍵,將其轉(zhuǎn)化為向量。
定義屏蔽函數(shù):
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
為了減少圖像無用區(qū)域?qū)τ柧氝^程的影響,需要將圖像上方天空區(qū)域以及兩側(cè)街景進行涂黑屏蔽。
vertices定義了一個區(qū)域,roi函數(shù)將此區(qū)域外的像素用255灰度涂黑。
將操作轉(zhuǎn)化為標簽向量:
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];
數(shù)據(jù)集錄制:
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 = []
初始化空數(shù)據(jù)集,其中"training_data_X.npy"中的X應用數(shù)字表示當前錄制批次。
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)
加入倒計時,在執(zhí)行程序與開始錄制數(shù)據(jù)集之間留下10秒空余,用以調(diào)整姿態(tài)與視角。
截取大小為1280*720的游戲區(qū)域,并對其進行縮小、灰化和屏蔽操作。
用key_check提取當前操作按鍵,并用函數(shù)轉(zhuǎn)化為標簽向量,與處理過的圖片一起append到數(shù)據(jù)集中。
每5000幀保存一次數(shù)據(jù)集;設置T為暫停鍵。
平衡數(shù)據(jù):
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批數(shù)據(jù)集合并在一起后進行隨機排序,并依據(jù)不同的標簽劃分為3個數(shù)組,按一定的比例進行截取后合并再進行隨機排序,最后保存為training_data_after_shuffle.npy文件
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/40977.html
摘要:智能駕駛源碼詳解二模型簡介本使用進行圖像分類前進左轉(zhuǎn)右轉(zhuǎn)。其性能超群,在年圖像識別比賽上展露頭角,是當時的冠軍,由團隊開發(fā),領頭人物為教父。 GTAV智能駕駛源碼詳解(二)——Train the AlexNet 模型簡介: 本AI(ScooterV2)使用AlexNet進行圖像分類(前進、左轉(zhuǎn)、右轉(zhuǎn))。Alexnet是一個經(jīng)典的卷積神經(jīng)網(wǎng)絡,有5個卷積層,其后為3個全連接層,最后的輸出...
摘要:目前每年全球有萬人死于車禍,損失,相關于很多國家的,自動駕駛可以很大效率的減少車禍,拯救生命。美國汽車工程師協(xié)會和美國高速公路安全局將自動駕駛技術(shù)進行了分級。特定場所的高度自動駕駛。這叫基于規(guī)則的一種自動駕駛,簡單的。 來自 GitChat 作者:劉盼更多IT技術(shù)分享,盡在微信公眾號:GitChat技術(shù)雜談 進入 GitChat 閱讀原文我們先以汽車在現(xiàn)代科技領域的演進來開始這次的ch...
摘要:了解華為海思的方案海思的前身是華為的半導體部門,主要產(chǎn)品線包括智能手機處理器麒麟系列,視頻采集和編解碼處理器系列,無線通信方向芯片等。 目錄 一、視頻行業(yè)1、視頻...
閱讀 2668·2021-11-24 10:44
閱讀 1928·2021-11-22 13:53
閱讀 1952·2021-09-30 09:47
閱讀 3713·2021-09-22 16:00
閱讀 2445·2021-09-08 09:36
閱讀 2323·2019-08-30 15:53
閱讀 2798·2019-08-30 15:48
閱讀 998·2019-08-30 15:44