Spaces:
Runtime error
Runtime error
File size: 9,291 Bytes
7629b39 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
import numpy as np
import os
import sys
# SMAL_DATA_DIR = '/is/cluster/work/nrueegg/dog_project/pytorch-dogs-inference/src/smal_pytorch/smpl_models/'
# SMAL_DATA_DIR = os.path.join(os.path.dirname(__file__), '..', 'smal_pytorch', 'smal_data')
SMAL_DATA_DIR = os.path.join(os.path.dirname(__file__), '..', '..', 'data', 'smal_data')
# we replace the old SMAL model by a more dog specific model (see BARC cvpr 2022 paper)
# our model has several differences compared to the original SMAL model, some of them are:
# - the PCA shape space is recalculated (from partially new data and weighted)
# - coefficients for limb length changes are allowed (similar to WLDO, we did borrow some of their code)
# - all dogs have a core of approximately the same length
# - dogs are centered in their root joint (which is close to the tail base)
# -> like this the root rotations is always around this joint AND (0, 0, 0)
# -> before this it would happen that the animal 'slips' from the image middle to the side when rotating it. Now
# 'trans' also defines the center of the rotation
# - we correct the back joint locations such that all those joints are more aligned
SMAL_MODEL_PATH = os.path.join(SMAL_DATA_DIR, 'my_smpl_SMBLD_nbj_v3.pkl')
UNITY_SMAL_SHAPE_PRIOR_DOGS = os.path.join(SMAL_DATA_DIR, 'my_smpl_data_SMBLD_v3.pkl')
SYMMETRY_INDS_FILE = os.path.join(SMAL_DATA_DIR, 'symmetry_inds.json')
mean_dog_bone_lengths_txt = os.path.join(SMAL_DATA_DIR, 'mean_dog_bone_lengths.txt')
# there exist different keypoint configurations, for example keypoints corresponding to SMAL joints or keypoints defined based on vertex locations
KEYPOINT_CONFIGURATION = 'green' # green: same as in https://github.com/benjiebob/SMALify/blob/master/config.py
# some vertex indices, (from silvia zuffi´s code, create_projected_images_cats.py)
KEY_VIDS = np.array(([1068, 1080, 1029, 1226], # left eye
[2660, 3030, 2675, 3038], # right eye
[910], # mouth low
[360, 1203, 1235, 1230], # front left leg, low
[3188, 3156, 2327, 3183], # front right leg, low
[1976, 1974, 1980, 856], # back left leg, low
[3854, 2820, 3852, 3858], # back right leg, low
[452, 1811], # tail start
[416, 235, 182], # front left leg, top
[2156, 2382, 2203], # front right leg, top
[829], # back left leg, top
[2793], # back right leg, top
[60, 114, 186, 59], # throat, close to base of neck
[2091, 2037, 2036, 2160], # withers (a bit lower than in reality)
[384, 799, 1169, 431], # front left leg, middle
[2351, 2763, 2397, 3127], # front right leg, middle
[221, 104], # back left leg, middle
[2754, 2192], # back right leg, middle
[191, 1158, 3116, 2165], # neck
[28], # Tail tip
[542], # Left Ear
[2507], # Right Ear
[1039, 1845, 1846, 1870, 1879, 1919, 2997, 3761, 3762], # nose tip
[0, 464, 465, 726, 1824, 2429, 2430, 2690]), dtype=object) # half tail
# the following vertices are used for visibility only: if one of the vertices is visible,
# then we assume that the joint is visible! There is some noise, but we don't care, as this is
# for generation of the synthetic dataset only
KEY_VIDS_VISIBILITY_ONLY = np.array(([1068, 1080, 1029, 1226, 645], # left eye
[2660, 3030, 2675, 3038, 2567], # right eye
[910, 11, 5], # mouth low
[360, 1203, 1235, 1230, 298, 408, 303, 293, 384], # front left leg, low
[3188, 3156, 2327, 3183, 2261, 2271, 2573, 2265], # front right leg, low
[1976, 1974, 1980, 856, 559, 851, 556], # back left leg, low
[3854, 2820, 3852, 3858, 2524, 2522, 2815, 2072], # back right leg, low
[452, 1811, 63, 194, 52, 370, 64], # tail start
[416, 235, 182, 440, 8, 80, 73, 112], # front left leg, top
[2156, 2382, 2203, 2050, 2052, 2406, 3], # front right leg, top
[829, 219, 218, 173, 17, 7, 279], # back left leg, top
[2793, 582, 140, 87, 2188, 2147, 2063], # back right leg, top
[60, 114, 186, 59, 878, 130, 189, 45], # throat, close to base of neck
[2091, 2037, 2036, 2160, 190, 2164], # withers (a bit lower than in reality)
[384, 799, 1169, 431, 321, 314, 437, 310, 323], # front left leg, middle
[2351, 2763, 2397, 3127, 2278, 2285, 2282, 2275, 2359], # front right leg, middle
[221, 104, 105, 97, 103], # back left leg, middle
[2754, 2192, 2080, 2251, 2075, 2074], # back right leg, middle
[191, 1158, 3116, 2165, 154, 653, 133, 339], # neck
[28, 474, 475, 731, 24], # Tail tip
[542, 147, 509, 200, 522], # Left Ear
[2507,2174, 2122, 2126, 2474], # Right Ear
[1039, 1845, 1846, 1870, 1879, 1919, 2997, 3761, 3762], # nose tip
[0, 464, 465, 726, 1824, 2429, 2430, 2690]), dtype=object) # half tail
# see: https://github.com/benjiebob/SMALify/blob/master/config.py
# JOINT DEFINITIONS - based on SMAL joints and additional {eyes, ear tips, chin and nose}
TORSO_JOINTS = [2, 5, 8, 11, 12, 23]
CANONICAL_MODEL_JOINTS = [
10, 9, 8, # upper_left [paw, middle, top]
20, 19, 18, # lower_left [paw, middle, top]
14, 13, 12, # upper_right [paw, middle, top]
24, 23, 22, # lower_right [paw, middle, top]
25, 31, # tail [start, end]
33, 34, # ear base [left, right]
35, 36, # nose, chin
38, 37, # ear tip [left, right]
39, 40, # eyes [left, right]
6, 11, # withers, throat (throat is inaccurate and withers also)
28] # tail middle
# old: 15, 15, # withers, throat (TODO: Labelled same as throat for now), throat
# the following list gives the indices of the KEY_VIDS_JOINTS that must be taken in order
# to judge if the CANONICAL_MODEL_JOINTS are visible - those are all approximations!
CMJ_VISIBILITY_IN_KEY_VIDS = [
3, 14, 8, # left front leg
5, 16, 10, # left rear leg
4, 15, 9, # right front leg
6, 17, 11, # right rear leg
7, 19, # tail front, tail back
20, 21, # ear base (but can not be found in blue, se we take the tip)
2, 2, # mouth (was: 22, 2)
20, 21, # ear tips
1, 0, # eyes
18, # withers, not sure where this point is
12, # throat
23, # mid tail
]
# define which bone lengths are used as input to the 2d-to-3d network
IDXS_BONES_NO_REDUNDANCY = [6,7,8,9,16,17,18,19,32,1,2,3,4,5,14,15,24,25,26,27,28,29,30,31]
# load bone lengths of the mean dog (already filtered)
mean_dog_bone_lengths = []
with open(mean_dog_bone_lengths_txt, 'r') as f:
for line in f:
mean_dog_bone_lengths.append(float(line.split('\n')[0]))
MEAN_DOG_BONE_LENGTHS_NO_RED = np.asarray(mean_dog_bone_lengths)[IDXS_BONES_NO_REDUNDANCY] # (24, )
# Body part segmentation:
# the body can be segmented based on the bones and for the new dog model also based on the new shapedirs
# axis_horizontal = self.shapedirs[2, :].reshape((-1, 3))[:, 0]
# all_indices = np.arange(3889)
# tail_indices = all_indices[axis_horizontal.detach().cpu().numpy() < 0.0]
VERTEX_IDS_TAIL = [ 0, 4, 9, 10, 24, 25, 28, 453, 454, 456, 457,
458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468,
469, 470, 471, 472, 473, 474, 475, 724, 725, 726, 727,
728, 729, 730, 731, 813, 975, 976, 977, 1109, 1110, 1111,
1811, 1813, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827,
1828, 1835, 1836, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967,
1968, 1969, 2418, 2419, 2421, 2422, 2423, 2424, 2425, 2426, 2427,
2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438,
2439, 2440, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2777,
3067, 3068, 3069, 3842, 3843, 3844, 3845, 3846, 3847]
# same as in https://github.com/benjiebob/WLDO/blob/master/global_utils/config.py
EVAL_KEYPOINTS = [
0, 1, 2, # left front
3, 4, 5, # left rear
6, 7, 8, # right front
9, 10, 11, # right rear
12, 13, # tail start -> end
14, 15, # left ear, right ear
16, 17, # nose, chin
18, 19] # left tip, right tip
KEYPOINT_GROUPS = {
'legs': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], # legs
'tail': [12, 13], # tail
'ears': [14, 15, 18, 19], # ears
'face': [16, 17] # face
}
|