图像检索评价指标: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}],')


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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vmware15激活码-激活码分享

    (vmware15激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • 服务器内网怎么更新微软补丁,架WSUS服务器 内网自动打补丁「建议收藏」

    三、客户端配置  运行“Gpedit.msc”打开组策略编辑器。在组策略编辑器中,依次单击“计算机配置→管理模板→Windows组件→WindowsUpdate”。在右侧双击“配置自动更新”,将自动更新策略设置为“启用”,并设置为“自动下载并计划安装”(图4)。图4双击“指定IntranetMicrosoft更新服务位置”,选择“已启用”项,在“为检测更新设置Intranet夹新服务”下方输入…

  • docker中启动mysql_win10启动项命令

    docker中启动mysql_win10启动项命令前提:已经装好了mysql镜像官方推荐必须使用密码故命令为:dockerrun–namemysql01-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.5但是没有做端口开放,外界访问不到!故先停止这个容器:在启动加了端口映射的mysqldockerrun-p3306:3306–namemysql02-eMYSQL_R…

  • 【OpenCV】双线性插值法

    【OpenCV】双线性插值法双线性插值法定义:又称双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向上分别进行一次线性插值。对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v)(其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值f(i+u,j+v)可由原图像中坐标为(i,j)、(…

  • POST、GET、@RequestBody和@RequestParam区别[通俗易懂]

    POST、GET、@RequestBody和@RequestParam区别[通俗易懂]@RequestParam注解@RequestParam接收的参数是来自requestHeader中,即请求头。RequestParam可以接受简单类型的属性,也可以接受对象类型。@RequestParam有三个配置参数:required表示是否必须,默认为true,必须。 defaultValue可设置请求参数的默认值。 value为接收url的参数名(相当于key值…

  • ECharts介绍及使用方法

    ECharts介绍及使用方法前面做项目时用到ECharts,今天特此整理一下,作为笔记,同时希望帮助更多人。首先简单介绍一下,ECharts是一个纯JavaScript图表库,底层依赖于轻量级的Canvas类库ZRender,基于BSD开原协议,是一款非常优秀的可视化前端框架。官网地址:http://echarts.baidu.com/1.首先在官网选择合适的下载版本http://echart…

发表回复

您的电子邮箱地址不会被公开。

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