From 50e2acffb7ad0ce8065b5e86e4a21958a5ec4e24 Mon Sep 17 00:00:00 2001
From: alexcbb <alexchapin@hotmail.fr>
Date: Fri, 28 Jul 2023 13:03:09 +0200
Subject: [PATCH] Set wandb offline

---
 Nonevisualisation_0.png           | Bin 24535 -> 0 bytes
 evaluate_sa.py                    |   1 -
 osrt/data/__init__.py             |   1 +
 osrt/data/core.py                 |  28 +++
 osrt/data/obsurf.py               |  29 +--
 osrt/data/ycb-video.py            | 372 ------------------------------
 osrt/utils/visualization_utils.py |   1 +
 quick_test.py                     |   9 +-
 runs/ycb/slot_att/config.yaml     |  24 ++
 runs/ycb/slot_att/config_tsa.yaml |  24 ++
 train_sa.py                       |   3 +-
 11 files changed, 85 insertions(+), 407 deletions(-)
 delete mode 100644 Nonevisualisation_0.png
 delete mode 100644 osrt/data/ycb-video.py
 create mode 100644 runs/ycb/slot_att/config.yaml
 create mode 100644 runs/ycb/slot_att/config_tsa.yaml

diff --git a/Nonevisualisation_0.png b/Nonevisualisation_0.png
deleted file mode 100644
index 59df42cecd44a6e04b3cc578d596a74d54a5cc10..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 24535
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

diff --git a/evaluate_sa.py b/evaluate_sa.py
index e5e06eb..bdd4e62 100644
--- a/evaluate_sa.py
+++ b/evaluate_sa.py
@@ -19,7 +19,6 @@ def main():
         description='Train a 3D scene representation model.'
     )
     parser.add_argument('config', type=str, help="Where to save the checkpoints.")
-    parser.add_argument('--wandb', action='store_true', help='Log run to Weights and Biases.')
     parser.add_argument('--seed', type=int, default=0, help='Random seed.')
     parser.add_argument('--ckpt', type=str, default=".", help='Model checkpoint path')
 
diff --git a/osrt/data/__init__.py b/osrt/data/__init__.py
index 96d64f2..84a842d 100644
--- a/osrt/data/__init__.py
+++ b/osrt/data/__init__.py
@@ -2,4 +2,5 @@ from osrt.data.core import get_dataset, worker_init_fn
 from osrt.data.nmr import NMRDataset
 from osrt.data.multishapenet import MultishapenetDataset 
 from osrt.data.obsurf import Clevr3dDataset, Clevr2dDataset
+from osrt.data.ycbv import YCBVideo2D
 
diff --git a/osrt/data/core.py b/osrt/data/core.py
index 3b8886e..5a8bb82 100644
--- a/osrt/data/core.py
+++ b/osrt/data/core.py
@@ -24,6 +24,7 @@ def get_dataset(mode, cfg, max_len=None, full_scale=False):
 
     if 'kwargs' in cfg:
         kwargs = cfg['kwargs']
+        print(kwargs)
     else:
         kwargs = dict()
 
@@ -45,6 +46,8 @@ def get_dataset(mode, cfg, max_len=None, full_scale=False):
                                       canonical_view=canonical_view, **kwargs)
     elif dataset_type == 'clevr2d':
         dataset = data.Clevr2dDataset(dataset_folder, mode, **kwargs)
+    elif dataset_type == 'ycb2d':
+        dataset = data.YCBVideo2D(dataset_folder, mode, **kwargs)
     elif dataset_type == 'obsurf_msn':
         dataset = data.Clevr3dDataset(dataset_folder, mode, points_per_item=points_per_item,
                                       shapenet=True, max_len=max_len, full_scale=full_scale,
@@ -62,3 +65,28 @@ def worker_init_fn(worker_id):
     base_seed = int.from_bytes(random_data, byteorder="big")
     np.random.seed(base_seed + worker_id)
 
+
+def downsample(x, num_steps=1):
+    if num_steps is None or num_steps < 1:
+        return x
+    stride = 2**num_steps
+    return x[stride//2::stride, stride//2::stride]
+
+def crop_center(image, crop_size=192):
+    height, width = image.shape[:2]
+
+    center_x = width // 2
+    center_y = height // 2
+
+    crop_size_half = crop_size // 2
+
+    # Calculate the top-left corner coordinates of the crop
+    crop_x1 = center_x - crop_size_half
+    crop_y1 = center_y - crop_size_half
+
+    # Calculate the bottom-right corner coordinates of the crop
+    crop_x2 = center_x + crop_size_half
+    crop_y2 = center_y + crop_size_half
+
+    # Crop the image
+    return image[crop_y1:crop_y2, crop_x1:crop_x2]
\ No newline at end of file
diff --git a/osrt/data/obsurf.py b/osrt/data/obsurf.py
index 074ac76..bb43841 100644
--- a/osrt/data/obsurf.py
+++ b/osrt/data/obsurf.py
@@ -10,32 +10,7 @@ import os
 
 from osrt.utils.nerf import get_camera_rays, get_extrinsic, transform_points
 import torch.nn.functional as F
-
-
-def downsample(x, num_steps=1):
-    if num_steps is None or num_steps < 1:
-        return x
-    stride = 2**num_steps
-    return x[stride//2::stride, stride//2::stride]
-
-def crop_center(image, crop_size=192):
-    height, width = image.shape[:2]
-
-    center_x = width // 2
-    center_y = height // 2
-
-    crop_size_half = crop_size // 2
-
-    # Calculate the top-left corner coordinates of the crop
-    crop_x1 = center_x - crop_size_half
-    crop_y1 = center_y - crop_size_half
-
-    # Calculate the bottom-right corner coordinates of the crop
-    crop_x2 = center_x + crop_size_half
-    crop_y2 = center_y + crop_size_half
-
-    # Crop the image
-    return image[crop_y1:crop_y2, crop_x1:crop_x2]
+from .core import downsample, crop_center
 
 class Clevr3dDataset(Dataset):
     def __init__(self, path, mode, max_views=None, points_per_item=2048, canonical_view=True,
@@ -250,8 +225,6 @@ class Clevr2dDataset(Dataset):
 
         np.put_along_axis(masks, np.expand_dims(mask_idxs, -1), 1, axis=-1)
 
-        metadata = {k: v[scene_idx] for (k, v) in self.metadata.items()}
-
         input_masks = crop_center(torch.tensor(masks), 192)
         input_masks = F.interpolate(input_masks.permute(2, 0, 1).unsqueeze(0), size=128)
         input_masks = input_masks.squeeze(0).permute(1, 2, 0)
diff --git a/osrt/data/ycb-video.py b/osrt/data/ycb-video.py
deleted file mode 100644
index 615a13f..0000000
--- a/osrt/data/ycb-video.py
+++ /dev/null
@@ -1,372 +0,0 @@
-import numpy as np
-import imageio
-import yaml
-from torch.utils.data import Dataset
-
-import os
-
-def get_extrinsic(camera_pos, rays=None, track_point=None, fourxfour=True):
-    """ Returns extrinsic matrix mapping world to camera coordinates.
-    Args:
-        camera_pos (np array [3]): Camera position.
-        track_point (np array [3]): Point on which the camera is fixated.
-        rays (np array [h, w, 3]): Rays eminating from the camera. Used to determine track_point
-            if it's not given.
-        fourxfour (bool): If true, a 4x4 matrix for homogeneous 3D coordinates is returned.
-            Otherwise, a 3x4 matrix is returned.
-    Returns:
-        extrinsic camera matrix (np array [4, 4] or [3, 4])
-    """
-    if track_point is None:
-        h, w, _ = rays.shape
-        if h % 2 == 0:
-            center_rays = rays[h//2 - 1:h//2 + 1]
-        else:
-            center_rays = rays[h//2:h//2+1]
-
-        if w % 2 == 0:
-            center_rays = rays[:, w//2 - 1:w//2 + 1]
-        else:
-            center_rays = rays[:, w//2:w//2+1]
-
-        camera_z = center_rays.mean((0, 1))
-    else:
-        camera_z = track_point - camera_pos
-
-    camera_z = camera_z / np.linalg.norm(camera_z, axis=-1, keepdims=True)
-
-    # We assume that (a) the z-axis is vertical, and that
-    # (b) the camera's horizontal, the x-axis, is orthogonal to the vertical, i.e.,
-    # the camera is in a level position.
-    vertical = np.array((0., 0., 1.))
-
-    camera_x = np.cross(camera_z, vertical)
-    camera_x = camera_x / np.linalg.norm(camera_x, axis=-1, keepdims=True)
-    camera_y = np.cross(camera_z, camera_x)
-
-    camera_matrix = np.stack((camera_x, camera_y, camera_z), -2)
-    translation = -np.einsum('...ij,...j->...i', camera_matrix, camera_pos)
-    camera_matrix = np.concatenate((camera_matrix, np.expand_dims(translation, -1)), -1)
-
-    if fourxfour:
-        filler = np.array([[0., 0., 0., 1.]])
-        camera_matrix = np.concatenate((camera_matrix, filler), 0)
-    return camera_matrix
-
-
-def transform_points(points, transform, translate=True):
-    """ Apply linear transform to a np array of points.
-    Args:
-        points (np array [..., 3]): Points to transform.
-        transform (np array [3, 4] or [4, 4]): Linear map.
-        translate (bool): If false, do not apply translation component of transform.
-    Returns:
-        transformed points (np array [..., 3])
-    """
-    # Append ones or zeros to get homogenous coordinates
-    if translate:
-        constant_term = np.ones_like(points[..., :1])
-    else:
-        constant_term = np.zeros_like(points[..., :1])
-    points = np.concatenate((points, constant_term), axis=-1)
-
-    points = np.einsum('nm,...m->...n', transform, points)
-    return points[..., :3]
-
-def get_camera_rays(c_pos, c_rot, width=640, height=480, focal_length=0.035, sensor_width=0.032,
-                    vertical=None):
-    if vertical is None:
-        vertical = np.array((0., 0., 1.))
-
-    c_dir = c_rot
-
-    img_plane_center = c_pos + c_dir * focal_length
-
-    # The horizontal axis of the camera sensor is horizontal (z=0) and orthogonal to the view axis
-    img_plane_horizontal = np.cross(c_dir, vertical)
-    img_plane_horizontal = img_plane_horizontal / np.linalg.norm(img_plane_horizontal)
-
-    # The vertical axis is orthogonal to both the view axis and the horizontal axis
-    img_plane_vertical = np.cross(c_dir, img_plane_horizontal)
-    img_plane_vertical = img_plane_vertical / np.linalg.norm(img_plane_vertical)
-
-    # Double check that everything is orthogonal
-    def is_small(x, atol=1e-7):
-        return abs(x) < atol
-
-    assert(is_small(np.dot(img_plane_vertical, img_plane_horizontal)))
-    assert(is_small(np.dot(img_plane_vertical, c_dir)))
-    assert(is_small(np.dot(c_dir, img_plane_horizontal)))
-
-    # Sensor height is implied by sensor width and aspect ratio
-    sensor_height = (sensor_width / width) * height
-
-    # Compute pixel boundaries
-    horizontal_offsets = np.linspace(-1, 1, width+1) * sensor_width / 2
-    vertical_offsets = np.linspace(-1, 1, height+1) * sensor_height / 2
-
-    # Compute pixel centers
-    horizontal_offsets = (horizontal_offsets[:-1] + horizontal_offsets[1:]) / 2
-    vertical_offsets = (vertical_offsets[:-1] + vertical_offsets[1:]) / 2
-
-    horizontal_offsets = np.repeat(np.reshape(horizontal_offsets, (1, width)), height, 0)
-    vertical_offsets = np.repeat(np.reshape(vertical_offsets, (height, 1)), width, 1)
-
-
-    horizontal_offsets = (np.reshape(horizontal_offsets, (height, width, 1)) *
-                          np.reshape(img_plane_horizontal, (1, 1, 3)))
-    vertical_offsets = (np.reshape(vertical_offsets, (height, width, 1)) *
-                        np.reshape(img_plane_vertical, (1, 1, 3)))
-
-    image_plane = horizontal_offsets + vertical_offsets
-
-    image_plane = image_plane + np.reshape(img_plane_center, (1, 1, 3))
-    c_pos_exp = np.reshape(c_pos, (1, 1, 3))
-    rays = image_plane - c_pos_exp
-    ray_norms = np.linalg.norm(rays, axis=2, keepdims=True)
-    rays = rays / ray_norms
-    return rays.astype(np.float32)
-
-def downsample(x, num_steps=1):
-    if num_steps is None or num_steps < 1:
-        return x
-    stride = 2**num_steps
-    return x[stride//2::stride, stride//2::stride]
-
-
-class YCBVideo3D(Dataset):
-    def __init__(self, path, mode, max_views=None, points_per_item=2048, canonical_view=True,
-                 max_len=None, full_scale=False, shapenet=False, downsample=None):
-        """ Loads the YCB-Video dataset that we have adapted.
-
-        Args:
-            path (str): Path to dataset.
-            mode (str): 'train', 'val', or 'test'.
-            points_per_item (int): Number of target points per scene.
-            max_len (int): Limit to the number of entries in the dataset.
-            canonical_view (bool): Return data in canonical camera coordinates (like in SRT), as opposed
-                to world coordinates.
-            full_scale (bool): Return all available target points, instead of sampling.
-            downsample (int): Downsample height and width of input image by a factor of 2**downsample
-        """
-        self.path = path
-        self.mode = mode
-        self.points_per_item = points_per_item
-        self.max_len = max_len
-        self.canonical = canonical_view
-        self.full_scale = full_scale
-        self.shapenet = shapenet
-        self.downsample = downsample
-
-        self.max_num_entities = 21 # max number of objects in a scene 
-        self.num_views = 3 # TODO : set this number for each scene 
-
-        self.start_idx, self.end_idx = {'train': (0, 70000),
-                                        'val': (70000, 75000),
-                                        'test': (85000, 100000)}[mode]
-
-        self.metadata = np.load(os.path.join(path, 'metadata.npz'))
-        self.metadata = {k: v for k, v in self.metadata.items()}
-
-        self.idxs = np.arange(self.start_idx, self.end_idx)
-
-        dataset_name = 'YCB-Video'
-        print(f'Initialized {dataset_name} {mode} set, {len(self.idxs)} examples')
-        print(self.idxs)
-
-        self.render_kwargs = {
-            'min_dist': 0.035,
-            'max_dist': 35.}
-
-    def __len__(self):
-        if self.max_len is not None:
-            return self.max_len
-        return len(self.idxs) * self.num_views
-
-    def __getitem__(self, idx):
-        scene_idx = idx % len(self.idxs)
-        view_idx = idx // len(self.idxs)
-
-        scene_idx = self.idxs[scene_idx]
-
-        imgs = [np.asarray(imageio.imread(
-            os.path.join(self.path, 'images', f'img_{scene_idx}_{v}.png')))
-            for v in range(self.num_views)]
-
-        imgs = [img[..., :3].astype(np.float32) / 255 for img in imgs]
-
-        mask_idxs = [imageio.imread(os.path.join(self.path, 'masks', f'masks_{scene_idx}_{v}.png'))
-                    for v in range(self.num_views)]
-        masks = np.zeros((self.num_views, 240, 320, self.max_num_entities), dtype=np.uint8)
-        np.put_along_axis(masks, np.expand_dims(mask_idxs, -1), 1, axis=-1)
-
-        input_image = downsample(imgs[view_idx], num_steps=self.downsample)
-        input_images = np.expand_dims(np.transpose(input_image, (2, 0, 1)), 0)
-
-        all_rays = []
-        # TODO : find a way to get the camera poses
-        all_camera_pos = self.metadata['camera_pos'][:self.num_views].astype(np.float32)
-        all_camera_rot= self.metadata['camera_rot'][:self.num_views].astype(np.float32)
-        for i in range(self.num_views):
-            cur_rays = get_camera_rays(all_camera_pos[i], all_camera_rot[i], noisy=False) # TODO : adapt function
-            all_rays.append(cur_rays)
-        all_rays = np.stack(all_rays, 0).astype(np.float32)
-
-        input_camera_pos = all_camera_pos[view_idx]
-
-        if self.canonical:
-            track_point = np.zeros_like(input_camera_pos)  # All cameras are pointed at the origin
-            canonical_extrinsic = get_extrinsic(input_camera_pos, track_point=track_point) # TODO : adapt function
-            canonical_extrinsic = canonical_extrinsic.astype(np.float32) 
-            all_rays = transform_points(all_rays, canonical_extrinsic, translate=False) # TODO : adapt function
-            all_camera_pos = transform_points(all_camera_pos, canonical_extrinsic)
-            input_camera_pos = all_camera_pos[view_idx]
-
-        input_rays = all_rays[view_idx]
-        input_rays = downsample(input_rays, num_steps=self.downsample)
-        input_rays = np.expand_dims(input_rays, 0)
-
-        input_masks = masks[view_idx]
-        input_masks = downsample(input_masks, num_steps=self.downsample)
-        input_masks = np.expand_dims(input_masks, 0)
-
-        input_camera_pos = np.expand_dims(input_camera_pos, 0)
-
-        all_pixels = np.reshape(np.stack(imgs, 0), (self.num_views * 240 * 320, 3))
-        all_rays = np.reshape(all_rays, (self.num_views * 240 * 320, 3))
-        all_camera_pos = np.tile(np.expand_dims(all_camera_pos, 1), (1, 240 * 320, 1))
-        all_camera_pos = np.reshape(all_camera_pos, (self.num_views * 240 * 320, 3))
-        all_masks = np.reshape(masks, (self.num_views * 240 * 320, self.max_num_entities))
-
-        num_points = all_rays.shape[0]
-
-        if not self.full_scale:
-            # If we have fewer points than we want, sample with replacement
-            replace = num_points < self.points_per_item
-            sampled_idxs = np.random.choice(np.arange(num_points),
-                                            size=(self.points_per_item,),
-                                            replace=replace)
-
-            target_rays = all_rays[sampled_idxs]
-            target_camera_pos = all_camera_pos[sampled_idxs]
-            target_pixels = all_pixels[sampled_idxs]
-            target_masks = all_masks[sampled_idxs]
-        else:
-            target_rays = all_rays
-            target_camera_pos = all_camera_pos
-            target_pixels = all_pixels
-            target_masks = all_masks
-
-        result = {
-            'input_images':         input_images,         # [1, 3, h, w]
-            'input_camera_pos':     input_camera_pos,     # [1, 3]
-            'input_rays':           input_rays,           # [1, h, w, 3]
-            'input_masks':          input_masks,          # [1, h, w, self.max_num_entities]
-            'target_pixels':        target_pixels,        # [p, 3]
-            'target_camera_pos':    target_camera_pos,    # [p, 3]
-            'target_rays':          target_rays,          # [p, 3]
-            'target_masks':         target_masks,         # [p, self.max_num_entities]
-            'sceneid':              idx,                  # int
-        }
-
-        if self.canonical:
-            result['transform'] = canonical_extrinsic     # [3, 4] (optional)
-
-        return result
-
-class YCBVideo2D(Dataset):
-    def __init__(self, path, mode, downsample=None):
-        """ Loads the YCB-Video dataset that we have adapted.
-
-        Args:
-            path (str): Path to dataset.
-            mode (str): 'train', 'val', or 'test'.
-            downsample (int): Downsample height and width of input image by a factor of 2**downsample
-        """
-        self.path = path
-        self.mode = mode
-        self.downsample = downsample
-
-        self.max_num_entities = 21 # max number of objects in a scene 
-
-        # TODO : set the right number here
-
-        dataset_name = 'YCB-Video'
-        print(f'Initialized {dataset_name} {mode} set')
-
-
-    def __len__(self):
-        return len(self.idxs)
-
-    def __getitem__(self, idx):
-
-        imgs = [np.asarray(imageio.imread(
-            os.path.join(self.path, 'images', f'img_{scene_idx}_{v}.png')))
-            for v in range(self.num_views)]
-
-        imgs = [img[..., :3].astype(np.float32) / 255 for img in imgs]
-
-        mask_idxs = [imageio.imread(os.path.join(self.path, 'masks', f'masks_{scene_idx}_{v}.png'))
-                    for v in range(self.num_views)]
-        masks = np.zeros((self.num_views, 240, 320, self.max_num_entities), dtype=np.uint8)
-        np.put_along_axis(masks, np.expand_dims(mask_idxs, -1), 1, axis=-1)
-
-        input_image = downsample(imgs[view_idx], num_steps=self.downsample)
-        input_images = np.expand_dims(np.transpose(input_image, (2, 0, 1)), 0)
-
-        all_rays = []
-        # TODO : find a way to get the camera poses
-        all_camera_pos = self.metadata['camera_pos'][:self.num_views].astype(np.float32)
-        all_camera_rot= self.metadata['camera_rot'][:self.num_views].astype(np.float32)
-        for i in range(self.num_views):
-            cur_rays = get_camera_rays(all_camera_pos[i], all_camera_rot[i], noisy=False) # TODO : adapt function
-            all_rays.append(cur_rays)
-        all_rays = np.stack(all_rays, 0).astype(np.float32)
-
-        input_camera_pos = all_camera_pos[view_idx]
-
-        if self.canonical:
-            track_point = np.zeros_like(input_camera_pos)  # All cameras are pointed at the origin
-            canonical_extrinsic = get_extrinsic(input_camera_pos, track_point=track_point) # TODO : adapt function
-            canonical_extrinsic = canonical_extrinsic.astype(np.float32) 
-            all_rays = transform_points(all_rays, canonical_extrinsic, translate=False) # TODO : adapt function
-            all_camera_pos = transform_points(all_camera_pos, canonical_extrinsic)
-            input_camera_pos = all_camera_pos[view_idx]
-
-        input_rays = all_rays[view_idx]
-        input_rays = downsample(input_rays, num_steps=self.downsample)
-        input_rays = np.expand_dims(input_rays, 0)
-
-        input_masks = masks[view_idx]
-        input_masks = downsample(input_masks, num_steps=self.downsample)
-        input_masks = np.expand_dims(input_masks, 0)
-
-        input_camera_pos = np.expand_dims(input_camera_pos, 0)
-
-        all_pixels = np.reshape(np.stack(imgs, 0), (self.num_views * 240 * 320, 3))
-        all_rays = np.reshape(all_rays, (self.num_views * 240 * 320, 3))
-        all_camera_pos = np.tile(np.expand_dims(all_camera_pos, 1), (1, 240 * 320, 1))
-        all_camera_pos = np.reshape(all_camera_pos, (self.num_views * 240 * 320, 3))
-        all_masks = np.reshape(masks, (self.num_views * 240 * 320, self.max_num_entities))
-
-        target_camera_pos = all_camera_pos
-        target_pixels = all_pixels
-        target_masks = all_masks
-
-        result = {
-            'input_images':         input_images,         # [1, 3, h, w]
-            'input_camera_pos':     input_camera_pos,     # [1, 3]
-            'input_rays':           input_rays,           # [1, h, w, 3]
-            'input_masks':          input_masks,          # [1, h, w, self.max_num_entities]
-            'target_pixels':        target_pixels,        # [p, 3]
-            'target_camera_pos':    target_camera_pos,    # [p, 3]
-            'target_masks':         target_masks,         # [p, self.max_num_entities]
-            'sceneid':              idx,                  # int
-        }
-
-        if self.canonical:
-            result['transform'] = canonical_extrinsic     # [3, 4] (optional)
-
-        return result
-
-
diff --git a/osrt/utils/visualization_utils.py b/osrt/utils/visualization_utils.py
index 6e36faf..f86b365 100644
--- a/osrt/utils/visualization_utils.py
+++ b/osrt/utils/visualization_utils.py
@@ -114,4 +114,5 @@ def visualize_slot_attention(num_slots, image, recon_combined, recons, masks, fo
     if not save_file:
         plt.show()
     else:
+        folder_save if folder_save is not None else "./"
         plt.savefig(f'{folder_save}visualisation_{step}.png', bbox_inches='tight')
diff --git a/quick_test.py b/quick_test.py
index d634171..7d8cf5c 100644
--- a/quick_test.py
+++ b/quick_test.py
@@ -3,18 +3,19 @@ from osrt import data
 from torch.utils.data import DataLoader
 import matplotlib.pyplot as plt
 
-with open("runs/clevr/slot_att/config.yaml", 'r') as f:
+with open("runs/ycb/slot_att/config.yaml", 'r') as f:
     cfg = yaml.load(f, Loader=yaml.CLoader)
 
-
+cfg['data']['path'] = "/home/achapin/Documents/Datasets/ycbv_small"
 train_dataset = data.get_dataset('train', cfg['data'])
 train_loader = DataLoader(train_dataset, batch_size=2, num_workers=0,shuffle=True)
 
+
 for val in train_loader:
     print(f"Shape masks {val['input_masks'].shape}")
     fig, axes = plt.subplots(2, 2)
-    axes[0][0].imshow(val['input_image'][0])
+    axes[0][0].imshow(val['input_images'][0].permute(1, 2, 0))
     axes[0][1].imshow(val['input_masks'][0][:, :, 0])
-    axes[1][0].imshow(val['input_image'][1])
+    axes[1][0].imshow(val['input_images'][1].permute(1, 2, 0))
     axes[1][1].imshow(val['input_masks'][1][:, :, 0])
     plt.show()
\ No newline at end of file
diff --git a/runs/ycb/slot_att/config.yaml b/runs/ycb/slot_att/config.yaml
new file mode 100644
index 0000000..ebc5132
--- /dev/null
+++ b/runs/ycb/slot_att/config.yaml
@@ -0,0 +1,24 @@
+data:
+  dataset: ycb2d
+model:
+  num_slots: 10
+  iters: 3
+  model_type: sa
+  input_dim: 64
+  slot_dim: 64
+  hidden_dim: 128
+  iters: 3
+training:
+  num_workers: 2 
+  num_gpus: 1
+  batch_size: 8 
+  max_it: 333000000
+  warmup_it: 10000
+  lr_warmup: 5000
+  decay_rate: 0.5
+  decay_it: 100000
+  visualize_every: 5000
+  validate_every: 5000
+  checkpoint_every: 1000
+  backup_every: 25000
+
diff --git a/runs/ycb/slot_att/config_tsa.yaml b/runs/ycb/slot_att/config_tsa.yaml
new file mode 100644
index 0000000..0e2a05a
--- /dev/null
+++ b/runs/ycb/slot_att/config_tsa.yaml
@@ -0,0 +1,24 @@
+data:
+  dataset: ycb2d
+model:
+  num_slots: 10
+  iters: 3
+  model_type: tsa
+  input_dim: 64
+  slot_dim: 64
+  hidden_dim: 128
+  iters: 3
+training:
+  num_workers: 2 
+  num_gpus: 1
+  batch_size: 8
+  max_it: 333000000
+  warmup_it: 10000
+  lr_warmup: 5000
+  decay_rate: 0.5
+  decay_it: 100000
+  visualize_every: 5000
+  validate_every: 5000
+  checkpoint_every: 1000
+  backup_every: 25000
+
diff --git a/train_sa.py b/train_sa.py
index c1e9daa..5963cf5 100644
--- a/train_sa.py
+++ b/train_sa.py
@@ -44,7 +44,6 @@ def main():
     batch_size = cfg["training"]["batch_size"]
     num_gpus = cfg["training"]["num_gpus"]
     num_slots = cfg["model"]["num_slots"]
-    num_iterations = cfg["model"]["iters"]
     num_train_steps = cfg["training"]["max_it"]
     num_workers = cfg["training"]["num_workers"]
     resolution = (128, 128)
@@ -84,7 +83,7 @@ def main():
                          devices=num_gpus, 
                          profiler="simple", 
                          default_root_dir="./logs", 
-                         logger=WandbLogger(project="slot-att") if args.wandb else None,
+                         logger=WandbLogger(project="slot-att", offline=True) if args.wandb else None,
                          strategy="ddp" if num_gpus > 1 else "auto", 
                          callbacks=[checkpoint_callback, early_stopping],
                          log_every_n_steps=100, 
-- 
GitLab