行人重识别数据集-统一为market1501数据集进行多数据集联合训练

一、前言

常用的数据集:
在这里插入图片描述数据集下载链接:https://kaiyangzhou.github.io/deep-person-reid/datasets.html
https://kaiyangzhou.github.io/deep-person-reid/datasets.html#sensereid-sensereid

二、数据集合并

第一步:market1501的数据集文件夹格式的创建

market1501的图片命名信息,以图片 0012_c4s1_000826_01.jpg 对数据集命名进行说明

  1. 0012 是行人 ID,Market 1501 有 1501 个行人,故行人 ID 范围为 0001-1501
  2. c4 是摄像头编号(camera 4),表明图片采集自第4个摄像头,一共有 6 个摄像头
  3. s1 是视频的第一个片段(sequece1),一个视频包含若干个片段
  4. 000826 是视频的第 826 帧图片,表明行人出现在该帧图片中
  5. 01 代表第 826 帧图片上的第一个检测框,DPM 检测器可能在一帧图片上生成多个检测框

DPM 检测器是DPM 是一种基于部件的模型,它将目标(如行人)视为多个部分的组合,这些部分可以有不同的形状和大小,并且它们之间的相对位置可以变形。例如在行人检测中,部件可能包括头部、手臂、躯干、腿等。这些部件被建模为滤波器,用于在图像中搜索与之对应的特征。

数据集的文件格式分析
下载好的 Market 1501 包括以下几个文件夹:

  • bounding_box_test 是测试集,包括 19732 张图片。gallery 是通过 DPM 检测器生成的。
  • bounding_box_train 是训练集,包括 12936 张图片。
  • query 是待查找的图片集,在 bounding_box_test 中实现查找。这些图片是手动绘制生成的。
  • gt_bbox 是手工标注的训练集和测试集图片,包括 25259 张图片,用来区分 “good” “junk” 和 “distractors” 图片。(基本弃用)
  • gt_query 是一些 Matlab 格式的文件,里面记录了 “good” 和 “junk” 图片的索引,主要被用来评估模型。(基本弃用)

因此,我们只需要创建几个文件夹-bounding_box_test 、bounding_box_train和query。使用的代码如下:

import os
def make_market_dir(dst_dir='./'):market_root = os.path.join(dst_dir, 'market1501')train_path = os.path.join(market_root, 'bounding_box_train')query_path = os.path.join(market_root, 'query')test_path = os.path.join(market_root, 'bounding_box_test')if not os.path.exists(train_path):os.makedirs(train_path)if not os.path.exists(query_path):os.makedirs(query_path)if not os.path.exists(test_path):os.makedirs(test_path)
if __name__ == '__main__':make_market_dir(dst_dir='./reID')

第二步:market1501数据集抽取

链接:https://pan.baidu.com/s/1Yf-Smagh1SOZzmhl7agzjQ
提取码:8741
将整个market1501数据集作为训练集,抽取的结果一共有 29419 张图片, ID从0001到1501一共1501 个不同ID的行人。

import re
import os
import shutildef extract_market(src_path, dst_dir):img_names = os.listdir(src_path)pattern = re.compile(r'([-\d]+)_c(\d)')pid_container = set()for img_name in img_names:if '.jpg' not in img_name:continueprint(img_name)# pid: 每个人的标签编号 1# _  : 摄像头号 2pid, _ = map(int, pattern.search(img_name).groups())# 去掉没用的图片if pid == 0 or pid == -1:continueshutil.copy(os.path.join(src_path, img_name), os.path.join(dst_dir, img_name))if __name__ == '__main__':src_train_path = './Market-1501-v15.09.15/bounding_box_train'src_query_path = './Market-1501-v15.09.15/query'src_test_path = './Market-1501-v15.09.15/bounding_box_test'# 将整个market1501数据集作为训练集dst_dir = './reID/market1501/bounding_box_train'extract_market(src_train_path, dst_dir)extract_market(src_query_path, dst_dir)extract_market(src_test_path, dst_dir)

第三步:CUHK数据集抽取

链接:https://pan.baidu.com/s/1y74mhK0PkIPBscHUxh-uGA
提取码:xvbc
CUHK03一共有 14097 张图片, ID从001502到002968一共1467个不同ID的行人

import glob
import re
import os.path as osp
import shutilimport re
import os
import shutildef extract_cuhk03(src_path, dst_dir):img_names = os.listdir(src_path)pattern = re.compile(r'([-\d]+)_c(\d)_([\d]+)')pid_container = set()for img_name in img_names:if '.png' not in img_name and '.jpg' not in img_name:continueprint(img_name)# pid: 每个人的标签编号 1# camid  : 摄像头号 2pid, camid, fname = map(int, pattern.search(img_name).groups())# 这里注意需要加上前面的market1501数据集的最后一个ID 1501# 在前面数据集的最后那个ID基础上继续往后排pid += 1501dst_img_name = str(pid).zfill(6) + '_c' + str(camid) + '_CUHK' + str(fname) + '.jpg'shutil.copy(os.path.join(src_path, img_name), os.path.join(dst_dir, dst_img_name))if __name__ == '__main__':src_train_path = './cuhk03-np/detected/bounding_box_train'src_query_path = './cuhk03-np/detected/query'src_test_path = './cuhk03-np/detected/bounding_box_test'dst_dir = './reID/market1501/bounding_box_train'extract_cuhk03(src_train_path, dst_dir)extract_cuhk03(src_query_path, dst_dir)extract_cuhk03(src_test_path, dst_dir)

第四步:MSMT17数据集抽取

链接:https://pan.baidu.com/s/1EKmiYw9ZltvzJUAlYd06fQ
提取码:abg3
MSMT17一共有 126441 张图片, ID从002969到007069一共1467个不同ID的行人。

import re
import os
import shutildef msmt2market(dir_path, dst_dir, prev_pid):img_names = os.listdir(dir_path)pattern = re.compile(r'([-\d]+)_c([-\d]+)_([\d]+)')for img_name in img_names:# 判断是否是jpg格式的图片if '.jpg' not in img_name:continueprint(img_name)# pid: 每个人的标签编号 1# _  : 摄像头号 2pid, camid, fname = map(int, pattern.search(img_name).groups())print(pid)# 去掉没用的图片if  pid == -1:continuepid_new = pid + 1 + prev_piddst_img_name = str(pid_new).zfill(6) + '_c' + str(camid) + '_MSMT' + str(fname) + '.jpg'print(dst_img_name)shutil.copy(os.path.join(dir_path, img_name),os.path.join(dst_dir, dst_img_name))if __name__ == '__main__':src_train_path = './MSMT17/bounding_box_train'src_query_path = './MSMT17/query'src_test_path = './MSMT17/bounding_box_test'dst_dir = './reID/market1501/bounding_box_train'msmt2market(src_train_path, dst_dir, 2968)msmt2market(src_query_path, dst_dir, 4009)msmt2market(src_test_path, dst_dir, 4009)

第五步:viper数据集抽取

链接:https://pan.baidu.com/s/1J6FAuse1VeFGurWQ7EOpxQ
提取码:1vsg
转换后的viper数据集一共有1264张图片, ID从007070到007943一共1467个不同ID的行人。需要注意这里ID不是连续的,不过只要ID跟之前不重复即可

import re
import os
import shutildef extract_viper(src_path, dst_dir, camid=1):img_names = os.listdir(src_path)pattern = re.compile(r'([\d]+)_([\d]+)')pid_container = set()for img_name in img_names:if '.bmp' not in img_name:continueprint(img_name)pid, fname = map(int, pattern.search(img_name).groups())# 这里注意需要加上前面的数据集的最后一个ID 7069# 由于viper数据集ID是从0开始,因此需要+1pid += 7069 + 1dst_img_name = str(pid).zfill(6) + '_c' + str(camid) + '_viper' + str(fname) + '.jpg'shutil.copy(os.path.join(src_path, img_name), os.path.join(dst_dir, dst_img_name))if __name__ == '__main__':src_cam_a = './VIPeR/cam_a'src_cam_b = './VIPeR/cam_b'dst_dir = './reID/market1501/bounding_box_train'extract_viper(src_cam_a, dst_dir, camid=1)extract_viper(src_cam_b, dst_dir, camid=2)

第六步:prid数据集抽取

链接:https://pan.baidu.com/s/1tkjzN_-g-GwmSY7eCUPisw
提取码:4ttv
转换后的prid数据集一共有2268张图片

import re
import os
import shutildef extract_prid(src_path, dst_dir, prevID, camid=1):pattern = re.compile(r'person_([\d]+)')pid_container = set()sub_dir_names = os.listdir(src_path)  # ['person_0001', 'person_0002',...for sub_dir_name in sub_dir_names:  # 'person_0001'img_names_all = os.listdir(os.path.join(src_path, sub_dir_name))# 这里我就只取首尾两张,防止重复太多了img_names = [img_names_all[0], img_names_all[-1]]for img_name in img_names:  # '0001.png'if '.png' not in img_name:continueprint(img_name)# parent.split('\\')[-1] : person_0001pid = int(pattern.search(sub_dir_name).group(1))pid += prevIDprint(pid)dst_img_name = str(pid).zfill(6) + '_c' + str(camid) + '_prid' + img_name.replace('.png', '.jpg')print(dst_img_name)shutil.copy(os.path.join(src_path, sub_dir_name, img_name), os.path.join(dst_dir, dst_img_name))if __name__ == '__main__':src_cam_a = './prid_2011/multi_shot/cam_a'src_cam_b = './prid_2011/multi_shot/cam_b'dst_dir = './reID/market1501/bounding_box_train'extract_prid(src_cam_a, dst_dir, 7943)extract_prid(src_cam_b, dst_dir, 8328)

第七步:ilids数据集抽取

链接:https://pan.baidu.com/s/1FfYx57Zc7iGuCQa1fMRRHA
提取码:yoww
转换后的ilids数据集一共有600张图片

import re
import os
import shutildef extract_ilids(src_path, dst_dir, prevID, camid):pattern = re.compile(r'person([\d]+)')pid_container = set()sub_dir_names = os.listdir(src_path)for sub_dir_name in sub_dir_names:img_names = os.listdir(os.path.join(src_path, sub_dir_name))for img_name in img_names:if '.png' not in img_name:continueprint(img_name)pid = int(pattern.search(sub_dir_name).group(1))pid += prevIDdst_img_name = str(pid).zfill(6) + '_c' + str(camid) + '_ilids' + '.jpg'shutil.copy(os.path.join(src_path, sub_dir_name, img_name), os.path.join(dst_dir, dst_img_name))if __name__ == '__main__':src_cam_a = './iLIDS-VID/i-LIDS-VID/images/cam1'src_cam_b = './iLIDS-VID/i-LIDS-VID/images/cam2'dst_dir = './reID/market1501/bounding_box_train'extract_ilids(src_cam_a, dst_dir, 9077, 1)extract_ilids(src_cam_b, dst_dir, 9077, 2)

第八步:grid数据集抽取

链接:https://pan.baidu.com/s/1YbQT2px3Em-3KZTs6pLXmA
提取码:2tbc
grid数据集一共有500张图片

import re
import os
import shutildef extract_grid(src_path, dst_dir, camid=1):img_names = os.listdir(src_path)pattern = re.compile(r'([\d]+)_')pid_container = set()for img_name in img_names:if '.jpeg' not in img_name:continueprint(img_name)pid = int(pattern.search(img_name).group(1))if pid == 0:continuepid += 9396print(pid)dst_img_name = str(pid).zfill(6) + '_c' + str(camid) + '_grid' + '.jpg'shutil.copy(os.path.join(src_path, img_name), os.path.join(dst_dir, dst_img_name))if __name__ == '__main__':src_cam_a = './underground_reid/probe'src_cam_b = './underground_reid/gallery'dst_dir = './reID/market1501/bounding_box_train'extract_grid(src_cam_a, dst_dir, camid=1)extract_grid(src_cam_b, dst_dir, camid=2)

第九步:DukeMTMC-reID数据集抽取

链接:https://pan.baidu.com/s/1AviYz5SenijfO5w1TGuEtA
提取码:l0pt

import re
import os
import shutildef extract_duke(src_path, dst_dir):img_names = os.listdir(src_path)pattern = re.compile(r'([-\d]+)_c(\d)_f([\d]+)')for img_name in img_names:if '.png' not in img_name and '.jpg' not in img_name:continueprint(img_name)# pid: 每个人的标签编号 1# camid  : 摄像头号 2pid, camid, fname = map(int, pattern.search(img_name).groups())# 这里注意需要加上前面的market1501数据集的最后一个ID 1501# 在前面数据集的最后那个ID基础上继续往后排pid += 9646print( pid, camid, fname)dst_img_name = str(pid).zfill(6) + '_c' + str(camid) + '_Duke' + str(fname) + '.jpg'print(dst_img_name)shutil.copy(os.path.join(src_path, img_name), os.path.join(dst_dir, dst_img_name))if __name__ == '__main__':src_train_path = './DukeMTMC-reID/DukeMTMC-reID/bounding_box_train'src_test_path ='./DukeMTMC-reID/DukeMTMC-reID/bounding_box_test'src_query_path = './DukeMTMC-reID/DukeMTMC-reID/query'dst_dir = './9'extract_duke(src_train_path, dst_dir)extract_duke(src_test_path, dst_dir)

第九步:SenseReID数据集抽取

import re
import os
import shutildef extract_SenseReID(src_path, dst_dir, fname):img_names = os.listdir(src_path)pattern = re.compile(r'([\d]+)_([\d]+)')pid_container = set()for img_name in img_names:if '.jpg' not in img_name:continueprint(img_name)pid, camid = map(int, pattern.search(img_name).groups())pid += 16786+ 1            dst_img_name = str(pid).zfill(6) + '_c' + str(camid + 1) + '_SenseReID_' + fname + '.jpg'shutil.copy(os.path.join(src_path, img_name), os.path.join(dst_dir, dst_img_name))if __name__ == '__main__':src_cam_a = r'D:\data\SenseReID\test_gallery'src_cam_b = r'D:\data\SenseReID\test_probe'dst_dir = r'E:\reID\market1501\bounding_box_train'extract_SenseReID(src_cam_a, dst_dir, 'gallery')extract_SenseReID(src_cam_b, dst_dir, 'probe')

代码修改

在market1501.py脚本修改如下代码:

# 在41行左右
# data_dir = osp.join(self.data_dir, 'Market-1501-v15.09.15')
data_dir = osp.join(self.data_dir, 'reID/market1501')# 在84行左右
# assert 0 <= pid <= 1501  # pid == 0 means background
# assert 1 <= camid <= 6
assert 0 <= pid <= 16786  # pid == 0 means background
assert 1 <= camid <= 16

参考链接:
1、行人重识别数据集转换–统一为market1501数据集进行多数据集联合训练
2、行人重识别数据集链接
3、行人重识别多个数据集格式统一为market1501格式

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

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

相关文章

数据分析工具 Top 8

你能想象一个没有工具箱的水管工吗? 没有,对吧? 数据从业者也是如此。如果没有他们的数据分析工具&#xff0c;数据从业者就无法分析数据、可视化数据、从数据中提取价值&#xff0c;也无法做数据从业者在日常工作中做的许多很酷的事情。 根据你最感兴趣的数据科学职业——数…

【架构】企业信息安全体系架构详解

企业信息安全体系架构来说,是包含技术、运维、管理3个层面。本文说的安全架构,主要集中讨论偏研发技术层面的安全架构。 安全性是软件研发技术体系,系统架构设计阶段的一个关键DFX能力,与可靠性、可服务性、性能等架构属性并列。由于安全性设计自身的特点,涉及到系统架构…

highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动

效果图&#xff1a;最左侧的分类列是跟随甘特图滚动的&#xff0c;因为这一列如果需要自定义&#xff0c;比如表格的话可能会存在行合并的情况&#xff0c;这个时候甘特图是没有办法做的&#xff0c;然后甘特图的表头又需要做滚动时固定&#xff0c;所以设置了甘特图滚动时&…

3dsmax渲染太慢,用云渲染农场多少钱?

对于许多从事计算机图形设计的创作者来说&#xff0c;渲染速度慢是一个常见问题&#xff0c;尤其是对于那些追求极致出图效果的室内设计师和建筑可视化师&#xff0c;他们通常使用3ds Max这样的工具&#xff0c;而高质量的渲染经常意味着长时间的等待。场景复杂、细节丰富&…

15-网络安全框架及模型-BLP机密性模型

目录 BLP机密性模型 1 背景概述 2 模型原理 3 主要特性 4 优势和局限性 5 困难和挑战 6 应用场景 7 应用案例 BLP机密性模型 1 背景概述 BLP模型&#xff0c;全称为Bell-LaPadula模型&#xff0c;是在1973年由D.Bell和J.LaPadula在《Mathematical foundations and mod…

ApiPost插件⭐️与IDEA的搭配使用,通过引入插件直接在项目里一键开测

小伙伴们大家好&#xff0c;用接口测试工具有一段时间了&#xff0c;最近发现该工具有提供插件直接可以在项目里测试接口&#xff0c;并且页面布局不输应用 目录 一、ApiPost插件介绍 二、安装插件 一、ApiPost插件介绍 Apipost 是一个用于测试和调试 API 接口的 IDEA 插件…

MariaDB单机多实例的配置方法

1、什么是数据库的单机多实例 数据库的单机多实例是指在一台物理服务器上运行多个数据库实例。这种部署方式允许多个数据库实例共享相同的物理资源&#xff0c;如CPU、内存和存储&#xff0c;从而提高硬件利用率并降低成本。每个数据库实例可以独立运行&#xff0c;处理不同的…

cpp_07_类型转换构造_析构函数_深拷贝_静态成员

1 类型转换构造函数 1.1 why? 基本类型之间的转换&#xff0c;编译器内置转换规则&#xff1a;int -> double 类类型之间的转换&#xff0c;编译器不知道转换规则&#xff0c;需要用户提供&#xff1a;Cat -> Dog // consconv_why.cpp 为什么需要自定义转换 #includ…

【机器学习】西瓜书第6章支持向量机课后习题6.1参考答案

【机器学习】西瓜书学习心得及课后习题参考答案—第6章支持向量机 1.试证明样本空间中任意点x到超平面(w,b)的距离为式(6.2)。 首先&#xff0c;直观解释二维空间内点到直线的距离&#xff1a; 由平面向量的有关知识&#xff0c;可得&#xff1a; 超平面的法向量为 w w w&am…

「Kafka」入门篇

「Kafka」入门篇 基础架构 Kafka 快速入门 集群规划 集群部署 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html 解压安装包&#xff1a; [atguiguhadoop102 software]$ tar -zxvf kafka_2.12-3.0.0.tgz -C /opt/module/修改解压后的文件名称&#xff1a; [a…

排列组合算法(升级版)

前言 在上一期博客中我们分享了一般的排列组合算法&#xff08;没看的话点这里哦~&#xff09;&#xff0c;但是缺点很明显&#xff0c;没法进行取模运算&#xff0c;而且计算的范围十分有限&#xff0c;而今天分享的排列组合升级版算法能够轻松解决这些问题&#xff0c;话不多…

构建高效数据中台:集群规划与搭建的最佳实践指南

架构设计 Rack(机架)配置建议 大数据集群规划 安装细节见配套文档 两地三中心 两地三中心是一种信息技术架构模式,通常用于灾难恢复和业务连续性计划。这种模式设计有两个物理位置(两地),在这两个位置上部署了三个数据中心(三中心):一个主数据中心和两个备份数据中心…

使用Visual Studio 2022 winform项目打包成安装程序.exe

winform项目打包 1.安装扩展插件 Microsoft Visual Studio Installer Projects 20222.在解决方案上新建一个setup project 项目3.新建成功如下图&#xff0c;之后添加你的winform程序生成之后的debug下的文件4.在Application Folder上点击右键->Add->项目输出->主输出…

【xdma】 pcie.bar设置

FPGA优质开源项目– PCIE通信 xdma 两者保持一致 FPGA开源项目 – PCIE I/O控制卡 xdma PCIe的XDMA应用 读写部分分为两种&#xff0c;一种是数据的读写&#xff0c;另一种是配置数据的读写&#xff0c;在数据读写部分&#xff0c;DMA通过MIG控制DDR完成数据读写。配置数据…

EasyExcel导出

1.简介 官网&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 2.案例 2.1 实现的效果 效果图如下&#xff1a; 2.2 实现步骤 三种情景&#xff0c;主要是表头和数据有区别&#xff0c;简列实现步骤如下&#xff1a; 2.3 具体实现 2.3.1 前置-依赖导入…

Centos开启防火墙和端口命令

Centos开启防火墙和端口命令 1 课堂小知识1.1 centos7简介1.2 iptables方式开启防火墙 2 操作步骤2.1 开启查看关闭firewalld服务状态2.2 查看端口是否开放2.3 新增开放端口2.4 查看开放的端口 3 防火墙的其他指令 1 课堂小知识 1.1 centos7简介 CentOS 7是CentOS项目发布的开…

【Linux】 last 命令使用

last 命令 用于检索和展示系统中用户的登录信息。它从/var/log/wtmp文件中读取记录&#xff0c;并将登录信息按时间顺序列出。 著者 Miquel van Smoorenburg 语法 last [-R] [-num] [ -n num ] [-adiox] [ -f file ] [name...] [tty...]last 命令 -Linux手册页 选项及作用…

泰迪智能科技“供需对接就业育人项目”介绍

为帮助用人单位培养和招聘更多实用型、复合型和紧缺型人才,推动高校人才培养与就业有机联动、人才供需有效对接促进高校毕业生更加充分更高质量就业&#xff0c;经广东泰迪智能科技股份有限公司申报、全国高校毕业生就业创业指导委员会专家组审核&#xff0c;泰迪智能科技“供需…

2024年HTML+CSS+JS 网页版烟花代码

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 直接跳到末尾 获取完整源码 在线体验地址&…

可视化云监控/安防监控系统EasyCVR视频管理平台播流失败的原因(端口篇)

安防视频监控EasyCVR平台兼容性强&#xff0c;可支持的接入协议众多&#xff0c;包括国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台能将接入的视频…