unit_test / uniperceiver /evaluation /imagenet_evaler.py
herrius's picture
Upload 259 files
32b542e
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}