Buckets:
| from real2sim import Episode, paths, video | |
| from real2sim.evaluate import draw_skeleton, keypoint_errors, to_camera | |
| from real2sim.tracking import HaWoR, save_tracks | |
| TASK = "basic_pick_place" | |
| INDEX = 0 | |
| SIZE = (960, 540) | |
| HAWOR_COLOR = (0, 230, 0) | |
| EGODEX_COLOR = (255, 60, 60) | |
| out, log = paths.start_run("track_hawor") | |
| episode = Episode.load(TASK, INDEX) | |
| focal = float(episode.intrinsics[0, 0]) | |
| log.info("%s #%d: %s", TASK, INDEX, episode.text) | |
| tracks = HaWoR().track(episode.video_path, focal, out) | |
| frames = video.read(episode.video_path, SIZE, limit=len(episode)) | |
| scale = SIZE[0] / 1920 | |
| reference = { | |
| side: to_camera(hand.keypoints, episode.camera) | |
| for side, hand in episode.hands.items() | |
| } | |
| for side, track in tracks.items(): | |
| errors = keypoint_errors(track.keypoints, reference[side], track.valid) | |
| log.info( | |
| "%s: tracked %d/%d frames, absolute %.1f mm, root relative %.1f mm, aligned %.1f mm", | |
| side, | |
| track.valid.sum(), | |
| len(track.valid), | |
| errors["absolute"], | |
| errors["root_relative"], | |
| errors["aligned"], | |
| ) | |
| drawn = frames.copy() | |
| for t in range(len(drawn)): | |
| for side, track in tracks.items(): | |
| draw_skeleton( | |
| drawn[t], reference[side][t], episode.intrinsics, EGODEX_COLOR, scale | |
| ) | |
| if track.valid[t]: | |
| draw_skeleton( | |
| drawn[t], track.keypoints[t], episode.intrinsics, HAWOR_COLOR, scale | |
| ) | |
| video.write(out / "tracking.mp4", drawn, episode.fps) | |
| save_tracks(out / "hawor_tracks.npz", tracks) | |
| log.info("saved to %s", out) | |
Xet Storage Details
- Size:
- 1.57 kB
- Xet hash:
- b571055641fcff85bbeffe2e7d27267898ca19af4d7fc64974ddb7b4f56f9611
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.