コード例 #1
0
ファイル: gibson.py プロジェクト: srk97/Reinforce
def gibson_env(hparams):
    basic_config = cfg_env(config_file=hparams.task_config,
                           config_dir=os.path.join(dirname, 'configs'))
    scenes = PointNavDatasetV1.get_scenes_to_load(basic_config.DATASET)
    config_env = cfg_env(config_file=hparams.task_config,
                         config_dir=os.path.join(dirname, 'configs'))
    config_env.defrost()

    if len(scenes) > 0:
        random.shuffle(scenes)
        config_env.DATASET.POINTNAVV1.CONTENT_SCENES = scenes
    for sensor in hparams.sensors:
        assert sensor in ["RGB_SENSOR", "DEPTH_SENSOR"]
    config_env.SIMULATOR.AGENT_0.SENSORS = hparams.sensors
    config_env.freeze()
    config_baseline = cfg_baseline()

    dataset = PointNavDatasetV1(config_env.DATASET)

    config_env.defrost()
    config_env.SIMULATOR.SCENE = dataset.episodes[0].scene_id
    config_env.freeze()

    env = NavRLEnv(config_env=config_env,
                   config_baseline=config_baseline,
                   dataset=dataset)

    return env
コード例 #2
0
ファイル: train_ppo.py プロジェクト: oawiles/habitat-api
def make_env_fn(config_env, config_baseline, rank):
    dataset = PointNavDatasetV1(config_env.DATASET)
    config_env.defrost()
    config_env.SIMULATOR.SCENE = dataset.episodes[0].scene_id
    config_env.freeze()
    env = NavRLEnv(config_env=config_env,
                   config_baseline=config_baseline,
                   dataset=dataset)
    env.seed(rank)
    return env
コード例 #3
0
def test_single_pointnav_dataset():
    dataset_config = get_config().DATASET
    if not PointNavDatasetV1.check_config_paths_exist(dataset_config):
        pytest.skip("Test skipped as dataset files are missing.")
    scenes = PointNavDatasetV1.get_scenes_to_load(config=dataset_config)
    assert (len(scenes) >
            0), "Expected dataset contains separate episode file per scene."
    dataset = PointNavDatasetV1(config=dataset_config)
    assert len(dataset.episodes) > 0, "The dataset shouldn't be empty."
    assert (len(
        dataset.scene_ids) == 2), "The test dataset scenes number is wrong."
    check_json_serializaiton(dataset)
コード例 #4
0
ファイル: __init__.py プロジェクト: shahhaard47/HabitatAI-RL
def make_env_fn(args, config_env, config_baseline, rank):
    print("-------------- condig_env ---------------")
    print(config_env)
    print("-----------------------------------------")
    dataset = PointNavDatasetV1(config_env.DATASET)
    print("Loading {}".format(config_env.SIMULATOR.SCENE))
    env = PointNavEnv(args=args,
                      rank=rank,
                      config_env=config_env,
                      config_baseline=config_baseline,
                      dataset=dataset)
    env.seed(rank)
    return env
コード例 #5
0
def make_env_fn(args, config_env, rank):
    dataset = PointNavDatasetV1(config_env.DATASET)
    config_env.defrost()
    config_env.SIMULATOR.SCENE = dataset.episodes[0].scene_id
    print("Loading {}".format(config_env.SIMULATOR.SCENE))
    config_env.freeze()

    env = Neural_SLAM_Env(args=args, rank=rank,
                          config_env=config_env, dataset=dataset
                          )

    env.seed(rank)
    return env
コード例 #6
0
def make_env_fn(config_env, config_baseline, rank, target_dim, log_dir,
                visdom_name, visdom_log_file, vis_interval, visdom_server,
                visdom_port, swap_building_k_episodes, map_kwargs,
                reward_kwargs, should_record, seed):
    if config_env.DATASET.SPLIT == 'val':
        datasetfile_path = config_env.DATASET.POINTNAVV1.DATA_PATH.format(
            split=config_env.DATASET.SPLIT)
        dataset = PointNavDatasetV1()
        with gzip.open(datasetfile_path, "rt") as f:
            dataset.from_json(f.read())
    else:
        dataset = PointNavDatasetV1(config_env.DATASET)

    config_env.defrost()
    config_env.SIMULATOR.SCENE = dataset.episodes[0].scene_id
    config_env.freeze()
    env = MidlevelNavRLEnv(config_env=config_env,
                           config_baseline=config_baseline,
                           dataset=dataset,
                           target_dim=target_dim,
                           map_kwargs=map_kwargs,
                           reward_kwargs=reward_kwargs)
    env.episodes = shuffle_episodes(env, swap_every_k=swap_building_k_episodes)
    env.seed(seed)
    if should_record and visdom_log_file is not None:
        print("SETTING VISDOM MONITOR WITH VIS INTERVAL", vis_interval)
        env = VisdomMonitor(env,
                            directory=os.path.join(log_dir, visdom_name),
                            video_callable=lambda x: x % vis_interval == 0,
                            uid=str(rank),
                            server=visdom_server,
                            port=visdom_port,
                            visdom_log_file=visdom_log_file,
                            visdom_env=visdom_name)

    return env
コード例 #7
0
def make_habitat_vector_env(
    scenario='PointNav',
    num_processes=2,
    target_dim=7,
    preprocessing_fn=None,
    log_dir=None,
    visdom_name='main',
    visdom_log_file=None,
    visdom_server='localhost',
    visdom_port='8097',
    vis_interval=200,
    train_scenes=None,
    val_scenes=None,
    num_val_processes=0,
    swap_building_k_episodes=10,
    gpu_devices=[0],
    map_kwargs={},
    reward_kwargs={},
    seed=42,
    test_mode=False,
    debug_mode=False,
    scenario_kwargs={},
):
    assert map_kwargs[
        'map_building_size'] > 0, 'Map building size must be positive!'
    default_reward_kwargs = {
        'slack_reward': -0.01,
        'success_reward': 10,
        'use_visit_penalty': False,
        'visit_penalty_coef': 0,
        'penalty_eps': 999,
        'sparse': False,
        'dist_coef': 1.0,
    }
    for k, v in default_reward_kwargs.items():
        if k not in reward_kwargs:
            reward_kwargs[k] = v

    habitat_path = os.path.dirname(os.path.dirname(habitat.__file__))
    if scenario == 'PointNav' or scenario == 'Exploration':
        task_config = os.path.join(habitat_path,
                                   'configs/tasks/pointnav_gibson_train.yaml')
        # only difference is that Exploration needs DEPTH_SENSOR but that is added in the Env
        # task_config = os.path.join(habitat_path, 'configs/tasks/exploration_gibson.yaml')

    env_configs = []
    baseline_configs = []
    encoders = []
    target_dims = []
    is_val = []

    # Assign specific episodes to each process
    config_env = cfg_env(task_config)

    # Load dataset
    print('Loading val dataset (partition by episode)...')
    datasetfile_path = config_env.DATASET.POINTNAVV1.DATA_PATH.format(
        split='val')
    dataset = PointNavDatasetV1()
    with gzip.open(datasetfile_path, "rt") as f:
        dataset.from_json(f.read())
    val_datasets = get_splits(dataset, max(num_val_processes, 1))
    #     for d in val_datasets:
    #         d.episodes = [d.episodes[0]]
    print('Loaded.')

    print('Loading train dataset (partition by building)...')
    train_datasets = []
    if num_processes - num_val_processes > 0:
        #         dataset = PointNavDatasetV1(config_env.DATASET)
        train_datasets = [
            None for _ in range(num_processes - num_val_processes)
        ]
    print('Loaded.')

    # Assign specific buildings to each process
    if num_processes > num_val_processes:
        train_process_scenes = [[] for _ in range(num_processes -
                                                  num_val_processes)]
        if train_scenes is None:
            train_scenes = PointNavDatasetV1.get_scenes_to_load(
                config_env.DATASET)
            random.shuffle(train_scenes)

        for i, scene in enumerate(train_scenes):
            train_process_scenes[i % len(train_process_scenes)].append(scene)

        # If n processes > n envs, some processes can use all envs
        for j, process in enumerate(train_process_scenes):
            if len(process) == 0:
                train_process_scenes[j] = list(train_scenes)

    get_scenes = lambda d: list(
        Counter([e.scene_id.split('/')[-1].split(".")[0]
                 for e in d.episodes]).items())
    for i in range(num_processes):
        config_env = cfg_env(task_config)
        config_env.defrost()

        if i < num_processes - num_val_processes:
            config_env.DATASET.SPLIT = 'train'
            #             config_env.DATASET.POINTNAVV1.CONTENT_SCENES = get_scenes(train_datasets[i])
            config_env.DATASET.POINTNAVV1.CONTENT_SCENES = train_process_scenes[
                i]
        else:
            val_i = i - (num_processes - num_val_processes)
            config_env.DATASET.SPLIT = 'val'
            if val_scenes is not None:
                config_env.DATASET.POINTNAVV1.CONTENT_SCENES = val_scenes
            else:
                config_env.DATASET.POINTNAVV1.CONTENT_SCENES = get_scenes(
                    val_datasets[val_i])

        print("Env {}:".format(i),
              config_env.DATASET.POINTNAVV1.CONTENT_SCENES)

        config_env.SIMULATOR.HABITAT_SIM_V0.GPU_DEVICE_ID = gpu_devices[
            i % len(gpu_devices)]
        config_env.SIMULATOR.SCENE = os.path.join(habitat_path,
                                                  config_env.SIMULATOR.SCENE)
        config_env.SIMULATOR.AGENT_0.SENSORS = ["RGB_SENSOR"]

        # Now define the config for the sensor
        #         config.TASK.AGENT_POSITION_SENSOR = habitat.Config()
        #         config.TASK.AGENT_POSITION_SENSOR.TYPE = "agent_position_sensor"
        #         config.TASK.SENSORS.append("AGENT_POSITION_SENSOR")

        config_env.TASK.MEASUREMENTS.append('COLLISIONS')

        config_env.freeze()
        env_configs.append(config_env)
        config_baseline = cfg_baseline()
        baseline_configs.append(config_baseline)
        encoders.append(preprocessing_fn)
        target_dims.append(target_dim)

    should_record = [(i == 0 or i == (num_processes - num_val_processes))
                     for i in range(num_processes)]
    if debug_mode:
        env = make_env_fn(
            scenario,
            env_configs[0],
            baseline_configs[0],
            0,
            0,
            1,
            target_dim,
            log_dir,
            visdom_name,
            visdom_log_file,
            vis_interval,
            visdom_server,
            visdom_port,
            swap_building_k_episodes,
            map_kwargs,
            reward_kwargs,
            False,
            seed,  # TODO set should_record to True
            test_mode,
            (train_datasets + val_datasets)[0],
            scenario_kwargs)
        envs = PreprocessEnv(env, preprocessing_fn=preprocessing_fn)
    else:
        envs = HabitatPreprocessVectorEnv(
            make_env_fn=make_env_fn,
            env_fn_args=tuple(
                tuple(
                    zip(
                        [scenario for _ in range(num_processes)],
                        env_configs,
                        baseline_configs,
                        range(num_processes),
                        [num_val_processes for _ in range(num_processes)],
                        [num_processes for _ in range(num_processes)],
                        target_dims,
                        [log_dir for _ in range(num_processes)],
                        [visdom_name for _ in range(num_processes)],
                        [visdom_log_file for _ in range(num_processes)],
                        [vis_interval for _ in range(num_processes)],
                        [visdom_server for _ in range(num_processes)],
                        [visdom_port for _ in range(num_processes)],
                        [
                            swap_building_k_episodes
                            for _ in range(num_processes)
                        ],
                        [map_kwargs for _ in range(num_processes)],
                        [reward_kwargs for _ in range(num_processes)],
                        should_record,
                        [seed + i for i in range(num_processes)],
                        [test_mode for _ in range(num_processes)],
                        train_datasets + val_datasets,
                        [scenario_kwargs for _ in range(num_processes)],
                    ))),
            preprocessing_fn=preprocessing_fn,
        )
        envs.observation_space = envs.observation_spaces[0]
    envs.action_space = spaces.Discrete(3)
    envs.reward_range = None
    envs.metadata = None
    envs.is_embodied = True
    return envs
コード例 #8
0
def make_env_fn(scenario, config_env, config_baseline, rank, num_val_processes,
                num_processes, target_dim, log_dir, visdom_name,
                visdom_log_file, vis_interval, visdom_server, visdom_port,
                swap_building_k_episodes, map_kwargs, reward_kwargs,
                should_record, seed, test_mode, dataset, scenario_kwargs):
    if config_env.DATASET.SPLIT == 'train':
        dataset = PointNavDatasetV1(config_env.DATASET)

    habitat_path = os.path.dirname(os.path.dirname(habitat.__file__))
    for ep in dataset.episodes:
        ep.scene_id = os.path.join(habitat_path, ep.scene_id)

    config_env.defrost()
    config_env.SIMULATOR.SCENE = dataset.episodes[0].scene_id
    config_env.freeze()

    if scenario == 'PointNav':
        dataset.episodes = [
            epi for epi in dataset.episodes if epi.info['geodesic_distance'] <
            scenario_kwargs['max_geodesic_dist']
        ]
        env = MidlevelNavRLEnv(config_env=config_env,
                               config_baseline=config_baseline,
                               dataset=dataset,
                               target_dim=target_dim,
                               map_kwargs=map_kwargs,
                               reward_kwargs=reward_kwargs,
                               loop_episodes=not test_mode,
                               scenario_kwargs=scenario_kwargs)
    elif scenario == 'Exploration':
        env = ExplorationRLEnv(config_env=config_env,
                               config_baseline=config_baseline,
                               dataset=dataset,
                               map_kwargs=map_kwargs,
                               reward_kwargs=reward_kwargs,
                               loop_episodes=not test_mode,
                               scenario_kwargs=scenario_kwargs)
    else:
        assert False, f'do not recognize scenario {scenario}'

    if test_mode:
        env.episodes = env.episodes
    else:
        env.episodes = shuffle_episodes(env,
                                        swap_every_k=swap_building_k_episodes)

    env.seed(seed)
    if should_record and visdom_log_file is not None:
        print(
            f"Recording videos from env {rank} every {vis_interval} episodes (via visdom)"
        )
        env = VisdomMonitor(env,
                            directory=os.path.join(log_dir, visdom_name),
                            video_callable=lambda x: x % vis_interval == 0,
                            uid=str(rank),
                            server=visdom_server,
                            port=visdom_port,
                            visdom_log_file=visdom_log_file,
                            visdom_env=visdom_name)

    return env