From 8c6d7b052560022a8b10ca5ca0d1f832d9af791e Mon Sep 17 00:00:00 2001
From: Oleksandr Maksymets <maksymets@gmail.com>
Date: Tue, 11 Feb 2020 01:41:14 -0800
Subject: [PATCH] added noises

---
 configs/tasks/objectnav_mp3d.yaml              |  11 +++++++++--
 examples/shortest_path_follower_example.py     |  11 +++++++++--
 habitat/config/default.py                      |   4 +++-
 habitat/core/dataset.py                        |   7 +++++++
 habitat/core/env.py                            |   7 +++++++
 .../datasets/object_nav/object_nav_dataset.py  |   5 +++++
 .../habitat_simulator/habitat_simulator.py     |   8 +++++++-
 habitat/tasks/nav/nav.py                       |   3 +++
 habitat_baselines/common/env_utils.py          |   5 ++++-
 habitat_baselines/common/utils.py              |   6 +++++-
 .../config/objectnav/ddppo_objectnav.yaml      |  17 ++++++++++-------
 .../config/pointnav/ddppo_pointnav.yaml        |   2 +-
 .../rl/ddppo/single_node_obj_nav.sh            |  12 ++++++++++++
 ...out.tfevents.1580768898.devfair0194.69437.0 | Bin 0 -> 130 bytes
 ...out.tfevents.1580943506.devfair0194.30021.0 | Bin 0 -> 40 bytes
 ...out.tfevents.1580946428.devfair0194.34988.0 | Bin 0 -> 6371 bytes
 ...out.tfevents.1580768902.devfair0194.69437.2 | Bin 0 -> 130 bytes
 ...out.tfevents.1580946531.devfair0194.34988.2 | Bin 0 -> 6371 bytes
 ...out.tfevents.1580768902.devfair0194.69437.1 | Bin 0 -> 130 bytes
 ...out.tfevents.1580946531.devfair0194.34988.1 | Bin 0 -> 6371 bytes
 20 files changed, 82 insertions(+), 16 deletions(-)
 create mode 100644 habitat_baselines/rl/ddppo/single_node_obj_nav.sh
 create mode 100644 tb/events.out.tfevents.1580768898.devfair0194.69437.0
 create mode 100644 tb/events.out.tfevents.1580943506.devfair0194.30021.0
 create mode 100644 tb/events.out.tfevents.1580946428.devfair0194.34988.0
 create mode 100644 tb/losses/policy/events.out.tfevents.1580768902.devfair0194.69437.2
 create mode 100644 tb/losses/policy/events.out.tfevents.1580946531.devfair0194.34988.2
 create mode 100644 tb/losses/value/events.out.tfevents.1580768902.devfair0194.69437.1
 create mode 100644 tb/losses/value/events.out.tfevents.1580946531.devfair0194.34988.1

diff --git a/configs/tasks/objectnav_mp3d.yaml b/configs/tasks/objectnav_mp3d.yaml
index 8811ba838..2f5dd4b0a 100644
--- a/configs/tasks/objectnav_mp3d.yaml
+++ b/configs/tasks/objectnav_mp3d.yaml
@@ -1,5 +1,8 @@
 ENVIRONMENT:
   MAX_EPISODE_STEPS: 500
+  ITERATOR_OPTIONS:
+    CYCLE: True
+    NUM_EPISODE_SAMPLE: 4
 SIMULATOR:
   TURN_ANGLE: 30
   TILT_ANGLE: 30
@@ -20,6 +23,9 @@ SIMULATOR:
     HEIGHT: 480
     HFOV: 79
     POSITION: [0, 0.88, 0]
+    NOISE_MODEL: "GaussianNoiseModel"
+    NOISE_MODEL_KWARGS:
+      intensity_constant: 0.1
   DEPTH_SENSOR:
     WIDTH: 640
     HEIGHT: 480
@@ -27,6 +33,7 @@ SIMULATOR:
     MIN_DEPTH: 0.5
     MAX_DEPTH: 5.0
     POSITION: [0, 0.88, 0]
+    NOISE_MODEL: "RedwoodDepthNoiseModel"
 TASK:
   TYPE: ObjectNav-v1
   POSSIBLE_ACTIONS: ["STOP", "MOVE_FORWARD", "TURN_LEFT", "TURN_RIGHT", "LOOK_UP", "LOOK_DOWN"]
@@ -45,7 +52,7 @@ TASK:
 
 DATASET:
   TYPE: ObjectNav-v1
-  SPLIT: val
-  CONTENT_SCENES: []
+  SPLIT: train
+  CONTENT_SCENES: ["GdvgFV5R1Z5", "GdvgFV5R1Z5", "GdvgFV5R1Z5", "GdvgFV5R1Z5"] # ["YmJkqBEsHnH", "YmJkqBEsHnH", "YmJkqBEsHnH", "YmJkqBEsHnH"] # ["*"] #
   DATA_PATH: "data/datasets/objectnav/mp3d/v0/{split}/{split}.json.gz"
   SCENES_DIR: "data/scene_datasets/"
diff --git a/examples/shortest_path_follower_example.py b/examples/shortest_path_follower_example.py
index 7b2262aed..2d0e39719 100644
--- a/examples/shortest_path_follower_example.py
+++ b/examples/shortest_path_follower_example.py
@@ -62,7 +62,9 @@ def draw_top_down_map(info, heading, output_size):
 
 
 def shortest_path_example(mode):
-    config = habitat.get_config(config_paths="configs/tasks/pointnav.yaml")
+    config = habitat.get_config(
+        config_paths="configs/tasks/objectnav_mp3d.yaml"
+    )
     config.defrost()
     config.TASK.MEASUREMENTS.append("TOP_DOWN_MAP")
     config.TASK.SENSORS.append("HEADING_SENSOR")
@@ -97,8 +99,13 @@ def shortest_path_example(mode):
             top_down_map = draw_top_down_map(
                 info, observations["heading"][0], im.shape[0]
             )
+            from habitat.utils.visualizations.utils import (
+                observations_to_image,
+            )
+
             output_im = np.concatenate((im, top_down_map), axis=1)
-            images.append(output_im)
+
+            images.append(observations_to_image(observations, info))
         images_to_video(images, dirname, "trajectory")
         print("Episode finished")
 
diff --git a/habitat/config/default.py b/habitat/config/default.py
index 1182a03e8..1031ef26b 100644
--- a/habitat/config/default.py
+++ b/habitat/config/default.py
@@ -212,6 +212,8 @@ SIMULATOR_SENSOR.HEIGHT = 480
 SIMULATOR_SENSOR.WIDTH = 640
 SIMULATOR_SENSOR.HFOV = 90  # horizontal field of view in degrees
 SIMULATOR_SENSOR.POSITION = [0, 1.25, 0]
+SIMULATOR_SENSOR.ORIENTATION = [0.0, 0.0, 0.0]
+SIMULATOR_SENSOR.NOISE_MODEL = "None"
 # -----------------------------------------------------------------------------
 # RGB SENSOR
 # -----------------------------------------------------------------------------
@@ -242,7 +244,7 @@ _C.SIMULATOR.AGENT_0.ANGULAR_ACCELERATION = 4 * 3.14
 _C.SIMULATOR.AGENT_0.LINEAR_FRICTION = 0.5
 _C.SIMULATOR.AGENT_0.ANGULAR_FRICTION = 1.0
 _C.SIMULATOR.AGENT_0.COEFFICIENT_OF_RESTITUTION = 0.0
-_C.SIMULATOR.AGENT_0.SENSORS = ["RGB_SENSOR"]
+_C.SIMULATOR.AGENT_0.SENSORS = ["RGB_SENSOR", "DEPTH_SENSOR"]
 _C.SIMULATOR.AGENT_0.IS_SET_START_STATE = False
 _C.SIMULATOR.AGENT_0.START_POSITION = [0, 0, 0]
 _C.SIMULATOR.AGENT_0.START_ROTATION = [0, 0, 0, 1]
diff --git a/habitat/core/dataset.py b/habitat/core/dataset.py
index 00e70f5ad..3b74acdf5 100644
--- a/habitat/core/dataset.py
+++ b/habitat/core/dataset.py
@@ -309,6 +309,13 @@ class EpisodeIterator(Iterator):
 
         # sample episodes
         if num_episode_sample >= 0:
+            np.random.seed(100)
+            print(f"np.random.state {np.random.get_state()[0]}")
+            episodes = [
+                episode
+                for episode in episodes
+                if episode.episode_id in ["7", "77", "774", "10"]
+            ]
             episodes = np.random.choice(
                 episodes, num_episode_sample, replace=False
             )
diff --git a/habitat/core/env.py b/habitat/core/env.py
index 273a9775e..f79ef247a 100644
--- a/habitat/core/env.py
+++ b/habitat/core/env.py
@@ -4,6 +4,7 @@
 # This source code is licensed under the MIT license found in the
 # LICENSE file in the root directory of this source tree.
 
+import random
 import time
 from typing import Any, Dict, Iterator, List, Optional, Tuple, Type, Union
 
@@ -91,6 +92,9 @@ class Env:
             self._config.defrost()
             self._config.SIMULATOR.SCENE = self._dataset.episodes[0].scene_id
             self._config.freeze()
+            print(
+                f"scenes{self._dataset.scene_ids}len(self._dataset.episodes) = {len(self._dataset.episodes)}"
+            )
 
         self._sim = make_sim(
             id_sim=self._config.SIMULATOR.TYPE, config=self._config.SIMULATOR
@@ -198,6 +202,7 @@ class Env:
         assert len(self.episodes) > 0, "Episodes list is empty"
 
         self._current_episode = next(self._episode_iterator)
+        # print(f"self._current_episode: {self._current_episode.episode_id} {self._current_episode.scene_id}")
         self.reconfigure(self._config)
 
         observations = self.task.reset(episode=self.current_episode)
@@ -254,6 +259,8 @@ class Env:
         return observations
 
     def seed(self, seed: int) -> None:
+        np.random.seed(seed)
+        random.seed(seed)
         self._sim.seed(seed)
         self._task.seed(seed)
 
diff --git a/habitat/datasets/object_nav/object_nav_dataset.py b/habitat/datasets/object_nav/object_nav_dataset.py
index a595b26bd..c0437346a 100644
--- a/habitat/datasets/object_nav/object_nav_dataset.py
+++ b/habitat/datasets/object_nav/object_nav_dataset.py
@@ -36,7 +36,11 @@ class ObjectNavDatasetV1(PointNavDatasetV1):
     def from_json(
         self, json_str: str, scenes_dir: Optional[str] = None
     ) -> None:
+        from habitat.core.logging import logger
+
+        logger.info(f"deserializing")
         deserialized = json.loads(json_str)
+        logger.info("unpacking")
         if CONTENT_SCENES_PATH_FIELD in deserialized:
             self.content_scenes_path = deserialized[CONTENT_SCENES_PATH_FIELD]
 
@@ -98,3 +102,4 @@ class ObjectNavDatasetV1(PointNavDatasetV1):
 
         for i, ep in enumerate(self.episodes):
             ep.episode_id = str(i)
+        logger.info("unpacked.")
diff --git a/habitat/sims/habitat_simulator/habitat_simulator.py b/habitat/sims/habitat_simulator/habitat_simulator.py
index 244258270..2c2eab0df 100644
--- a/habitat/sims/habitat_simulator/habitat_simulator.py
+++ b/habitat/sims/habitat_simulator/habitat_simulator.py
@@ -186,12 +186,18 @@ class HabitatSim(Simulator):
         sensor_specifications = []
         for sensor in _sensor_suite.sensors.values():
             sim_sensor_cfg = habitat_sim.SensorSpec()
+            overwrite_config(
+                config_from=sensor.config, config_to=sim_sensor_cfg
+            )
             sim_sensor_cfg.uuid = sensor.uuid
             sim_sensor_cfg.resolution = list(
                 sensor.observation_space.shape[:2]
             )
             sim_sensor_cfg.parameters["hfov"] = str(sensor.config.HFOV)
-            sim_sensor_cfg.position = sensor.config.POSITION
+            # sim_sensor_cfg.position = sensor.config.POSITION
+            # sim_sensor_cfg.orientation = np.array(sensor.config.ORIENTATION, dtype=np.float32)
+            # sim_sensor_cfg.noise_model = sensor.config.NOISE_MODEL
+
             # TODO(maksymets): Add configure method to Sensor API to avoid
             # accessing child attributes through parent interface
             sim_sensor_cfg.sensor_type = sensor.sim_sensor_type  # type: ignore
diff --git a/habitat/tasks/nav/nav.py b/habitat/tasks/nav/nav.py
index 49d835d2d..62159d8dd 100644
--- a/habitat/tasks/nav/nav.py
+++ b/habitat/tasks/nav/nav.py
@@ -817,6 +817,9 @@ class DistanceToGoal(Measure):
                 for goal in episode.goals
                 for view_point in goal.view_points
             ]
+            # logger.info(
+            #     f"episode: {episode.episode_id}, {episode.goals[0].object_category} self._episode_view_points { len(self._episode_view_points)}."
+            # )
         self.update_metric(*args, episode=episode, **kwargs)
 
     def _euclidean_distance(self, position_a, position_b):
diff --git a/habitat_baselines/common/env_utils.py b/habitat_baselines/common/env_utils.py
index 1c87463e6..0e8d350e6 100644
--- a/habitat_baselines/common/env_utils.py
+++ b/habitat_baselines/common/env_utils.py
@@ -54,8 +54,11 @@ def construct_envs(
     configs = []
     env_classes = [env_class for _ in range(num_processes)]
     dataset = make_dataset(config.TASK_CONFIG.DATASET.TYPE)
-    scenes = dataset.get_scenes_to_load(config.TASK_CONFIG.DATASET)
+    scenes = config.TASK_CONFIG.DATASET.CONTENT_SCENES
+    if "*" in config.TASK_CONFIG.DATASET.CONTENT_SCENES:
+        scenes = dataset.get_scenes_to_load(config.TASK_CONFIG.DATASET)
 
+    print(f"len(scenes): {len(scenes)}")
     if len(scenes) > 0:
         random.shuffle(scenes)
 
diff --git a/habitat_baselines/common/utils.py b/habitat_baselines/common/utils.py
index d9b976765..8ddb184f6 100644
--- a/habitat_baselines/common/utils.py
+++ b/habitat_baselines/common/utils.py
@@ -165,5 +165,9 @@ def generate_video(
         images_to_video(images, video_dir, video_name)
     if "tensorboard" in video_option:
         tb_writer.add_video_from_np_images(
-            f"episode{episode_id}", checkpoint_idx, images, fps=fps
+            # f"episode{episode_id}",
+            video_name,
+            checkpoint_idx,
+            images,
+            fps=fps,
         )
diff --git a/habitat_baselines/config/objectnav/ddppo_objectnav.yaml b/habitat_baselines/config/objectnav/ddppo_objectnav.yaml
index 1e759ad89..1881ceb16 100644
--- a/habitat_baselines/config/objectnav/ddppo_objectnav.yaml
+++ b/habitat_baselines/config/objectnav/ddppo_objectnav.yaml
@@ -4,23 +4,26 @@ ENV_NAME: "NavRLEnv"
 SIMULATOR_GPU_ID: 0
 TORCH_GPU_ID: 1
 VIDEO_OPTION: ["disk", "tensorboard"]
-TENSORBOARD_DIR: "/checkpoint/maksymets/logs/habitat_baselines/ddppo/obj_nav_mp3d"
+TENSORBOARD_DIR: "/checkpoint/maksymets/logs/habitat_baselines/ddppo/obj_nav_mp3d_4_ep_slack-1e3"
 VIDEO_DIR: "data/video_dir"
-TEST_EPISODE_COUNT: 2184
-EVAL_CKPT_PATH_DIR: "data/new_checkpoints"
-NUM_PROCESSES: 2
+TEST_EPISODE_COUNT: 1
+EVAL_CKPT_PATH_DIR: "data/new_checkpoints/obj_nav_mp3d_4_ep_slack-1e3"
+NUM_PROCESSES: 4
 SENSORS: ["DEPTH_SENSOR", "RGB_SENSOR"]
-CHECKPOINT_FOLDER: "data/new_checkpoints"
-NUM_UPDATES: 10000
+CHECKPOINT_FOLDER: "data/new_checkpoints/obj_nav_mp3d_4_ep_slack-1e3"
+NUM_UPDATES: 270000
 LOG_INTERVAL: 10
 CHECKPOINT_INTERVAL: 50
+EVAL:
+  SPLIT: "train"
 
 RL:
   SUCCESS_REWARD: 2.5
+  SLACK_REWARD: -1e-3
   PPO:
     # ppo params
     clip_param: 0.2
-    ppo_epoch: 2
+    ppo_epoch: 4
     num_mini_batch: 2
     value_loss_coef: 0.5
     entropy_coef: 0.01
diff --git a/habitat_baselines/config/pointnav/ddppo_pointnav.yaml b/habitat_baselines/config/pointnav/ddppo_pointnav.yaml
index b6f56c62d..6558e350e 100644
--- a/habitat_baselines/config/pointnav/ddppo_pointnav.yaml
+++ b/habitat_baselines/config/pointnav/ddppo_pointnav.yaml
@@ -8,7 +8,7 @@ TENSORBOARD_DIR: "tb"
 VIDEO_DIR: "video_dir"
 TEST_EPISODE_COUNT: 994
 EVAL_CKPT_PATH_DIR: "data/new_checkpoints"
-NUM_PROCESSES: 4
+NUM_PROCESSES: 2
 SENSORS: ["DEPTH_SENSOR"]
 CHECKPOINT_FOLDER: "data/new_checkpoints"
 NUM_UPDATES: 10000
diff --git a/habitat_baselines/rl/ddppo/single_node_obj_nav.sh b/habitat_baselines/rl/ddppo/single_node_obj_nav.sh
new file mode 100644
index 000000000..df389cd3d
--- /dev/null
+++ b/habitat_baselines/rl/ddppo/single_node_obj_nav.sh
@@ -0,0 +1,12 @@
+#/bin/bash
+
+export GLOG_minloglevel=2
+export MAGNUM_LOG=quiet
+
+set -x
+python -u -m torch.distributed.launch \
+    --use_env \
+    --nproc_per_node 1 \
+    habitat_baselines/run.py \
+    --exp-config habitat_baselines/config/objectnav/ddppo_objectnav.yaml \
+    --run-type train
diff --git a/tb/events.out.tfevents.1580768898.devfair0194.69437.0 b/tb/events.out.tfevents.1580768898.devfair0194.69437.0
new file mode 100644
index 0000000000000000000000000000000000000000..b954c8a63fb6be701f80cb65d12fcb361d9cf340
GIT binary patch
literal 130
zcmb1OfPlsI-b$P~hbAph@4N0O#hX-=n3<>NT9%quVr8VC{^q|dL>WVZ{(WUmhweoS
zLFxn=ShV=Lc)8e$Qp*#IQbeEj3+xq0;^9D1EXliR5kxTuisDPY3-*SZmj(j>VZ9}F

literal 0
HcmV?d00001

diff --git a/tb/events.out.tfevents.1580943506.devfair0194.30021.0 b/tb/events.out.tfevents.1580943506.devfair0194.30021.0
new file mode 100644
index 0000000000000000000000000000000000000000..98ae3d4bfd6d18f265bf43c7bd9431c1713aad10
GIT binary patch
literal 40
rcmb1OfPlsI-b$RNVM|pm^<8(A;!P?_%*@ksElbTSu`-h9%CQ0f#zhMo

literal 0
HcmV?d00001

diff --git a/tb/events.out.tfevents.1580946428.devfair0194.34988.0 b/tb/events.out.tfevents.1580946428.devfair0194.34988.0
new file mode 100644
index 0000000000000000000000000000000000000000..796eb3e24f753fb9861cd5924de125b2845aa9d3
GIT binary patch
literal 6371
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
R)zeT_f8F0}cc5tgNdV3oz+(Ua

literal 0
HcmV?d00001

diff --git a/tb/losses/policy/events.out.tfevents.1580768902.devfair0194.69437.2 b/tb/losses/policy/events.out.tfevents.1580768902.devfair0194.69437.2
new file mode 100644
index 0000000000000000000000000000000000000000..769bf65661095cb8c6215c35c1a76face53e8dd6
GIT binary patch
literal 130
zcmb1OfPlsI-b$Po#TGAA@4N0O#hX-=n3<>NT9%quVrBI1@=-Tgh%$x*{rk$Cu04yu
z>I52CwD`Grx!7{@i;Gi>MU&r_*gju1#~DTOI=)SdK!yr5aG)smk(p*|x$(wE0Lm68
A*8l(j

literal 0
HcmV?d00001

diff --git a/tb/losses/policy/events.out.tfevents.1580946531.devfair0194.34988.2 b/tb/losses/policy/events.out.tfevents.1580946531.devfair0194.34988.2
new file mode 100644
index 0000000000000000000000000000000000000000..372a4b19d3613bac5f5ea87f1173ea0f9846b246
GIT binary patch
literal 6371
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
UK3D`%Jq=ZLa{NTQ#5~Dv0A*y(tpET3

literal 0
HcmV?d00001

diff --git a/tb/losses/value/events.out.tfevents.1580768902.devfair0194.69437.1 b/tb/losses/value/events.out.tfevents.1580768902.devfair0194.69437.1
new file mode 100644
index 0000000000000000000000000000000000000000..b5416a2f96807e103601adb623ce68e42d77ebef
GIT binary patch
literal 130
zcmb1OfPlsI-b$QomlrKm@4N0O#hX-=n3<>NT9%quVrBH)A}mW5qKqLy|GqM(YY#-7
zKm&^wKNl|-TTXs)acZ&XpA(%nzodVEMNzztZ_^@>p#lvYD2i|Xmb10V<K+bar>7@9

literal 0
HcmV?d00001

diff --git a/tb/losses/value/events.out.tfevents.1580946531.devfair0194.34988.1 b/tb/losses/value/events.out.tfevents.1580946531.devfair0194.34988.1
new file mode 100644
index 0000000000000000000000000000000000000000..43dd6f5345f9e0b8f8e85e9617d13d17c7d424a4
GIT binary patch
literal 6371
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
JZAH^^cK}f7s=)vN

literal 0
HcmV?d00001

-- 
GitLab