Techt3o commited on
Commit
57ae837
·
verified ·
1 Parent(s): 053f2f0

7b38318811baa04ff0314e2a0700e7273cc8cccf91c9fe7f87200c3bcfd1c703

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +4 -0
  2. checkpoints/dpvo.pth +3 -0
  3. checkpoints/wham_vit_bedlam_w_3dpw.pth.tar +3 -0
  4. checkpoints/wham_vit_w_3dpw.pth.tar +3 -0
  5. checkpoints/yolov8x.pt +3 -0
  6. configs/__pycache__/config.cpython-39.pyc +0 -0
  7. configs/__pycache__/constants.cpython-39.pyc +0 -0
  8. configs/config.py +111 -0
  9. configs/constants.py +59 -0
  10. configs/yamls/demo.yaml +14 -0
  11. configs/yamls/model_base.yaml +7 -0
  12. configs/yamls/stage1.yaml +28 -0
  13. configs/yamls/stage2.yaml +37 -0
  14. configs/yamls/stage2_b.yaml +38 -0
  15. dataset/body_models/J_regressor_coco.npy +3 -0
  16. dataset/body_models/J_regressor_feet.npy +3 -0
  17. dataset/body_models/J_regressor_h36m.npy +3 -0
  18. dataset/body_models/J_regressor_wham.npy +3 -0
  19. dataset/body_models/smpl/SMPL_FEMALE.pkl +3 -0
  20. dataset/body_models/smpl/SMPL_MALE.pkl +3 -0
  21. dataset/body_models/smpl/SMPL_NEUTRAL.pkl +3 -0
  22. dataset/body_models/smpl/__MACOSX/._smpl +0 -0
  23. dataset/body_models/smpl/__MACOSX/smpl/._.DS_Store +0 -0
  24. dataset/body_models/smpl/__MACOSX/smpl/.___init__.py +0 -0
  25. dataset/body_models/smpl/__MACOSX/smpl/._models +0 -0
  26. dataset/body_models/smpl/__MACOSX/smpl/._smpl_webuser +0 -0
  27. dataset/body_models/smpl/__MACOSX/smpl/models/basicModel_f_lbs_10_207_0_v1.0.0.pkl +3 -0
  28. dataset/body_models/smpl/__MACOSX/smpl/models/basicmodel_m_lbs_10_207_0_v1.0.0.pkl +3 -0
  29. dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._LICENSE.txt +0 -0
  30. dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._README.txt +0 -0
  31. dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/.___init__.py +0 -0
  32. dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._hello_world +0 -0
  33. dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._lbs.py +0 -0
  34. dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._posemapper.py +0 -0
  35. dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._serialization.py +0 -0
  36. dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._verts.py +0 -0
  37. dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/hello_world/._hello_smpl.py +0 -0
  38. dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/hello_world/._render_smpl.py +0 -0
  39. dataset/body_models/smpl_faces.npy +3 -0
  40. dataset/body_models/smpl_mean_params.npz +3 -0
  41. dataset/body_models/smplx2smpl.pkl +3 -0
  42. demo.py +234 -0
  43. docs/API.md +18 -0
  44. docs/DATASET.md +42 -0
  45. docs/DOCKER.md +23 -0
  46. docs/INSTALL.md +38 -0
  47. examples/IMG_9730.mov +3 -0
  48. examples/IMG_9731.mov +3 -0
  49. examples/IMG_9732.mov +3 -0
  50. examples/drone_calib.txt +1 -0
.gitattributes CHANGED
@@ -33,3 +33,7 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ examples/drone_video.mp4 filter=lfs diff=lfs merge=lfs -text
37
+ examples/IMG_9730.mov filter=lfs diff=lfs merge=lfs -text
38
+ examples/IMG_9731.mov filter=lfs diff=lfs merge=lfs -text
39
+ examples/IMG_9732.mov filter=lfs diff=lfs merge=lfs -text
checkpoints/dpvo.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:30d02dc2b88a321cf99aad8e4ea1152a44d791b5b65bf95ad036922819c0ff12
3
+ size 14167743
checkpoints/wham_vit_bedlam_w_3dpw.pth.tar ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:91d250d2d298b00f200aa39df36253b55ca434188c2934d8e91e5e0777fb67fd
3
+ size 527307587
checkpoints/wham_vit_w_3dpw.pth.tar ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9835bcbc952221ad72fa72e768e1f4620e96788b12cecd676a3b1dbee057dd66
3
+ size 527307587
checkpoints/yolov8x.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c4d5a3f000d771762f03fc8b57ebd0aae324aeaefdd6e68492a9c4470f2d1e8b
3
+ size 136867539
configs/__pycache__/config.cpython-39.pyc ADDED
Binary file (3.01 kB). View file
 
configs/__pycache__/constants.cpython-39.pyc ADDED
Binary file (2.77 kB). View file
 
configs/config.py ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ from yacs.config import CfgNode as CN
3
+
4
+ # Configuration variable
5
+ cfg = CN()
6
+
7
+ cfg.TITLE = 'default'
8
+ cfg.OUTPUT_DIR = 'results'
9
+ cfg.EXP_NAME = 'default'
10
+ cfg.DEVICE = 'cuda'
11
+ cfg.DEBUG = False
12
+ cfg.EVAL = False
13
+ cfg.RESUME = False
14
+ cfg.LOGDIR = ''
15
+ cfg.NUM_WORKERS = 5
16
+ cfg.SEED_VALUE = -1
17
+ cfg.SUMMARY_ITER = 50
18
+ cfg.MODEL_CONFIG = ''
19
+ cfg.FLIP_EVAL = False
20
+
21
+ cfg.TRAIN = CN()
22
+ cfg.TRAIN.STAGE = 'stage1'
23
+ cfg.TRAIN.DATASET_EVAL = '3dpw'
24
+ cfg.TRAIN.CHECKPOINT = ''
25
+ cfg.TRAIN.BATCH_SIZE = 64
26
+ cfg.TRAIN.START_EPOCH = 0
27
+ cfg.TRAIN.END_EPOCH = 999
28
+ cfg.TRAIN.OPTIM = 'Adam'
29
+ cfg.TRAIN.LR = 3e-4
30
+ cfg.TRAIN.LR_FINETUNE = 5e-5
31
+ cfg.TRAIN.LR_PATIENCE = 5
32
+ cfg.TRAIN.LR_DECAY_RATIO = 0.1
33
+ cfg.TRAIN.WD = 0.0
34
+ cfg.TRAIN.MOMENTUM = 0.9
35
+ cfg.TRAIN.MILESTONES = [50, 70]
36
+
37
+ cfg.DATASET = CN()
38
+ cfg.DATASET.SEQLEN = 81
39
+ cfg.DATASET.RATIO = [1.0, 0, 0, 0, 0]
40
+
41
+ cfg.MODEL = CN()
42
+ cfg.MODEL.BACKBONE = 'vit'
43
+
44
+ cfg.LOSS = CN()
45
+ cfg.LOSS.SHAPE_LOSS_WEIGHT = 0.001
46
+ cfg.LOSS.JOINT2D_LOSS_WEIGHT = 5.
47
+ cfg.LOSS.JOINT3D_LOSS_WEIGHT = 5.
48
+ cfg.LOSS.VERTS3D_LOSS_WEIGHT = 1.
49
+ cfg.LOSS.POSE_LOSS_WEIGHT = 1.
50
+ cfg.LOSS.CASCADED_LOSS_WEIGHT = 0.0
51
+ cfg.LOSS.CONTACT_LOSS_WEIGHT = 0.04
52
+ cfg.LOSS.ROOT_VEL_LOSS_WEIGHT = 0.001
53
+ cfg.LOSS.ROOT_POSE_LOSS_WEIGHT = 0.4
54
+ cfg.LOSS.SLIDING_LOSS_WEIGHT = 0.5
55
+ cfg.LOSS.CAMERA_LOSS_WEIGHT = 0.04
56
+ cfg.LOSS.LOSS_WEIGHT = 60.
57
+ cfg.LOSS.CAMERA_LOSS_SKIP_EPOCH = 5
58
+
59
+
60
+ def get_cfg_defaults():
61
+ """Get a yacs CfgNode object with default values for my_project."""
62
+ # Return a clone so that the defaults will not be altered
63
+ # This is for the "local variable" use pattern
64
+ return cfg.clone()
65
+
66
+
67
+ def get_cfg(args, test):
68
+ """
69
+ Define configuration.
70
+ """
71
+ import os
72
+
73
+ cfg = get_cfg_defaults()
74
+ if os.path.exists(args.cfg):
75
+ cfg.merge_from_file(args.cfg)
76
+
77
+ cfg.merge_from_list(args.opts)
78
+ if test:
79
+ cfg.merge_from_list(['EVAL', True])
80
+
81
+ return cfg.clone()
82
+
83
+
84
+ def bool_arg(value):
85
+ if value.lower() in ('yes', 'true', 't', 'y', '1'):
86
+ return True
87
+ elif value.lower() in ('no', 'false', 'f', 'n', '0'):
88
+ return False
89
+
90
+
91
+ def parse_args(test=False):
92
+ parser = argparse.ArgumentParser()
93
+ parser.add_argument('-c', '--cfg', type=str, default='./configs/debug.yaml', help='cfg file path')
94
+ parser.add_argument(
95
+ "--eval-set", type=str, default='3dpw', help="Evaluation dataset")
96
+ parser.add_argument(
97
+ "--eval-split", type=str, default='test', help="Evaluation data split")
98
+ parser.add_argument('--render', default=False, type=bool_arg,
99
+ help='Render SMPL meshes after the evaluation')
100
+ parser.add_argument('--save-results', default=False, type=bool_arg,
101
+ help='Save SMPL parameters after the evaluation')
102
+ parser.add_argument(
103
+ "opts", default=None, nargs=argparse.REMAINDER,
104
+ help="Modify config options using the command-line")
105
+
106
+ args = parser.parse_args()
107
+ print(args, end='\n\n')
108
+ cfg_file = args.cfg
109
+ cfg = get_cfg(args, test)
110
+
111
+ return cfg, cfg_file, args
configs/constants.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import absolute_import
2
+ from __future__ import print_function
3
+ from __future__ import division
4
+
5
+ import torch
6
+
7
+ IMG_FEAT_DIM = {
8
+ 'resnet': 2048,
9
+ 'vit': 1024
10
+ }
11
+
12
+ N_JOINTS = 17
13
+ root = 'dataset'
14
+ class PATHS:
15
+ # Raw data folders
16
+ PARSED_DATA = f'{root}/parsed_data'
17
+ AMASS_PTH = f'{root}/AMASS'
18
+ THREEDPW_PTH = f'{root}/3DPW'
19
+ HUMAN36M_PTH = f'{root}/Human36M'
20
+ RICH_PTH = f'{root}/RICH'
21
+ EMDB_PTH = f'{root}/EMDB'
22
+
23
+ # Processed labels
24
+ AMASS_LABEL = f'{root}/parsed_data/amass.pth'
25
+ THREEDPW_LABEL = f'{root}/parsed_data/3dpw_dset_backbone.pth'
26
+ MPII3D_LABEL = f'{root}/parsed_data/mpii3d_dset_backbone.pth'
27
+ HUMAN36M_LABEL = f'{root}/parsed_data/human36m_dset_backbone.pth'
28
+ INSTA_LABEL = f'{root}/parsed_data/insta_dset_backbone.pth'
29
+ BEDLAM_LABEL = f'{root}/parsed_data/bedlam_train_backbone.pth'
30
+
31
+ class KEYPOINTS:
32
+ NUM_JOINTS = N_JOINTS
33
+ H36M_TO_J17 = [6, 5, 4, 1, 2, 3, 16, 15, 14, 11, 12, 13, 8, 10, 0, 7, 9]
34
+ H36M_TO_J14 = H36M_TO_J17[:14]
35
+ J17_TO_H36M = [14, 3, 4, 5, 2, 1, 0, 15, 12, 16, 13, 9, 10, 11, 8, 7, 6]
36
+ COCO_AUG_DICT = f'{root}/body_models/coco_aug_dict.pth'
37
+ TREE = [[5, 6], 0, 0, 1, 2, -1, -1, 5, 6, 7, 8, -1, -1, 11, 12, 13, 14, 15, 15, 15, 16, 16, 16]
38
+
39
+ # STD scale for video noise
40
+ S_BIAS = 1e-1
41
+ S_JITTERING = 5e-2
42
+ S_PEAK = 3e-1
43
+ S_PEAK_MASK = 5e-3
44
+ S_MASK = 0.03
45
+
46
+
47
+ class BMODEL:
48
+ MAIN_JOINTS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] # reduced_joints
49
+
50
+ FLDR = f'{root}/body_models/smpl/'
51
+ SMPLX2SMPL = f'{root}/body_models/smplx2smpl.pkl'
52
+ FACES = f'{root}/body_models/smpl_faces.npy'
53
+ MEAN_PARAMS = f'{root}/body_models/smpl_mean_params.npz'
54
+ JOINTS_REGRESSOR_WHAM = f'{root}/body_models/J_regressor_wham.npy'
55
+ JOINTS_REGRESSOR_H36M = f'{root}/body_models/J_regressor_h36m.npy'
56
+ JOINTS_REGRESSOR_EXTRA = f'{root}/body_models/J_regressor_extra.npy'
57
+ JOINTS_REGRESSOR_FEET = f'{root}/body_models/J_regressor_feet.npy'
58
+ PARENTS = torch.tensor([
59
+ -1, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 12, 13, 14, 16, 17, 18, 19, 20, 21])
configs/yamls/demo.yaml ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ LOGDIR: ''
2
+ DEVICE: 'cuda'
3
+ EXP_NAME: 'demo'
4
+ OUTPUT_DIR: 'experiments/'
5
+ NUM_WORKERS: 0
6
+ MODEL_CONFIG: 'configs/yamls/model_base.yaml'
7
+ FLIP_EVAL: True
8
+
9
+ TRAIN:
10
+ STAGE: 'stage2'
11
+ CHECKPOINT: 'checkpoints/wham_vit_bedlam_w_3dpw.pth.tar'
12
+
13
+ MODEL:
14
+ BACKBONE: 'vit'
configs/yamls/model_base.yaml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ architecture: 'RNN'
2
+ in_dim: 49
3
+ n_iters: 1
4
+ pose_dr: 0.15
5
+ d_embed: 512
6
+ n_layers: 3
7
+ layer: 'LSTM'
configs/yamls/stage1.yaml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ LOGDIR: ''
2
+ DEVICE: 'cuda'
3
+ EXP_NAME: 'train_stage1'
4
+ OUTPUT_DIR: 'experiments/'
5
+ NUM_WORKERS: 8
6
+ MODEL_CONFIG: 'configs/yamls/model_base.yaml'
7
+ FLIP_EVAL: True
8
+ SEED_VALUE: 42
9
+
10
+ TRAIN:
11
+ LR: 5e-4
12
+ BATCH_SIZE: 64
13
+ END_EPOCH: 100
14
+ STAGE: 'stage1'
15
+ CHECKPOINT: ''
16
+ MILESTONES: [60, 80]
17
+
18
+ LOSS:
19
+ SHAPE_LOSS_WEIGHT: 0.004
20
+ JOINT3D_LOSS_WEIGHT: 0.4
21
+ JOINT2D_LOSS_WEIGHT: 0.1
22
+ POSE_LOSS_WEIGHT: 8.0
23
+ CASCADED_LOSS_WEIGHT: 0.0
24
+ SLIDING_LOSS_WEIGHT: 0.5
25
+ CAMERA_LOSS_WEIGHT: 0.04
26
+ ROOT_VEL_LOSS_WEIGHT: 0.001
27
+ LOSS_WEIGHT: 50.0
28
+ CAMERA_LOSS_SKIP_EPOCH: 5
configs/yamls/stage2.yaml ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ LOGDIR: ''
2
+ DEVICE: 'cuda'
3
+ EXP_NAME: 'train_stage2'
4
+ OUTPUT_DIR: 'experiments'
5
+ NUM_WORKERS: 8
6
+ MODEL_CONFIG: 'configs/yamls/model_base.yaml'
7
+ FLIP_EVAL: True
8
+ SEED_VALUE: 42
9
+
10
+ TRAIN:
11
+ LR: 1e-4
12
+ LR_FINETUNE: 1e-5
13
+ STAGE: 'stage2'
14
+ CHECKPOINT: 'checkpoints/wham_stage1.pth.tar'
15
+ BATCH_SIZE: 64
16
+ END_EPOCH: 40
17
+ MILESTONES: [20, 30]
18
+ LR_DECAY_RATIO: 0.2
19
+
20
+ MODEL:
21
+ BACKBONE: 'vit'
22
+
23
+ LOSS:
24
+ SHAPE_LOSS_WEIGHT: 0.0
25
+ JOINT2D_LOSS_WEIGHT: 3.0
26
+ JOINT3D_LOSS_WEIGHT: 6.0
27
+ POSE_LOSS_WEIGHT: 1.0
28
+ CASCADED_LOSS_WEIGHT: 0.05
29
+ SLIDING_LOSS_WEIGHT: 0.5
30
+ CAMERA_LOSS_WEIGHT: 0.01
31
+ ROOT_VEL_LOSS_WEIGHT: 0.001
32
+ LOSS_WEIGHT: 60.0
33
+ CAMERA_LOSS_SKIP_EPOCH: 0
34
+
35
+ DATASET:
36
+ SEQLEN: 81
37
+ RATIO: [0.2, 0.2, 0.2, 0.2, 0.2]
configs/yamls/stage2_b.yaml ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ LOGDIR: ''
2
+ DEVICE: 'cuda'
3
+ EXP_NAME: 'train_stage2_b'
4
+ OUTPUT_DIR: 'experiments'
5
+ NUM_WORKERS: 8
6
+ MODEL_CONFIG: 'configs/yamls/model_base.yaml'
7
+ FLIP_EVAL: True
8
+ SEED_VALUE: 42
9
+
10
+ TRAIN:
11
+ LR: 1e-4
12
+ LR_FINETUNE: 1e-5
13
+ STAGE: 'stage2'
14
+ CHECKPOINT: 'checkpoints/wham_stage1.pth.tar'
15
+ BATCH_SIZE: 64
16
+ END_EPOCH: 80
17
+ MILESTONES: [40, 50, 70]
18
+ LR_DECAY_RATIO: 0.2
19
+
20
+ MODEL:
21
+ BACKBONE: 'vit'
22
+
23
+ LOSS:
24
+ SHAPE_LOSS_WEIGHT: 0.0
25
+ JOINT2D_LOSS_WEIGHT: 5.0
26
+ JOINT3D_LOSS_WEIGHT: 5.0
27
+ VERTS3D_LOSS_WEIGHT: 1.0
28
+ POSE_LOSS_WEIGHT: 3.0
29
+ CASCADED_LOSS_WEIGHT: 0.05
30
+ SLIDING_LOSS_WEIGHT: 0.5
31
+ CAMERA_LOSS_WEIGHT: 0.01
32
+ ROOT_VEL_LOSS_WEIGHT: 0.001
33
+ LOSS_WEIGHT: 60.0
34
+ CAMERA_LOSS_SKIP_EPOCH: 0
35
+
36
+ DATASET:
37
+ SEQLEN: 81
38
+ RATIO: [0.2, 0.2, 0.2, 0.2, 0.0, 0.2]
dataset/body_models/J_regressor_coco.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0cd49241810715e752aa7384363b7bc09fb96b386ca99aa1c3eb2c0d15d6b8b9
3
+ size 468648
dataset/body_models/J_regressor_feet.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7ef9e6d64796f2f342983a9fde6a6d9f8e3544f1239e7f86aa4f6b7aa82f4cf6
3
+ size 220608
dataset/body_models/J_regressor_h36m.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c655cd7013d7829eb9acbebf0e43f952a3fa0305a53c35880e39192bfb6444a0
3
+ size 937168
dataset/body_models/J_regressor_wham.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f938dcfd5cd88d0b19ee34e442d49f1dc370d3d8c4f5aef57a93d0cf2e267c4c
3
+ size 854488
dataset/body_models/smpl/SMPL_FEMALE.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a583c1b98e4afc19042641f1bae5cd8a1f712a6724886291a7627ec07acd408d
3
+ size 39056454
dataset/body_models/smpl/SMPL_MALE.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0e8c0bbbbc635dcb166ed29c303fb4bef16ea5f623e5a89263495a9e403575bd
3
+ size 39056404
dataset/body_models/smpl/SMPL_NEUTRAL.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:98e65c74ad9b998783132f00880d1025a8d64b158e040e6ef13a557e5098bc42
3
+ size 39001280
dataset/body_models/smpl/__MACOSX/._smpl ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/._.DS_Store ADDED
Binary file (120 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/.___init__.py ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/._models ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/._smpl_webuser ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/models/basicModel_f_lbs_10_207_0_v1.0.0.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a583c1b98e4afc19042641f1bae5cd8a1f712a6724886291a7627ec07acd408d
3
+ size 39056454
dataset/body_models/smpl/__MACOSX/smpl/models/basicmodel_m_lbs_10_207_0_v1.0.0.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0e8c0bbbbc635dcb166ed29c303fb4bef16ea5f623e5a89263495a9e403575bd
3
+ size 39056404
dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._LICENSE.txt ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._README.txt ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/.___init__.py ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._hello_world ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._lbs.py ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._posemapper.py ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._serialization.py ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/._verts.py ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/hello_world/._hello_smpl.py ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl/__MACOSX/smpl/smpl_webuser/hello_world/._render_smpl.py ADDED
Binary file (239 Bytes). View file
 
dataset/body_models/smpl_faces.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:51fc11ebadb0487d74bef220c4eea43f014609249f0121413c1fc629d859fecb
3
+ size 165392
dataset/body_models/smpl_mean_params.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6fd6dd687800da946d0a0492383f973b92ec20f166a0b829775882868c35fcdd
3
+ size 1310
dataset/body_models/smplx2smpl.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c1d912d121ad98132e4492d8e7a0f1a8cf4412811e14a7ef8cb337bb48eef99e
3
+ size 578019251
demo.py ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import argparse
3
+ import os.path as osp
4
+ from glob import glob
5
+ from collections import defaultdict
6
+
7
+ import cv2
8
+ import torch
9
+ import joblib
10
+ import numpy as np
11
+ from loguru import logger
12
+ from progress.bar import Bar
13
+
14
+ from configs.config import get_cfg_defaults
15
+ from lib.data.datasets import CustomDataset
16
+ from lib.utils.imutils import avg_preds
17
+ from lib.utils.transforms import matrix_to_axis_angle
18
+ from lib.models import build_network, build_body_model
19
+ from lib.models.preproc.detector import DetectionModel
20
+ from lib.models.preproc.extractor import FeatureExtractor
21
+ from lib.models.smplify import TemporalSMPLify
22
+
23
+ try:
24
+ from lib.models.preproc.slam import SLAMModel
25
+ _run_global = True
26
+ except:
27
+ logger.info('DPVO is not properly installed. Only estimate in local coordinates !')
28
+ _run_global = False
29
+
30
+ def run(cfg,
31
+ video,
32
+ output_pth,
33
+ network,
34
+ calib=None,
35
+ run_global=True,
36
+ save_pkl=False,
37
+ visualize=False):
38
+
39
+ cap = cv2.VideoCapture(video)
40
+ assert cap.isOpened(), f'Faild to load video file {video}'
41
+ fps = cap.get(cv2.CAP_PROP_FPS)
42
+ length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
43
+ width, height = cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
44
+
45
+ # Whether or not estimating motion in global coordinates
46
+ run_global = run_global and _run_global
47
+
48
+ # Preprocess
49
+ with torch.no_grad():
50
+ if not (osp.exists(osp.join(output_pth, 'tracking_results.pth')) and
51
+ osp.exists(osp.join(output_pth, 'slam_results.pth'))):
52
+
53
+ detector = DetectionModel(cfg.DEVICE.lower())
54
+ extractor = FeatureExtractor(cfg.DEVICE.lower(), cfg.FLIP_EVAL)
55
+
56
+ if run_global: slam = SLAMModel(video, output_pth, width, height, calib)
57
+ else: slam = None
58
+
59
+ bar = Bar('Preprocess: 2D detection and SLAM', fill='#', max=length)
60
+ while (cap.isOpened()):
61
+ flag, img = cap.read()
62
+ if not flag: break
63
+
64
+ # 2D detection and tracking
65
+ detector.track(img, fps, length)
66
+
67
+ # SLAM
68
+ if slam is not None:
69
+ slam.track()
70
+
71
+ bar.next()
72
+
73
+ tracking_results = detector.process(fps)
74
+
75
+ if slam is not None:
76
+ slam_results = slam.process()
77
+ else:
78
+ slam_results = np.zeros((length, 7))
79
+ slam_results[:, 3] = 1.0 # Unit quaternion
80
+
81
+ # Extract image features
82
+ # TODO: Merge this into the previous while loop with an online bbox smoothing.
83
+ tracking_results = extractor.run(video, tracking_results)
84
+ logger.info('Complete Data preprocessing!')
85
+
86
+ # Save the processed data
87
+ joblib.dump(tracking_results, osp.join(output_pth, 'tracking_results.pth'))
88
+ joblib.dump(slam_results, osp.join(output_pth, 'slam_results.pth'))
89
+ logger.info(f'Save processed data at {output_pth}')
90
+
91
+ # If the processed data already exists, load the processed data
92
+ else:
93
+ tracking_results = joblib.load(osp.join(output_pth, 'tracking_results.pth'))
94
+ slam_results = joblib.load(osp.join(output_pth, 'slam_results.pth'))
95
+ logger.info(f'Already processed data exists at {output_pth} ! Load the data .')
96
+
97
+ # Build dataset
98
+ dataset = CustomDataset(cfg, tracking_results, slam_results, width, height, fps)
99
+
100
+ # run WHAM
101
+ results = defaultdict(dict)
102
+
103
+ n_subjs = len(dataset)
104
+ for subj in range(n_subjs):
105
+
106
+ with torch.no_grad():
107
+ if cfg.FLIP_EVAL:
108
+ # Forward pass with flipped input
109
+ flipped_batch = dataset.load_data(subj, True)
110
+ _id, x, inits, features, mask, init_root, cam_angvel, frame_id, kwargs = flipped_batch
111
+ flipped_pred = network(x, inits, features, mask=mask, init_root=init_root, cam_angvel=cam_angvel, return_y_up=True, **kwargs)
112
+
113
+ # Forward pass with normal input
114
+ batch = dataset.load_data(subj)
115
+ _id, x, inits, features, mask, init_root, cam_angvel, frame_id, kwargs = batch
116
+ pred = network(x, inits, features, mask=mask, init_root=init_root, cam_angvel=cam_angvel, return_y_up=True, **kwargs)
117
+
118
+ # Merge two predictions
119
+ flipped_pose, flipped_shape = flipped_pred['pose'].squeeze(0), flipped_pred['betas'].squeeze(0)
120
+ pose, shape = pred['pose'].squeeze(0), pred['betas'].squeeze(0)
121
+ flipped_pose, pose = flipped_pose.reshape(-1, 24, 6), pose.reshape(-1, 24, 6)
122
+ avg_pose, avg_shape = avg_preds(pose, shape, flipped_pose, flipped_shape)
123
+ avg_pose = avg_pose.reshape(-1, 144)
124
+ avg_contact = (flipped_pred['contact'][..., [2, 3, 0, 1]] + pred['contact']) / 2
125
+
126
+ # Refine trajectory with merged prediction
127
+ network.pred_pose = avg_pose.view_as(network.pred_pose)
128
+ network.pred_shape = avg_shape.view_as(network.pred_shape)
129
+ network.pred_contact = avg_contact.view_as(network.pred_contact)
130
+ output = network.forward_smpl(**kwargs)
131
+ pred = network.refine_trajectory(output, cam_angvel, return_y_up=True)
132
+
133
+ else:
134
+ # data
135
+ batch = dataset.load_data(subj)
136
+ _id, x, inits, features, mask, init_root, cam_angvel, frame_id, kwargs = batch
137
+
138
+ # inference
139
+ pred = network(x, inits, features, mask=mask, init_root=init_root, cam_angvel=cam_angvel, return_y_up=True, **kwargs)
140
+
141
+ # if False:
142
+ if args.run_smplify:
143
+ smplify = TemporalSMPLify(smpl, img_w=width, img_h=height, device=cfg.DEVICE)
144
+ input_keypoints = dataset.tracking_results[_id]['keypoints']
145
+ pred = smplify.fit(pred, input_keypoints, **kwargs)
146
+
147
+ with torch.no_grad():
148
+ network.pred_pose = pred['pose']
149
+ network.pred_shape = pred['betas']
150
+ network.pred_cam = pred['cam']
151
+ output = network.forward_smpl(**kwargs)
152
+ pred = network.refine_trajectory(output, cam_angvel, return_y_up=True)
153
+
154
+ # ========= Store results ========= #
155
+ pred_body_pose = matrix_to_axis_angle(pred['poses_body']).cpu().numpy().reshape(-1, 69)
156
+ pred_root = matrix_to_axis_angle(pred['poses_root_cam']).cpu().numpy().reshape(-1, 3)
157
+ pred_root_world = matrix_to_axis_angle(pred['poses_root_world']).cpu().numpy().reshape(-1, 3)
158
+ pred_pose = np.concatenate((pred_root, pred_body_pose), axis=-1)
159
+ pred_pose_world = np.concatenate((pred_root_world, pred_body_pose), axis=-1)
160
+ pred_trans = (pred['trans_cam'] - network.output.offset).cpu().numpy()
161
+
162
+ results[_id]['pose'] = pred_pose
163
+ results[_id]['trans'] = pred_trans
164
+ results[_id]['pose_world'] = pred_pose_world
165
+ results[_id]['trans_world'] = pred['trans_world'].cpu().squeeze(0).numpy()
166
+ results[_id]['betas'] = pred['betas'].cpu().squeeze(0).numpy()
167
+ results[_id]['verts'] = (pred['verts_cam'] + pred['trans_cam'].unsqueeze(1)).cpu().numpy()
168
+ results[_id]['frame_ids'] = frame_id
169
+
170
+ if save_pkl:
171
+ joblib.dump(results, osp.join(output_pth, "wham_output.pkl"))
172
+
173
+ # Visualize
174
+ if visualize:
175
+ from lib.vis.run_vis import run_vis_on_demo
176
+ with torch.no_grad():
177
+ run_vis_on_demo(cfg, video, results, output_pth, network.smpl, vis_global=run_global)
178
+
179
+
180
+ if __name__ == '__main__':
181
+ parser = argparse.ArgumentParser()
182
+
183
+ parser.add_argument('--video', type=str,
184
+ default='examples/demo_video.mp4',
185
+ help='input video path or youtube link')
186
+
187
+ parser.add_argument('--output_pth', type=str, default='output/demo',
188
+ help='output folder to write results')
189
+
190
+ parser.add_argument('--calib', type=str, default=None,
191
+ help='Camera calibration file path')
192
+
193
+ parser.add_argument('--estimate_local_only', action='store_true',
194
+ help='Only estimate motion in camera coordinate if True')
195
+
196
+ parser.add_argument('--visualize', action='store_true',
197
+ help='Visualize the output mesh if True')
198
+
199
+ parser.add_argument('--save_pkl', action='store_true',
200
+ help='Save output as pkl file')
201
+
202
+ parser.add_argument('--run_smplify', action='store_true',
203
+ help='Run Temporal SMPLify for post processing')
204
+
205
+ args = parser.parse_args()
206
+
207
+ cfg = get_cfg_defaults()
208
+ cfg.merge_from_file('configs/yamls/demo.yaml')
209
+
210
+ logger.info(f'GPU name -> {torch.cuda.get_device_name()}')
211
+ logger.info(f'GPU feat -> {torch.cuda.get_device_properties("cuda")}')
212
+
213
+ # ========= Load WHAM ========= #
214
+ smpl_batch_size = cfg.TRAIN.BATCH_SIZE * cfg.DATASET.SEQLEN
215
+ smpl = build_body_model(cfg.DEVICE, smpl_batch_size)
216
+ network = build_network(cfg, smpl)
217
+ network.eval()
218
+
219
+ # Output folder
220
+ sequence = '.'.join(args.video.split('/')[-1].split('.')[:-1])
221
+ output_pth = osp.join(args.output_pth, sequence)
222
+ os.makedirs(output_pth, exist_ok=True)
223
+
224
+ run(cfg,
225
+ args.video,
226
+ output_pth,
227
+ network,
228
+ args.calib,
229
+ run_global=not args.estimate_local_only,
230
+ save_pkl=args.save_pkl,
231
+ visualize=args.visualize)
232
+
233
+ print()
234
+ logger.info('Done !')
docs/API.md ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## Python API
2
+
3
+ To use python API of WHAM, please finish the basic installation first ([Installation](INSTALL.md) or [Docker](DOCKER.md)).
4
+
5
+ If you use Docker environment, please run:
6
+
7
+ ```bash
8
+ cd /path/to/WHAM
9
+ docker run -it -v .:/code/ --rm yusun9/wham-vitpose-dpvo-cuda11.3-python3.9 python
10
+ ```
11
+
12
+ Then you can run wham via python code like
13
+ ```bash
14
+ from wham_api import WHAM_API
15
+ wham_model = WHAM_API()
16
+ input_video_path = 'examples/IMG_9732.mov'
17
+ results, tracking_results, slam_results = wham_model(input_video_path)
18
+ ```
docs/DATASET.md ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Dataset
2
+
3
+ ## Training Data
4
+ We use [AMASS](https://amass.is.tue.mpg.de/), [InstaVariety](https://github.com/akanazawa/human_dynamics/blob/master/doc/insta_variety.md), [MPI-INF-3DHP](https://vcai.mpi-inf.mpg.de/3dhp-dataset/), [Human3.6M](http://vision.imar.ro/human3.6m/description.php), and [3DPW](https://virtualhumans.mpi-inf.mpg.de/3DPW/) datasets for training. Please register to their websites to download and process the data. You can download parsed ViT version of InstaVariety, MPI-INF-3DHP, Human3.6M, and 3DPW data from the [Google Drive](https://drive.google.com/drive/folders/13T2ghVvrw_fEk3X-8L0e6DVSYx_Og8o3?usp=sharing). You can save the data under `dataset/parsed_data` folder.
5
+
6
+ ### Process AMASS dataset
7
+ After downloading AMASS dataset, you can process it by running:
8
+ ```bash
9
+ python -m lib.data_utils.amass_utils
10
+ ```
11
+ The processed data will be stored at `dataset/parsed_data/amass.pth`.
12
+
13
+ ### Process 3DPW, MPII3D, Human3.6M, and InstaVariety datasets
14
+ First, visit [TCMR](https://github.com/hongsukchoi/TCMR_RELEASE) and download preprocessed data at `dataset/parsed_data/TCMR_preproc/'.
15
+
16
+ Next, prepare 2D keypoints detection using [ViTPose](https://github.com/ViTAE-Transformer/ViTPose) and store the results at `dataset/detection_results/\<DATAsET-NAME>/\<SEQUENCE_NAME.npy>'. You may need to download all images to prepare the detection results.
17
+
18
+ For Human36M, MPII3D, and InstaVariety datasets, you need to also download [NeuralAnnot](https://github.com/mks0601/NeuralAnnot_RELEASE) pseudo groundtruth SMPL label. As mentioned in our paper, we do not supervise WHAM on this label, but use it for neural initialization step.
19
+
20
+ Finally, run following codes to preprocess all training data.
21
+ ```bash
22
+ python -m lib.data_utils.threedpw_train_utils # 3DPW dataset
23
+ # [Coming] python -m lib.data_utils.human36m_train_utils # Human3.6M dataset
24
+ # [Coming] python -m lib.data_utils.mpii3d_train_utils # MPI-INF-3DHP dataset
25
+ # [Coming] python -m lib.data_utils.insta_train_utils # InstaVariety dataset
26
+ ```
27
+
28
+ ### Process BEDLAM dataset
29
+ Will be updated.
30
+
31
+ ## Evaluation Data
32
+ We use [3DPW](https://virtualhumans.mpi-inf.mpg.de/3DPW/), [RICH](https://rich.is.tue.mpg.de/), and [EMDB](https://eth-ait.github.io/emdb/) for the evaluation. We provide the parsed data for the evaluation. Please download the data from [Google Drive](https://drive.google.com/drive/folders/13T2ghVvrw_fEk3X-8L0e6DVSYx_Og8o3?usp=sharing) and place them at `dataset/parsed_data/`.
33
+
34
+ To process the data at your end, please
35
+ 1) Download parsed 3DPW data from [TCMR](https://github.com/hongsukchoi/TCMR_RELEASE) and store `dataset/parsed_data/TCMR_preproc/'.
36
+ 2) Run [ViTPose](https://github.com/ViTAE-Transformer/ViTPose) on all test data and store the results at `dataset/detection_results/\<DATAsET-NAME>'.
37
+ 3) Run following codes.
38
+ ```bash
39
+ python -m lib.data_utils.threedpw_eval_utils --split <"val" or "test"> # 3DPW dataset
40
+ python -m lib.data_utils.emdb_eval_utils --split <"1" or "2"> # EMDB dataset
41
+ python -m lib.data_utils.rich_eval_utils # RICH dataset
42
+ ```
docs/DOCKER.md ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## Installation
2
+
3
+ ### Pre-requirments
4
+ 1. Please make sure that you have properly installed the [Docker](https://www.docker.com/) and [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) before installation.
5
+
6
+ 2. Please prepare the essential data for inference:
7
+ To download SMPL body models (Neutral, Female, and Male), you need to register for [SMPL](https://smpl.is.tue.mpg.de/) and [SMPLify](https://smplify.is.tue.mpg.de/). The username and password for both homepages will be used while fetching the demo data.
8
+ Next, run the following script to fetch demo data. This script will download all the required dependencies including trained models and demo videos.
9
+ ```bash
10
+ bash fetch_demo_data.sh
11
+ ```
12
+
13
+ ### Usage
14
+ 1. Pulling the docker image from docker hub:
15
+ ```bash
16
+ docker pull yusun9/wham-vitpose-dpvo-cuda11.3-python3.9:latest
17
+ ```
18
+
19
+ 2. Run the code with docker environment:
20
+ ```bash
21
+ cd /path/to/WHAM
22
+ docker run -v .:/code/ --rm yusun9/wham-vitpose-dpvo-cuda11.3-python3.9 python demo.py --video examples/IMG_9732.mov
23
+ ```
docs/INSTALL.md ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Installation
2
+
3
+ WHAM has been implemented and tested on Ubuntu 20.04 and 22.04 with python = 3.9. We provide [anaconda](https://www.anaconda.com/) environment to run WHAM as below.
4
+
5
+ ```bash
6
+ # Clone the repo
7
+ git clone https://github.com/yohanshin/WHAM.git --recursive
8
+ cd WHAM/
9
+
10
+ # Create Conda environment
11
+ conda create -n wham python=3.9
12
+ conda activate wham
13
+
14
+ # Install PyTorch libraries
15
+ conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch
16
+
17
+ # Install PyTorch3D (optional) for visualization
18
+ conda install -c fvcore -c iopath -c conda-forge fvcore iopath
19
+ pip install pytorch3d -f https://dl.fbaipublicfiles.com/pytorch3d/packaging/wheels/py39_cu113_pyt1110/download.html
20
+
21
+ # Install WHAM dependencies
22
+ pip install -r requirements.txt
23
+
24
+ # Install ViTPose
25
+ pip install -v -e third-party/ViTPose
26
+
27
+ # Install DPVO
28
+ cd third-party/DPVO
29
+ wget https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.zip
30
+ unzip eigen-3.4.0.zip -d thirdparty && rm -rf eigen-3.4.0.zip
31
+ conda install pytorch-scatter=2.0.9 -c rusty1s
32
+ conda install cudatoolkit-dev=11.3.1 -c conda-forge
33
+
34
+ # ONLY IF your GCC version is larger than 10
35
+ conda install -c conda-forge gxx=9.5
36
+
37
+ pip install .
38
+ ```
examples/IMG_9730.mov ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3739b87ba0c64d047df3d8f5479c530377788fdab4c2283925477894a1d252f9
3
+ size 21526220
examples/IMG_9731.mov ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:116ad3f95743524283a234fd9e7a1152b28a04536ab5975f4e4e71c547d9e1a6
3
+ size 22633328
examples/IMG_9732.mov ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:168773c92e0112361dcd1da4154c915983490e58ff89102c1a65edb28d505813
3
+ size 23960355
examples/drone_calib.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ 1321.0 1321.0 960.0 540.0