AnyMo / tools /fid_calc.py
Xxx999's picture
-
8b3f571
Raw History Blame Contribute Delete
2.88 kB
import src
from mmengine.config import Config
from mmengine.registry import MODELS, DATASETS
import torch
from torch.utils.data import DataLoader
from tqdm import tqdm
from src.metrics.t2m_metric import calculate_frechet_distance, calculate_activation_statistics
from src.datasets.anymo_text_dataset import anymo_text_collate_fn
import numpy as np
cfg = Config.fromfile('configs/temos.py')
model = MODELS.build(cfg.model)
ckpt = torch.load('work_dirs/temos_50e/epoch_50.pth', weights_only=False, map_location='cpu')
model.load_state_dict(ckpt['state_dict'])
model.cuda().eval()
mean_path='data/mean_272.npy'
std_path='data/std_272.npy'
train_dataset = dict(
type='AnyMoTextDataset',
data_path_file=[
# 'data/data_paths/omnihumo_motion_caption_dynamic.txt',
# 'data/data_paths/omnihumo_motion_caption_static.txt'
# "data/data_paths/omnihumo_motion_caption_speak.txt",
"data/data_paths/omnihumo_motion_caption_dance.txt"
],
unit_length=4,
mean_path=mean_path,
std_path=std_path,
min_motion_length=60,
max_motion_length=300,
interval=1,
)
test_dataset = dict(
type='AnyMoTextDataset',
data_path_file='data/data_paths/dance_test.txt',
unit_length=4,
mean_path=mean_path,
std_path=std_path,
min_motion_length=60,
max_motion_length=300,
interval=1,
)
train_dataset = DATASETS.build(train_dataset)
test_dataset = DATASETS.build(test_dataset)
train_dataloader = DataLoader(train_dataset, batch_size=4, shuffle=False, num_workers=4, collate_fn=anymo_text_collate_fn)
test_dataloader = DataLoader(test_dataset, batch_size=4, shuffle=False, num_workers=4, collate_fn=anymo_text_collate_fn)
train_latents = []
for data in tqdm(train_dataloader):
motion = data['motion'].cuda()
m_len = data['motion_length'].cuda()
pad_m = torch.zeros((motion.shape[0], 300 - m_len.max(), 272)).to(motion)
motion = torch.cat([motion, pad_m], dim=1)
with torch.no_grad():
latents = model.motionencoder(motion.cuda(), m_len.cuda()).loc
train_latents.append(latents.cpu().numpy())
test_latents = []
for data in tqdm(test_dataloader):
motion = data['motion'].cuda()
m_len = data['motion_length'].cuda()
pad_m = torch.zeros((motion.shape[0], 300 - m_len.max(), 272)).to(motion)
motion = torch.cat([motion, pad_m], dim=1)
with torch.no_grad():
latents = model.motionencoder(motion.cuda(), m_len.cuda()).loc
test_latents.append(latents.cpu().numpy())
train_embd = np.concatenate(train_latents, axis=0)
test_embd = np.concatenate(test_latents, axis=0)
all_embd = np.concatenate([train_embd, test_embd], axis=0)
np.save('all_gt_dance_embd.npy', all_embd)
gt_mu, gt_cov = calculate_activation_statistics(train_embd)
mu, cov = calculate_activation_statistics(test_embd)
fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov)
print(fid)