def show(self, results, out_dir, show=True, pipeline=None): """Results visualization. Args: results (list[dict]): List of bounding boxes results. out_dir (str): Output directory of visualization result. show (bool): Visualize the results online. pipeline (list[dict], optional): raw data loading for showing. Default: None. """ assert out_dir is not None, 'Expect out_dir, got none.' pipeline = self._get_pipeline(pipeline) for i, result in enumerate(results): data_info = self.data_infos[i] pts_path = data_info['pts_path'] file_name = osp.split(pts_path)[-1].split('.')[0] points, img_metas, img, calib = self._extract_data( i, pipeline, ['points', 'img_metas', 'img', 'calib']) # scale colors to [0, 255] points = points.numpy() points[:, 3:] *= 255 gt_bboxes = self.get_ann_info(i)['gt_bboxes_3d'].tensor.numpy() pred_bboxes = result['boxes_3d'].tensor.numpy() show_result(points, gt_bboxes.copy(), pred_bboxes.copy(), out_dir, file_name, show) # multi-modality visualization if self.modality['use_camera'] and 'calib' in data_info.keys(): img = img.numpy() # need to transpose channel to first dim img = img.transpose(1, 2, 0) pred_bboxes = DepthInstance3DBoxes( pred_bboxes, origin=(0.5, 0.5, 0)) gt_bboxes = DepthInstance3DBoxes( gt_bboxes, origin=(0.5, 0.5, 0)) show_multi_modality_result( img, gt_bboxes, pred_bboxes, calib, out_dir, file_name, depth_bbox=True, img_metas=img_metas, show=show)
def show(self, results, out_dir, show=True): """Results visualization. Args: results (list[dict]): List of bounding boxes results. out_dir (str): Output directory of visualization result. show (bool): Visualize the results online. """ assert out_dir is not None, 'Expect out_dir, got none.' for i, result in enumerate(results): data_info = self.data_infos[i] pts_path = data_info['pts_path'] file_name = osp.split(pts_path)[-1].split('.')[0] if hasattr(self, 'pipeline'): example = self.prepare_test_data(i) else: example = None points = np.fromfile(osp.join(self.data_root, pts_path), dtype=np.float32).reshape(-1, 6) points[:, 3:] *= 255 gt_bboxes = self.get_ann_info(i)['gt_bboxes_3d'].tensor.numpy() pred_bboxes = result['boxes_3d'].tensor.numpy() show_result(points, gt_bboxes.copy(), pred_bboxes.copy(), out_dir, file_name, show) # multi-modality visualization if self.modality['use_camera'] and example is not None and \ 'calib' in data_info.keys(): img = mmcv.imread(example['img_metas']._data['filename']) pred_bboxes = DepthInstance3DBoxes(pred_bboxes, origin=(0.5, 0.5, 0)) gt_bboxes = DepthInstance3DBoxes(gt_bboxes, origin=(0.5, 0.5, 0)) show_multi_modality_result( img, gt_bboxes, pred_bboxes, example['calib'], out_dir, file_name, depth_bbox=True, img_metas=example['img_metas']._data, show=show)
def show_results(self, data, result, out_dir, show=False, score_thr=None): """Results visualization. Args: data (list[dict]): Input images and the information of the sample. result (list[dict]): Prediction results. out_dir (str): Output directory of visualization result. show (bool, optional): Determines whether you are going to show result by open3d. Defaults to False. TODO: implement score_thr of single_stage_mono3d. score_thr (float, optional): Score threshold of bounding boxes. Default to None. Not implemented yet, but it is here for unification. """ for batch_id in range(len(result)): if isinstance(data['img_metas'][0], DC): img_filename = data['img_metas'][0]._data[0][batch_id][ 'filename'] cam2img = data['img_metas'][0]._data[0][batch_id]['cam2img'] elif mmcv.is_list_of(data['img_metas'][0], dict): img_filename = data['img_metas'][0][batch_id]['filename'] cam2img = data['img_metas'][0][batch_id]['cam2img'] else: ValueError( f"Unsupported data type {type(data['img_metas'][0])} " f'for visualization!') img = mmcv.imread(img_filename) file_name = osp.split(img_filename)[-1].split('.')[0] assert out_dir is not None, 'Expect out_dir, got none.' pred_bboxes = result[batch_id]['img_bbox']['boxes_3d'] assert isinstance(pred_bboxes, CameraInstance3DBoxes), \ f'unsupported predicted bbox type {type(pred_bboxes)}' show_multi_modality_result(img, None, pred_bboxes, cam2img, out_dir, file_name, 'camera', show=show)
def show_results(self, data, result, out_dir): """Results visualization. Args: data (list[dict]): Input images and the information of the sample. result (list[dict]): Prediction results. out_dir (str): Output directory of visualization result. """ for batch_id in range(len(result)): if isinstance(data['img_metas'][0], DC): img_filename = data['img_metas'][0]._data[0][batch_id][ 'filename'] cam_intrinsic = data['img_metas'][0]._data[0][batch_id][ 'cam_intrinsic'] elif mmcv.is_list_of(data['img_metas'][0], dict): img_filename = data['img_metas'][0][batch_id]['filename'] cam_intrinsic = data['img_metas'][0][batch_id]['cam_intrinsic'] else: ValueError( f"Unsupported data type {type(data['img_metas'][0])} " f'for visualization!') img = mmcv.imread(img_filename) file_name = osp.split(img_filename)[-1].split('.')[0] assert out_dir is not None, 'Expect out_dir, got none.' pred_bboxes = result[batch_id]['img_bbox']['boxes_3d'] assert isinstance(pred_bboxes, CameraInstance3DBoxes), \ f'unsupported predicted bbox type {type(pred_bboxes)}' # TODO: remove the hack of box from NuScenesMonoDataset pred_bboxes = mono_cam_box2vis(pred_bboxes) show_multi_modality_result(img, None, pred_bboxes, cam_intrinsic, out_dir, file_name, 'camera', show=True)
def show_proj_det_result_meshlab(data, result, out_dir, score_thr=0.0, show=False, snapshot=False): """Show result of projecting 3D bbox to 2D image by meshlab.""" assert 'img' in data.keys(), 'image data is not provided for visualization' img_filename = data['img_metas'][0][0]['filename'] file_name = osp.split(img_filename)[-1].split('.')[0] # read from file because img in data_dict has undergone pipeline transform img = mmcv.imread(img_filename) if 'pts_bbox' in result[0].keys(): result[0] = result[0]['pts_bbox'] elif 'img_bbox' in result[0].keys(): result[0] = result[0]['img_bbox'] pred_bboxes = result[0]['boxes_3d'].tensor.numpy() pred_scores = result[0]['scores_3d'].numpy() # filter out low score bboxes for visualization if score_thr > 0: inds = pred_scores > score_thr pred_bboxes = pred_bboxes[inds] box_mode = data['img_metas'][0][0]['box_mode_3d'] if box_mode == Box3DMode.LIDAR: if 'lidar2img' not in data['img_metas'][0][0]: raise NotImplementedError( 'LiDAR to image transformation matrix is not provided') show_bboxes = LiDARInstance3DBoxes(pred_bboxes, origin=(0.5, 0.5, 0)) show_multi_modality_result(img, None, show_bboxes, data['img_metas'][0][0]['lidar2img'], out_dir, file_name, box_mode='lidar', show=show) elif box_mode == Box3DMode.DEPTH: show_bboxes = DepthInstance3DBoxes(pred_bboxes, origin=(0.5, 0.5, 0)) show_multi_modality_result(img, None, show_bboxes, None, out_dir, file_name, box_mode='depth', img_metas=data['img_metas'][0][0], show=show) elif box_mode == Box3DMode.CAM: if 'cam2img' not in data['img_metas'][0][0]: raise NotImplementedError( 'camera intrinsic matrix is not provided') show_bboxes = CameraInstance3DBoxes(pred_bboxes, box_dim=pred_bboxes.shape[-1], origin=(0.5, 1.0, 0.5)) show_multi_modality_result(img, None, show_bboxes, data['img_metas'][0][0]['cam2img'], out_dir, file_name, box_mode='camera', show=show) else: raise NotImplementedError( f'visualization of {box_mode} bbox is not supported') return file_name
def show_result_meshlab(data, result, out_dir, score_thr=0.0, show=False, snapshot=False): """Show result by meshlab. Args: data (dict): Contain data from pipeline. result (dict): Predicted result from model. out_dir (str): Directory to save visualized result. score_thr (float): Minimum score of bboxes to be shown. Default: 0.0 show (bool): Visualize the results online. Defaults to False. snapshot (bool): Whether to save the online results. Defaults to False. """ points = data['points'][0][0].cpu().numpy() pts_filename = data['img_metas'][0][0]['pts_filename'] file_name = osp.split(pts_filename)[-1].split('.')[0] assert out_dir is not None, 'Expect out_dir, got none.' if 'pts_bbox' in result[0].keys(): pred_bboxes = result[0]['pts_bbox']['boxes_3d'].tensor.numpy() pred_scores = result[0]['pts_bbox']['scores_3d'].numpy() else: pred_bboxes = result[0]['boxes_3d'].tensor.numpy() pred_scores = result[0]['scores_3d'].numpy() # filter out low score bboxes for visualization if score_thr > 0: inds = pred_scores > score_thr pred_bboxes = pred_bboxes[inds] # for now we convert points into depth mode box_mode = data['img_metas'][0][0]['box_mode_3d'] if box_mode != Box3DMode.DEPTH: points = points[..., [1, 0, 2]] points[..., 0] *= -1 show_bboxes = Box3DMode.convert(pred_bboxes, box_mode, Box3DMode.DEPTH) else: show_bboxes = deepcopy(pred_bboxes) show_result(points, None, show_bboxes, out_dir, file_name, show=show, snapshot=snapshot) if 'img' not in data.keys(): return out_dir, file_name # multi-modality visualization # project 3D bbox to 2D image plane if box_mode == Box3DMode.LIDAR: if 'lidar2img' not in data['img_metas'][0][0]: raise NotImplementedError( 'LiDAR to image transformation matrix is not provided') show_bboxes = LiDARInstance3DBoxes(pred_bboxes, origin=(0.5, 0.5, 0)) img = mmcv.imread(data['img_metas'][0][0]['filename']) show_multi_modality_result(img, None, show_bboxes, data['img_metas'][0][0]['lidar2img'], out_dir, file_name, show=show) elif box_mode == Box3DMode.DEPTH: if 'calib' not in data.keys(): raise NotImplementedError( 'camera calibration information is not provided') show_bboxes = DepthInstance3DBoxes(pred_bboxes, origin=(0.5, 0.5, 0)) img = mmcv.imread(data['img_metas'][0][0]['filename']) show_multi_modality_result(img, None, show_bboxes, data['calib'][0], out_dir, file_name, depth_bbox=True, img_metas=data['img_metas'][0][0], show=show) else: raise NotImplementedError( f'visualization of {box_mode} bbox is not supported') return out_dir, file_name