Advertisement

(17-7-05)基于强化学习的自动驾驶系统:评估自动驾驶模型的性能

阅读量:

17.8.6 评估自动驾驶模型的性能

编写一个名为test_agent.py的Python文件用于评估一个已有的自动驾驶智能体模型性能。该脚本允许用户通过标准输入指定测试路线、模型文件以及其他配置信息以执行测试任务。与之前介绍的训练脚本不同,则是为了评估已有的智能体性能而非进行新的模型训练工作。以下展示了具体实现代码:

复制代码
 def test_agent(env, weather_list, agent, route_id, nb_episodes):

    
     ep_rewards = []
    
     success_rate = 0
    
     avg_steps = 0
    
     for episode in range(nb_episodes):
    
     weather = weather_list[episode%len(weather_list)]
    
     env.set_weather(weather)
    
     obs = env.reset(route_id)
    
     done = False
    
     episode_reward = 0
    
     nb_steps = 0
    
     while not done:
    
         act = agent.select_action(obs, noise=False)
    
         print(act)
    
         obs_t1, reward, done, _ = env.step(act)
    
         obs = obs_t1
    
  
    
         episode_reward += reward
    
         nb_steps += 1
    
         if done:
    
             if reward > 450:
    
                 success_rate += 1
    
             avg_steps += nb_steps
    
             ep_rewards.append(episode_reward)
    
             print('Evaluation episode %3d | Steps: %4d | Reward: %4d | Success: %r' % (episode + 1, nb_steps, episode_reward, reward>450))     
    
         
    
     ep_rewards = np.array(ep_rewards)
    
     avg_reward = np.average(ep_rewards)
    
     std_reward = np.std(ep_rewards)
    
     success_rate /= nb_episodes
    
     avg_steps /= nb_episodes
    
     
    
     print('Average Reward: %.2f, Reward Deviation: %.2f | Average Steps: %.2f, Success Rate: %.2f' % (avg_reward, std_reward, avg_steps, success_rate))
    
     print('%.2f/%.2f/%.2f' % (success_rate, avg_reward, std_reward))
    
     return avg_reward, std_reward, success_rate
    
 if __name__=='__main__':
    
     argparser = ArgumentParser()
    
     argparser.add_argument('--world-port', type=int, default=config.WORLD_PORT)
    
     argparser.add_argument('--host', type=str, default=config.WORLD_HOST)
    
     argparser.add_argument('--cam_height', type=int, default=config.CAM_HEIGHT, help="Camera height")
    
     argparser.add_argument('--cam_width', type=int, default=config.CAM_WIDTH, help="Camera width")
    
     argparser.add_argument('--fov', type=int, default=config.CAM_FOV, help="Camera field of view")
    
     argparser.add_argument('--tick', type=float, default=config.TICK, help="Sensor tick length")
    
     argparser.add_argument('--model', type=str, default=config.AE_MODEL, help='model',
    
                        choices=['Autoencoder', 'AutoencoderSEM', 'VAE'])
    
     argparser.add_argument('--autoencoder_model', type=str, help="Autoencoder model path", default=config.AE_PRETRAINED)    
    
     argparser.add_argument('--device', type=str, default='cpu', help="Device to use for testing", choices=['cuda', 'cpu'])
    
     argparser.add_argument('--nb_episodes', type=int, default=20, help="Number of episodes of testing")
    
     argparser.add_argument('--route_id', type=int, required=True, help="Route id to use for testing")
    
     argparser.add_argument('--agent_model', type=str, required=True, help="Trained agent file")
    
     argparser.add_argument('--type', type=str, default='test', choices=['test', 'train'], help="Type of evaluation")
    
     argparser.add_argument('-exo_vehicles', action='store_true', help="Use exo vehicles")
    
     args = argparser.parse_args()
    
     if not os.path.exists(args.autoencoder_model):
    
     raise Exception('Autoencoder model not found')    
    
     if not os.path.exists(args.agent_model):
    
     raise Exception('Agent model not found')
    
     if args.model=='AutoencoderSEM':
    
     autoencoder = AutoencoderSEM.load_from_checkpoint(args.autoencoder_model)
    
     elif args.model=='VAE':
    
     autoencoder = VAE.load_from_checkpoint(args.autoencoder_model)
    
     elif args.model=='Autoencoder':
    
     autoencoder = Autoencoder.load_from_checkpoint(args.autoencoder_model)
    
     else:
    
     raise ValueError(f"Unknown model {args.model}")
    
     autoencoder.freeze()
    
     autoencoder.eval()
    
     map_name = config.TRAIN_MAP if args.type=='train' else config.TEST_MAP
    
     print(map_name)
    
     env = CarlaEnv(autoencoder, args.world_port, args.host, map_name, 'ClearNoon',
    
              args.cam_height, args.cam_width, args.fov, args.tick, 500, exo_vehicles=args.exo_vehicles)
    
     
    
     num_routes = len(Route.get_possibilities(config.TRAIN_MAP))
    
     weather_list = config.TRAIN_WEATHER if args.type=='train' else config.TEST_WEATHER
    
     with open(args.agent_model, 'rb') as f:
    
     agent = pickle.load(f)   
    
     try:
    
     test_agent(env, weather_list, agent, args.route_id, args.nb_episodes)
    
     finally:
    
     env.reset_settings()

上述代码的主要目的是进行性能评估,并全面了解该智能体在指定路线和不同环境条件下运行的表现情况。通过命令行参数可以选择需要测试的具体路线、相应的智能体模型文件以及其他必要的配置信息来启动测试过程。详细的具体步骤如下:首先设置好所需测试的路径与文件路径;其次输入所需的关键参数;最后运行代码即可完成测试任务并输出结果分析

  1. 通过解析命令行参数获取配置信息包, 其中包含Carla仿真环境的具体设置、使用的Autoencoder/AutoencoderSEM/VAE模型类型、测试路线(route_id)以及自动驾驶智能体(agent_model)的路径等关键信息。
  2. 调用预训练好的图像特征提取模型(Autoencoder/AutoencoderSEM/VAE)进行后续操作。
  3. 基于命令行参数设置Carla仿真环境的具体属性, 包括世界端口数值、主机地址、摄像头配置参数、天气模式选择以及时间间隔tick值等。
  4. 读取并加载已训练完成的自动驾驶智能体模型, 该模型包含了策略网络等关键组件和权重参数。
  5. 在指定测试路线中运行自动驾驶智能体, 并根据仿真环境反馈执行相应的动作以测试性能。
  6. 在每个测试回合中持续记录回报值(reward)、执行步数(steps)以及任务完成与否的信息。
  7. 最后汇总并输出该回合的各项测试指标数据, 包括平均回报值、回报标准差数值、平均步长统计和成功率百分比等关键指标。
  8. 测试结束后, 将仿真环境设置恢复到初始状态以便下次使用。

**注意:**相较于之前介绍的训练脚本,《这个脚本》的主要目的是评估已有的智能体系而非开发新模型。

全部评论 (0)

还没有任何评论哟~