def test_getpts(self): pc = read_pc_from_bin("./unit-test/data/test_KittiObj_000016.bin") kittiobj = KittiObj("Truck 0.00 2 2.11 125.12 91.71 474.04 253.26 4.02 2.60 16.79 -9.48 2.08 26.41 1.77") kitticalib = KittiCalib("./unit-test/data/test_KittiObj_000016.txt").read_calib_file() pts = kittiobj.get_pts(pc[:, :3], kitticalib) pts_gt = np.load("./unit-test/data/test_KittiObj_getpts_gt.npy") self.assertTrue(np.allclose(pts, pts_gt, rtol=1e-6))
def test_init(self): kittiobj = KittiObj('Car 0.00 0 1.55 614.24 181.78 727.31 284.77 1.57 1.73 4.15 1.00 1.75 13.22 1.62') self.assertEqual(kittiobj.type, 'Car') self.assertEqual(kittiobj.truncated, 0) self.assertEqual(kittiobj.occluded, 0) self.assertEqual(kittiobj.alpha, 1.55) self.assertEqual(kittiobj.bbox_l, 614.24) self.assertEqual(kittiobj.bbox_t, 181.78) self.assertEqual(kittiobj.bbox_r, 727.31) self.assertEqual(kittiobj.bbox_b, 284.77) self.assertEqual(kittiobj.h, 1.57) self.assertEqual(kittiobj.w, 1.73) self.assertEqual(kittiobj.l, 4.15) self.assertEqual(kittiobj.x, 1.00) self.assertEqual(kittiobj.y, 1.75) self.assertEqual(kittiobj.z, 13.22) self.assertEqual(kittiobj.ry, 1.62) self.assertEqual(kittiobj.score, None) kittiobj = KittiObj('Car 0.00 0 1.55 614.24 181.78 727.31 284.77 1.57 1.73 4.15 1.00 1.75 13.22 1.62 0.99') self.assertEqual(kittiobj.type, 'Car') self.assertEqual(kittiobj.truncated, 0) self.assertEqual(kittiobj.occluded, 0) self.assertEqual(kittiobj.alpha, 1.55) self.assertEqual(kittiobj.bbox_l, 614.24) self.assertEqual(kittiobj.bbox_t, 181.78) self.assertEqual(kittiobj.bbox_r, 727.31) self.assertEqual(kittiobj.bbox_b, 284.77) self.assertEqual(kittiobj.h, 1.57) self.assertEqual(kittiobj.w, 1.73) self.assertEqual(kittiobj.l, 4.15) self.assertEqual(kittiobj.x, 1.00) self.assertEqual(kittiobj.y, 1.75) self.assertEqual(kittiobj.z, 13.22) self.assertEqual(kittiobj.ry, 1.62) self.assertEqual(kittiobj.score, 0.99)
def test_from_corners(self): kittiobj = KittiObj() calib = KittiCalib("./unit-test/data/test_KittiCalib_000000.txt").read_calib_file() cns = np.array([[1.24242996, 1.47, 8.6559879], [2.44236996, 1.47, 8.6439881], [2.43757004, 1.47, 8.1640121], [1.23763004, 1.47, 8.1760119], [1.24242996, -0.42, 8.6559879], [2.44236996, -0.42, 8.6439881], [2.43757004, -0.42, 8.1640121], [1.23763004, -0.42, 8.1760119]]) kittiobj.from_corners(calib, cns, 'Pedestrian', 1.0) self.assertEqual(kittiobj.type, 'Pedestrian') self.assertEqual(kittiobj.truncated, 0) self.assertEqual(kittiobj.occluded, 0) self.assertEqual(kittiobj.alpha, 0) self.assertTrue(np.allclose(kittiobj.bbox_l, 712.4, rtol=0.1)) self.assertTrue(np.allclose(kittiobj.bbox_t, 143.0, rtol=0.1)) self.assertTrue(np.allclose(kittiobj.bbox_r, 810.73, rtol=0.1)) self.assertTrue(np.allclose(kittiobj.bbox_b, 307.92, rtol=0.1)) self.assertTrue(np.allclose(kittiobj.h, 1.89, rtol=1e-5)) self.assertTrue(np.allclose(kittiobj.w, 0.48, rtol=1e-5)) self.assertTrue(np.allclose(kittiobj.l, 1.2, rtol=1e-5)) self.assertTrue(np.allclose(kittiobj.x, 1.84, rtol=1e-5)) self.assertTrue(np.allclose(kittiobj.y, 1.47, rtol=1e-5)) self.assertTrue(np.allclose(kittiobj.z, 8.41, rtol=1e-5)) self.assertTrue(np.allclose(kittiobj.ry, 0.01, rtol=1e-5)) self.assertEqual(kittiobj.score, 1.0)
def vis_fn_kitti(data_dir, idx, detection, x_range=(-35.2, 35.2), y_range=(-40, 40), grid_size=(0.1, 0.1)): itm = detection output_dict = { "calib": True, "image": False, "label": True, "velodyne": True } if "nusc" in data_dir: calib, _, label, pc = KittiData( data_dir, idx, output_dict=output_dict).read_data(num_feature=5) else: calib, _, label, pc = KittiData(data_dir, idx, output_dict=output_dict).read_data() bevimg = BEVImage(x_range, y_range, grid_size) bevimg.from_lidar(pc) for obj in label.data: bevimg.draw_box(obj, calib, bool_gt=True) box3d_lidar = itm["box3d_lidar"] score = itm["scores"] for box3d_lidar_, score_ in zip(box3d_lidar, score): x, y, z, w, l, h, ry = box3d_lidar_ obj = KittiObj() bcenter_Flidar = np.array([x, y, z]).reshape(1, -1) bcenter_Fcam = calib.lidar2leftcam(bcenter_Flidar) obj.x, obj.y, obj.z = bcenter_Fcam.flatten() obj.w, obj.l, obj.h = w, l, h obj.ry = ry bevimg.draw_box(obj, calib, bool_gt=False, width=2) return bevimg
def test_get3dcorners(self): kittiobj = KittiObj('Pedestrian 0.0 0.0 -0.2 712.4 143.0 810.73 307.92 1.89 0.48 1.2 1.84 1.47 8.41 0.01') ans = np.array([[1.24242996, 1.47, 8.6559879], [2.44236996, 1.47, 8.6439881], [2.43757004, 1.47, 8.1640121], [1.23763004, 1.47, 8.1760119], [1.24242996, -0.42, 8.6559879], [2.44236996, -0.42, 8.6439881], [2.43757004, -0.42, 8.1640121], [1.23763004, -0.42, 8.1760119]]) self.assertTrue(np.allclose(kittiobj.get_bbox3dcorners(), ans, rtol=1e-5))
def keep(self, label: KittiLabel, pc: np.array, calib: KittiCalib) -> (KittiLabel, np.array): # copy pc & label pc_ = pc.copy() label_ = KittiLabel() label_.data = [] for obj in label.data: label_.data.append(KittiObj(str(obj))) res_label = KittiLabel() for obj in label_.data: res_label.add_obj(obj) res_label.current_frame = "Cam2" return res_label, pc_
def validate(data_dir: str, idx: str, label_Fcam: KittiLabel, save_dir: str): ''' To validate the function of this script inputs: data_dir: dir of Carla data idx: "000000.txt" label_Fcam: result after converting save_dir: dir for saving visulizaition figures Note: the following code is dangerous, and should not be used in other place. ''' from det3.dataloader.carladata import CarlaData from det3.visualizer.vis import FVImage, BEVImage from det3.dataloader.kittidata import KittiObj, KittiLabel, KittiCalib from PIL import Image tag = idx.split(".")[0] pc, label, calib = CarlaData(data_dir, tag).read_data() bevimg = BEVImage(x_range=(-100, 100), y_range=(-50, 50), grid_size=(0.05, 0.05)) bevimg.from_lidar(np.vstack([pc['velo_top']]), scale=1) fvimg = FVImage() fvimg.from_lidar(calib, np.vstack([pc['velo_top']])) for obj in label.read_label_file().data: if obj.type == 'Car': bevimg.draw_box(obj, calib, bool_gt=True) fvimg.draw_box(obj, calib, bool_gt=True) kittilabel = KittiLabel() kittilabel.data = [] kitticalib = KittiCalib(None) kitticalib.P2 = np.array([[450, 0., 600, 0.], [0., 450, 180, 0.], [0., 0., 1, 0.]]) kitticalib.R0_rect = np.eye(4) kitticalib.Tr_velo_to_cam = np.zeros((4, 4)) kitticalib.Tr_velo_to_cam[0, 1] = -1 kitticalib.Tr_velo_to_cam[1, 2] = -1 kitticalib.Tr_velo_to_cam[2, 0] = 1 kitticalib.Tr_velo_to_cam[3, 3] = 1 kitticalib.data = [] for obj in label_Fcam.data: kittilabel.data.append(KittiObj(str(obj))) for obj in kittilabel.data: if obj.type == 'Car': fvimg.draw_box(obj, kitticalib, bool_gt=False) bevimg.draw_box(obj, kitticalib, bool_gt=False) bevimg_img = Image.fromarray(bevimg.data) bevimg_img.save(os.path.join(save_dir, "{}_bev.png".format(tag))) fvimg_img = Image.fromarray(fvimg.data) fvimg_img.save(os.path.join(save_dir, "{}_fv.png".format(tag)))
def flip_pc(self, label: KittiLabel, pc: np.array, calib: KittiCalib) -> (KittiLabel, np.array): ''' flip point cloud along the y axis of the Kitti Lidar frame inputs: label: ground truth pc: point cloud calib: ''' assert istype(label, "KittiLabel") calib_is_iter = isinstance(calib, list) # copy pc & label pc_ = pc.copy() label_ = KittiLabel() label_.data = [] for obj in label.data: label_.data.append(KittiObj(str(obj))) # flip point cloud pc_[:, 1] *= -1 # modify gt if not calib_is_iter: for obj in label_.data: bottom_Fcam = np.array([obj.x, obj.y, obj.z]).reshape(1, -1) bottom_Flidar = calib.leftcam2lidar(bottom_Fcam) bottom_Flidar[0, 1] *= -1 bottom_Fcam = calib.lidar2leftcam(bottom_Flidar) obj.x, obj.y, obj.z = bottom_Fcam.flatten() obj.ry *= -1 else: for obj, calib_ in zip(label_.data, calib): bottom_Fcam = np.array([obj.x, obj.y, obj.z]).reshape(1, -1) bottom_Flidar = calib_.leftcam2lidar(bottom_Fcam) bottom_Flidar[0, 1] *= -1 bottom_Fcam = calib_.lidar2leftcam(bottom_Flidar) obj.x, obj.y, obj.z = bottom_Fcam.flatten() obj.ry *= -1 res_label = KittiLabel() for obj in label_.data: res_label.add_obj(obj) res_label.current_frame = "Cam2" return res_label, pc_
def main(is_val, data_dir, vis_dir, result_path): dt_data = pickle.load(open(result_path, 'rb')) save_dir = vis_dir if is_val: for dt in tqdm(dt_data): idx = dt['metadata']['image_idx'] idx = "{:06d}".format(idx) calib, img, label, pc = KittiData(root_dir=data_dir, idx=idx).read_data() label_est = KittiLabel() label_est.data = [] num_dt = len(dt['name']) for i in range(num_dt): obj = KittiObj() obj.type = dt['name'][i] obj.truncated = dt['truncated'][i] obj.occluded = dt['occluded'][i] obj.alpha = dt['alpha'][i] obj.bbox_l, obj.bbox_t, obj.bbox_r, obj.bbox_b = dt['bbox'][i] obj.l, obj.h, obj.w = dt['dimensions'][i] obj.x, obj.y, obj.z = dt['location'][i] obj.ry = dt['rotation_y'][i] obj.score = dt['score'][i] label_est.data.append(obj) fvimg = FVImage() fvimg.from_image(img) for obj in label.data: if (obj.x > obj.z) or (-obj.x > obj.z): continue if obj.type in ['Car', 'Van']: fvimg.draw_3dbox(obj, calib, bool_gt=True, width=3) for obj in label_est.data: if (obj.x > obj.z) or (-obj.x > obj.z): continue fvimg.draw_3dbox(obj, calib, bool_gt=False, width=2, c=(255, 255, int(255 * obj.score), 255)) fvimg_img = Image.fromarray(fvimg.data) fvimg_img.save(os.path.join(save_dir, "fv_{}.png".format(idx))) else: pc_dir = os.path.join(data_dir, "velodyne_points", "data") img2_dir = os.path.join(data_dir, "image_02", "data") calib_dir = os.path.join(data_dir, "calib") calib = read_calib(calib_dir) for dt in tqdm(dt_data): idx = dt['metadata']['image_idx'] idx = "{:010d}".format(idx) pc = read_pc_from_bin(os.path.join(pc_dir, idx + ".bin")) img = read_image(os.path.join(img2_dir, idx + ".png")) label_est = KittiLabel() label_est.data = [] num_dt = len(dt['name']) for i in range(num_dt): obj = KittiObj() obj.type = dt['name'][i] obj.truncated = dt['truncated'][i] obj.occluded = dt['occluded'][i] obj.alpha = dt['alpha'][i] obj.bbox_l, obj.bbox_t, obj.bbox_r, obj.bbox_b = dt['bbox'][i] obj.l, obj.h, obj.w = dt['dimensions'][i] obj.x, obj.y, obj.z = dt['location'][i] obj.ry = dt['rotation_y'][i] obj.score = dt['score'][i] label_est.data.append(obj) fvimg = FVImage() fvimg.from_image(img) # for obj in label.data: # if obj.type in ['Car', 'Van']: # fvimg.draw_3dbox(obj, calib, bool_gt=True, width=3) for obj in label_est.data: if (obj.x > obj.z) or (-obj.x > obj.z): continue fvimg.draw_3dbox(obj, calib, bool_gt=False, width=2, c=(255, 255, int(obj.score * 255), 255)) fvimg_img = Image.fromarray(fvimg.data) fvimg_img.save(os.path.join(save_dir, "fv_{}.png".format(idx)))
def save_detections(self, detections, tags, calibs, save_dir): res_dir = save_dir if os.path.isdir(res_dir): shutil.rmtree(res_dir, ignore_errors=True) os.makedirs(res_dir) for det, tag, calib in zip(detections, tags, calibs): label = KittiLabel() label.current_frame = "Cam2" final_box_preds = det["box3d_lidar"].detach().cpu().numpy() label_preds = det["label_preds"].detach().cpu().numpy() scores = det["scores"].detach().cpu().numpy() for i in range(final_box_preds.shape[0]): obj_np = final_box_preds[i, :] bcenter_Flidar = obj_np[:3].reshape(1, 3) bcenter_Fcam = calib.lidar2leftcam(bcenter_Flidar) wlh = obj_np[3:6] ry = obj_np[-1] obj = KittiObj() obj.type = self._class_names[int(label_preds[i])] obj.score = scores[i] obj.x, obj.y, obj.z = bcenter_Fcam.flatten() obj.w, obj.l, obj.h = wlh.flatten() obj.ry = ry obj.from_corners(calib, obj.get_bbox3dcorners(), obj.type, obj.score) obj.truncated = 0 obj.occluded = 0 obj.alpha = -np.arctan2(-bcenter_Flidar[0, 1], bcenter_Flidar[0, 0]) + ry label.add_obj(obj) # save label write_str_to_file(str(label), os.path.join(res_dir, f"{tag}.txt"))
def test_equal(self): # same kittiobj1 = KittiObj('Pedestrian 0.0 0.0 -0.2 712.4 143.0 810.73 307.92 1.89 0.48 1.2 1.84 1.47 8.41 0.01') kittiobj2 = KittiObj('Pedestrian 0.0 0.0 -0.2 712.4 143.0 810.73 307.92 1.89 0.48 1.2 1.84 1.47 8.41 0.01') self.assertTrue(kittiobj1.equal(kittiobj1, 'Pedestrian', rtol=1e-5)) self.assertTrue(kittiobj1.equal(kittiobj2, 'Pedestrian', rtol=1e-5)) self.assertTrue(kittiobj2.equal(kittiobj1, 'Pedestrian', rtol=1e-5)) self.assertTrue(kittiobj2.equal(kittiobj2, 'Pedestrian', rtol=1e-5)) # ry vs. ry+np.pi kittiobj1 = KittiObj('Pedestrian 0.0 0.0 -0.2 712.4 143.0 810.73 307.92 1.89 0.48 1.2 1.84 1.47 8.41 0.01') kittiobj2 = KittiObj('Pedestrian 0.0 0.0 -0.2 712.4 143.0 810.73 307.92 1.89 0.48 1.2 1.84 1.47 8.41 3.1515926') self.assertTrue(kittiobj1.equal(kittiobj1, 'Pedestrian', rtol=1e-5)) self.assertTrue(kittiobj1.equal(kittiobj2, 'Pedestrian', rtol=1e-5)) self.assertTrue(kittiobj2.equal(kittiobj1, 'Pedestrian', rtol=1e-5)) self.assertTrue(kittiobj2.equal(kittiobj2, 'Pedestrian', rtol=1e-5)) # Different cls kittiobj1 = KittiObj('Pedestrian 0.0 0.0 -0.2 712.4 143.0 810.73 307.92 1.89 0.48 1.2 1.84 1.47 8.41 0.01') kittiobj2 = KittiObj('Car 0.0 0.0 -0.2 712.4 143.0 810.73 307.92 1.89 0.48 1.2 1.84 1.47 8.41 0.01') self.assertTrue(not kittiobj1.equal(kittiobj2, 'Pedestrian', rtol=1e-5)) self.assertTrue(not kittiobj2.equal(kittiobj1, 'Pedestrian', rtol=1e-5)) # Different ry kittiobj1 = KittiObj('Pedestrian 0.0 0.0 -0.2 712.4 143.0 810.73 307.92 1.89 0.48 1.2 1.84 1.47 8.41 0.01') kittiobj2 = KittiObj('Pedestrian 0.0 0.0 -0.2 712.4 143.0 810.73 307.92 1.89 0.48 1.2 1.84 1.47 8.41 1.31') self.assertTrue(not kittiobj1.equal(kittiobj2, 'Pedestrian', rtol=1e-5)) self.assertTrue(not kittiobj2.equal(kittiobj1, 'Pedestrian', rtol=1e-5))
def test_filt_label_by_range(self): def limit_period_torch(val, offset=0.5, period=np.pi): return val - torch.floor(val / period + offset) * period data_cfg = Test_prep_infos.TRAINDATA_cfg voxelizer = voxelizer_builder.build(Test_exclude_classes.VOXELIZER_cfg) target_assigner = target_assigner_builder.build(Test_exclude_classes.TARGETASSIGNER_cfg) dataloader = build(data_cfg, ext_dict={ "voxelizer": voxelizer, "target_assigner": target_assigner, "feature_map_size": [1, 200, 176] }) box_coder = target_assigner.box_coder import torch import torch.nn as nn from det3.methods.second.ops.torch_ops import rotate_nms from det3.dataloader.carladata import CarlaObj, CarlaLabel from incdet3.utils.utils import filt_label_by_range for data in dataloader: tag = data["metadata"][0]["tag"] if tag != "000006": continue label = data["metadata"][0]["label"] cls_pred = torch.from_numpy(data["labels"]).cuda().float() cls_pred *= (cls_pred >= 0).float() cls_pred = cls_pred.long() cls_pred = nn.functional.one_hot(cls_pred, num_classes=2+1) cls_pred = cls_pred[..., 1:] anchors = torch.from_numpy(data["anchors"]).cuda().float() box_pred = torch.from_numpy(data["reg_targets"]).cuda().float() box_pred = box_coder.decode(box_pred, anchors) for box_preds, cls_preds in zip(box_pred, cls_pred): box_preds = box_preds.float() cls_preds = cls_preds.float() total_scores = cls_preds nms_func = rotate_nms top_scores, top_labels = torch.max( total_scores, dim=-1) top_scores_keep = top_scores >= 0.5 top_scores = top_scores.masked_select(top_scores_keep) box_preds = box_preds[top_scores_keep] top_labels = top_labels[top_scores_keep] boxes_for_nms = box_preds[:, [0, 1, 3, 4, 6]] selected = nms_func( boxes_for_nms, top_scores, pre_max_size=1000, post_max_size=1000, iou_threshold=0.3, ) selected_boxes = box_preds[selected] selected_labels = top_labels[selected] selected_scores = top_scores[selected] box_preds = selected_boxes scores = selected_scores label_preds = selected_labels final_box_preds = box_preds final_scores = scores final_labels = label_preds predictions_dict = { "box3d_lidar": final_box_preds, "scores": final_scores, "label_preds": label_preds, } label_est = KittiLabel() calib = KittiCalib(f"unit_tests/data/test_kittidata/training/calib/{tag}.txt").read_calib_file() for box3d_lidar, label_preds, score in zip( predictions_dict["box3d_lidar"], predictions_dict["label_preds"], predictions_dict["scores"]): obj = KittiObj() obj.type = "Car" if label_preds == 0 else "Pedestrian" xyzwlhry_Flidar = box3d_lidar.cpu().numpy().flatten() bcenter_Flidar = xyzwlhry_Flidar[:3].reshape(-1, 3) bcenter_Fcam = calib.lidar2leftcam(bcenter_Flidar) obj.x, obj.y, obj.z = bcenter_Fcam.flatten() obj.w, obj.l, obj.h, obj.ry = xyzwlhry_Flidar[3:] obj.truncated = 0 obj.occluded = 0 obj.alpha = 0 obj.bbox_l = 0 obj.bbox_t = 0 obj.bbox_r = 0 obj.bbox_b = 0 label_est.add_obj(obj) label_est.current_frame = "Cam2" label_filt = filt_label_by_range(label_est, valid_range=[20, -35.2, -3, 52.8, 12.85, -0.26], calib=calib) self.assertTrue(len(label_filt) == 1)
def test_targets(self): def limit_period_torch(val, offset=0.5, period=np.pi): return val - torch.floor(val / period + offset) * period import torch import torch.nn as nn from det3.methods.second.ops.torch_ops import rotate_nms from det3.dataloader.kittidata import KittiCalib for i, data in enumerate(self.dataloader): if i == 2: break else: continue label = data["metadata"][0]["label"] tag = data["metadata"][0]["tag"] cls_pred = torch.from_numpy(data["labels"]).cuda().float() cls_pred *= (cls_pred >= 0).float() cls_pred = cls_pred.long() cls_pred = nn.functional.one_hot(cls_pred, num_classes=2+1) cls_pred = cls_pred[..., 1:] anchors = torch.from_numpy(data["anchors"]).cuda().float() box_pred = torch.from_numpy(data["reg_targets"]).cuda().float() # pred_dict = { # "cls_preds": cls_pred * 10, # "box_preds": box_pred # } # box_coder = self.box_coder # from det3.ops import write_pkl # write_pkl({"pred_dict": pred_dict, "box_coder": box_coder}, "test_model_est.pkl") box_pred = self.box_coder.decode(box_pred, anchors) for box_preds, cls_preds in zip(box_pred, cls_pred): box_preds = box_preds.float() cls_preds = cls_preds.float() total_scores = cls_preds nms_func = rotate_nms top_scores, top_labels = torch.max( total_scores, dim=-1) top_scores_keep = top_scores >= 0.5 top_scores = top_scores.masked_select(top_scores_keep) box_preds = box_preds[top_scores_keep] top_labels = top_labels[top_scores_keep] boxes_for_nms = box_preds[:, [0, 1, 3, 4, 6]] selected = nms_func( boxes_for_nms, top_scores, pre_max_size=1000, post_max_size=1000, iou_threshold=0.3, ) selected_boxes = box_preds[selected] selected_labels = top_labels[selected] selected_scores = top_scores[selected] box_preds = selected_boxes scores = selected_scores label_preds = selected_labels final_box_preds = box_preds final_scores = scores final_labels = label_preds predictions_dict = { "box3d_lidar": final_box_preds, "scores": final_scores, "label_preds": label_preds, } from det3.dataloader.kittidata import KittiObj, KittiLabel label_gt = KittiLabel() label_est = KittiLabel() calib = KittiCalib(f"unit_tests/data/test_kittidata/training/calib/{tag}.txt").read_calib_file() for obj_str in label.split("\n"): if len(obj_str) == 0: continue obj = KittiObj(obj_str) if obj.type not in ["Car", "Pedestrian"]: continue bcenter_Fcam = np.array([obj.x, obj.y, obj.z]).reshape(-1, 3) bcenter_Flidar = calib.leftcam2lidar(bcenter_Fcam) center_Flidar = bcenter_Flidar + np.array([0, 0, obj.h/2.0]).reshape(-1, 3) if (center_Flidar[0, 0] < 0 or center_Flidar[0, 0] > 52.8 or center_Flidar[0, 1] < -30 or center_Flidar[0, 1] > 30 or center_Flidar[0, 2] < -3 or center_Flidar[0, 2] > 1): continue obj.truncated = 0 obj.occluded = 0 obj.alpha = 0 obj.bbox_l = 0 obj.bbox_t = 0 obj.bbox_r = 0 obj.bbox_b = 0 label_gt.add_obj(obj) for box3d_lidar, label_preds, score in zip( predictions_dict["box3d_lidar"], predictions_dict["label_preds"], predictions_dict["scores"]): obj = KittiObj() obj.type = "Car" if label_preds == 0 else "Pedestrian" xyzwlhry_Flidar = box3d_lidar.cpu().numpy().flatten() bcenter_Flidar = xyzwlhry_Flidar[:3].reshape(-1, 3) bcenter_Fcam = calib.lidar2leftcam(bcenter_Flidar) obj.x, obj.y, obj.z = bcenter_Fcam.flatten() obj.w, obj.l, obj.h, obj.ry = xyzwlhry_Flidar[3:] obj.truncated = 0 obj.occluded = 0 obj.alpha = 0 obj.bbox_l = 0 obj.bbox_t = 0 obj.bbox_r = 0 obj.bbox_b = 0 label_est.add_obj(obj) self.assertTrue(label_gt.equal(label_est, acc_cls=["Car", "Pedestrian"], rtol=1e-2))
def rotate_obj(self, label: KittiLabel, pc: np.array, calib: KittiCalib, dry_range: List[float]) -> (KittiLabel, np.array): ''' rotate object along the z axis in the LiDAR frame inputs: label: gt pc: [#pts, >= 3] calib: dry_range: [dry_min, dry_max] in radius returns: label_rot pc_rot Note: If the attemp times is over max_attemp, it will return the original copy ''' assert istype(label, "KittiLabel") dry_min, dry_max = dry_range max_attemp = 10 num_attemp = 0 calib_is_iter = isinstance(calib, list) while True: num_attemp += 1 # copy pc & label pc_ = pc.copy() label_ = KittiLabel() label_.data = [] for obj in label.data: label_.data.append(KittiObj(str(obj))) if num_attemp > max_attemp: print( "KittiAugmentor.rotate_obj: Warning: the attemp times is over {} times," "will return the original copy".format(max_attemp)) break if not calib_is_iter: for obj in label_.data: # generate random number dry = np.random.rand() * (dry_max - dry_min) + dry_min # modify pc_ idx = obj.get_pts_idx(pc_[:, :3], calib) bottom_Fcam = np.array([obj.x, obj.y, obj.z]).reshape(1, -1) bottom_Flidar = calib.leftcam2lidar(bottom_Fcam) pc_[idx, :3] = apply_tr(pc_[idx, :3], -bottom_Flidar) # obj.ry += dry is correspond to rotz(-dry) # since obj is in cam frame # pc_ is in LiDAR frame pc_[idx, :3] = apply_R(pc_[idx, :3], rotz(-dry)) pc_[idx, :3] = apply_tr(pc_[idx, :3], bottom_Flidar) # modify obj obj.ry += dry else: for obj, calib_ in zip(label_.data, calib): # generate random number dry = np.random.rand() * (dry_max - dry_min) + dry_min # modify pc_ idx = obj.get_pts_idx(pc_[:, :3], calib_) bottom_Fcam = np.array([obj.x, obj.y, obj.z]).reshape(1, -1) bottom_Flidar = calib_.leftcam2lidar(bottom_Fcam) pc_[idx, :3] = apply_tr(pc_[idx, :3], -bottom_Flidar) # obj.ry += dry is correspond to rotz(-dry) # since obj is in cam frame # pc_ is in LiDAR frame pc_[idx, :3] = apply_R(pc_[idx, :3], rotz(-dry)) pc_[idx, :3] = apply_tr(pc_[idx, :3], bottom_Flidar) # modify obj obj.ry += dry if self.check_overlap(label_): break res_label = KittiLabel() for obj in label_.data: res_label.add_obj(obj) res_label.current_frame = "Cam2" return res_label, pc_
def tr_obj(self, label: KittiLabel, pc: np.array, calib: KittiCalib, dx_range: List[float], dy_range: List[float], dz_range: List[float]) -> (KittiLabel, np.array): ''' translate object in the LiDAR frame inputs: label: gt pc: [#pts, >= 3] calib: dx_range: [dx_min, dx_max] in LiDAR frame dy_range: [dy_min, dy_max] in LiDAR frame dz_range: [dz_min, dz_max] in LiDAR frame returns: label_tr pc_tr Note: If the attemp times is over max_attemp, it will return the original copy ''' assert istype(label, "KittiLabel") dx_min, dx_max = dx_range dy_min, dy_max = dy_range dz_min, dz_max = dz_range max_attemp = 10 num_attemp = 0 calib_is_iter = isinstance(calib, list) while True: num_attemp += 1 # copy pc & label pc_ = pc.copy() label_ = KittiLabel() label_.data = [] for obj in label.data: label_.data.append(KittiObj(str(obj))) if num_attemp > max_attemp: print( "KittiAugmentor.tr_obj: Warning: the attemp times is over {} times," "will return the original copy".format(max_attemp)) break if not calib_is_iter: for obj in label_.data: # gennerate ramdom number dx = np.random.rand() * (dx_max - dx_min) + dx_min dy = np.random.rand() * (dy_max - dy_min) + dy_min dz = np.random.rand() * (dz_max - dz_min) + dz_min # modify pc_ idx = obj.get_pts_idx(pc_[:, :3], calib) dtr = np.array([dx, dy, dz]).reshape(1, -1) pc_[idx, :3] = apply_tr(pc_[idx, :3], dtr) # modify obj bottom_Fcam = np.array([obj.x, obj.y, obj.z]).reshape(1, -1) bottom_Flidar = calib.leftcam2lidar(bottom_Fcam) bottom_Flidar = apply_tr(bottom_Flidar, dtr) bottom_Fcam = calib.lidar2leftcam(bottom_Flidar) obj.x, obj.y, obj.z = bottom_Fcam.flatten() else: for obj, calib_ in zip(label_.data, calib): # gennerate ramdom number dx = np.random.rand() * (dx_max - dx_min) + dx_min dy = np.random.rand() * (dy_max - dy_min) + dy_min dz = np.random.rand() * (dz_max - dz_min) + dz_min # modify pc_ idx = obj.get_pts_idx(pc_[:, :3], calib_) dtr = np.array([dx, dy, dz]).reshape(1, -1) pc_[idx, :3] = apply_tr(pc_[idx, :3], dtr) # modify obj bottom_Fcam = np.array([obj.x, obj.y, obj.z]).reshape(1, -1) bottom_Flidar = calib_.leftcam2lidar(bottom_Fcam) bottom_Flidar = apply_tr(bottom_Flidar, dtr) bottom_Fcam = calib_.lidar2leftcam(bottom_Flidar) obj.x, obj.y, obj.z = bottom_Fcam.flatten() if self.check_overlap(label_): break res_label = KittiLabel() for obj in label_.data: res_label.add_obj(obj) res_label.current_frame = "Cam2" return res_label, pc_