| import os |
| import pickle |
| from tqdm import tqdm |
| import shutil |
| import torch |
| import numpy as np |
| import librosa |
| import random |
|
|
| speakers = ['seth', 'conan', 'oliver', 'chemistry'] |
| data_root = "../ExpressiveWholeBodyDatasetv1.0/" |
| split = 'train' |
|
|
|
|
|
|
| def split_list(full_list,shuffle=False,ratio=0.2): |
| n_total = len(full_list) |
| offset_0 = int(n_total * ratio) |
| offset_1 = int(n_total * ratio * 2) |
| if n_total==0 or offset_1<1: |
| return [],full_list |
| if shuffle: |
| random.shuffle(full_list) |
| sublist_0 = full_list[:offset_0] |
| sublist_1 = full_list[offset_0:offset_1] |
| sublist_2 = full_list[offset_1:] |
| return sublist_0, sublist_1, sublist_2 |
|
|
|
|
| def moveto(list, file): |
| for f in list: |
| before, after = '/'.join(f.split('/')[:-1]), f.split('/')[-1] |
| new_path = os.path.join(before, file) |
| new_path = os.path.join(new_path, after) |
| |
| |
| |
|
|
| |
| shutil.copytree(f, new_path) |
| |
| shutil.rmtree(f) |
| return None |
|
|
|
|
| def read_pkl(data): |
| betas = np.array(data['betas']) |
|
|
| jaw_pose = np.array(data['jaw_pose']) |
| leye_pose = np.array(data['leye_pose']) |
| reye_pose = np.array(data['reye_pose']) |
| global_orient = np.array(data['global_orient']).squeeze() |
| body_pose = np.array(data['body_pose_axis']) |
| left_hand_pose = np.array(data['left_hand_pose']) |
| right_hand_pose = np.array(data['right_hand_pose']) |
|
|
| full_body = np.concatenate( |
| (jaw_pose, leye_pose, reye_pose, global_orient, body_pose, left_hand_pose, right_hand_pose), axis=1) |
|
|
| expression = np.array(data['expression']) |
| full_body = np.concatenate((full_body, expression), axis=1) |
|
|
| if (full_body.shape[0] < 90) or (torch.isnan(torch.from_numpy(full_body)).sum() > 0): |
| return 1 |
| else: |
| return 0 |
|
|
|
|
| for speaker_name in speakers: |
| speaker_root = os.path.join(data_root, speaker_name) |
|
|
| videos = [v for v in os.listdir(speaker_root)] |
| print(videos) |
|
|
| haode = huaide = 0 |
| total_seqs = [] |
|
|
| for vid in tqdm(videos, desc="Processing training data of {}......".format(speaker_name)): |
| |
| source_vid = vid |
| vid_pth = os.path.join(speaker_root, source_vid) |
| |
| t = os.path.join(speaker_root, source_vid, 'test') |
| v = os.path.join(speaker_root, source_vid, 'val') |
|
|
| |
| |
| |
| |
| try: |
| seqs = [s for s in os.listdir(vid_pth)] |
| except: |
| continue |
| |
| |
| |
| for s in seqs: |
| quality = 0 |
| total_seqs.append(os.path.join(vid_pth,s)) |
| seq_root = os.path.join(vid_pth, s) |
| key = seq_root |
| audio_fname = os.path.join(speaker_root, source_vid, s, '%s.wav' % (s)) |
|
|
| |
| if os.path.isfile(audio_fname): |
| try: |
| audio = librosa.load(audio_fname) |
| except: |
| |
| shutil.rmtree(key) |
| huaide = huaide + 1 |
| continue |
| else: |
| huaide = huaide + 1 |
| |
| shutil.rmtree(key) |
| continue |
|
|
| |
| motion_fname = os.path.join(speaker_root, source_vid, s, '%s.pkl' % (s)) |
| try: |
| f = open(motion_fname, 'rb+') |
| except: |
| shutil.rmtree(key) |
| huaide = huaide + 1 |
| continue |
|
|
| data = pickle.load(f) |
| w = read_pkl(data) |
| f.close() |
| quality = quality + w |
|
|
| if w == 1: |
| shutil.rmtree(key) |
| |
| huaide = huaide + 1 |
| continue |
|
|
| haode = haode + 1 |
|
|
| print("huaide:{}, haode:{}, total_seqs:{}".format(huaide, haode, total_seqs.__len__())) |
|
|
| for speaker_name in speakers: |
| speaker_root = os.path.join(data_root, speaker_name) |
|
|
| videos = [v for v in os.listdir(speaker_root)] |
| print(videos) |
|
|
| haode = huaide = 0 |
| total_seqs = [] |
|
|
| for vid in tqdm(videos, desc="Processing training data of {}......".format(speaker_name)): |
| |
| source_vid = vid |
| vid_pth = os.path.join(speaker_root, source_vid) |
| try: |
| seqs = [s for s in os.listdir(vid_pth)] |
| except: |
| continue |
| for s in seqs: |
| quality = 0 |
| total_seqs.append(os.path.join(vid_pth, s)) |
| print("total_seqs:{}".format(total_seqs.__len__())) |
| |
| test_list, val_list, train_list = split_list(total_seqs, True, 0.1) |
| print(len(test_list), len(val_list), len(train_list)) |
| moveto(train_list, 'train') |
| moveto(test_list, 'test') |
| moveto(val_list, 'val') |
|
|
|
|