Spaces:
Configuration error
Configuration error
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] |