【ReID】1、行人重识别模型

文章目录

  • 一、概念
  • 二、实现方案
  • 三、代码

一、概念

ReID,也就是 Re-identification,其定义是利用算法,在图像库中找到要搜索的目标的技术,所以它是属于图像检索的一个子问题。

说白了,在监控拍不到人脸的情况下,ReID可以代替人脸识别来在视频序列中找到我要找到目标对象。那么他的应用就很广了,可以做安防,可以做个人定位,在商场上可以配合推荐系统,搭建出个性化的推荐服务等等。下面一张图可以生动的解释它在安防的一个应用场景。

ReID的概念最早在2006年的CVPR会议上被提出。2007年首个ReID数据集VIPeR被公布,之后越来越多的不同场景下的数据集先后被开源了出来,这些数据集也一定程度上推动了ReID的发展。

在2015年左右,深度学习还没有大热大火之前,ReID的研究大部分都是基于的特征的阶段,对于人工特征,如颜色、HOG特征等,之后的度量学习是寻找特征之间的最佳近似度,但这种方法学习复杂的场景数据效果不佳。随着AlphaGo取得令人瞩目的成就,以及最新硬件支持技术的发展也带来了深度学习的高产阶段,深度学习也逐渐渗透到人工智能的各个方面,包括ReID,利用深度学习的方法可以很好的学习出黑盒性质的特征,在一些方面可以超过了人类的识别水平,因而深度学习在CV中的应用已成为相关研究者关注的热点。

2017年和2018年ReID得到快速发展,在国内外各类顶级计算机视觉会议和顶级期刊上每年都有多篇ReID的文章。迁移学习的火热也使得在大数据量和算力下训练好的模型可以作为网络的初始化,使得网络的性能大大改善。对抗生成网络的出现也给ReID带来了新道路;虽然目前来说,ReID主流的方法仍然属于监督学习,但是迁移学习以及GAN网络也将是一个很有前景的方向。

二、实现方案

person-reid 又简称 reid,是旨在用来从图片序列或视频中检索行人的技术。可总体划分为以下5步:

  • 原始数据采集: 主要来自于监控摄像头
  • 行人框生成: 将图片中的行人裁剪出来,可通过人工或使用行人检测算法
  • 训练数据标注: 可能包含行人属性、相机等,对于新场景,一般需要重新标注
  • 模型训练: 模型集中于特征表示学习、距离度量学习或者二者的组合
  • 行人检索: 给定 query(感兴趣的行人) 和 gallery 集合,用训练得到的模型抽取各自的特征表达,然后计算 query 和 gallery 中每个行人的相似度进行排序.
    论文中将ReID技术分为 Closed-world 和Open-world 两大子集 , 本文主要记录 closed-world 的reid, 即常见的标注完整的有监督的行人重识别方法.

从前面讲的,我们已经大致知道ReID是干什么的了,似乎就是去检索出一个目标对象。这里我会具体去讲这个任务如何去做。

上面这张图向我们展示了ReID的一个任务过程

  • 首先要做的是Detection,也就是检测出行人,其实这一步数据集已经帮我们做到了,下面介绍数据集的时候会讲到不同数据集采用的不同的目标检测方法以及ID的标注方式。
  • 剩下的部分,就是要去训练一个特征提取网络,根据特征所计算的度量距离得到损失值
    • 我们选用一个优化器去迭代找到loss最小值,并不断更新网络的参数达到学习的效果。
    • 在测试的时候,我们用将要检索的图片(称为query或者probe),在底库gallery中,根据计算出的特征距离进行排序,选出最TOP的几张图片,来达到目标检索的目的。下面两张图分别是训练阶段和测试阶段的示意图:

测试阶段中,我们利用训练后的网络计算特征从所有搜索到的图像中提取特征,并计算搜索图与地库之间的特征距离。然后根据计算出的距离对它们进行排序。排名越高,相似性越高,上图中,绿色边框的是正确检索的结果,红色边框的是错误检索的结果。

用学习好的reid特征得到初始的检索排序结果后,利用图片之间的相似性关系来进行初始的检索结果优化,主要有:

  • re-rank
  • rank-fusion

三、代码

import numpy as np
import jsonwith open('gallery.json', 'r') as res_lst:gallery = res_lst.readlines()
with open('query.json', 'r') as res_lst:query = res_lst.readlines()if __name__ == '__main__':for idx1, res1 in enumerate(query):res1_dic = json.loads(res1)vector1 = res1_dic['data']max_smi = 0max_target_idx = -1for idx2, res2 in enumerate(gallery):res2_dic = json.loads(res2)vector2 = res2_dic['data']# 计算向量的内积dot_product = np.dot(vector1, vector2)# 计算向量的模长norm1 = np.linalg.norm(vector1)norm2 = np.linalg.norm(vector2)# 计算余弦相似度similarity = dot_product / (norm1 * norm2)if similarity > max_smi:max_smi = similaritymax_target_idx = idx2print('idx1={},max_target_idx={},max_smi={}'.format(idx1, max_target_idx, max_smi))

若两个向量完全相同,则其余弦相似度接近 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/164997.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机玻璃盖板为什么需要透光率检测

手机盖板,也称为手机壳或保护套,是一种用于保护手机外观和延长使用寿命的装置。它们通常由塑料、硅胶、玻璃或金属等材料制成,并固定在手机外壳上,其中任何一个工序出现差错,都有可能导致手机盖板产生缺陷,例如漏油、透…

《持续交付:发布可靠软件的系统方法》- 读书笔记(十二)

持续交付:发布可靠软件的系统方法(十二) 第 12 章 数据管理12.1 引言12.2 数据库脚本化12.3 增量式修改12.3.1 对数据库进行版本控制12.3.2 联合环境中的变更管理 12.4 数据库回滚和无停机发布12.4.1 保留数据的回滚12.4.2 将应用程序部署与数…

Bean的四种实例化方式以及BeanFactory和FactoryBean的区别

2023.11.8 Spring为Bean提供了多种实例化方式,通常包括4种方式。 第一种:通过构造方法实例化第二种:通过简单工厂模式实例化第三种:通过factory-bean实例化第四种:通过FactoryBean接口实例化 通过构造方法实例化 创…

一文掌握 Apache SkyWalking

Apache SkyWalking SkyWalking是一个开源可观测平台,用于收集、分析、聚合和可视化来自服务和云原生基础设施的数据。SkyWalking 提供了一种简单的方法来保持分布式系统的清晰视图,甚至跨云。它是一种现代APM,专为云原生、基于容器的分布式系…

大厂面试题-b树和b+树的理解

为了更清晰的解答这个问题,从三个方面来回答: a.了解二叉树、AVL树、B树的概念 b.B树和B树的应用场景 1.B树是一种多路平衡查找树,为了更形象的理解,我们来看这张图。 二叉树,每个节点支持两个分支的树结构&#xff…

2023年11月数据库流行度最新排名

点击查看最新数据库流行度最新排名(每月更新) 2023年11月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多,这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

四种常见分布式限流算法实现!

转载:四种常见分布式限流算法实现! - 知乎 大家好,我是老三,最近公司在搞年终大促,随着各种营销活动“组合拳”打出,进站流量时不时会有一个小波峰,一般情况下,当然是流量越多越好&…

为什么HTTP用得很好的,开始普及HTTPS呢?

显而易见,现在的HTTP早已不安全,当我们在浏览各个网站时会发现HTTP前面都会显示不安全,因为HTTP是明文传输,一旦电脑被植入了木马,木马程序就会主动周期性发消息给Internet的控制终端,这样NAT小洞会一直敞开…

前端瀑布流怎么布局

假设你需要把页面搭建成这样,有两列元素,每个元素宽度一定,高度不一定。如何实现? 这种瀑布流布局有很多实现方式,比如Grid布局。 什么是Grid布局 Grid布局是一种很灵活的布局方式,他把你的页面划分成了很…

BeanUtils.copyProperties浅拷贝的坑你得知道?

今天想写一篇文章,主要关于深拷贝和浅拷贝相关的,主要是最近写代码的时候遇到一个BUG,刚好涉及到浅拷贝导致的问题。 问题背景 现在有一个需要是需要修改门店信息,门店也区分父门店和子门店,父门店被编辑更新是需要通过…

【Leetcode】【数据结构】【C语言】判断两个链表是否相交并返回交点地址

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *tailAheadA;struct ListNode *tailBheadB;int count10;int count20;//分别找尾节点,并顺便统计节点数量:while(tailA){tailAtailA->next;c…

CSS 浮动

目标target✓ 能够说出来为什么需要浮动能够说出来浮动的排列特性能够说出来三种最常见的布局方式能够说出来为什么需要清除浮动,能够至少写出两种清楚浮动的方法能够利用Photoshop实现基本的切图能够利用Photoshop插件实现切图能够完成学成在线的页面布 传统网页布局的三种模…