import os import numpy as np import cv2 as cv from tqdm import tqdm class ImageNet: def __init__(self, root, size=224): self.root = root self.size = size self.top1_acc = -1 self.top5_acc = -1 self.root_val = os.path.join(self.root, "ILSVRC", "Data", "CLS-LOC", "val") self.val_label_file = os.path.join(self.root, "caffe_ilsvrc12", "val.txt") self.val_label = self.load_label(self.val_label_file) @property def name(self): return self.__class__.__name__ def load_label(self, label_file): label = list() with open(label_file, "r") as f: for line in f: line = line.strip() key, value = line.split() key = os.path.join(self.root_val, key) value = int(value) label.append([key, value]) return label def eval(self, model): top_1_hits = 0 top_5_hits = 0 pbar = tqdm(self.val_label) pbar.set_description("Evaluating {} with {} val set".format(model.name, self.name)) for fn, label in pbar: img = cv.imread(fn) img = cv.cvtColor(img, cv.COLOR_BGR2RGB) img = cv.resize(img, dsize=(256, 256)) img = img[16:240, 16:240, :] pred = model.infer(img) if label == pred[0][0]: top_1_hits += 1 if label in pred[0]: top_5_hits += 1 self.top1_acc = top_1_hits/(len(self.val_label) * 1.0) self.top5_acc = top_5_hits/(len(self.val_label) * 1.0) def get_result(self): return self.top1_acc, self.top5_acc def print_result(self): print("Top-1 Accuracy: {:.2f}%; Top-5 Accuracy: {:.2f}%".format(self.top1_acc*100, self.top5_acc*100))