def score_jnd_dataset(data_loader, func): ''' Function computes JND score using distance function 'func' in dataset 'data_loader' INPUTS data_loader - CustomDatasetDataLoader object - contains a JNDDataset inside func - callable distance function - calling d=func(in0,in1) should take 2 pytorch tensors with shape Nx3xXxY, and return numpy array of length N OUTPUTS [0] - JND score in [0,1], mAP score (area under precision-recall curve) [1] - dictionary with following elements ds - N array containing distances between two patches shown to human evaluator sames - N array containing fraction of people who thought the two patches were identical CONSTS N - number of test triplets in data_loader ''' ds = [] gts = [] # bar = pb.ProgressBar(max_value=data_loader.load_data().__len__()) for (i, data) in enumerate(data_loader.load_data()): ds += func(data['p0'], data['p1']).tolist() gts += data['same'].cpu().numpy().flatten().tolist() # bar.update(i) sames = np.array(gts) ds = np.array(ds) sorted_inds = np.argsort(ds) ds_sorted = ds[sorted_inds] sames_sorted = sames[sorted_inds] TPs = np.cumsum(sames_sorted) FPs = np.cumsum(1 - sames_sorted) FNs = np.sum(sames_sorted) - TPs precs = TPs / (TPs + FPs) recs = TPs / (TPs + FNs) score = util.voc_ap(recs, precs) return (score, dict(ds=ds, sames=sames))
def score_jnd_dataset(data_loader,func): ''' Function computes JND score using distance function 'func' in dataset 'data_loader' INPUTS data_loader - CustomDatasetDataLoader object - contains a JNDDataset inside func - callable distance function - calling d=func(in0,in1) should take 2 pytorch tensors with shape Nx3xXxY, and return numpy array of length N OUTPUTS [0] - JND score in [0,1], mAP score (area under precision-recall curve) [1] - dictionary with following elements ds - N array containing distances between two patches shown to human evaluator sames - N array containing fraction of people who thought the two patches were identical CONSTS N - number of test triplets in data_loader ''' ds = [] gts = [] # bar = pb.ProgressBar(max_value=data_loader.load_data().__len__()) for (i,data) in enumerate(data_loader.load_data()): ds+=func(data['p0'],data['p1']).tolist() gts+=data['same'].cpu().numpy().flatten().tolist() # bar.update(i) sames = np.array(gts) ds = np.array(ds) sorted_inds = np.argsort(ds) ds_sorted = ds[sorted_inds] sames_sorted = sames[sorted_inds] TPs = np.cumsum(sames_sorted) FPs = np.cumsum(1-sames_sorted) FNs = np.sum(sames_sorted)-TPs precs = TPs/(TPs+FPs) recs = TPs/(TPs+FNs) score = util.voc_ap(recs,precs) return(score, dict(ds=ds,sames=sames))