コード例 #1
0
ファイル: infer.py プロジェクト: zhwzhong/FeatDepth
def evaluate(cfg_path, model_path, gt_path, output_path):
    filenames = readlines("../mono/datasets/splits/exp/val_files.txt")
    cfg = Config.fromfile(cfg_path)

    dataset = KITTIRAWDataset(cfg.data['in_path'],
                              filenames,
                              cfg.data['height'],
                              cfg.data['width'], [0],
                              is_train=False,
                              gt_depth_path=gt_path)

    dataloader = DataLoader(dataset,
                            1,
                            shuffle=False,
                            num_workers=4,
                            pin_memory=True,
                            drop_last=False)

    cfg.model['imgs_per_gpu'] = 1
    model = MONO.module_dict[cfg.model['name']](cfg.model)
    checkpoint = torch.load(model_path)
    model.load_state_dict(checkpoint['state_dict'], strict=False)
    model.cuda()
    model.eval()

    with torch.no_grad():
        for batch_idx, inputs in enumerate(dataloader):
            for key, ipt in inputs.items():
                inputs[key] = ipt.cuda()
            outputs = model(inputs)

            img_path = os.path.join(output_path,
                                    'img_{:0>4d}.jpg'.format(batch_idx))
            plt.imsave(
                img_path,
                inputs[("color", 0, 0)][0].squeeze().transpose(0, 1).transpose(
                    1, 2).cpu().numpy())

            disp = outputs[("disp", 0, 0)]
            pred_disp, _ = disp_to_depth(disp, 0.1, 100)
            pred_disp = pred_disp[0, 0].cpu().numpy()
            pred_disp = cv2.resize(pred_disp,
                                   (cfg.data['width'], cfg.data['height']))

            img_path = os.path.join(output_path,
                                    'disp_{:0>4d}.jpg'.format(batch_idx))
            vmax = np.percentile(pred_disp, 95)
            plt.imsave(img_path, pred_disp, cmap='magma', vmax=vmax)

    print("\n-> Done!")
コード例 #2
0
def evaluate(MODEL_PATH, CFG_PATH, GT_PATH):
    filenames = readlines("../mono/datasets/splits/exp/val_files.txt")
    cfg = Config.fromfile(CFG_PATH)

    dataset = KITTIRAWDataset(cfg.data['in_path'],
                              filenames,
                              cfg.data['height'],
                              cfg.data['width'], [0],
                              is_train=False,
                              gt_depth_path=None)

    dataloader = DataLoader(dataset,
                            2,
                            shuffle=False,
                            num_workers=1,
                            pin_memory=True,
                            drop_last=True)

    cfg.model['imgs_per_gpu'] = 2
    model = MONO.module_dict[cfg.model['name']](cfg.model)
    checkpoint = torch.load(MODEL_PATH)
    model.load_state_dict(checkpoint['state_dict'], strict=True)
    model.cuda()
    model.eval()

    pred_disps = []
    with torch.no_grad():
        for batch_idx, inputs in enumerate(dataloader):
            print(batch_idx)
            for key, ipt in inputs.items():
                inputs[key] = ipt.cuda()

            outputs = model(inputs)

            disp = outputs[("disp", 0, 0)]
            # N = pred_disp.shape[0] // 2
            # pred_disp = batch_post_process_disparity(pred_disp[:N], pred_disp[N:, :, ::-1])
            pred_disp, _ = disp_to_depth(disp, 0.1, 100)
            pred_disp = pred_disp.cpu()[:, 0].numpy()
            pred_disps.append(pred_disp)
    pred_disps = np.concatenate(pred_disps)

    gt_depths = np.load(GT_PATH,
                        allow_pickle=True,
                        fix_imports=True,
                        encoding='latin1')["data"]

    print("-> Evaluating")
    if cfg.data['stereo_scale']:
        print('using baseline')
    else:
        print('using mean scaling')

    errors = []
    ratios = []
    for i in range(pred_disps.shape[0]):
        gt_depth = gt_depths[i]
        gt_height, gt_width = gt_depth.shape[:2]

        pred_disp = pred_disps[i]
        pred_disp = cv2.resize(pred_disp, (gt_width, gt_height))

        pred_depth = 1 / pred_disp

        mask = np.logical_and(gt_depth > MIN_DEPTH, gt_depth < MAX_DEPTH)
        crop = np.array([
            0.40810811 * gt_height, 0.99189189 * gt_height,
            0.03594771 * gt_width, 0.96405229 * gt_width
        ]).astype(np.int32)
        crop_mask = np.zeros(mask.shape)
        crop_mask[crop[0]:crop[1], crop[2]:crop[3]] = 1
        mask = np.logical_and(mask, crop_mask)

        pred_depth = pred_depth[mask]
        gt_depth = gt_depth[mask]

        ratio = np.median(gt_depth) / np.median(pred_depth)
        ratios.append(ratio)

        if cfg.data['stereo_scale']:
            ratio = STEREO_SCALE_FACTOR

        pred_depth *= ratio
        pred_depth[pred_depth < MIN_DEPTH] = MIN_DEPTH
        pred_depth[pred_depth > MAX_DEPTH] = MAX_DEPTH
        errors.append(compute_errors(gt_depth, pred_depth))

    ratios = np.array(ratios)
    med = np.median(ratios)
    mean_errors = np.array(errors).mean(0)
    print("Scaling ratios | med: {:0.3f} | std: {:0.3f}".format(
        med, np.std(ratios / med)))
    print("\n" +
          ("{:>}| " * 7
           ).format("abs_rel", "sq_rel", "rmse", "rmse_log", "a1", "a2", "a3"))
    print(("&{:.3f} " * 7).format(*mean_errors.tolist()) + "\\\\")
    print("\n-> Done!")
コード例 #3
0
def odo(opt):
    if opt.kitti:
        filenames = readlines("../mono/datasets/splits/odom/test_files_{:02d}.txt".format(opt.sequence_id))

        dataset = KITTIOdomDataset(opt.data_path,
                                   filenames,
                                   opt.height,
                                   opt.width,
                                   [0, 1],
                                   is_train=False,
                                   img_ext='.png',
                                   gt_depth_path=None)
    else:
        dataset = FolderDataset(opt.data_path,
                                None,
                                opt.height,
                                opt.width,
                                [0, 1],
                                is_train=False,
                                img_ext='.png',
                                gt_depth_path=None)

    dataloader = DataLoader(dataset,
                            1,
                            shuffle=False,
                            num_workers=4,
                            pin_memory=True,
                            drop_last=False)

    pose_encoder = PoseEncoder(18, None, 2)
    pose_decoder = PoseDecoder(pose_encoder.num_ch_enc)

    checkpoint = torch.load(opt.model_path)
    for name, param in pose_encoder.state_dict().items():
        pose_encoder.state_dict()[name].copy_(checkpoint['state_dict']['PoseEncoder.' + name])
    for name, param in pose_decoder.state_dict().items():
        pose_decoder.state_dict()[name].copy_(checkpoint['state_dict']['PoseDecoder.' + name])
    pose_encoder.cuda()
    pose_encoder.eval()
    pose_decoder.cuda()
    pose_decoder.eval()

    global_pose = np.identity(4)
    poses = [global_pose[0:3, :].reshape(1, 12)]

    with torch.no_grad():
        for batch_idx, inputs in enumerate(dataloader):
            for key, ipt in inputs.items():
                inputs[key] = ipt.cuda()
            all_color_aug = torch.cat([inputs[("color_aug", i, 0)] for i in [0,1]], 1)
            axisangle, translation = pose_decoder(pose_encoder(all_color_aug))
            g = transformation_from_parameters(axisangle[:, 0], translation[:, 0])
            backward_transform = g.squeeze().cpu().numpy()#the transformation from frame +1 to frame 0
            global_pose = global_pose @ np.linalg.inv(backward_transform)
            poses.append(global_pose[0:3, :].reshape(1, 12))
    poses = np.concatenate(poses, axis=0)

    if opt.kitti:
        filename = os.path.join(opt.result_dir, "{:02d}_pred.txt".format(opt.sequence_id))
    else:
        filename = os.path.join(opt.result_dir, "fm_ms_euroc_mh04_diff_3.txt")

    np.savetxt(filename, poses, delimiter=' ', fmt='%1.8e')
    if opt.kitti:
        opt.eva_seqs = '{:02d}_pred'.format(opt.sequence_id)
        pose_eval = kittiOdomEval(opt)
        pose_eval.eval(toCameraCoord=False)  # set the value according to the predicted results
    print('saving into ', opt.result_dir)
コード例 #4
0
ファイル: eval_pose.py プロジェクト: zhwzhong/FeatDepth
def evaluate(data_path, model_path, sequence_id, height, width):
    filenames = readlines(
        "../mono/datasets/splits/odom/test_files_{:02d}.txt".format(
            sequence_id))

    dataset = KITTIOdomDataset(data_path,
                               filenames,
                               height,
                               width, [0, 1],
                               is_train=False,
                               img_ext='.png',
                               gt_depth_path=None)

    dataloader = DataLoader(dataset,
                            1,
                            shuffle=False,
                            num_workers=4,
                            pin_memory=True,
                            drop_last=False)

    pose_encoder = PoseEncoder(18, None, 2)
    pose_decoder = PoseDecoder(pose_encoder.num_ch_enc)

    checkpoint = torch.load(model_path)
    for name, param in pose_encoder.state_dict().items():
        pose_encoder.state_dict()[name].copy_(
            checkpoint['state_dict']['PoseEncoder.' + name])
    for name, param in pose_decoder.state_dict().items():
        pose_decoder.state_dict()[name].copy_(
            checkpoint['state_dict']['PoseDecoder.' + name])
    pose_encoder.cuda()
    pose_encoder.eval()
    pose_decoder.cuda()
    pose_decoder.eval()

    pred_poses = []

    print("-> Computing pose predictions")
    with torch.no_grad():
        for inputs in dataloader:
            for key, ipt in inputs.items():
                inputs[key] = ipt.cuda()
            all_color_aug = torch.cat(
                [inputs[("color_aug", i, 0)] for i in [0, 1]], 1)
            features = pose_encoder(all_color_aug)
            axisangle, translation = pose_decoder(features)
            pred_poses.append(
                transformation_from_parameters(axisangle[:, 0],
                                               translation[:,
                                                           0]).cpu().numpy())
    pred_poses = np.concatenate(pred_poses)

    gt_poses_path = os.path.join(data_path, "poses",
                                 "{:02d}.txt".format(sequence_id))
    gt_global_poses = np.loadtxt(gt_poses_path).reshape(-1, 3, 4)
    gt_global_poses = np.concatenate(
        (gt_global_poses, np.zeros((gt_global_poses.shape[0], 1, 4))), 1)
    gt_global_poses[:, 3, 3] = 1
    gt_xyzs = gt_global_poses[:, :3, 3]
    gt_local_poses = []
    for i in range(1, len(gt_global_poses)):
        gt_local_poses.append(
            np.linalg.inv(
                np.dot(np.linalg.inv(gt_global_poses[i - 1]),
                       gt_global_poses[i])))

    ates = []
    num_frames = gt_xyzs.shape[0]
    track_length = 5
    for i in range(0, num_frames - 1):
        local_xyzs = np.array(dump_xyz(pred_poses[i:i + track_length - 1]))
        gt_local_xyzs = np.array(
            dump_xyz(gt_local_poses[i:i + track_length - 1]))
        ates.append(compute_ate(gt_local_xyzs, local_xyzs))

    print("\n  odom_{} Trajectory error: {:0.3f}, std: {:0.3f}\n".format(
        sequence_id, np.mean(ates), np.std(ates)))