|
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] |