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. 2
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. 3
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. 4
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))