当前位置:首页 > 科技  > 知识百科

AI实战,用Python玩个自动驾驶!

来源: 责编: 时间:2023-08-07 16:30:09 143观看
导读 安装环境gym是用于开发和比较强化学习算法的工具包,在python中安装gym库和其中子场景都较为简便。安装gym:pip install gym安装自动驾驶模块,这里使用 Edouard Leurent 发布在

 安装环境DKK28资讯网——每日最新资讯28at.com

gym是用于开发和比较强化学习算法的工具包,在python中安装gym库和其中子场景都较为简便。DKK28资讯网——每日最新资讯28at.com

安装gym:DKK28资讯网——每日最新资讯28at.com

pip install gymDKK28资讯网——每日最新资讯28at.com

安装自动驾驶模块,这里使用 Edouard Leurent 发布在 github 上的包 highway-env:DKK28资讯网——每日最新资讯28at.com

pip install --user git+https://github.com/eleurent/highway-envDKK28资讯网——每日最新资讯28at.com

其中包含6个场景:DKK28资讯网——每日最新资讯28at.com

高速公路——“highway-v0” 汇入——“merge-v0” 环岛——“roundabout-v0” 泊车——“parking-v0” 十字路口——“intersection-v0” 赛车道——“racetrack-v0”DKK28资讯网——每日最新资讯28at.com

详细文档可以参考这里:DKK28资讯网——每日最新资讯28at.com

https://highway-env.readthedocs.io/en/latest/DKK28资讯网——每日最新资讯28at.com

配置环境DKK28资讯网——每日最新资讯28at.com

安装好后即可在代码中进行实验(以高速公路场景为例):DKK28资讯网——每日最新资讯28at.com

import gymDKK28资讯网——每日最新资讯28at.com
import highway_envDKK28资讯网——每日最新资讯28at.com
%matplotlib inlineDKK28资讯网——每日最新资讯28at.com
env = gym.make('highway-v0')DKK28资讯网——每日最新资讯28at.com
env.reset()DKK28资讯网——每日最新资讯28at.com
for _ in range(3):DKK28资讯网——每日最新资讯28at.com
action = env.action_type.actions_indexes["IDLE"]DKK28资讯网——每日最新资讯28at.com
obs, reward, done, info = env.step(action)DKK28资讯网——每日最新资讯28at.com
env.render()DKK28资讯网——每日最新资讯28at.com

运行后会在模拟器中生成如下场景:DKK28资讯网——每日最新资讯28at.com

DKK28资讯网——每日最新资讯28at.com

env类有很多参数可以配置,具体可以参考原文档。DKK28资讯网——每日最新资讯28at.com

训练模型 1、数据处理DKK28资讯网——每日最新资讯28at.com

(1)stateDKK28资讯网——每日最新资讯28at.com

highway-env包中没有定义传感器,车辆所有的state (observations) 都从底层代码读取,节省了许多前期的工作量。根据文档介绍,state (ovservations) 有三种输出方式:Kinematics,Grayscale Image和Occupancy grid。DKK28资讯网——每日最新资讯28at.com

KinematicsDKK28资讯网——每日最新资讯28at.com

输出V*F的矩阵,V代表需要观测的车辆数量(包括ego vehicle本身),F代表需要统计的特征数量。例:DKK28资讯网——每日最新资讯28at.com

数据生成时会默认归一化,取值范围:[100, 100, 20, 20],也可以设置ego vehicle以外的车辆属性是地图的绝对坐标还是对ego vehicle的相对坐标。DKK28资讯网——每日最新资讯28at.com

在定义环境时需要对特征的参数进行设定:DKK28资讯网——每日最新资讯28at.com

config = DKK28资讯网——每日最新资讯28at.com
{DKK28资讯网——每日最新资讯28at.com
"observation": DKK28资讯网——每日最新资讯28at.com
{DKK28资讯网——每日最新资讯28at.com
"type": "Kinematics",DKK28资讯网——每日最新资讯28at.com
#选取5辆车进行观察(包括ego vehicle)DKK28资讯网——每日最新资讯28at.com
"vehicles_count": 5, DKK28资讯网——每日最新资讯28at.com
#共7个特征DKK28资讯网——每日最新资讯28at.com
"features": ["presence", "x", "y", "vx", "vy", "cos_h", "sin_h"], DKK28资讯网——每日最新资讯28at.com
"features_range": DKK28资讯网——每日最新资讯28at.com
{DKK28资讯网——每日最新资讯28at.com
"x": [-100, 100],DKK28资讯网——每日最新资讯28at.com
"y": [-100, 100],DKK28资讯网——每日最新资讯28at.com
"vx": [-20, 20],DKK28资讯网——每日最新资讯28at.com
"vy": [-20, 20]DKK28资讯网——每日最新资讯28at.com
},DKK28资讯网——每日最新资讯28at.com
"absolute": False,DKK28资讯网——每日最新资讯28at.com
"order": "sorted"DKK28资讯网——每日最新资讯28at.com
},DKK28资讯网——每日最新资讯28at.com
"simulation_frequency": 8, # [Hz]DKK28资讯网——每日最新资讯28at.com
"policy_frequency": 2, # [Hz]DKK28资讯网——每日最新资讯28at.com
}DKK28资讯网——每日最新资讯28at.com

Grayscale ImageDKK28资讯网——每日最新资讯28at.com

生成一张W*H的灰度图像,W代表图像宽度,H代表图像高度DKK28资讯网——每日最新资讯28at.com

Occupancy gridDKK28资讯网——每日最新资讯28at.com

生成一个WHF的三维矩阵,用W*H的表格表示ego vehicle周围的车辆情况,每个格子包含F个特征。DKK28资讯网——每日最新资讯28at.com

(2) actionDKK28资讯网——每日最新资讯28at.com

highway-env包中的action分为连续和离散两种。连续型action可以直接定义throttle和steering angle的值,离散型包含5个meta actions:DKK28资讯网——每日最新资讯28at.com

ACTIONS_ALL = {DKK28资讯网——每日最新资讯28at.com
0: 'LANE_LEFT',DKK28资讯网——每日最新资讯28at.com
1: 'IDLE',DKK28资讯网——每日最新资讯28at.com
2: 'LANE_RIGHT',DKK28资讯网——每日最新资讯28at.com
3: 'FASTER',DKK28资讯网——每日最新资讯28at.com
4: 'SLOWER'DKK28资讯网——每日最新资讯28at.com
}DKK28资讯网——每日最新资讯28at.com

(3) rewardDKK28资讯网——每日最新资讯28at.com

highway-env包中除了泊车场景外都采用同一个reward function:DKK28资讯网——每日最新资讯28at.com

DKK28资讯网——每日最新资讯28at.com

这个function只能在其源码中更改,在外层只能调整权重。DKK28资讯网——每日最新资讯28at.com

(泊车场景的reward function原文档里有)DKK28资讯网——每日最新资讯28at.com

2、搭建模型DKK28资讯网——每日最新资讯28at.com

DQN网络,我采用第一种state表示方式——Kinematics进行示范。由于state数据量较小(5辆车*7个特征),可以不考虑使用CNN,直接把二维数据的size[5,7]转成[1,35]即可,模型的输入就是35,输出是离散action数量,共5个。DKK28资讯网——每日最新资讯28at.com

import torchDKK28资讯网——每日最新资讯28at.com
import torch.nn as nnDKK28资讯网——每日最新资讯28at.com
from torch.autograd import VariableDKK28资讯网——每日最新资讯28at.com
import torch.nn.functional as FDKK28资讯网——每日最新资讯28at.com
import torch.optim as optimDKK28资讯网——每日最新资讯28at.com
import torchvision.transforms as TDKK28资讯网——每日最新资讯28at.com
from torch import FloatTensor, LongTensor, ByteTensorDKK28资讯网——每日最新资讯28at.com
from collections import namedtupleDKK28资讯网——每日最新资讯28at.com
import random DKK28资讯网——每日最新资讯28at.com
Tensor = FloatTensorDKK28资讯网——每日最新资讯28at.com
EPSILON = 0 # epsilon used for epsilon greedy approachDKK28资讯网——每日最新资讯28at.com
GAMMA = 0.9DKK28资讯网——每日最新资讯28at.com
TARGET_NETWORK_REPLACE_FREQ = 40 # How frequently target netowrk updatesDKK28资讯网——每日最新资讯28at.com
MEMORY_CAPACITY = 100DKK28资讯网——每日最新资讯28at.com
BATCH_SIZE = 80DKK28资讯网——每日最新资讯28at.com
LR = 0.01 # learning rateDKK28资讯网——每日最新资讯28at.com
class DQNNet(nn.Module):DKK28资讯网——每日最新资讯28at.com
def __init__(self):DKK28资讯网——每日最新资讯28at.com
super(DQNNet,self).__init__() DKK28资讯网——每日最新资讯28at.com
self.linear1 = nn.Linear(35,35)DKK28资讯网——每日最新资讯28at.com
self.linear2 = nn.Linear(35,5) DKK28资讯网——每日最新资讯28at.com
def forward(self,s):DKK28资讯网——每日最新资讯28at.com
s=torch.FloatTensor(s) DKK28资讯网——每日最新资讯28at.com
s = s.view(s.size(0),1,35) DKK28资讯网——每日最新资讯28at.com
s = self.linear1(s)DKK28资讯网——每日最新资讯28at.com
s = self.linear2(s)DKK28资讯网——每日最新资讯28at.com
return s DKK28资讯网——每日最新资讯28at.com
class DQN(object):DKK28资讯网——每日最新资讯28at.com
def __init__(self):DKK28资讯网——每日最新资讯28at.com
self,self.target_net = DQNNet(),DQNNet() DKK28资讯网——每日最新资讯28at.com
self.learn_step_counter = 0 DKK28资讯网——每日最新资讯28at.com
self.memory = []DKK28资讯网——每日最新资讯28at.com
self.position = 0 DKK28资讯网——每日最新资讯28at.com
self.capacity = MEMORY_CAPACITY DKK28资讯网——每日最新资讯28at.com
self.optimizer = torch.optim.Adam(self.parameters(), lr=LR)DKK28资讯网——每日最新资讯28at.com
self.loss_func = nn.MSELoss()DKK28资讯网——每日最新资讯28at.com
def choose_action(self,s,e):DKK28资讯网——每日最新资讯28at.com
x=np.expand_dims(s, axis=0)DKK28资讯网——每日最新资讯28at.com
if np.random.uniform() < 1-e: DKK28资讯网——每日最新资讯28at.com
actions_value = self.forward(x) DKK28资讯网——每日最新资讯28at.com
action = torch.max(actions_value,-1)[1].data.numpy()DKK28资讯网——每日最新资讯28at.com
action = action.max() DKK28资讯网——每日最新资讯28at.com
else: DKK28资讯网——每日最新资讯28at.com
action = np.random.randint(0, 5)DKK28资讯网——每日最新资讯28at.com
return actionDKK28资讯网——每日最新资讯28at.com
def push_memory(self, s, a, r, s_):DKK28资讯网——每日最新资讯28at.com
if len(self.memory) < self.capacity:DKK28资讯网——每日最新资讯28at.com
self.memory.append(None)DKK28资讯网——每日最新资讯28at.com
self.memory[self.position] = Transition(torch.unsqueeze(torch.FloatTensor(s), 0),torch.unsqueeze(torch.FloatTensor(s_), 0),DKK28资讯网——每日最新资讯28at.com
torch.from_numpy(np.array([a])),torch.from_numpy(np.array([r],dtype='float32')))#DKK28资讯网——每日最新资讯28at.com
self.position = (self.position + 1) % self.capacityDKK28资讯网——每日最新资讯28at.com
def get_sample(self,batch_size):DKK28资讯网——每日最新资讯28at.com
sample = random.sample(self.memory,batch_size)DKK28资讯网——每日最新资讯28at.com
return sampleDKK28资讯网——每日最新资讯28at.com
def learn(self):DKK28资讯网——每日最新资讯28at.com
if self.learn_step_counter % TARGET_NETWORK_REPLACE_FREQ == 0:DKK28资讯网——每日最新资讯28at.com
self.target_net.load_state_dict(self.state_dict())DKK28资讯网——每日最新资讯28at.com
self.learn_step_counter += 1DKK28资讯网——每日最新资讯28at.com
transitions = self.get_sample(BATCH_SIZE)DKK28资讯网——每日最新资讯28at.com
batch = Transition(*zip(*transitions))DKK28资讯网——每日最新资讯28at.com
b_s = Variable(torch.cat(batch.state))DKK28资讯网——每日最新资讯28at.com
b_s_ = Variable(torch.cat(batch.next_state))DKK28资讯网——每日最新资讯28at.com
b_a = Variable(torch.cat(batch.action))DKK28资讯网——每日最新资讯28at.com
b_r = Variable(torch.cat(batch.reward)) DKK28资讯网——每日最新资讯28at.com
q_eval = self.forward(b_s).squeeze(1).gather(1,b_a.unsqueeze(1).to(torch.int64)) DKK28资讯网——每日最新资讯28at.com
q_next = self.target_net.forward(b_s_).detach() #DKK28资讯网——每日最新资讯28at.com
q_target = b_r + GAMMA * q_next.squeeze(1).max(1)[0].view(BATCH_SIZE, 1).t() DKK28资讯网——每日最新资讯28at.com
loss = self.loss_func(q_eval, q_target.t()) DKK28资讯网——每日最新资讯28at.com
self.optimizer.zero_grad() # reset the gradient to zero DKK28资讯网——每日最新资讯28at.com
loss.backward()DKK28资讯网——每日最新资讯28at.com
self.optimizer.step() # execute back propagation for one step DKK28资讯网——每日最新资讯28at.com
return lossDKK28资讯网——每日最新资讯28at.com
Transition = namedtuple('Transition',('state', 'next_state','action', 'reward'))DKK28资讯网——每日最新资讯28at.com
3、运行结果DKK28资讯网——每日最新资讯28at.com

各个部分都完成之后就可以组合在一起训练模型了,流程和用CARLA差不多,就不细说了。DKK28资讯网——每日最新资讯28at.com

初始化环境(DQN的类加进去就行了):DKK28资讯网——每日最新资讯28at.com

import gymDKK28资讯网——每日最新资讯28at.com
import highway_envDKK28资讯网——每日最新资讯28at.com
from matplotlib import pyplot as pltDKK28资讯网——每日最新资讯28at.com
import numpy as npDKK28资讯网——每日最新资讯28at.com
import timeDKK28资讯网——每日最新资讯28at.com
config = DKK28资讯网——每日最新资讯28at.com
{DKK28资讯网——每日最新资讯28at.com
"observation": DKK28资讯网——每日最新资讯28at.com
{DKK28资讯网——每日最新资讯28at.com
"type": "Kinematics",DKK28资讯网——每日最新资讯28at.com
"vehicles_count": 5,DKK28资讯网——每日最新资讯28at.com
"features": ["presence", "x", "y", "vx", "vy", "cos_h", "sin_h"],DKK28资讯网——每日最新资讯28at.com
"features_range": DKK28资讯网——每日最新资讯28at.com
{DKK28资讯网——每日最新资讯28at.com
"x": [-100, 100],DKK28资讯网——每日最新资讯28at.com
"y": [-100, 100],DKK28资讯网——每日最新资讯28at.com
"vx": [-20, 20],DKK28资讯网——每日最新资讯28at.com
"vy": [-20, 20]DKK28资讯网——每日最新资讯28at.com
},DKK28资讯网——每日最新资讯28at.com
"absolute": False,DKK28资讯网——每日最新资讯28at.com
"order": "sorted"DKK28资讯网——每日最新资讯28at.com
},DKK28资讯网——每日最新资讯28at.com
"simulation_frequency": 8, # [Hz]DKK28资讯网——每日最新资讯28at.com
"policy_frequency": 2, # [Hz]DKK28资讯网——每日最新资讯28at.com
}DKK28资讯网——每日最新资讯28at.com
env = gym.make("highway-v0")DKK28资讯网——每日最新资讯28at.com
env.configure(config)DKK28资讯网——每日最新资讯28at.com

训练模型:DKK28资讯网——每日最新资讯28at.com

dqn=DQN()DKK28资讯网——每日最新资讯28at.com
count=0DKK28资讯网——每日最新资讯28at.com
reward=[]DKK28资讯网——每日最新资讯28at.com
avg_reward=0DKK28资讯网——每日最新资讯28at.com
all_reward=[]DKK28资讯网——每日最新资讯28at.com
time_=[]DKK28资讯网——每日最新资讯28at.com
all_time=[]DKK28资讯网——每日最新资讯28at.com
collision_his=[]DKK28资讯网——每日最新资讯28at.com
all_collision=[]DKK28资讯网——每日最新资讯28at.com
while True:DKK28资讯网——每日最新资讯28at.com
done = False DKK28资讯网——每日最新资讯28at.com
start_time=time.time()DKK28资讯网——每日最新资讯28at.com
s = env.reset()DKK28资讯网——每日最新资讯28at.com
while not done:DKK28资讯网——每日最新资讯28at.com
e = np.exp(-count/300) #随机选择action的概率,随着训练次数增多逐渐降低DKK28资讯网——每日最新资讯28at.com
a = dqn.choose_action(s,e)DKK28资讯网——每日最新资讯28at.com
s_, r, done, info = env.step(a)DKK28资讯网——每日最新资讯28at.com
env.render()DKK28资讯网——每日最新资讯28at.com
dqn.push_memory(s, a, r, s_)DKK28资讯网——每日最新资讯28at.com
if ((dqn.position !=0)&(dqn.position % 99==0)):DKK28资讯网——每日最新资讯28at.com
loss_=dqn.learn()DKK28资讯网——每日最新资讯28at.com
count+=1DKK28资讯网——每日最新资讯28at.com
print('trained times:',count)DKK28资讯网——每日最新资讯28at.com
if (count%40==0):DKK28资讯网——每日最新资讯28at.com
avg_reward=np.mean(reward)DKK28资讯网——每日最新资讯28at.com
avg_time=np.mean(time_)DKK28资讯网——每日最新资讯28at.com
collision_rate=np.mean(collision_his)DKK28资讯网——每日最新资讯28at.com
all_reward.append(avg_reward)DKK28资讯网——每日最新资讯28at.com
all_time.append(avg_time)DKK28资讯网——每日最新资讯28at.com
all_collision.append(collision_rate)DKK28资讯网——每日最新资讯28at.com
plt.plot(all_reward)DKK28资讯网——每日最新资讯28at.com
plt.show()DKK28资讯网——每日最新资讯28at.com
plt.plot(all_time)DKK28资讯网——每日最新资讯28at.com
plt.show()DKK28资讯网——每日最新资讯28at.com
plt.plot(all_collision)DKK28资讯网——每日最新资讯28at.com
plt.show()DKK28资讯网——每日最新资讯28at.com
reward=[]DKK28资讯网——每日最新资讯28at.com
time_=[]DKK28资讯网——每日最新资讯28at.com
collision_his=[]DKK28资讯网——每日最新资讯28at.com
s = s_DKK28资讯网——每日最新资讯28at.com
reward.append(r) DKK28资讯网——每日最新资讯28at.com
end_time=time.time()DKK28资讯网——每日最新资讯28at.com
episode_time=end_time-start_timeDKK28资讯网——每日最新资讯28at.com
time_.append(episode_time)DKK28资讯网——每日最新资讯28at.com
is_collision=1 if info['crashed']==True else 0DKK28资讯网——每日最新资讯28at.com
collision_his.append(is_collision)DKK28资讯网——每日最新资讯28at.com

我在代码中添加了一些画图的函数,在运行过程中就可以掌握一些关键的指标,每训练40次统计一次平均值。DKK28资讯网——每日最新资讯28at.com

平均碰撞发生率:DKK28资讯网——每日最新资讯28at.com

DKK28资讯网——每日最新资讯28at.com

epoch平均时长(s):DKK28资讯网——每日最新资讯28at.com

DKK28资讯网——每日最新资讯28at.com

平均reward:DKK28资讯网——每日最新资讯28at.com

DKK28资讯网——每日最新资讯28at.com

可以看出平均碰撞发生率会随训练次数增多逐渐降低,每个epoch持续的时间会逐渐延长(如果发生碰撞epoch会立刻结束)DKK28资讯网——每日最新资讯28at.com

总结DKK28资讯网——每日最新资讯28at.com

相比于模拟器CARLA,highway-env环境包明显更加抽象化,用类似游戏的表示方式,使得算法可以在一个理想的虚拟环境中得到训练,而不用考虑数据获取方式、传感器精度、运算时长等现实问题。对于端到端的算法设计和测试非常友好,但从自动控制的角度来看,可以入手的方面较少,研究起来不太灵活。DKK28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-119-2267-0.htmlAI实战,用Python玩个自动驾驶!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 无人出租车被警察截停后逃逸!AI:我当时害怕极了

下一篇: 京东云发布云原生自研中间件JCQ 性能容量接近无限扩展

标签:
  • 热门焦点
Top
Baidu
map