一、安装环境 gym是用于开发和比较强化学习算法的工具包,在python中安装gym库和其中子场景都较为简便。
安装gym:
pip install gym安装自动驾驶模块,这里使用Edouard Leurent发布在github上的包highway-env(链接:https://github.com/eleurent/highway-env):
pip install --user git+https://github.com/eleurent/highway-env其中包含6个场景:
详细文档可以参考这里:
https://highway-env.readthedocs.io/en/latest/
二、配置环境 安装好后即可在代码中进行实验(以高速公路场景为例):
import gym'highway-v0' )for  _ in  range(3):"IDLE" ]done , info = env.step(action)运行后会在模拟器中生成如下场景:
绿色为ego vehicle 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 = {'LANE_LEFT' ,'IDLE' ,'LANE_RIGHT' ,'FASTER' ,'SLOWER' (3) reward highway-env包中除了泊车场景外都采用同一个reward function:
这个function只能在其源码中更改,在外层只能调整权重。(泊车场景的reward function原文档里有,懒得打公式了……)
2、搭建模型 DQN网络的结构和搭建过程已经在我另一篇文章中讨论过,所以这里不再详细解释。我采用第一种state表示方式——Kinematics进行示范。
由于state数据量较小(5辆车*7个特征),可以不考虑使用CNN,直接把二维数据的size[5,7]转成[1,35]即可,模型的输入就是35,输出是离散action数量,共5个。
import torch# epsilon used for epsilon greedy approach # How frequently target netowrk updates # learning rate return  s           if  np.random.uniform() -e:  else : return  actionif  len(self.memory)             self.memory.append(None)'float32' )))# return  sampleif  self.learn_step_counter % TARGET_NETWORK_REPLACE_FREQ == 0:# # reset the gradient to zero         # execute back propagation for one step        return  loss'Transition' ,('state' , 'next_state' ,'action' , 'reward' ))3、运行结果 各个部分都完成之后就可以组合在一起训练模型了,流程和用CARLA差不多,就不细说了。
初始化环境(DQN的类加进去就行了):
import gym"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] "highway-v0" )训练模型:
dqn=DQN()while  True:done  = False    while  not done :#随机选择action的概率,随着训练次数增多逐渐降低 
 , info = env.step(a)if  ((dqn.position !=0)&(dqn.position % 99==0)):print ('trained times:' ,count)if  (count%40==0):if  info['crashed' ]==True else  0我在代码中添加了一些画图的函数,在运行过程中就可以掌握一些关键的指标,每训练40次统计一次平均值。
平均碰撞发生率:
epoch平均时长(s):
 平均reward:
可以看出平均碰撞发生率会随训练次数增多逐渐降低,每个epoch持续的时间会逐渐延长(如果发生碰撞epoch会立刻结束)
四、总结 相比于我在之前文章中使用过的模拟器CARLA,highway-env环境包明显更加抽象化,用类似游戏的表示方式,使得算法可以在一个理想的虚拟环境中得到训练,而不用考虑数据获取方式、传感器精度、运算时长等现实问题。对于端到端的算法设计和测试非常友好,但从自动控制的角度来看,可以入手的方面较少,研究起来不太灵活。
- EOF - 
关注「大数据与机器学习文摘」 
看精选技术文章和最新行业资讯 
点赞和在看就是最大的支持 ❤️