|
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) |
|
|