Untitled

 avatar
unknown
plain_text
a year ago
1.7 kB
7
Indexable
def evaluate_model(image_features, model_features):
    # Compute metrics
    mAP = compute_map(image_features, model_features)

    # Initialize counters and metrics
    classwise_model_count = {}
    for _, model_class in model_features:
        classwise_model_count[model_class] = classwise_model_count.get(model_class, 0) + 1

    ft, st, mrr, dcg_scores = 0, 0, 0, []
    for (image_feature, image_class) in image_features:
        distances = []
        for (model_feature, model_class) in model_features:
            distance = 1 - torch.cosine_similarity(image_feature, model_feature).item()
            distances.append((distance, model_class))

        distances.sort(key=lambda x: x[0])

        ft += sum(1 for _, model_class in distances[:classwise_model_count[image_class]] if model_class == image_class) / classwise_model_count[image_class]
        st += sum(1 for _, model_class in distances[:2 * classwise_model_count[image_class]] if model_class == image_class) / classwise_model_count[image_class]

        for rank, (_, model_class) in enumerate(distances, 1):
            if model_class == image_class:
                mrr += 1 / rank
                break

        rel_scores = [1 if model_class == image_class else 0 for _, model_class in distances]
        dcg_scores.append(dcg_at_k(rel_scores, len(rel_scores)))

    avg_ft = ft / len(image_features)
    avg_st = st / len(image_features)
    avg_mrr = mrr / len(image_features)
    avg_dcg = np.mean(dcg_scores)

    return {
        "mAP": mAP,
        "First Tier": avg_ft,
        "Second Tier": avg_st,
        "MRR": avg_mrr,
        "DCG": avg_dcg
    }
Editor is loading...
Leave a Comment