def evaluate(data_loader, model_pos, device): batch_time = AverageMeter() data_time = AverageMeter() epoch_loss_3d_pos = AverageMeter() epoch_loss_3d_pos_procrustes = AverageMeter() # Switch to evaluate mode torch.set_grad_enabled(False) model_pos.eval() end = time.time() bar = Bar('Eval ', max=len(data_loader)) for i, (targets_3d, inputs_2d, _) in enumerate(data_loader): # Measure data loading time data_time.update(time.time() - end) num_poses = targets_3d.size(0) inputs_2d = inputs_2d.to(device) outputs_3d = model_pos(inputs_2d.view(num_poses, -1)).view(num_poses, -1, 3).cpu() outputs_3d = torch.cat( [torch.zeros(num_poses, 1, outputs_3d.size(2)), outputs_3d], 1) # Pad hip joint (0,0,0) epoch_loss_3d_pos.update( mpjpe(outputs_3d, targets_3d).item() * 1000.0, num_poses) epoch_loss_3d_pos_procrustes.update( p_mpjpe(outputs_3d.numpy(), targets_3d.numpy()).item() * 1000.0, num_poses) # Measure elapsed time batch_time.update(time.time() - end) end = time.time() bar.suffix = '({batch}/{size}) Data: {data:.6f}s | Batch: {bt:.3f}s | Total: {ttl:} | ETA: {eta:} ' \ '| MPJPE: {e1: .4f} | P-MPJPE: {e2: .4f}' \ .format(batch=i + 1, size=len(data_loader), data=data_time.avg, bt=batch_time.avg, ttl=bar.elapsed_td, eta=bar.eta_td, e1=epoch_loss_3d_pos.avg, e2=epoch_loss_3d_pos_procrustes.avg) bar.next() bar.finish() return epoch_loss_3d_pos.avg, epoch_loss_3d_pos_procrustes.avg
def evaluate(data_loader, model_pos, device): batch_time = AverageMeter() data_time = AverageMeter() epoch_loss_3d_pos = AverageMeter() epoch_loss_3d_pos_procrustes = AverageMeter() # Switch to evaluate mode torch.set_grad_enabled(False) model_pos.eval() end = time.time() bar = Bar('Eval ', max=len(data_loader)) for i, (targets_3d, inputs_2d, feature_mutual) in enumerate(data_loader): # Measure data loading time data_time.update(time.time() - end) num_poses = targets_3d.size(1) inputs_2d, feature_mutual = inputs_2d.to(device), feature_mutual.to( device) outputs_3d = model_pos([inputs_2d, feature_mutual]).cpu() #outputs_3d[:, :, :] -= outputs_3d[:, :1, :] # Zero-centre the root (hip) epoch_loss_3d_pos.update( mpjpe(outputs_3d, targets_3d).item() * 1000.0, num_poses) epoch_loss_3d_pos_procrustes.update( p_mpjpe(outputs_3d.numpy(), targets_3d.numpy()).item() * 1000.0, num_poses) # Measure elapsed time batch_time.update(time.time() - end) end = time.time() bar.suffix = '({batch}/{size}) Data: {data:.6f}s | Batch: {bt:.3f}s | Total: {ttl:} | ETA: {eta:} ' \ '| MPJPE: {e1: .4f} | P-MPJPE: {e2: .4f}' \ .format(batch=i + 1, size=len(data_loader), data=data_time.val, bt=batch_time.avg, ttl=bar.elapsed_td, eta=bar.eta_td, e1=epoch_loss_3d_pos.avg, e2=epoch_loss_3d_pos_procrustes.avg) bar.next() bar.finish() return epoch_loss_3d_pos.avg, epoch_loss_3d_pos_procrustes.avg
def evaluate(test_generator, action=None, return_predictions=False): epoch_loss_3d_pos = 0 epoch_loss_3d_pos_procrustes = 0 epoch_loss_3d_pos_scale = 0 epoch_loss_3d_vel = 0 with torch.no_grad(): model_pos.eval() N = 0 for _, batch, batch_2d in test_generator.next_epoch(): inputs_2d = torch.from_numpy(batch_2d.astype('float32')) if torch.cuda.is_available(): inputs_2d = inputs_2d.cuda() # Positional model predicted_3d_pos = model_pos(inputs_2d) # Test-time augmentation (if enabled) if test_generator.augment_enabled(): # Undo flipping and take average with non-flipped version predicted_3d_pos[1, :, :, 0] *= -1 predicted_3d_pos[1, :, joints_left + joints_right] = predicted_3d_pos[ 1, :, joints_right + joints_left] predicted_3d_pos = torch.mean(predicted_3d_pos, dim=0, keepdim=True) if return_predictions: return predicted_3d_pos.squeeze(0).cpu().numpy() inputs_3d = torch.from_numpy(batch.astype('float32')) if torch.cuda.is_available(): inputs_3d = inputs_3d.cuda() inputs_3d[:, :, 0] = 0 if test_generator.augment_enabled(): inputs_3d = inputs_3d[:1] error = mpjpe(predicted_3d_pos, inputs_3d) epoch_loss_3d_pos_scale += inputs_3d.shape[0] * inputs_3d.shape[ 1] * n_mpjpe(predicted_3d_pos, inputs_3d).item() epoch_loss_3d_pos += inputs_3d.shape[0] * inputs_3d.shape[ 1] * error.item() N += inputs_3d.shape[0] * inputs_3d.shape[1] inputs = inputs_3d.cpu().numpy().reshape(-1, inputs_3d.shape[-2], inputs_3d.shape[-1]) predicted_3d_pos = predicted_3d_pos.cpu().numpy().reshape( -1, inputs_3d.shape[-2], inputs_3d.shape[-1]) epoch_loss_3d_pos_procrustes += inputs_3d.shape[ 0] * inputs_3d.shape[1] * p_mpjpe(predicted_3d_pos, inputs) # Compute velocity error epoch_loss_3d_vel += inputs_3d.shape[0] * inputs_3d.shape[ 1] * mean_velocity_error(predicted_3d_pos, inputs) if action is None: print('----------') else: print('----' + action + '----') e1 = (epoch_loss_3d_pos / N) * 1000 e2 = (epoch_loss_3d_pos_procrustes / N) * 1000 e3 = (epoch_loss_3d_pos_scale / N) * 1000 ev = (epoch_loss_3d_vel / N) * 1000 print('Test time augmentation:', test_generator.augment_enabled()) print('Protocol #1 Error (MPJPE):', e1, 'mm') print('Protocol #2 Error (P-MPJPE):', e2, 'mm') print('Protocol #3 Error (N-MPJPE):', e3, 'mm') print('Velocity Error (MPJVE):', ev, 'mm') print('----------') return e1, e2, e3, ev