图像检索评价指标:PR曲线的计算与绘制

图像检索评价指标:PR曲线的计算与绘制#@filename:test2.py#@brief:如何绘制PR曲线#@author:liupc#@date:2021/8/2importnumpyasnpfromtqdmimporttqdmimportmatplotlib.pyplotasplt#计算汉明距离。有几位不同,距离就为几。defCalcHammingDist(B1,B2):q=B2.shape[1]distH=.

大家好,又见面了,我是你们的朋友全栈君。

# @file name  : test2.py
# @brief      : 如何绘制PR曲线
# @author     : liupc
# @date       : 2021/8/2

import numpy as np
from tqdm import tqdm
import matplotlib.pyplot as plt


#计算汉明距离。有几位不同,距离就为几。
def CalcHammingDist(B1, B2):
    q = B2.shape[1]
    distH = 0.5 * (q - np.dot(B1, B2.transpose()))
    return distH


draw_range = [1,2,3,4,5,6,7]

def pr_curve(rF, qF, rL, qL, draw_range=draw_range):
    #rf:galleryBinary
    #qF: queryBinary
    #rL: galleryLabel。7行3列。
    #qL: queryLabel。3行3列。

    n_query = qF.shape[0]   #多少个查询,3
    Gnd = (np.dot(qL, rL.transpose()) > 0).astype(np.float32)
    '''
    print(Gnd)  #是一个3行7列的数组。第一行代表gallery的7个元素是否与query[0]同类;第二行代表gallery的7个元素是否与query[1]同类。。。
    [[0. 1. 1. 0. 0. 0. 1.]    #gallery[0]与query[0]不同类;gallery[1]与query[0]同类;gallery[2]与query[0]同类;gallery[3]与query[0]不同类。。。
     [1. 1. 1. 0. 1. 0. 1.]
     [0. 0. 1. 1. 0. 1. 0.]]
    '''

    Rank = np.argsort(CalcHammingDist(qF, rF))                #是一个3行7列的数组。
    '''
    print(Rank)             #是一个3行7列的数组。
    [[3 0 2 5 1 4 6]        #gallery的七个元组中,与query[0]最近的元素是gallery[3],其次是gallery[0],再次是gallery[2]。。。
     [6 1 4 0 2 5 3]
     [0 4 2 5 6 1 3]]
    '''

    P, R = [], []

    for k in tqdm(draw_range):   #比如k=5
        p = np.zeros(n_query)    #[0, 0, 0]  分别是query[0]的acc&k, query[1]的acc&k, query[2]的acc&k
        r = np.zeros(n_query)    #[0, 0, 0]  分别是query[0]的recall&k, query[1]的recall&k, query[2]的recall&k
        for it in range(n_query): #比如it=0
            gnd = Gnd[it]          #[0. 1. 1. 0. 0. 0. 1.]
            gnd_all = np.sum(gnd)  #3,为了求召回率
            if gnd_all == 0:       #如果没有对的,那准确率和召回率肯定都是0,不用继续求了
                continue
            asc_id = Rank[it][:k]  #[3 0 2 5 1]
            gnd = gnd[asc_id]      #[0 0 1 0 1]
            gnd_r = np.sum(gnd)    #前k个结果中对了2个。
            p[it] = gnd_r / k      #准确率:2/5
            r[it] = gnd_r / gnd_all #召回率:2/3
        P.append(np.mean(p))
        R.append(np.mean(r))

    #绘制PR曲线
    plt.plot(R, P, linestyle="-", marker='D', label="DSH")
    plt.grid(True)
    plt.xlim(0, 1)
    plt.ylim(0, 1)
    plt.xlabel('recall')
    plt.ylabel('precision')
    plt.legend()  # 加图例

    plt.show()

    return P, R



if __name__=='__main__':
    queryBinary = np.array([[1,-1,1,1],[-1,1,-1,-1],[1,-1,-1,-1]])

    galleryBinary = np.array([[ 1,-1,-1,-1],
                              [-1, 1, 1,-1],
                              [ 1, 1, 1,-1],
                              [-1,-1, 1, 1],
                              [ 1, 1,-1,-1],
                              [ 1, 1, 1,-1],
                              [-1, 1,-1,-1]])

    queryLabel = np.array([[1,0,0],
                           [1,1,0],
                           [0,0,1]], dtype=np.int64)

    galleryLabel = np.array([[0,1,0],
                             [1,1,0],
                             [1,0,1],
                             [0,0,1],
                             [0,1,0],
                             [0,0,1],
                             [1,1,0]], dtype=np.int64)

    P, R = pr_curve(galleryBinary, queryBinary, galleryLabel, queryLabel)
    print(f'Precision Recall Curve data:\n"DSH":[{P},{R}],')


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149718.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 免费mysql数据库空间_mysql数据库空间满了

    免费mysql数据库空间_mysql数据库空间满了申请地址:https://db4free.net/signup.php在这里注册完并且邮箱认证后即可使用。

    2022年4月19日
    64
  • SPI协议详解(图文并茂+超详细)

    SPI协议详解(图文并茂+超详细)先说串口因为之前写过一篇UART,通用串行异步通讯协议,UART的相关资料因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。如果要解决这个问题,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步;双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示;如果您注意到

    2022年6月18日
    87
  • matlab中的imwrite_medfilt2函数

    matlab中的imwrite_medfilt2函数1.imwrite函数imwrite函数的作用是将图像写入图形文件。2.语法imwrite(A,filename)imwrite(A,map,filename)imwrite(___,fmt)imwrite(___,Name,Value)(1)imwrite(A,filename)将图像数据A写入filename指定的文件,并从扩展名推断出文件格式。imwrite在当前文件夹中创建新文件。输出图像的位深度取决于A的数据类型和文件格式。对于大多数格式来说: 如果……

    2022年10月4日
    5
  • ASP.NET ViewState详解[通俗易懂]

    ASP.NET ViewState详解[通俗易懂]作者:InfinitiesLoop概述ViewState是一个被误解很深的动物了。我希望通过此文章来澄清人们对ViewState的一些错误认识。为了达到这个目的,我决定从头到尾详细的描述一下整个ViewState的工作机制,其中我会同时用一些例子说明我文章中的观点,结论。比如我会用静态控件(declaredcontrols)和动态控件(dynamiccontrols)两个方面来说明同…

    2022年7月21日
    12
  • leetcode-54螺旋矩阵

    leetcode-54螺旋矩阵给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:m == matrix.lengthn == matrix[i].length1 <= m,

    2022年8月8日
    6
  • Eclipse快捷键_10个最高效的快捷键

    1. ctrl+shift+r:打开资源    这可能是所有快捷键组合中最省时间的了。这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xml。美中不足的是这组快捷键并非在所有视图下都能用。2. ctrl+o:快速outline    如果想要查看当前类的方法或某个特定方法,但又不想把代码拉上拉下,也不想使用查找功能的话

    2022年3月10日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号