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