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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 造车两年股价跌六成,小米的估值逻辑变了吗?

    如果从小米官宣造车后的首个交易日起持有小米集团的股票,那么截至2023年上半年最后一个交易日,投资者将浮亏59.16%,同区间的恒生科技指数跌幅为52.78%
  • 华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    在今日举行的2023年华为云数字文娱AI创新峰会上,华为云全球Marketing与销售服务总裁石冀琳表示,华为云将在后续推出盘古数字人大模型,可帮助用户12小
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
Top