Re-ranking Person Re-identification with k-reciprocal Encoding 重排序算法解析

本文主要是介绍Re-ranking Person Re-identification with k-reciprocal Encoding 重排序算法解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

论文:

Re-ranking Person Re-identification with k-reciprocal Encoding

代码:

https://github.com/layumi/Person_reID_baseline_pytorch/blob/master/re_ranking.py

 

 

3.提出的方法

3.1 问题定义

给定probe person 和gallery set,可以度量它们的马氏距离:

这里是特征向量,M是半正定矩阵。我们可以根据这个距离对p和G排序,距离从小到大排列:

我们的目标是对这个初始排序列表重新排序,使得更多的正样本出现在列表的前段。

 

3.2 K-reciprocal Nearest Neighbors

首先,定义k-nearest neighbors(k-nn),即排序列表的前k个样本:

接着,定义k-reciprocal nearest neighbors(k-rnn),简单地说就是满足“都在对方的k-nn列表里”这一条件的的集合:

 

然而,由于光照、姿态、视角等一系列变化,正样本可能会被排除到k-nn列表外,因此我们定义了一个更鲁棒的k-rnn集合:

上式的意思是,对于原本的集合R(p,k)中的每一个样本q,找到它们的k-rnn集合R(q,k/2),对于重合样本数达到一定条件的,则将其并入R(p,k).通过这种方式,将原本不在R(p,k)集合中的正样本重新带回来。文中给了一个例子来说明这一过程,如下图所示:

 

3.3 Jaccard距离

作者认为,假如两张图片相似,那么它们的k-rnn集合会重叠,即会有重复的样本。重复的样本越多,这两张图片就越相似。那么很自然地就想到用Jaccard Distance度量它们k-rnn集合的相似度:

然而,上面的距离度量有三个缺点:

1.取交集和并集的操作非常耗时间,尤其是在需要计算所有图像对的情况下。一个可选方式是将近邻集编码为一个等价的但是更简单的向量,以减少计算复杂度。

2.这种距离计算方法将所有的近邻样本都认为是同等重要的,而实际上,距离更接近于probe的更可能是正样本。因此,根据原始的距离将大的权值分配给较近的样本这一做法是合理的。

3.单纯考虑上下文信息会在试图测量两个人之间的相似性时造成相当大的障碍。因为,不可避免的变化会使得区分上下文信息变得困难。因此,为了得到鲁棒的距离度量,结合原始距离和Jaccard距离是有必要的。

为了克服上述缺点,我们开始改造Jaccard距离。首先,将k-rnn集合编码为N维的二值向量=,其中每个元素由以下指示函数定义:

接着,为了给每一个元素根据原始距离来重新分配权值,我们采用了高斯核。于是将向量改写为:

 

于是,计算Jaccard距离时用到的交集和并集的基数就改写为:

最后,我们终于得到了改造过的Jaccard距离:

这个改造过程,实际上是将集合比较问题转化为纯粹的向量计算,实践起来更简单。

 

3.4 Local Query Expansion

基于来自同一类的图像可能共享相似特征的想法,我们使用probe的k-nn集合来实现local query expansion,

特别要说明的是,这个query expansion被同时用到了probe 和galleries 上。(这里我的理解是对每个向量定义为其k-nn集合向量的平均,通过这种方法来提升性能。根据我的测试,去掉这一步仍然有不错的效果,但mAP会有少许的下降。)因为k-nn集合可能会混有噪声,因此我们将k值设置得比较小。为了与前面的k做区分,我们定义前面用到的为,而这里用到的为,k1>k2.

 

3.5 最终距离

在这里有参数,最终计算距离如下:

 

3.6 复杂度分析

参考原文内容。

 

整个重排序的流程图如下所示:

 

 

 

这篇关于Re-ranking Person Re-identification with k-reciprocal Encoding 重排序算法解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/306149

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量