Polos-Demo / validate /compute_pascal50s.py
yuwd's picture
init
03f6091
from polos.metrics.regression_metrics import RegressionReport
from polos.models import load_checkpoint
from tqdm import tqdm
from polos.models import download_model, load_checkpoint, model2download, str2model
from polos.trainer import TrainerConfig, build_trainer
import yaml
from utils import *
from dataset import *
from pascal50s import Pascal50sDataset
from PIL import Image
def collect_acc(memory, dataset_name, method, acc):
memory.setdefault(dataset_name, {})
memory[dataset_name].update({method : acc})
gprint(f"[{dataset_name}]",method,acc)
def polos(dataset,args):
yprint("Compute Polos ...")
rep = RegressionReport()
if args.model:
model = load_checkpoint(args.model)
elif args.hparams:
yaml_file = yaml.load(open(args.hparams).read(), Loader=yaml.FullLoader)
train_configs = TrainerConfig(yaml_file)
model_config = str2model[train_configs.model].ModelConfig(yaml_file)
print(str2model[train_configs.model].ModelConfig)
print(model_config.namespace())
model = str2model[train_configs.model](model_config.namespace())
model.eval()
model.freeze()
data = []
gt_scores = []
for data_ in (pbar := tqdm(dataset)):
pbar.set_description("Prepare dataset ...")
data.append(data_)
_, sys_score = model.predict(data,cuda=True,batch_size=32)
return sys_score
def compute_acc(model_fn,dataset,**kwargs):
data = {}
gt = {}
for (img_path, a, b, references, category_str, label) in (pbar := tqdm(dataset)):
pbar.set_description("Prepare dataset ...")
data.setdefault(category_str, {"A" : [], "B" : [], "gt": []})
data[category_str]["A"].append({
"img" : Image.open(img_path).convert("RGB"),
"imgid" : img_path,
"refs": references,
"mt": a,
})
data[category_str]["B"].append({
"img" : Image.open(img_path).convert("RGB"),
"imgid" : img_path,
"refs": references,
"mt": b,
})
data[category_str]["gt"].append(label) # 0 if A > B else 1
accs = {}
for category_str, data_ in (pbar := tqdm(data.items())):
pbar.set_description(f"Compute {category_str}")
print("Compute type A ...")
sys_scoreA = model_fn(data_["A"],**kwargs)
print("Compute type B ...")
sys_scoreB = model_fn(data_["B"],**kwargs)
print("Compute accuracy ...")
assert len(sys_scoreA) == len(sys_scoreB) == len(data_["gt"])
acc, N = 0, len(sys_scoreA)
for a, b, gt in zip(sys_scoreA,sys_scoreB,data_["gt"]):
score = 0 if a > b else 1
acc += 1 if score == gt else 0
acc /= N
accs[category_str] = acc
rprint(f"acc({category_str}) : {acc}")
return accs
def compute_pascal50S(args, memory, tops):
dataset = Pascal50sDataset(root="data_en/pascal/", voc_path="data_en/pascal/VOCdevkit/VOC2010")
dataset_name = "pascal50s"
if args.polos:
polos_acc = compute_acc(polos, dataset, args=args)
collect_acc(memory, dataset_name, "Polos", polos_acc)
# aggregate
max_acc = {}
for method, accs in memory[dataset_name].items():
for category, acc in accs.items():
max_acc.setdefault(category, ("",0))
if max_acc[category][1] < acc:
max_acc[category] = (method, acc)
rprint("[TOP]")
rprint(max_acc)
tops[dataset_name] = max_acc
return memory, tops