Esempio n. 1
0
 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))
Esempio n. 2
0
 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)
Esempio n. 3
0
 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)
Esempio n. 4
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
Esempio n. 5
0
 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))
Esempio n. 6
0
 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_
Esempio n. 7
0
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)))
Esempio n. 8
0
 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_
Esempio n. 9
0
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)))
Esempio n. 10
0
 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"))
Esempio n. 11
0
 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))        
Esempio n. 12
0
 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)
Esempio n. 13
0
 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))
Esempio n. 14
0
 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_
Esempio n. 15
0
 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_