Video2MC / common /inference_3d.py
Sapphire-356's picture
add: progress bar
2ee3801
# Copyright (c) 2018-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
#
import hashlib
import os
import pathlib
import shutil
import sys
import time
import cv2
import numpy as np
import torch
from torch.autograd import Variable
def get_varialbe(target):
num = len(target)
var = []
for i in range(num):
temp = Variable(target[i]).contiguous().type(torch.cuda.FloatTensor)
var.append(temp)
return var
def input_augmentation(input_2D, input_2D_flip, model_trans, joints_left, joints_right):
B, T, J, C = input_2D.shape
input_2D_flip = input_2D_flip.view(B, T, J, C, 1).permute(0, 3, 1, 2, 4)
input_2D_non_flip = input_2D.view(B, T, J, C, 1).permute(0, 3, 1, 2, 4)
output_3D_flip, output_3D_flip_VTE = model_trans(input_2D_flip)
output_3D_flip_VTE[:, 0] *= -1
output_3D_flip[:, 0] *= -1
output_3D_flip_VTE[:, :, :, joints_left + joints_right] = output_3D_flip_VTE[:, :, :, joints_right + joints_left]
output_3D_flip[:, :, :, joints_left + joints_right] = output_3D_flip[:, :, :, joints_right + joints_left]
output_3D_non_flip, output_3D_non_flip_VTE = model_trans(input_2D_non_flip)
output_3D_VTE = (output_3D_non_flip_VTE + output_3D_flip_VTE) / 2
output_3D = (output_3D_non_flip + output_3D_flip) / 2
input_2D = input_2D_non_flip
return input_2D, output_3D, output_3D_VTE
def step(opt, dataLoader, model, progress, optimizer=None, epoch=None):
model_trans = model['trans']
model_trans.eval()
joints_left = [4, 5, 6, 11, 12, 13]
joints_right = [1, 2, 3, 14, 15, 16]
epoch_cnt=0
out = []
# probar = progress.tqdm(total=1, desc="Step 2: Prediction (Please wait)")
for _, batch, batch_2d, batch_2d_flip in dataLoader.next_epoch():
#[gt_3D, input_2D] = get_varialbe([batch, batch_2d])
#input_2D = Variable(batch_2d).contiguous().type(torch.cuda.FloatTensor)
input_2D = torch.from_numpy(batch_2d.astype('float32'))
input_2D_flip = torch.from_numpy(batch_2d_flip.astype('float32'))
if torch.cuda.is_available():
input_2D = input_2D
input_2D_flip = input_2D_flip
N = input_2D.size(0)
# out_target = gt_3D.clone().view(N, -1, opt.out_joints, opt.out_channels)
# out_target[:, :, 0] = 0
# gt_3D = gt_3D.view(N, -1, opt.out_joints, opt.out_channels).type(torch.cuda.FloatTensor)
#
# if out_target.size(1) > 1:
# out_target_single = out_target[:, opt.pad].unsqueeze(1)
# gt_3D_single = gt_3D[:, opt.pad].unsqueeze(1)
# else:
# out_target_single = out_target
# gt_3D_single = gt_3D
input_2D, output_3D, output_3D_VTE = input_augmentation(input_2D, input_2D_flip, model_trans, joints_left, joints_right)
output_3D_VTE = output_3D_VTE.permute(0, 2, 3, 4, 1).contiguous().view(N, -1, opt.out_joints, opt.out_channels)
output_3D = output_3D.permute(0, 2, 3, 4, 1).contiguous().view(N, -1, opt.out_joints, opt.out_channels)
output_3D_single = output_3D
pred_out = output_3D_single
input_2D = input_2D.permute(0, 2, 3, 1, 4).view(N, -1, opt.n_joints, 2)
pred_out[:, :, 0, :] = 0
if epoch_cnt == 0:
out = pred_out.squeeze(1).cpu()
else:
out = torch.cat((out, pred_out.squeeze(1).cpu()), dim=0)
epoch_cnt +=1
return out.numpy()
def val(opt, val_loader, model, progress):
with torch.no_grad():
return step(opt, val_loader, model, progress)