|
|
|
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 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): |
|
|
|
|
|
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)) |
|
|
|
return {'Acc@1': acc1, 'Acc@5': acc5} |