目錄
安裝環境
首頁 後端開發 Python教學 學習Python實現自動駕駛系統

學習Python實現自動駕駛系統

Apr 21, 2023 pm 04:58 PM
python ai 自動駕駛

學習Python實現自動駕駛系統

安裝環境

gym是用來開發和比較強化學習演算法的工具包,在python中安裝gym函式庫和其中子場景都較為簡單。

安裝gym:

pip install gym
登入後複製

安裝自動駕駛模組,這裡使用Edouard Leurent 發佈在github 上的套件highway-env:

pip install --user git+https://github.com/eleurent/highway-env
登入後複製

其中包含6個場景:

  • 高速公路—「highway-v0」
  • 匯入—「merge-v0」
  • 環島—「roundabout-v0」
  • # 停車——「parking-v0」
  • 十字路口——「intersection-v0」
  • 賽車道——「racetrack-v0」
##詳細文件可以參考這裡:

#https://www.php.cn/link/c0fda89ebd645bd7cea60fcbb5960309

#設定環境

安裝好後即可在程式碼中進行實驗(以高速公路場景為例):

import gym
import highway_env
%matplotlib inline
env = gym.make('highway-v0')
env.reset()
for _ in range(3):
action = env.action_type.actions_indexes["IDLE"]
obs, reward, done, info = env.step(action)
env.render()
登入後複製

運行後會在模擬器中產生以下場景:

學習Python實現自動駕駛系統

env類別有很多參數可以配置,具體可以參考原文檔。

訓練模型

1、資料處理

(1)state

highway-env套件中沒有定義感測器,車輛所有的state (observations)都從底層程式碼讀取,節省了許多前期的工作量。根據文件介紹,state (ovservations) 有三種輸出方式:Kinematics,Grayscale Image和Occupancy grid。

Kinematics

輸出V*F的矩陣,V代表需要觀測的車輛數量(包括ego vehicle本身),F代表需要統計的特徵數量。例:

資料產生時會預設歸一化,取值範圍:[100, 100, 20, 20],也可以設定ego vehicle以外的車輛屬性是地圖的絕對座標還是ego vehicle的相對座標。

在定義環境時需要對特徵的參數進行設定:

config = 
{
"observation":
 {
"type": "Kinematics",
#选取5辆车进行观察(包括ego vehicle)
"vehicles_count": 5,
#共7个特征
"features": ["presence", "x", "y", "vx", "vy", "cos_h", "sin_h"],
"features_range":
{
"x": [-100, 100],
"y": [-100, 100],
"vx": [-20, 20],
"vy": [-20, 20]
},
"absolute": False,
"order": "sorted"
},
"simulation_frequency": 8,# [Hz]
"policy_frequency": 2,# [Hz]
}
登入後複製

Grayscale Image

產生一張W*H的灰階影像,W代表影像寬度, H代表影像高度

Occupancy grid

產生一個WHF的三維矩陣,用W*H的表格表示ego vehicle周圍的車輛狀況,每個格子包含F個特徵。

(2) action

highway-env套件中的action分為連續和離散兩種。連續型action可以直接定義throttle和steering angle的值,離散型包含5個meta actions:

ACTIONS_ALL = {
0: 'LANE_LEFT',
1: 'IDLE',
2: 'LANE_RIGHT',
3: 'FASTER',
4: 'SLOWER'
}
登入後複製

(3) reward

highway-env包中除了泊車場景外都採用同一個reward function:

學習Python實現自動駕駛系統

這個function只能在其原始碼中更改,在外層只能調整權重。

(泊車場景的reward function原始文檔裡有)

2、搭建模型

DQN網絡,我採用第一種state表示方式-Kinematics進行示範。由於state資料量較小(5輛車*7個特徵),可以不考慮使用CNN,直接把二維資料的size[5,7]轉成[1,35]即可,模型的輸入就是35,輸出是離散action數量,共5個。

import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.nn.functional as F
import torch.optim as optim
import torchvision.transforms as T
from torch import FloatTensor, LongTensor, ByteTensor
from collections import namedtuple
import random
Tensor = FloatTensor
EPSILON = 0# epsilon used for epsilon greedy approach
GAMMA = 0.9
TARGET_NETWORK_REPLACE_FREQ = 40 # How frequently target netowrk updates
MEMORY_CAPACITY = 100
BATCH_SIZE = 80
LR = 0.01 # learning rate
class DQNNet(nn.Module):
def __init__(self):
super(DQNNet,self).__init__()
self.linear1 = nn.Linear(35,35)
self.linear2 = nn.Linear(35,5)
def forward(self,s):
s=torch.FloatTensor(s)
s = s.view(s.size(0),1,35)
s = self.linear1(s)
s = self.linear2(s)
return s
class DQN(object):
def __init__(self):
self.net,self.target_net = DQNNet(),DQNNet()
self.learn_step_counter = 0
self.memory = []
self.position = 0
self.capacity = MEMORY_CAPACITY
self.optimizer = torch.optim.Adam(self.net.parameters(), lr=LR)
self.loss_func = nn.MSELoss()
def choose_action(self,s,e):
x=np.expand_dims(s, axis=0)
if np.random.uniform() < 1-e:
actions_value = self.net.forward(x)
action = torch.max(actions_value,-1)[1].data.numpy()
action = action.max()
else:
action = np.random.randint(0, 5)
return action
def push_memory(self, s, a, r, s_):
if len(self.memory) < self.capacity:
self.memory.append(None)
self.memory[self.position] = Transition(torch.unsqueeze(torch.FloatTensor(s), 0),torch.unsqueeze(torch.FloatTensor(s_), 0),
torch.from_numpy(np.array([a])),torch.from_numpy(np.array([r],dtype='float32')))#
self.position = (self.position + 1) % self.capacity
def get_sample(self,batch_size):
sample = random.sample(self.memory,batch_size)
return sample
def learn(self):
if self.learn_step_counter % TARGET_NETWORK_REPLACE_FREQ == 0:
self.target_net.load_state_dict(self.net.state_dict())
self.learn_step_counter += 1
transitions = self.get_sample(BATCH_SIZE)
batch = Transition(*zip(*transitions))
b_s = Variable(torch.cat(batch.state))
b_s_ = Variable(torch.cat(batch.next_state))
b_a = Variable(torch.cat(batch.action))
b_r = Variable(torch.cat(batch.reward))
q_eval = self.net.forward(b_s).squeeze(1).gather(1,b_a.unsqueeze(1).to(torch.int64))
q_next = self.target_net.forward(b_s_).detach() #
q_target = b_r + GAMMA * q_next.squeeze(1).max(1)[0].view(BATCH_SIZE, 1).t()
loss = self.loss_func(q_eval, q_target.t())
self.optimizer.zero_grad() # reset the gradient to zero
loss.backward()
self.optimizer.step() # execute back propagation for one step
return loss
Transition = namedtuple('Transition',('state', 'next_state','action', 'reward'))
登入後複製

3、運行結果

各個部分都完成之後就可以組合在一起訓練模型了,流程和用CARLA差不多,就不細說了。

初始化環境(DQN的類別加進去就行了):

import gym
import highway_env
from matplotlib import pyplot as plt
import numpy as np
import time
config = 
{
"observation":
 {
"type": "Kinematics",
"vehicles_count": 5,
"features": ["presence", "x", "y", "vx", "vy", "cos_h", "sin_h"],
"features_range":
{
"x": [-100, 100],
"y": [-100, 100],
"vx": [-20, 20],
"vy": [-20, 20]
},
"absolute": False,
"order": "sorted"
},
"simulation_frequency": 8,# [Hz]
"policy_frequency": 2,# [Hz]
}
env = gym.make("highway-v0")
env.configure(config)
登入後複製

訓練模型:

dqn=DQN()
count=0
reward=[]
avg_reward=0
all_reward=[]
time_=[]
all_time=[]
collision_his=[]
all_collision=[]
while True:
done = False
start_time=time.time()
s = env.reset()
while not done:
e = np.exp(-count/300)#随机选择action的概率,随着训练次数增多逐渐降低
a = dqn.choose_action(s,e)
s_, r, done, info = env.step(a)
env.render()
dqn.push_memory(s, a, r, s_)
if ((dqn.position !=0)&(dqn.position % 99==0)):
loss_=dqn.learn()
count+=1
print('trained times:',count)
if (count%40==0):
avg_reward=np.mean(reward)
avg_time=np.mean(time_)
collision_rate=np.mean(collision_his)
all_reward.append(avg_reward)
all_time.append(avg_time)
all_collision.append(collision_rate)
plt.plot(all_reward)
plt.show()
plt.plot(all_time)
plt.show()
plt.plot(all_collision)
plt.show()
reward=[]
time_=[]
collision_his=[]
s = s_
reward.append(r)
end_time=time.time()
episode_time=end_time-start_time
time_.append(episode_time)
is_collision=1 if info['crashed']==True else 0
collision_his.append(is_collision)
登入後複製
我在程式碼中加入了一些畫圖的函數,在運行過程中就可以掌握一些關鍵的指標,每訓練40次統計一次平均值。

平均碰撞發生率:

學習Python實現自動駕駛系統

epoch平均長度(s):

學習Python實現自動駕駛系統

平均reward :

學習Python實現自動駕駛系統

可以看出平均碰撞發生率會隨訓練次數增加逐漸降低,每個epoch持續的時間會逐漸延長(如果發生碰撞epoch會立刻結束)

總結

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

以上是學習Python實現自動駕駛系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

幣圈行情實時數據免費平台推薦前十名發布 幣圈行情實時數據免費平台推薦前十名發布 Apr 22, 2025 am 08:12 AM

適合新手的加密貨幣數據平台有CoinMarketCap和非小號。 1. CoinMarketCap提供全球加密貨幣實時價格、市值、交易量排名,適合新手與基礎分析需求。 2. 非小號提供中文友好界面,適合中文用戶快速篩選低風險潛力項目。

okx在線  okx交易所官網在線 okx在線 okx交易所官網在線 Apr 22, 2025 am 06:45 AM

OKX 交易所的詳細介紹如下:1) 發展歷程:2017 年創辦,2022 年更名為 OKX;2) 總部位於塞舌爾;3) 業務範圍涵蓋多種交易產品,支持 350 多種加密貨幣;4) 用戶遍布 200 餘個國家,千萬級用戶量;5) 採用多重安全措施保障用戶資產;6) 交易費用基於做市商模式,費率隨交易量增加而降低;7) 曾獲多項榮譽,如“年度加密貨幣交易所”等。

各大虛擬貨幣交易平台的特色服務一覽 各大虛擬貨幣交易平台的特色服務一覽 Apr 22, 2025 am 08:09 AM

機構投資者應選擇Coinbase Pro和Genesis Trading等合規平台,關注冷存儲比例與審計透明度;散戶投資者應選擇幣安和火幣等大平台,注重用戶體驗與安全;合規敏感地區的用戶可通過Circle Trade和Huobi Global進行法幣交易,中國大陸用戶需通過合規場外渠道。

大宗交易的虛擬貨幣交易平台排行榜top10最新發布 大宗交易的虛擬貨幣交易平台排行榜top10最新發布 Apr 22, 2025 am 08:18 AM

選擇大宗交易平台時應考慮以下因素:1. 流動性:優先選擇日均交易量超50億美元的平台。 2. 合規性:查看平台是否持有美國FinCEN、歐盟MiCA等牌照。 3. 安全性:冷錢包存儲比例和保險機制是關鍵指標。 4. 服務能力:是否提供專屬客戶經理和定制化交易工具。

支持多種幣種的虛擬貨幣交易平台推薦前十名一覽 支持多種幣種的虛擬貨幣交易平台推薦前十名一覽 Apr 22, 2025 am 08:15 AM

優先選擇合規平台如OKX和Coinbase,啟用多重驗證,資產自託管可減少依賴:1. 選擇有監管牌照的交易所;2. 開啟2FA和提幣白名單;3. 使用硬件錢包或支持自託管的平台。

數字貨幣交易app容易上手的推薦top10(025年最新排名) 數字貨幣交易app容易上手的推薦top10(025年最新排名) Apr 22, 2025 am 07:45 AM

gate.io(全球版)核心優勢是界面極簡,支持中文,法幣交易流程直觀;幣安(簡版)核心優勢是全球交易量第一,簡版模式僅保留現貨交易;OKX(香港版)核心優勢是界面簡潔,支持粵語/普通話,衍生品交易門檻低;火幣全球站(香港版)核心優勢是老牌交易所,推出元宇宙交易終端;KuCoin(中文社區版)核心優勢是支持800 幣種,界面採用微信式交互;Kraken(香港版)核心優勢是美國老牌交易所,持有香港SVF牌照,界面簡潔;HashKey Exchange(香港持牌)核心優勢是香港知名持牌交易所,支持法

幣圈十大行情網站的使用技巧與推薦2025 幣圈十大行情網站的使用技巧與推薦2025 Apr 22, 2025 am 08:03 AM

國內用戶適配方案包括合規渠道和本地化工具。 1. 合規渠道:通過OTC平台如Circle Trade進行法幣兌換,境內需通過香港或海外平台。 2. 本地化工具:使用幣圈網獲取中文資訊,火幣全球站提供元宇宙交易終端。

數字貨幣交易所App前十名蘋果版下載入口匯總 數字貨幣交易所App前十名蘋果版下載入口匯總 Apr 22, 2025 am 09:27 AM

提供各種複雜的交易工具和市場分析。覆蓋 100 多個國家,日均衍生品交易量超 300 億美元,支持 300 多個交易對與 200 倍槓桿,技術實力強大,擁有龐大的全球用戶基礎,提供專業的交易平台、安全存儲解決方案以及豐富的交易對。

See all articles