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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top