def test_loading_image_lidar(data_loader: ArgoverseTrackingLoader) -> None: camera = CAMERA_LIST[0] log = "1" image_1 = data_loader.get_image_at_timestamp(0, camera, log) image_2 = data_loader.get_image_list_sync(camera, log, load=True)[0] image_3 = data_loader.get_image(0, camera, log) image_4 = data_loader.get_image_sync(0, camera, log) assert np.array_equal(image_1, image_2) and np.array_equal( image_1, image_3) and np.array_equal(image_1, image_4) lidar_0 = data_loader.get_lidar(0, log) lidar_gt = np.array([ [0.0, 0.0, 5.0], [1.0, 0.0, 5.0], [2.0, 0.0, 5.0], [3.0, 0.0, 5.0], [4.0, 0.0, 5.0], [5.0, 0.0, 5.0], [6.0, 0.0, 5.0], [7.0, 0.0, 5.0], [8.0, 0.0, 5.0], [9.0, 0.0, 5.0], ]) assert np.array_equal(lidar_0, lidar_gt)
def shuffle_log(subset, log: ArgoverseTrackingLoader): index = np.arange(log.num_lidar_frame) random.shuffle(index) for idx in index: lidar = log.get_lidar(idx) label = log.get_label_object(idx) yield idx, subset, lidar, label, log
def test_calib(data_loader: ArgoverseTrackingLoader) -> None: assert data_loader.calib camera = "ring_front_center" calib = data_loader.get_calibration(camera) pc = data_loader.get_lidar(0) uv = calib.project_ego_to_image(pc) uv_cam = calib.project_ego_to_cam(pc) assert (uv == calib.project_cam_to_image(uv_cam)).all assert (uv_cam == calib.project_image_to_cam(uv)).all assert (pc == calib.project_image_to_ego(uv)).all
def draw_point_cloud( ax: plt.Axes, title: str, argoverse_data: ArgoverseTrackingLoader, idx: int, axes: Optional[Any] = None, xlim3d: Any = None, ylim3d: Any = None, zlim3d: Any = None, ) -> None: axes = _get_axes_or_default(axes) pc = argoverse_data.get_lidar(idx) assert isinstance(pc, np.ndarray) objects = argoverse_data.get_label_object(idx) ax.scatter(*np.transpose(pc[:, axes]), s=point_size, c=pc[:, 2], cmap="gray") ax.set_title(title) ax.set_xlabel("{} axis".format(axes_str[axes[0]])) ax.set_ylabel("{} axis".format(axes_str[axes[1]])) if len(axes) > 2: ax.set_xlim3d(*axes_limits[axes[0]]) ax.set_ylim3d(*axes_limits[axes[1]]) ax.set_zlim3d(*axes_limits[axes[2]]) ax.set_zlabel("{} axis".format(axes_str[axes[2]])) else: ax.set_xlim(*axes_limits[axes[0]]) ax.set_ylim(*axes_limits[axes[1]]) # User specified limits if xlim3d != None: ax.set_xlim3d(xlim3d) if ylim3d != None: ax.set_ylim3d(ylim3d) if zlim3d != None: ax.set_zlim3d(zlim3d) for obj in objects: if obj.occlusion == 100: continue if obj.label_class is None: logger.warning("No label class, just picking the default color.") color = _COLOR_MAP[-1] else: color = _COLOR_MAP[OBJ_CLASS_MAPPING_DICT[obj.label_class]] draw_box(ax, obj.as_3d_bbox().T, axes=axes, color=color)
def draw_point_cloud_trajectory( ax: plt.Axes, title: str, argoverse_data: ArgoverseTrackingLoader, idx: int, axes: Optional[Any] = None, xlim3d: Any = None, ylim3d: Any = None, zlim3d: Any = None, ) -> None: axes = _get_axes_or_default(axes) unique_id_list = set() for i in range(len(argoverse_data.lidar_list)): for label in argoverse_data.get_label_object(i): unique_id_list.add(label.track_id) color_map = { track_id: ( float(np.random.rand()), float(np.random.rand()), float(np.random.rand()), ) for track_id in unique_id_list } pc = argoverse_data.get_lidar(idx) assert isinstance(pc, np.ndarray) objects = argoverse_data.get_label_object(idx) ax.scatter(*np.transpose(pc[:, axes]), s=point_size, c=pc[:, 2], cmap="gray") ax.set_title(title) ax.set_xlabel("{} axis".format(axes_str[axes[0]])) ax.set_ylabel("{} axis".format(axes_str[axes[1]])) if len(axes) > 2: ax.set_xlim3d(*axes_limits[axes[0]]) ax.set_ylim3d(*axes_limits[axes[1]]) ax.set_zlim3d(*axes_limits[axes[2]]) ax.set_zlabel("{} axis".format(axes_str[axes[2]])) else: ax.set_xlim(*axes_limits[axes[0]]) ax.set_ylim(*axes_limits[axes[1]]) # User specified limits if xlim3d != None: ax.set_xlim3d(xlim3d) if ylim3d != None: ax.set_ylim3d(ylim3d) if zlim3d != None: ax.set_zlim3d(zlim3d) visible_track_id = set() for obj in objects: if obj.occlusion == 100: continue draw_box(ax, obj.as_3d_bbox().T, axes=axes, color=color_map[obj.track_id]) visible_track_id.add(obj.track_id) current_pose = argoverse_data.get_pose(idx) traj_by_id: Dict[Optional[str], List[Any]] = defaultdict(list) for i in range(0, idx, 1): if current_pose is None: logger.warning("`current_pose` is missing at index %d", idx) break pose = argoverse_data.get_pose(i) if pose is None: logger.warning("`pose` is missing at index %d", i) continue objects = argoverse_data.get_label_object(i) for obj in objects: if obj.occlusion == 100: continue if obj.track_id is None or obj.track_id not in visible_track_id: continue x, y, z = pose.transform_point_cloud( np.array([np.array(obj.translation)]))[0] x, y, _ = current_pose.inverse_transform_point_cloud( np.array([np.array([x, y, z])]))[0] # ax.scatter(x,y, s=point_size, c=color_map[obj.track_id]) if obj.track_id is None: logger.warning( "Label has no track_id. Collisions with other tracks that are missing IDs could happen" ) traj_by_id[obj.track_id].append([x, y]) for track_id in traj_by_id.keys(): traj = np.array(traj_by_id[track_id]) ax.plot( traj[:, 0], traj[:, 1], color=color_map[track_id], linestyle="--", linewidth=1, )