图像检索评价指标: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)
上一篇 2022年6月23日 下午10:16
下一篇 2022年6月23日 下午10:16


相关推荐

  • 向量积求三角形面积

    向量积求三角形面积向量积可以求三角形面积 进而求多边形面积 向量 AB x1 y1 向量 AC x2 y2 area 0 5 x1y2 x2y1 例题 HDU2036

    2026年3月17日
    2
  • Android——Handler详解

    Android——Handler详解1 简介 Handler 是一套 Android 消息传递机制可以说只要有异步线程与主线程通信的地方就一定会有 Handler 在多线程的应用场景中 将工作线程中需更新 UI 的操作信息传递到 UI 主线程 从而实现工作线程对 UI 的更新处理 最终实现异步消息的处理使用 Handler 消息传递机制主要是为了多个线程并发更新 UI 的同时 保证线程安全 2 相关概念解释 Handler Message MessageQueue LooperAndroi 消息机制 以 Handler 的 sendMes

    2026年3月16日
    2
  • pycharm画图并显示

    pycharm画图并显示在 pycharm 中利用 pylot 画图可是一直不显示 code 如下 frommatplotl np linspace 1 10 20 print x1 y1 x1 x1 2fig plt figure axes fig add axes 0 1 0 1 0 9 0 9 axes plot

    2026年3月27日
    2
  • 【JavaEE进阶系列 | 从小白到工程师】Calendar类的常用方法使用与创建对象

    【JavaEE进阶系列 | 从小白到工程师】Calendar类的常用方法使用与创建对象java util Calendar 是日历类 Date 类中很多方法都过时了 而 Calendar 类的功能比 Date 强大很多 所以 Java 官方推荐使用 Calendar 来替换 Date 的使用 java util Calendar 是日历类 Date 类中很多方法都过时了 而 Calendar 类的功能比 Date 强大很多 所以 Java 官方推荐使用 Calendar 来替换 Date 的使用 java util Calendar 是日历类

    2026年3月16日
    2
  • 字节面试:如何用Redis实现一个分布式锁?

    字节面试:如何用Redis实现一个分布式锁?我当场手写了一个 面试官说我大学没白读

    2026年3月16日
    3
  • 微信小程序反编译及源码抓取(2021最新)

    微信小程序反编译及源码抓取(2021最新)网易 Mumu 模拟器安装下载地址 http mumu 163 com 360 下载完安装包后直接安装 打开模拟器安装微信 RE 文件管理器设置 Root 权限打开 RE 文件管理器 提示请求超级用户访问权限 选择允许到此准备工作完成 打开微信 然后打开小程序 获取小程序编译包先打开微信 搜索微博小程序打开 打开 RE 文件管理 按照 data data com tencent mm MicroMsg 80b34bca4945

    2026年3月16日
    1

发表回复

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

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