unit_test / uniperceiver /evaluation /imagenet_evaler.py
herrius's picture
Upload 259 files
32b542e
raw
history blame
1.6 kB
import os
import sys
import tempfile
import json
from json import encoder
import torch
from uniperceiver.config import configurable
from .build import EVALUATION_REGISTRY
# from timm.utils import accuracy
from uniperceiver.utils import comm
def accuracy(output, target, topk=(1,)):
"""Computes the accuracy over the k top predictions for the specified values of k"""
maxk = max(topk)
batch_size = target.size(0)
_, pred = output.topk(maxk, 1, True, True)
pred = pred.t()
correct = pred.eq(target.reshape(1, -1).expand_as(pred))
return [correct[:k].reshape(-1).float().sum(0) * 100. / batch_size for k in topk]
@EVALUATION_REGISTRY.register()
class ImageNetEvaler(object):
def __init__(self, cfg, annfile, output_dir):
super(ImageNetEvaler, self).__init__()
self.ann_file = annfile
with open(self.ann_file, 'r') as f:
img_infos = f.readlines()
target = [int(info.replace('\n', '').split(' ')[1]) for info in img_infos]
self.target = torch.tensor(target)
def eval(self, results, epoch):
# sort the result for multi-gpu evaluation
results = {res['image_id']: res['cls_logits'] for res in results}
results = [results[i] for i in sorted(results.keys())]
results = torch.stack(results)
acc1, acc5 = accuracy(results, self.target.to(device=results.device), topk=(1, 5))
# acc1, acc5 = accuracy(results, self.target[:results.size(0)].to(device=results.device), topk=(1, 5))
return {'Acc@1': acc1, 'Acc@5': acc5}