|
|
import models |
|
|
import time |
|
|
import torch |
|
|
import math |
|
|
from tqdm import tqdm |
|
|
import numpy as np |
|
|
import pandas as pd |
|
|
from sklearn.metrics import f1_score, accuracy_score, recall_score, precision_score, average_precision_score, roc_auc_score |
|
|
|
|
|
def eval_model(cfg, model, val_loader, loss_ce, val_batch_size): |
|
|
model.eval() |
|
|
outpred_list = [] |
|
|
gt_label_list = [] |
|
|
video_list = [] |
|
|
valLoss = 0 |
|
|
lossTrainNorm = 0 |
|
|
print("******** Start Testing. ********") |
|
|
|
|
|
with torch.no_grad(): |
|
|
for i, (_, input, target, binary_label, video_id) in enumerate(tqdm(val_loader, desc="Validation", total=len(val_loader))): |
|
|
if i == 0: |
|
|
ss_time = time.time() |
|
|
|
|
|
input = input[:,0] |
|
|
varInput = torch.autograd.Variable(input.float().cuda()) |
|
|
varTarget = torch.autograd.Variable(target.contiguous().cuda()) |
|
|
var_Binary_Target = torch.autograd.Variable(binary_label.contiguous().cuda()) |
|
|
|
|
|
logit = model(varInput) |
|
|
lossvalue = loss_ce(logit, var_Binary_Target) |
|
|
|
|
|
valLoss += lossvalue.item() |
|
|
lossTrainNorm += 1 |
|
|
outpred_list.append(logit[:,0].sigmoid().cpu().detach().numpy()) |
|
|
gt_label_list.append(varTarget.cpu().detach().numpy()) |
|
|
video_list.append(video_id) |
|
|
|
|
|
valLoss = valLoss / lossTrainNorm |
|
|
|
|
|
outpred = np.concatenate(outpred_list, 0) |
|
|
gt_label = np.concatenate(gt_label_list, 0) |
|
|
video_list = np.concatenate(video_list, 0) |
|
|
pred_labels = [1 if item > 0.5 else 0 for item in outpred] |
|
|
true_labels = np.argmax(gt_label, axis=1) |
|
|
|
|
|
pred_accuracy = accuracy_score(true_labels, pred_labels) |
|
|
|
|
|
return pred_accuracy, video_list, pred_labels, true_labels, outpred |