示例#1
0
 def evaluate(self, conf, carray, issame, nrof_folds = 5, tta = False):
     self.model.eval()
     idx = 0
     embeddings = np.zeros([len(carray), conf.embedding_size])
     with torch.no_grad():
         while idx + conf.batch_size <= len(carray):
             batch = torch.tensor(carray[idx:idx + conf.batch_size])
             if tta:
                 fliped = hflip_batch(batch)
                 emb_batch = self.model(batch.to(conf.device)) + self.model(fliped.to(conf.device))
                 embeddings[idx:idx + conf.batch_size] = l2_norm(emb_batch)
             else:
                 embeddings[idx:idx + conf.batch_size] = self.model(batch.to(conf.device)).cpu()
             idx += conf.batch_size
         if idx < len(carray):
             batch = torch.tensor(carray[idx:])            
             if tta:
                 fliped = hflip_batch(batch)
                 emb_batch = self.model(batch.to(conf.device)) + self.model(fliped.to(conf.device))
                 embeddings[idx:] = l2_norm(emb_batch)
             else:
                 embeddings[idx:] = self.model(batch.to(conf.device)).cpu()
     tpr, fpr, accuracy, best_thresholds = evaluate(embeddings, issame, nrof_folds)
     buf = gen_plot(fpr, tpr)
     roc_curve = Image.open(buf)
     roc_curve_tensor = trans.ToTensor()(roc_curve)
     return accuracy.mean(), best_thresholds.mean(), roc_curve_tensor
示例#2
0
    def infer(self, conf, faces, target_embs, tta=False):
        '''
        faces : list of PIL Image
        target_embs : [n, 512] computed embeddings of faces in facebank
        names : recorded names of faces in facebank
        tta : test time augmentation (hfilp, that's all)
        '''
        embs = []
        for img in faces:
            if tta:
                mirror = trans.functional.hflip(img)
                emb = self.model(
                    conf.test_transform(img).to(conf.device).unsqueeze(0))
                emb_mirror = self.model(
                    conf.test_transform(mirror).to(conf.device).unsqueeze(0))
                embs.append(l2_norm(emb + emb_mirror))
            else:
                embs.append(
                    self.model(
                        conf.test_transform(img).to(conf.device).unsqueeze(0)))
        source_embs = torch.cat(embs)

        diff = source_embs.unsqueeze(-1) - target_embs.transpose(
            1, 0).unsqueeze(0)
        dist = torch.sum(torch.pow(diff, 2), dim=1)
        minimum, min_idx = torch.min(dist, dim=1)
        min_idx[minimum > self.threshold] = -1  # if no match, set idx to -1
        return min_idx, minimum