行人重识别数据集-统一为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='E:/reID')

第二步:market1501数据集抽取

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

import re
import os
import shutil
 
def 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:
            continue
        print(img_name)
        # pid: 每个人的标签编号 1
        # _  : 摄像头号 2
        pid, _ = map(int, pattern.search(img_name).groups())
        # 去掉没用的图片
        if pid == 0 or pid == -1:
            continue
        shutil.copy(os.path.join(src_path, img_name), os.path.join(dst_dir, img_name))
 
if __name__ == '__main__':
    src_train_path = r'D:\data\market1501\bounding_box_train'
    src_query_path = r'D:\data\market1501\query'
    src_test_path = r'D:\data\market1501\bounding_box_test'
    # 将整个market1501数据集作为训练集
    dst_dir = r'E:\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 shutil
 
import re
import os
import shutil
 
def 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:
            continue
        print(img_name)
        # pid: 每个人的标签编号 1
        # camid  : 摄像头号 2
        pid, camid, fname = map(int, pattern.search(img_name).groups())
        # 这里注意需要加上前面的market1501数据集的最后一个ID 1501
        # 在前面数据集的最后那个ID基础上继续往后排
        pid += 1501
        dst_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 = r'D:\data\cuhk03-np\detected\bounding_box_train'
    src_query_path = r'D:\data\cuhk03-np\detected\query'
    src_test_path = r'D:\data\cuhk03-np\detected\bounding_box_test'
    dst_dir = r'E:\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 glob
import re
import os.path as osp
import shutil
 
def msmt2market(dir_path, list_path, dst_dir, prev_pid):
    with open(list_path, 'r') as txt:
        lines = txt.readlines()
    pid_container = set()
    for img_idx, img_info in enumerate(lines):
        img_path, pid = img_info.split(' ')
        pid = int(pid) + prev_pid + 1 # 2969 5121
        camid = int(img_path.split('_')[2])
        img_path = osp.join(dir_path, img_path)
        name = img_path.split('/')[-1]  # '0001_c2_f0046182.jpg'
        Newdir = osp.join(dst_dir, str(pid).zfill(6) + '_c' + str(camid) + '_' + name)  # 用字符串函数zfill 以0补全所需位数
        shutil.copy(img_path, Newdir)  # 复制一个文件到一个文件或一个目录
 
 
    # check if pid starts from 0 and increments with 1
    for idx, pid in enumerate(pid_container):
        assert idx == pid, "See code comment for explanation"
 
if __name__ == '__main__':
    dataset_dir = r'D:\data\MSMT17_V2'
    train_dir = osp.join(dataset_dir, 'mask_train_v2')
    test_dir = osp.join(dataset_dir, 'mask_test_v2')
    list_train_path = osp.join(dataset_dir, 'list_train.txt')
    list_val_path = osp.join(dataset_dir, 'list_val.txt')
    list_query_path = osp.join(dataset_dir, 'list_query.txt')
    list_gallery_path = osp.join(dataset_dir, 'list_gallery.txt')
 
    dst_dir = r'E:\reID\market1501\bounding_box_train'
    msmt2market(train_dir, list_train_path, dst_dir, 2968)
    msmt2market(train_dir, list_val_path, dst_dir, 2968)
    msmt2market(test_dir, list_query_path, dst_dir, 4009)
    msmt2market(test_dir, list_gallery_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 shutil
 
def 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:
            continue
        print(img_name)
        pid, fname = map(int, pattern.search(img_name).groups())
        # 这里注意需要加上前面的数据集的最后一个ID 7069
        # 由于viper数据集ID是从0开始,因此需要+1
        pid += 7069 + 1
        dst_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 = r'D:\data\viper\cam_a'
    src_cam_b = r'D:\data\viper\cam_b'
    dst_dir = r'E:\reID\market1501\bounding_box_train'
 
    extract_viper(src_cam_a, dst_dir, camid=1)
    extract_viper(src_cam_b, dst_dir, camid=2)

第六步:SenseReID数据集抽取

转换后的SenseReID数据集一共有4428张图片, ID从007944到009661

import re
import os
import shutil
 
def 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:
            continue
        print(img_name)
        pid, camid = map(int, pattern.search(img_name).groups())
        pid += 7943 + 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')

第七步:prid数据集抽取

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

import re
import os
import shutil
 
def 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:
                continue
            print(img_name)
            # parent.split('\\')[-1] : person_0001
            pid = int(pattern.search(sub_dir_name).group(1))
            pid += prevID
            dst_img_name = str(pid).zfill(6) + '_c' + str(camid) + '_prid' + img_name.replace('.png', '.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 = r'D:\data\prid2011\multi_shot\cam_a'
    src_cam_b = r'D:\data\prid2011\multi_shot\cam_b'
    dst_dir = r'E:\reID\market1501\bounding_box_train'
 
    extract_prid(src_cam_a, dst_dir, 9661)
    extract_prid(src_cam_b, dst_dir, 10046)

第八步:ilids数据集抽取

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

import re
import os
import shutil
 
def 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:
                continue
            print(img_name)
            pid = int(pattern.search(sub_dir_name).group(1))
            pid += prevID
            dst_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 = r'D:\data\ilids\i-LIDS-VID\images\cam1'
    src_cam_b = r'D:\data\ilids\i-LIDS-VID\images\cam2'
    dst_dir = r'E:\reID\market1501\bounding_box_train'
 
    extract_ilids(src_cam_a, dst_dir, 10795, 1)
    extract_ilids(src_cam_b, dst_dir, 10795, 2)

grid数据集抽取

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

import re
import os
import shutil
 
def 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:
            continue
        print(img_name)
        pid = int(pattern.search(img_name).group(1))
        if pid == 0:
            continue
        pid += 11114
        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 = r'D:\data\grid\probe'
    src_cam_b = r'D:\data\grid\gallery'
    dst_dir = r'E:\reID\market1501\bounding_box_train'
 
    extract_grid(src_cam_a, dst_dir, camid=1)
    extract_grid(src_cam_b, dst_dir, camid=2)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【史上最小白】Bert:双向 Transformer 编码器

Bert:双向 Transformer 编码器 Bert:论洞察语境,GPT 不如我深刻;论理解含义,ELMo 不如我全面输入阶段词嵌入:把词语转换为向量第一个预训练 Masked:学习语言的深层次理解尝试 1:预测…

一款CAT1产品天线定制-FPC天线无源数据测试示例

需求情况 根据产品的壳料内部结构,定制一款PFC天线,设备类型是4G-TLE,所以需要支持的频段范围比较宽,谐振要落在800MHz~1GHz与1.6GHz~2.6GHz之内。 天线阻抗、回波损耗、电压驻波情况 天线无源效率及增益情况 小结:整…

【交叉编译环境】安装arm-linux交叉编译环境到虚拟机教程(简洁版本)

就是看到了好些教程有些繁琐,我就写了一个 我这个解压安装的交叉编译环境是Linaro GCC的一个版本,可以用于在x86_64的主机上编译arm-linux-gnueabihf的目标代码 步骤来了 在你的Ubuntu系统中创建一个目录,例如/usr/local/arm,然后…

cesium实现区域贴图及加载多个gif动图

1、cesium加载多个gif动图 Cesium的Billboard支持单帧纹理贴图,如果能够将gif动图进行解析,获得时间序列对应的每帧图片,然后按照时间序列动态更新Billboard的纹理,即可实现动图纹理效果。为此也找到了相对于好一点的第三方库libg…

Wireshark网络工具来了

Wireshark是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。 Wireshark是一个免费开源软件,不需要付费,免费使用,可以直接登陆到Wireshark的官网下载安装。 在windows环境中&#x…

【网络安全】一次SRC挖掘经历

本文仅供网络安全学习研究,违F绕路 资产发现 首先是信息收集子域名,谷歌语句直接site:xxx.com -www,一个登录口网站吸引了我的注意力。 我点击电信、网通、自动的时候,发现域名跳转到了真实IP 这样,就可以对真实IP进行端口扫描-&…

医学影像处理与智能医学:数据集资源和云端加速路径

医学影像处理识别是一种利用计算机技术影像进行识别、分析和处理的方法。它主要应用于医学影像学领域,如 X 射线、CT 扫描、MRI 和超声等。通过图像处理技术,可以对这些影像进行数字化处理,提取有用信息,辅助医生进行疾病诊断、治…

音频修复增强软件iZotope RX 10 mac特点介绍

iZotope RX 10 mac是一款音频修复和增强软件。 iZotope RX 10 mac软件特点 声音修复:iZotope RX 10可以去除不良噪音、杂音、吱吱声等,使音频变得更加清晰干净。 音频增强:iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等处…

使用 OpenTelemetry 和 Loki 实现高效的应用日志采集和分析

在之前的文章陆续介绍了 如何在 Kubernetes 中使用 Otel 的自动插桩 以及 Otel 与 服务网格协同实现分布式跟踪,这两篇的文章都将目标聚焦在分布式跟踪中,而作为可观测性三大支柱之一的日志也是我们经常使用的系统观测手段,今天这篇文章就来体…

springCould中的zookeeper-从小白开始【3】

目录 1.启动zookeeper❤️❤️❤️ 2.创建8004模块 ❤️❤️❤️ 3.临时节点还是永久节点❤️❤️❤️ 4.创建zk80消费模块❤️❤️❤️ 1.启动zookeeper❤️❤️❤️ 进入自己zookeeper的bin目录下 分别使用命令: ./zkServer.sh start 和 ./zkCli.sh -serve…

旅游品牌网站搭建的作用是什么

我国旅游业规模非常高,各地大小旅游景区也是非常多,尤其节假日更是可以达到峰值,无论周边游还是外地游对所要去的景区,消费者总是需要来回了解很多,浏览器查或旅行社咨询等。 对旅游企业而言,传统线下方式…

QT 构建项目报错Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7

问题 Getting NoClassDefFoundError: Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7获取 NoClassDefFoundError:无法初始化类 org.codehaus.groovy.vmplugin.v7.Java7 解决方法一 java版本 过高 将java版本降低,例如从java17降…

虹科方案|车内智慧大脑:基于车载网络捕获的全景数据处理

导读:随着汽车电子技术的不断发展,车载网络已经成为汽车智能化和互联互通的关键组成部分。然而随着汽车系统的复杂性增加,CAN的带宽和数据处理能力已不足以满足快速增长的数据需求。为了应对这一挑战,虹科智能互联提出了基于车载网…

哪个超声波清洗机好?适合洗眼镜超声波清洗机有哪些?

随着科技的进步,超声波清洗机已经成为了家居清洁的必备神器。尤其是对于眼镜、珠宝、饰品等需要深度清洁的小物件,超声波清洗机更是不可或缺。眼镜店最经常看见超声波清洗机的身影,可以很好帮我们清洗眼镜同时有些比较好的超声波清洗机还会带…

Matplotlib ------ 纵坐标科学计数法含义

matplotlib 纵坐标科学计数法含义 引言正文 引言 今天画图时遇到了一个问题,发现纵坐标是科学计数法的表示,但是很难理解它的含义,这里特来记录一下。 正文 我们以下图为例, 由图上我们可以看出,纵坐标显示为 1e-…

高压放大器的考虑因素有哪些

高压放大器是一种重要的电子设备,用于放大高电压信号。其设计和应用需要考虑多种因素,以确保性能稳定、安全可靠。以下是设计高压放大器时需要考虑的主要因素: 电压范围需求:首要考虑是要放大的电压信号范围。高压放大器应能够处理…

SpringBoot的测试

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,…

CentOS7部署bitbucket7.21.20-postgresql版

文章目录 1.资源下载2.上传服务器3.赋予执行权限并执行安装4.执行安装5.访问Bitbucket6.Bitbucket安装页面配置6.1连接Jira应用程序到PostgreSQL6.1.1创建并配置PostgreSQL数据库6.1.2测试数据库连接 6.2授权6.2.1授权包6.2.1.1资源地址6.2.1.2上传到服务器 6.2.2停止bitbucket…

PDF控件Spire.PDF for .NET【安全】演示:在 PDF 中添加或删除数字签名

随着 PDF 文档在商业中越来越流行,确保其真实性已成为一个关键问题。使用基于证书的签名对 PDF 进行签名可以保护内容,还可以让其他人知道谁签署或批准了该文档。在本文中,您将了解如何使用不可见或可见签名对 PDF 进行数字签名,以…

用CSDN训练的InsCode AI创作博文:数据治理体系建设

想不想用AI帮我们写方案? 想尝试用CSDN提供的InsCode AI创作助手协助我们进行技术方案的创作,看看效果如何,能不能辅助我们日常的方案编写与创作?以前用ChatGPT也尝试过,但对于专业性更强的内容,还有表现的…