import json import os import time import torch import torch.nn.functional as F from torch.autograd import Variable from utils import AverageMeter def calculate_video_results(output_buffer, video_id, test_results, class_names): video_outputs = torch.stack(output_buffer) average_scores = torch.mean(video_outputs, dim=0) sorted_scores, locs = torch.topk(average_scores, k=10) video_results = [] for i in range(sorted_scores.size(0)): video_results.append({ 'label': class_names[int(locs[i])], 'score': float(sorted_scores[i]) }) test_results['results'][video_id] = video_results def test(data_loader, model, opt, class_names): print('test') model.eval() batch_time = AverageMeter() data_time = AverageMeter() end_time = time.time() output_buffer = [] previous_video_id = '' test_results = {'results': {}} for i, (inputs, targets) in enumerate(data_loader): data_time.update(time.time() - end_time) with torch.no_grad(): inputs = Variable(inputs) outputs = model(inputs) if not opt.no_softmax_in_test: outputs = F.softmax(outputs, dim=1) for j in range(outputs.size(0)): if not (i == 0 and j == 0) and targets[j] != previous_video_id: calculate_video_results(output_buffer, previous_video_id, test_results, class_names) output_buffer = [] output_buffer.append(outputs[j].data.cpu()) previous_video_id = targets[j].item() if (i % 100) == 0: with open( os.path.join(opt.result_path, '{}.json'.format( opt.test_subset)), 'w') as f: json.dump(test_results, f) batch_time.update(time.time() - end_time) end_time = time.time() print('[{}/{}]\t' 'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t' 'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'.format( i + 1, len(data_loader), batch_time=batch_time, data_time=data_time)) with open( os.path.join(opt.result_path, '{}.json'.format(opt.test_subset)), 'w') as f: json.dump(test_results, f)