''' Adjusted version of other PyTorch implementation of the SMAL/SMPL model see: 1.) https://github.com/silviazuffi/smalst/blob/master/smal_model/smal_torch.py 2.) https://github.com/benjiebob/SMALify/blob/master/smal_model/smal_torch.py ''' import os import pickle as pkl import json import numpy as np import pickle as pkl import os import sys sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) from configs.SMAL_configs import SMAL_DATA_DIR, SYMMETRY_INDS_FILE # model_dir = 'smalst/smpl_models/' # FILE_DIR = os.path.dirname(os.path.realpath(__file__)) model_dir = SMAL_DATA_DIR # os.path.join(FILE_DIR, '..', 'smpl_models/') symmetry_inds_file = SYMMETRY_INDS_FILE # os.path.join(FILE_DIR, '..', 'smpl_models/symmetry_inds.json') with open(symmetry_inds_file) as f: symmetry_inds_dict = json.load(f) LEFT_INDS = np.asarray(symmetry_inds_dict['left_inds']) RIGHT_INDS = np.asarray(symmetry_inds_dict['right_inds']) CENTER_INDS = np.asarray(symmetry_inds_dict['center_inds']) def get_symmetry_indices(): sym_dict = {'left': LEFT_INDS, 'right': RIGHT_INDS, 'center': CENTER_INDS} return sym_dict def verify_symmetry(shapedirs, center_inds=CENTER_INDS, left_inds=LEFT_INDS, right_inds=RIGHT_INDS): # shapedirs: (3889, 3, n_sh) assert (shapedirs[center_inds, 1, :] == 0.0).all() assert (shapedirs[right_inds, 1, :] == -shapedirs[left_inds, 1, :]).all() return def from_shapedirs_to_shapedirs_half(shapedirs, center_inds=CENTER_INDS, left_inds=LEFT_INDS, right_inds=RIGHT_INDS, verify=False): # shapedirs: (3889, 3, n_sh) # shapedirs_half: (2012, 3, n_sh) selected_inds = np.concatenate((center_inds, left_inds), axis=0) shapedirs_half = shapedirs[selected_inds, :, :] if verify: verify_symmetry(shapedirs) else: shapedirs_half[:center_inds.shape[0], 1, :] = 0.0 return shapedirs_half def from_shapedirs_half_to_shapedirs(shapedirs_half, center_inds=CENTER_INDS, left_inds=LEFT_INDS, right_inds=RIGHT_INDS): # shapedirs_half: (2012, 3, n_sh) # shapedirs: (3889, 3, n_sh) shapedirs = np.zeros((center_inds.shape[0] + 2*left_inds.shape[0], 3, shapedirs_half.shape[2])) shapedirs[center_inds, :, :] = shapedirs_half[:center_inds.shape[0], :, :] shapedirs[left_inds, :, :] = shapedirs_half[center_inds.shape[0]:, :, :] shapedirs[right_inds, :, :] = shapedirs_half[center_inds.shape[0]:, :, :] shapedirs[right_inds, 1, :] = - shapedirs_half[center_inds.shape[0]:, 1, :] return shapedirs def align_smal_template_to_symmetry_axis(v, subtract_mean=True): # These are the indexes of the points that are on the symmetry axis I = [0, 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, 37, 55, 119, 120, 163, 209, 210, 211, 213, 216, 227, 326, 395, 452, 578, 910, 959, 964, 975, 976, 977, 1172, 1175, 1176, 1178, 1194, 1243, 1739, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1870, 1919, 1960, 1961, 1965, 1967, 2003] if subtract_mean: v = v - np.mean(v) y = np.mean(v[I,1]) v[:,1] = v[:,1] - y v[I,1] = 0 left_inds = LEFT_INDS right_inds = RIGHT_INDS center_inds = CENTER_INDS v[right_inds, :] = np.array([1,-1,1])*v[left_inds, :] try: assert(len(left_inds) == len(right_inds)) except: import pdb; pdb.set_trace() return v, left_inds, right_inds, center_inds