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]