import os import json import numpy as np from sklearn.cluster import KMeans from tqdm import tqdm json_path = "./datasets/data_json/beat2_s20_l128_speaker2.json" with open(json_path, 'r') as f: data = json.load(f) arr = [] for d in tqdm(data): m = np.load(d["motion_path"].replace("/content/beat_v2.0.0/", "./BEAT2/"))["poses"][d["start_idx"]:d["end_idx"]] arr.append(m) arr = np.array(arr).reshape(len(arr), 128, 55, 3)[:, :, :21] X_content = arr.reshape(len(arr), -1) content_km = KMeans(n_clusters=10, random_state=0).fit(X_content) content_labels = content_km.labels_ for i, d in tqdm(enumerate(data)): d["content_label"] = int(content_labels[i]) unique_c, counts_c = np.unique(content_labels, return_counts=True) for uc, cc in zip(unique_c, counts_c): print(uc, cc, round(cc/len(content_labels), 2)) vel = np.diff(arr, axis=1) mag = np.linalg.norm(vel, axis=-1) beat = np.zeros_like(mag) w = 5 for i in tqdm(range(beat.shape[0])): for j in range(beat.shape[2]): for t in range(w, beat.shape[1]-w): if mag[i, t, j] == np.min(mag[i, t-w:t+w+1, j]): beat[i, t, j] = 1 X_rhythm = beat.reshape(len(beat), -1) rhythm_km = KMeans(n_clusters=10, random_state=0).fit(X_rhythm) rhythm_labels = rhythm_km.labels_ for i, d in enumerate(data): d["rhythm_label"] = int(rhythm_labels[i]) unique_r, counts_r = np.unique(rhythm_labels, return_counts=True) for ur, cr in zip(unique_r, counts_r): print(ur, cr, round(cr/len(rhythm_labels), 2)) with open("./datasets/data_json/beat2_s20_l128_speaker2_disco.json", 'w') as f: json.dump(data, f)