| import torch | |
| import numpy as np | |
| import ipdb | |
| import glob | |
| import os | |
| import io | |
| import math | |
| import random | |
| import json | |
| import pickle | |
| import math | |
| from torch.utils.data import Dataset, DataLoader | |
| from lib.utils.utils_data import crop_scale | |
| def halpe2h36m(x): | |
| ''' | |
| Input: x (T x V x C) | |
| //Halpe 26 body keypoints | |
| {0, "Nose"}, | |
| {1, "LEye"}, | |
| {2, "REye"}, | |
| {3, "LEar"}, | |
| {4, "REar"}, | |
| {5, "LShoulder"}, | |
| {6, "RShoulder"}, | |
| {7, "LElbow"}, | |
| {8, "RElbow"}, | |
| {9, "LWrist"}, | |
| {10, "RWrist"}, | |
| {11, "LHip"}, | |
| {12, "RHip"}, | |
| {13, "LKnee"}, | |
| {14, "Rknee"}, | |
| {15, "LAnkle"}, | |
| {16, "RAnkle"}, | |
| {17, "Head"}, | |
| {18, "Neck"}, | |
| {19, "Hip"}, | |
| {20, "LBigToe"}, | |
| {21, "RBigToe"}, | |
| {22, "LSmallToe"}, | |
| {23, "RSmallToe"}, | |
| {24, "LHeel"}, | |
| {25, "RHeel"}, | |
| ''' | |
| T, V, C = x.shape | |
| y = np.zeros([T,17,C]) | |
| y[:,0,:] = x[:,19,:] | |
| y[:,1,:] = x[:,12,:] | |
| y[:,2,:] = x[:,14,:] | |
| y[:,3,:] = x[:,16,:] | |
| y[:,4,:] = x[:,11,:] | |
| y[:,5,:] = x[:,13,:] | |
| y[:,6,:] = x[:,15,:] | |
| y[:,7,:] = (x[:,18,:] + x[:,19,:]) * 0.5 | |
| y[:,8,:] = x[:,18,:] | |
| y[:,9,:] = x[:,0,:] | |
| y[:,10,:] = x[:,17,:] | |
| y[:,11,:] = x[:,5,:] | |
| y[:,12,:] = x[:,7,:] | |
| y[:,13,:] = x[:,9,:] | |
| y[:,14,:] = x[:,6,:] | |
| y[:,15,:] = x[:,8,:] | |
| y[:,16,:] = x[:,10,:] | |
| return y | |
| def read_input(json_path, vid_size, scale_range, focus): | |
| with open(json_path, "r") as read_file: | |
| results = json.load(read_file) | |
| kpts_all = [] | |
| for item in results: | |
| if focus!=None and item['idx']!=focus: | |
| continue | |
| kpts = np.array(item['keypoints']).reshape([-1,3]) | |
| kpts_all.append(kpts) | |
| kpts_all = np.array(kpts_all) | |
| kpts_all = halpe2h36m(kpts_all) | |
| if vid_size: | |
| w, h = vid_size | |
| scale = min(w,h) / 2.0 | |
| kpts_all[:,:,:2] = kpts_all[:,:,:2] - np.array([w, h]) / 2.0 | |
| kpts_all[:,:,:2] = kpts_all[:,:,:2] / scale | |
| motion = kpts_all | |
| if scale_range: | |
| motion = crop_scale(kpts_all, scale_range) | |
| return motion.astype(np.float32) | |
| class WildDetDataset(Dataset): | |
| def __init__(self, json_path, clip_len=243, vid_size=None, scale_range=None, focus=None): | |
| self.json_path = json_path | |
| self.clip_len = clip_len | |
| self.vid_all = read_input(json_path, vid_size, scale_range, focus) | |
| def __len__(self): | |
| 'Denotes the total number of samples' | |
| return math.ceil(len(self.vid_all) / self.clip_len) | |
| def __getitem__(self, index): | |
| 'Generates one sample of data' | |
| st = index*self.clip_len | |
| end = min((index+1)*self.clip_len, len(self.vid_all)) | |
| return self.vid_all[st:end] |