def eval_self_cider(dataset, preds_n, model_id, split):
    cache_path = os.path.join('eval_results/',
                              model_id + '_' + split + '_n.json')

    coco = getCOCO(dataset)
    valids = coco.getImgIds()

    # Get Cider_scorer
    Cider_scorer = Cider(df='corpus')

    tokenizer = PTBTokenizer()
    gts = {}
    for imgId in valids:
        gts[imgId] = coco.imgToAnns[imgId]
    gts = tokenizer.tokenize(gts)

    for imgId in valids:
        Cider_scorer.cider_scorer += (None, gts[imgId])
    Cider_scorer.cider_scorer.compute_doc_freq()
    Cider_scorer.cider_scorer.ref_len = np.log(
        float(len(Cider_scorer.cider_scorer.crefs)))

    # Prepare captions
    capsById = {}
    for d in preds_n:
        capsById[d['image_id']] = capsById.get(d['image_id'], []) + [d]

    capsById = tokenizer.tokenize(capsById)
    imgIds = list(capsById.keys())
    scores = Cider_scorer.my_self_cider([capsById[_] for _ in imgIds])

    def get_div(eigvals):
        eigvals = np.clip(eigvals, 0, None)
        return -np.log(np.sqrt(eigvals[-1]) /
                       (np.sqrt(eigvals).sum())) / np.log(len(eigvals))

    sc_scores = [get_div(np.linalg.eigvalsh(_ / 10)) for _ in scores]
    score = np.mean(np.array(sc_scores))

    imgToEval = {}
    for i, image_id in enumerate(imgIds):
        imgToEval[image_id] = {
            'self_cider': sc_scores[i],
            'self_cider_mat': scores[i].tolist()
        }
    return {'overall': {'self_cider': score}, 'imgToEval': imgToEval}

    return score
示例#2
0
def init_scorer(cached_tokens):
    global CiderD_scorer
    CiderD_scorer = CiderD_scorer or CiderD(df=cached_tokens)
    global Cider_scorer
    Cider_scorer = Cider_scorer or Cider(df=cached_tokens)
    global Bleu_scorer
    Bleu_scorer = Bleu_scorer or Bleu(4)
示例#3
0
 def __init__(self, path_to_cached_tokens, metric_weights):
     self._scorer = dict(
             ciderD = CiderD(df=path_to_cached_tokens),
             cider = Cider(df=path_to_cached_tokens),
             bleu = BleuSilent(4))
     self.weights = metric_weights