def mv1pmf_skel(dataset, check_repro=True, args=None): MIN_CONF_THRES = args.thres2d no_img = not (args.vis_det or args.vis_repro) dataset.no_img = no_img kp3ds = [] start, end = args.start, min(args.end, len(dataset)) kpts_repro = None for nf in tqdm(range(start, end), desc='triangulation'): images, annots = dataset[nf] check_keypoints(annots['keypoints'], WEIGHT_DEBUFF=1, min_conf=MIN_CONF_THRES) keypoints3d, kpts_repro = simple_recon_person(annots['keypoints'], dataset.Pall) if check_repro: keypoints3d, kpts_repro = check_repro_error( keypoints3d, kpts_repro, annots['keypoints'], P=dataset.Pall, MAX_REPRO_ERROR=args.MAX_REPRO_ERROR) # keypoints3d, kpts_repro = robust_triangulate(annots['keypoints'], dataset.Pall, config=config, ret_repro=True) kp3ds.append(keypoints3d) if args.vis_det: dataset.vis_detections(images, annots, nf, sub_vis=args.sub_vis) if args.vis_repro: dataset.vis_repro(images, kpts_repro, nf=nf, sub_vis=args.sub_vis) # smooth the skeleton if args.smooth3d > 0: kp3ds = smooth_skeleton(kp3ds, args.smooth3d) for nf in tqdm(range(len(kp3ds)), desc='dump'): dataset.write_keypoints3d(kp3ds[nf], nf + start)
def check_repro_error(keypoints3d, kpts_repro, keypoints2d, P, MAX_REPRO_ERROR): square_diff = (keypoints2d[:, :, :2] - kpts_repro[:, :, :2])**2 conf = keypoints3d[None, :, -1:] conf = (keypoints3d[None, :, -1:] > 0) * (keypoints2d[:, :, -1:] > 0) dist = np.sqrt((((kpts_repro[..., :2] - keypoints2d[..., :2]) * conf)**2).sum(axis=-1)) vv, jj = np.where(dist > MAX_REPRO_ERROR) if vv.shape[0] > 0: keypoints2d[vv, jj, -1] = 0. keypoints3d, kpts_repro = simple_recon_person(keypoints2d, P) return keypoints3d, kpts_repro