AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 知識百科

AI實戰,用Python玩個自動駕駛!

來源: 責編: 時間:2023-08-07 16:30:09 257觀看
導讀 安裝環境gym是用于開發和比較強化學習算法的工具包,在python中安裝gym庫和其中子場景都較為簡便。安裝gym:pip install gym安裝自動駕駛模塊,這里使用 Edouard Leurent 發布在

 安裝環境hCQ28資訊網——每日最新資訊28at.com

gym是用于開發和比較強化學習算法的工具包,在python中安裝gym庫和其中子場景都較為簡便。hCQ28資訊網——每日最新資訊28at.com

安裝gym:hCQ28資訊網——每日最新資訊28at.com

pip install gymhCQ28資訊網——每日最新資訊28at.com

安裝自動駕駛模塊,這里使用 Edouard Leurent 發布在 github 上的包 highway-env:hCQ28資訊網——每日最新資訊28at.com

pip install --user git+https://github.com/eleurent/highway-envhCQ28資訊網——每日最新資訊28at.com

其中包含6個場景:hCQ28資訊網——每日最新資訊28at.com

高速公路——“highway-v0” 匯入——“merge-v0” 環島——“roundabout-v0” 泊車——“parking-v0” 十字路口——“intersection-v0” 賽車道——“racetrack-v0”hCQ28資訊網——每日最新資訊28at.com

詳細文檔可以參考這里:hCQ28資訊網——每日最新資訊28at.com

https://highway-env.readthedocs.io/en/latest/hCQ28資訊網——每日最新資訊28at.com

配置環境hCQ28資訊網——每日最新資訊28at.com

安裝好后即可在代碼中進行實驗(以高速公路場景為例):hCQ28資訊網——每日最新資訊28at.com

import gymhCQ28資訊網——每日最新資訊28at.com
import highway_envhCQ28資訊網——每日最新資訊28at.com
%matplotlib inlinehCQ28資訊網——每日最新資訊28at.com
env = gym.make('highway-v0')hCQ28資訊網——每日最新資訊28at.com
env.reset()hCQ28資訊網——每日最新資訊28at.com
for _ in range(3):hCQ28資訊網——每日最新資訊28at.com
action = env.action_type.actions_indexes["IDLE"]hCQ28資訊網——每日最新資訊28at.com
obs, reward, done, info = env.step(action)hCQ28資訊網——每日最新資訊28at.com
env.render()hCQ28資訊網——每日最新資訊28at.com

運行后會在模擬器中生成如下場景:hCQ28資訊網——每日最新資訊28at.com

hCQ28資訊網——每日最新資訊28at.com

env類有很多參數可以配置,具體可以參考原文檔。hCQ28資訊網——每日最新資訊28at.com

訓練模型 1、數據處理hCQ28資訊網——每日最新資訊28at.com

(1)statehCQ28資訊網——每日最新資訊28at.com

highway-env包中沒有定義傳感器,車輛所有的state (observations) 都從底層代碼讀取,節省了許多前期的工作量。根據文檔介紹,state (ovservations) 有三種輸出方式:Kinematics,Grayscale Image和Occupancy grid。hCQ28資訊網——每日最新資訊28at.com

KinematicshCQ28資訊網——每日最新資訊28at.com

輸出V*F的矩陣,V代表需要觀測的車輛數量(包括ego vehicle本身),F代表需要統計的特征數量。例:hCQ28資訊網——每日最新資訊28at.com

數據生成時會默認歸一化,取值范圍:[100, 100, 20, 20],也可以設置ego vehicle以外的車輛屬性是地圖的絕對坐標還是對ego vehicle的相對坐標。hCQ28資訊網——每日最新資訊28at.com

在定義環境時需要對特征的參數進行設定:hCQ28資訊網——每日最新資訊28at.com

config = hCQ28資訊網——每日最新資訊28at.com
{hCQ28資訊網——每日最新資訊28at.com
"observation": hCQ28資訊網——每日最新資訊28at.com
{hCQ28資訊網——每日最新資訊28at.com
"type": "Kinematics",hCQ28資訊網——每日最新資訊28at.com
#選取5輛車進行觀察(包括ego vehicle)hCQ28資訊網——每日最新資訊28at.com
"vehicles_count": 5, hCQ28資訊網——每日最新資訊28at.com
#共7個特征hCQ28資訊網——每日最新資訊28at.com
"features": ["presence", "x", "y", "vx", "vy", "cos_h", "sin_h"], hCQ28資訊網——每日最新資訊28at.com
"features_range": hCQ28資訊網——每日最新資訊28at.com
{hCQ28資訊網——每日最新資訊28at.com
"x": [-100, 100],hCQ28資訊網——每日最新資訊28at.com
"y": [-100, 100],hCQ28資訊網——每日最新資訊28at.com
"vx": [-20, 20],hCQ28資訊網——每日最新資訊28at.com
"vy": [-20, 20]hCQ28資訊網——每日最新資訊28at.com
},hCQ28資訊網——每日最新資訊28at.com
"absolute": False,hCQ28資訊網——每日最新資訊28at.com
"order": "sorted"hCQ28資訊網——每日最新資訊28at.com
},hCQ28資訊網——每日最新資訊28at.com
"simulation_frequency": 8, # [Hz]hCQ28資訊網——每日最新資訊28at.com
"policy_frequency": 2, # [Hz]hCQ28資訊網——每日最新資訊28at.com
}hCQ28資訊網——每日最新資訊28at.com

Grayscale ImagehCQ28資訊網——每日最新資訊28at.com

生成一張W*H的灰度圖像,W代表圖像寬度,H代表圖像高度hCQ28資訊網——每日最新資訊28at.com

Occupancy gridhCQ28資訊網——每日最新資訊28at.com

生成一個WHF的三維矩陣,用W*H的表格表示ego vehicle周圍的車輛情況,每個格子包含F個特征。hCQ28資訊網——每日最新資訊28at.com

(2) actionhCQ28資訊網——每日最新資訊28at.com

highway-env包中的action分為連續和離散兩種。連續型action可以直接定義throttle和steering angle的值,離散型包含5個meta actions:hCQ28資訊網——每日最新資訊28at.com

ACTIONS_ALL = {hCQ28資訊網——每日最新資訊28at.com
0: 'LANE_LEFT',hCQ28資訊網——每日最新資訊28at.com
1: 'IDLE',hCQ28資訊網——每日最新資訊28at.com
2: 'LANE_RIGHT',hCQ28資訊網——每日最新資訊28at.com
3: 'FASTER',hCQ28資訊網——每日最新資訊28at.com
4: 'SLOWER'hCQ28資訊網——每日最新資訊28at.com
}hCQ28資訊網——每日最新資訊28at.com

(3) rewardhCQ28資訊網——每日最新資訊28at.com

highway-env包中除了泊車場景外都采用同一個reward function:hCQ28資訊網——每日最新資訊28at.com

hCQ28資訊網——每日最新資訊28at.com

這個function只能在其源碼中更改,在外層只能調整權重。hCQ28資訊網——每日最新資訊28at.com

(泊車場景的reward function原文檔里有)hCQ28資訊網——每日最新資訊28at.com

2、搭建模型hCQ28資訊網——每日最新資訊28at.com

DQN網絡,我采用第一種state表示方式——Kinematics進行示范。由于state數據量較小(5輛車*7個特征),可以不考慮使用CNN,直接把二維數據的size[5,7]轉成[1,35]即可,模型的輸入就是35,輸出是離散action數量,共5個。hCQ28資訊網——每日最新資訊28at.com

import torchhCQ28資訊網——每日最新資訊28at.com
import torch.nn as nnhCQ28資訊網——每日最新資訊28at.com
from torch.autograd import VariablehCQ28資訊網——每日最新資訊28at.com
import torch.nn.functional as FhCQ28資訊網——每日最新資訊28at.com
import torch.optim as optimhCQ28資訊網——每日最新資訊28at.com
import torchvision.transforms as ThCQ28資訊網——每日最新資訊28at.com
from torch import FloatTensor, LongTensor, ByteTensorhCQ28資訊網——每日最新資訊28at.com
from collections import namedtuplehCQ28資訊網——每日最新資訊28at.com
import random hCQ28資訊網——每日最新資訊28at.com
Tensor = FloatTensorhCQ28資訊網——每日最新資訊28at.com
EPSILON = 0 # epsilon used for epsilon greedy approachhCQ28資訊網——每日最新資訊28at.com
GAMMA = 0.9hCQ28資訊網——每日最新資訊28at.com
TARGET_NETWORK_REPLACE_FREQ = 40 # How frequently target netowrk updateshCQ28資訊網——每日最新資訊28at.com
MEMORY_CAPACITY = 100hCQ28資訊網——每日最新資訊28at.com
BATCH_SIZE = 80hCQ28資訊網——每日最新資訊28at.com
LR = 0.01 # learning ratehCQ28資訊網——每日最新資訊28at.com
class DQNNet(nn.Module):hCQ28資訊網——每日最新資訊28at.com
def __init__(self):hCQ28資訊網——每日最新資訊28at.com
super(DQNNet,self).__init__() hCQ28資訊網——每日最新資訊28at.com
self.linear1 = nn.Linear(35,35)hCQ28資訊網——每日最新資訊28at.com
self.linear2 = nn.Linear(35,5) hCQ28資訊網——每日最新資訊28at.com
def forward(self,s):hCQ28資訊網——每日最新資訊28at.com
s=torch.FloatTensor(s) hCQ28資訊網——每日最新資訊28at.com
s = s.view(s.size(0),1,35) hCQ28資訊網——每日最新資訊28at.com
s = self.linear1(s)hCQ28資訊網——每日最新資訊28at.com
s = self.linear2(s)hCQ28資訊網——每日最新資訊28at.com
return s hCQ28資訊網——每日最新資訊28at.com
class DQN(object):hCQ28資訊網——每日最新資訊28at.com
def __init__(self):hCQ28資訊網——每日最新資訊28at.com
self,self.target_net = DQNNet(),DQNNet() hCQ28資訊網——每日最新資訊28at.com
self.learn_step_counter = 0 hCQ28資訊網——每日最新資訊28at.com
self.memory = []hCQ28資訊網——每日最新資訊28at.com
self.position = 0 hCQ28資訊網——每日最新資訊28at.com
self.capacity = MEMORY_CAPACITY hCQ28資訊網——每日最新資訊28at.com
self.optimizer = torch.optim.Adam(self.parameters(), lr=LR)hCQ28資訊網——每日最新資訊28at.com
self.loss_func = nn.MSELoss()hCQ28資訊網——每日最新資訊28at.com
def choose_action(self,s,e):hCQ28資訊網——每日最新資訊28at.com
x=np.expand_dims(s, axis=0)hCQ28資訊網——每日最新資訊28at.com
if np.random.uniform() < 1-e: hCQ28資訊網——每日最新資訊28at.com
actions_value = self.forward(x) hCQ28資訊網——每日最新資訊28at.com
action = torch.max(actions_value,-1)[1].data.numpy()hCQ28資訊網——每日最新資訊28at.com
action = action.max() hCQ28資訊網——每日最新資訊28at.com
else: hCQ28資訊網——每日最新資訊28at.com
action = np.random.randint(0, 5)hCQ28資訊網——每日最新資訊28at.com
return actionhCQ28資訊網——每日最新資訊28at.com
def push_memory(self, s, a, r, s_):hCQ28資訊網——每日最新資訊28at.com
if len(self.memory) < self.capacity:hCQ28資訊網——每日最新資訊28at.com
self.memory.append(None)hCQ28資訊網——每日最新資訊28at.com
self.memory[self.position] = Transition(torch.unsqueeze(torch.FloatTensor(s), 0),torch.unsqueeze(torch.FloatTensor(s_), 0),hCQ28資訊網——每日最新資訊28at.com
torch.from_numpy(np.array([a])),torch.from_numpy(np.array([r],dtype='float32')))#hCQ28資訊網——每日最新資訊28at.com
self.position = (self.position + 1) % self.capacityhCQ28資訊網——每日最新資訊28at.com
def get_sample(self,batch_size):hCQ28資訊網——每日最新資訊28at.com
sample = random.sample(self.memory,batch_size)hCQ28資訊網——每日最新資訊28at.com
return samplehCQ28資訊網——每日最新資訊28at.com
def learn(self):hCQ28資訊網——每日最新資訊28at.com
if self.learn_step_counter % TARGET_NETWORK_REPLACE_FREQ == 0:hCQ28資訊網——每日最新資訊28at.com
self.target_net.load_state_dict(self.state_dict())hCQ28資訊網——每日最新資訊28at.com
self.learn_step_counter += 1hCQ28資訊網——每日最新資訊28at.com
transitions = self.get_sample(BATCH_SIZE)hCQ28資訊網——每日最新資訊28at.com
batch = Transition(*zip(*transitions))hCQ28資訊網——每日最新資訊28at.com
b_s = Variable(torch.cat(batch.state))hCQ28資訊網——每日最新資訊28at.com
b_s_ = Variable(torch.cat(batch.next_state))hCQ28資訊網——每日最新資訊28at.com
b_a = Variable(torch.cat(batch.action))hCQ28資訊網——每日最新資訊28at.com
b_r = Variable(torch.cat(batch.reward)) hCQ28資訊網——每日最新資訊28at.com
q_eval = self.forward(b_s).squeeze(1).gather(1,b_a.unsqueeze(1).to(torch.int64)) hCQ28資訊網——每日最新資訊28at.com
q_next = self.target_net.forward(b_s_).detach() #hCQ28資訊網——每日最新資訊28at.com
q_target = b_r + GAMMA * q_next.squeeze(1).max(1)[0].view(BATCH_SIZE, 1).t() hCQ28資訊網——每日最新資訊28at.com
loss = self.loss_func(q_eval, q_target.t()) hCQ28資訊網——每日最新資訊28at.com
self.optimizer.zero_grad() # reset the gradient to zero hCQ28資訊網——每日最新資訊28at.com
loss.backward()hCQ28資訊網——每日最新資訊28at.com
self.optimizer.step() # execute back propagation for one step hCQ28資訊網——每日最新資訊28at.com
return losshCQ28資訊網——每日最新資訊28at.com
Transition = namedtuple('Transition',('state', 'next_state','action', 'reward'))hCQ28資訊網——每日最新資訊28at.com
3、運行結果hCQ28資訊網——每日最新資訊28at.com

各個部分都完成之后就可以組合在一起訓練模型了,流程和用CARLA差不多,就不細說了。hCQ28資訊網——每日最新資訊28at.com

初始化環境(DQN的類加進去就行了):hCQ28資訊網——每日最新資訊28at.com

import gymhCQ28資訊網——每日最新資訊28at.com
import highway_envhCQ28資訊網——每日最新資訊28at.com
from matplotlib import pyplot as plthCQ28資訊網——每日最新資訊28at.com
import numpy as nphCQ28資訊網——每日最新資訊28at.com
import timehCQ28資訊網——每日最新資訊28at.com
config = hCQ28資訊網——每日最新資訊28at.com
{hCQ28資訊網——每日最新資訊28at.com
"observation": hCQ28資訊網——每日最新資訊28at.com
{hCQ28資訊網——每日最新資訊28at.com
"type": "Kinematics",hCQ28資訊網——每日最新資訊28at.com
"vehicles_count": 5,hCQ28資訊網——每日最新資訊28at.com
"features": ["presence", "x", "y", "vx", "vy", "cos_h", "sin_h"],hCQ28資訊網——每日最新資訊28at.com
"features_range": hCQ28資訊網——每日最新資訊28at.com
{hCQ28資訊網——每日最新資訊28at.com
"x": [-100, 100],hCQ28資訊網——每日最新資訊28at.com
"y": [-100, 100],hCQ28資訊網——每日最新資訊28at.com
"vx": [-20, 20],hCQ28資訊網——每日最新資訊28at.com
"vy": [-20, 20]hCQ28資訊網——每日最新資訊28at.com
},hCQ28資訊網——每日最新資訊28at.com
"absolute": False,hCQ28資訊網——每日最新資訊28at.com
"order": "sorted"hCQ28資訊網——每日最新資訊28at.com
},hCQ28資訊網——每日最新資訊28at.com
"simulation_frequency": 8, # [Hz]hCQ28資訊網——每日最新資訊28at.com
"policy_frequency": 2, # [Hz]hCQ28資訊網——每日最新資訊28at.com
}hCQ28資訊網——每日最新資訊28at.com
env = gym.make("highway-v0")hCQ28資訊網——每日最新資訊28at.com
env.configure(config)hCQ28資訊網——每日最新資訊28at.com

訓練模型:hCQ28資訊網——每日最新資訊28at.com

dqn=DQN()hCQ28資訊網——每日最新資訊28at.com
count=0hCQ28資訊網——每日最新資訊28at.com
reward=[]hCQ28資訊網——每日最新資訊28at.com
avg_reward=0hCQ28資訊網——每日最新資訊28at.com
all_reward=[]hCQ28資訊網——每日最新資訊28at.com
time_=[]hCQ28資訊網——每日最新資訊28at.com
all_time=[]hCQ28資訊網——每日最新資訊28at.com
collision_his=[]hCQ28資訊網——每日最新資訊28at.com
all_collision=[]hCQ28資訊網——每日最新資訊28at.com
while True:hCQ28資訊網——每日最新資訊28at.com
done = False hCQ28資訊網——每日最新資訊28at.com
start_time=time.time()hCQ28資訊網——每日最新資訊28at.com
s = env.reset()hCQ28資訊網——每日最新資訊28at.com
while not done:hCQ28資訊網——每日最新資訊28at.com
e = np.exp(-count/300) #隨機選擇action的概率,隨著訓練次數增多逐漸降低hCQ28資訊網——每日最新資訊28at.com
a = dqn.choose_action(s,e)hCQ28資訊網——每日最新資訊28at.com
s_, r, done, info = env.step(a)hCQ28資訊網——每日最新資訊28at.com
env.render()hCQ28資訊網——每日最新資訊28at.com
dqn.push_memory(s, a, r, s_)hCQ28資訊網——每日最新資訊28at.com
if ((dqn.position !=0)&(dqn.position % 99==0)):hCQ28資訊網——每日最新資訊28at.com
loss_=dqn.learn()hCQ28資訊網——每日最新資訊28at.com
count+=1hCQ28資訊網——每日最新資訊28at.com
print('trained times:',count)hCQ28資訊網——每日最新資訊28at.com
if (count%40==0):hCQ28資訊網——每日最新資訊28at.com
avg_reward=np.mean(reward)hCQ28資訊網——每日最新資訊28at.com
avg_time=np.mean(time_)hCQ28資訊網——每日最新資訊28at.com
collision_rate=np.mean(collision_his)hCQ28資訊網——每日最新資訊28at.com
all_reward.append(avg_reward)hCQ28資訊網——每日最新資訊28at.com
all_time.append(avg_time)hCQ28資訊網——每日最新資訊28at.com
all_collision.append(collision_rate)hCQ28資訊網——每日最新資訊28at.com
plt.plot(all_reward)hCQ28資訊網——每日最新資訊28at.com
plt.show()hCQ28資訊網——每日最新資訊28at.com
plt.plot(all_time)hCQ28資訊網——每日最新資訊28at.com
plt.show()hCQ28資訊網——每日最新資訊28at.com
plt.plot(all_collision)hCQ28資訊網——每日最新資訊28at.com
plt.show()hCQ28資訊網——每日最新資訊28at.com
reward=[]hCQ28資訊網——每日最新資訊28at.com
time_=[]hCQ28資訊網——每日最新資訊28at.com
collision_his=[]hCQ28資訊網——每日最新資訊28at.com
s = s_hCQ28資訊網——每日最新資訊28at.com
reward.append(r) hCQ28資訊網——每日最新資訊28at.com
end_time=time.time()hCQ28資訊網——每日最新資訊28at.com
episode_time=end_time-start_timehCQ28資訊網——每日最新資訊28at.com
time_.append(episode_time)hCQ28資訊網——每日最新資訊28at.com
is_collision=1 if info['crashed']==True else 0hCQ28資訊網——每日最新資訊28at.com
collision_his.append(is_collision)hCQ28資訊網——每日最新資訊28at.com

我在代碼中添加了一些畫圖的函數,在運行過程中就可以掌握一些關鍵的指標,每訓練40次統計一次平均值。hCQ28資訊網——每日最新資訊28at.com

平均碰撞發生率:hCQ28資訊網——每日最新資訊28at.com

hCQ28資訊網——每日最新資訊28at.com

epoch平均時長(s):hCQ28資訊網——每日最新資訊28at.com

hCQ28資訊網——每日最新資訊28at.com

平均reward:hCQ28資訊網——每日最新資訊28at.com

hCQ28資訊網——每日最新資訊28at.com

可以看出平均碰撞發生率會隨訓練次數增多逐漸降低,每個epoch持續的時間會逐漸延長(如果發生碰撞epoch會立刻結束)hCQ28資訊網——每日最新資訊28at.com

總結hCQ28資訊網——每日最新資訊28at.com

相比于模擬器CARLA,highway-env環境包明顯更加抽象化,用類似游戲的表示方式,使得算法可以在一個理想的虛擬環境中得到訓練,而不用考慮數據獲取方式、傳感器精度、運算時長等現實問題。對于端到端的算法設計和測試非常友好,但從自動控制的角度來看,可以入手的方面較少,研究起來不太靈活。hCQ28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-119-2267-0.htmlAI實戰,用Python玩個自動駕駛!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 無人出租車被警察截停后逃逸!AI:我當時害怕極了

下一篇: 京東云發布云原生自研中間件JCQ 性能容量接近無限擴展

標簽:
  • 熱門焦點
Top