pytorch图像检索评价指标MAP

map是图像检索模型的一个评价指标
pytorch图像检索评价指标MAP_第1张图片
以图片中第一个计算AP值为例

P的分别是[1, 2/3, 3/6, 4/9, 5/10]
R值分别是[1/5, 2/5, 3/5/, 4/5, 1]

AP计算结果

1+2/3+3/6+4/9+5/10/ 5

pytorch图像检索评价指标MAP_第2张图片

https://blog.csdn.net/weixin_40100431/article/details/88768479

假设输入一张图片,数据库中有3个图像与之匹配,按照相似度高低进行排序,得到的位置是第1位,第3位,第6位是这三幅图像,匹配正确。

在这里插入代码片

但是在这个程序设计中,待检索图像在当前数据库中,那么本身的相似度肯定是最高的,排在第0位,ranks=[0,1,3,6]
。nres=4。表示数据库中与待检索图像的属于同一类的个数。按照图像检索ap的计算 方式, 得到ap=(1+1+3/4+4/7)/4=0.830357143.但是这种计算方式ap值偏大,自己检索到自己不应该算到里面 ,于是正确的计算方式应该是ap=(1+2/3+3/6)/3=0.7222222。在测试的时候计算之后发现与代码中计算结果不一致。代码中的求取方式是[(1+1+3/4+4/7)/4+(1+2/3+3/6)/3]/2。不是求平均值。

import numpy as np

def compute_ap(ranks, nres):
    """
    Computes average precision for given ranked indexes.
    
    Arguments
    ---------
    ranks : zerro-based ranks of positive images
    nres  : number of positive images
    
    Returns
    -------
    ap    : average precision
    """

    # number of images ranked by the system
    nimgranks = len(ranks)

    # accumulate trapezoids in PR-plot
    ap = 0

    recall_step = 1. / nres

    for j in np.arange(nimgranks):
        rank = ranks[j]

        if rank == 0:
            precision_0 = 1.
        else:
            precision_0 = float(j) / rank
        precision_1 = float(j + 1) / (rank + 1)
        ap += (precision_0 + precision_1) * recall_step / 2.
    return ap

ranks=np.array([0,1,3,6])
ners=4
result=compute_ap(ranks,ners)
print(result)
0.8110119047619047
import numpy as np

ranks = np.array([1,3,6])

def compute_ap(ranks):
    ap = 0
    for i,j in enumerate(ranks):
        print(i,j)
        print((i + 1) / j)
        ap += (i + 1) / j
    return ap / len(ranks)
ap = compute_ap(ranks)
print("AP:",ap)
0 1
1.0
1 3
0.6666666666666666
2 6
0.5
AP: 0.7222222222222222

你可能感兴趣的:(pytorch学习)