From cfa754bceffb18b201dccbef59e49a38195db871 Mon Sep 17 00:00:00 2001 From: Hunor Laczko Date: Mon, 7 Nov 2022 15:12:23 +0000 Subject: [PATCH] pose clustering --- analysis_curvature.py | 0 cluster_poses.py | 99 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 analysis_curvature.py create mode 100644 cluster_poses.py diff --git a/analysis_curvature.py b/analysis_curvature.py new file mode 100644 index 0000000..e69de29 diff --git a/cluster_poses.py b/cluster_poses.py new file mode 100644 index 0000000..0ec6a0e --- /dev/null +++ b/cluster_poses.py @@ -0,0 +1,99 @@ +import os +import tqdm +import random +import numpy as np +import pandas as pd +import plotly.graph_objects as go + +from sklearn.cluster import KMeans, MiniBatchKMeans + + +def generate_clusters(folder, n_cluster): + frames = os.listdir(os.path.join(folder, 'pose_shape')) + frames = [frame.split('.')[0] for frame in frames] + # random.shuffle(frames) + # frames = frames[:5000] + + all_poses = np.zeros((len(frames), 69), np.float32) + + i = 0 + for frame in tqdm.tqdm(frames): + # id, frame_nr = frame.split('_') + # frame_nr = frame_nr.split('.')[0] + + pose_shape = np.load(os.path.join(folder, 'pose_shape', frame + '.npy')) + pose = pose_shape[3:72] + + all_poses[i, :] = pose + + i+= 1 + + + # kmeans = KMeans(n_clusters=20, random_state=0).fit(all_poses) + kmeans = MiniBatchKMeans(n_clusters=n_cluster, random_state=0, verbose=1).fit(all_poses) + + data = {'frame': frames, 'label': kmeans.labels_} + + df = pd.DataFrame(data) + df.to_csv('custom_data/' + folder.split('/')[-1] + '_pose_cluster_' + str(n_cluster) + '.csv', index=False) + + +def sample_from_cluster(file, n_sample, output_file): + df = pd.read_csv(file) + samples = df.groupby('label', group_keys=False).apply(lambda x: x.sample(n_sample)) + + sampled_frames = np.asarray(samples['frame'].array) + + with open(os.path.join(folder, output_file), 'w') as f: + for i, frame in enumerate(sampled_frames): + f.write(frame + '\n') + + +if __name__ == '__main__': + folder = '/home/workspace/data/dataset/test_ready' + + is_skirt = False + F = np.load("custom_utils/smpl_faces" + ("_skirt" if is_skirt == 1 else "") + ".npy") + + # generate_clusters(folder, 20) + sample_from_cluster('custom_data/test_ready_pose_cluster_20.csv', 10, '/home/workspace/data/dataset/test_ready/frames_pose_cluster_20_sample_10.txt') + + + # samples = df.groupby('label', group_keys=False).apply(lambda x: x.sample()) + + # sampled_frames = np.asarray(samples['frame'].array) + # sampled_labels = np.asarray(samples['label'].array) + + # for i in range(sampled_frames.shape[0]): + # body_no_orient = np.load(os.path.join(folder, 'mesh_posed_body_no_orient', sampled_frames[i] + '.npz')); body_no_orient = body_no_orient['mesh_posed_body_no_orient'] + + # x = body_no_orient + # fig = go.Figure(data=[ + # go.Mesh3d( + # # 8 vertices of a cube + # x=x[:,0], + # y=x[:,1], + # z=x[:,2], + # # i, j and k give the vertices of triangles + # i = F[:,0], + # j = F[:,1], + # k = F[:,2], + # text='cluster: ' + str(sampled_labels[i]) + # ), + # ]) + + # fig.update_layout(scene_aspectmode='manual', + # scene_aspectratio=dict(x=1, y=1, z=1)) + # fig.update_layout( + # scene = dict( + # xaxis = dict(nticks=4, range=[-1.5,1.5],), + # yaxis = dict(nticks=4, range=[-1.5,1.5],), + # zaxis = dict(nticks=4, range=[-1.5,1.5],),) + # ) + + # fig.show() + + # print() + + + print() \ No newline at end of file