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

2023-11-10

0 前言

  常用的reID数据集如图所示

下载好数据集,我的数据集一开始是这样的

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

market1501数据集的具体介绍可以看看这个 http://blog.fangchengjin.cn/reid-market-1501.html

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数据集抽取出来

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)

抽取的结果如图所示,现在一共有 29419 张图片, ID从0001到1501一共1501 个不同ID的行人。

第三步 将CUHK数据集抽取出来

具体介绍看这个:http://blog.fangchengjin.cn/reid-cuhk03.html

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)

转换结果如图所示,CUHK03一共有 14097 张图片, ID从001502到002968一共1467个不同ID的行人。

第四步 将MSMT17数据集抽取出来

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)


转换结果如图所示,MSMT17一共有 126441 张图片, ID从002969到007069一共1467个不同ID的行人。

到现在以及完成了除了duke以外的几个大型主流数据集的转换,duke数据集想留作测试,体现出模型的泛化能力。

目前的统计结果如下图所示,训练集现在已经有将近17w的图片,ID一共有7069个。

第五步 将viper数据集抽取出来

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)

转换后的viper数据集一共有1264张图片, ID从007070到007943一共1467个不同ID的行人。需要注意这里ID不是连续的,不过只要ID跟之前不重复即可。

第六步 将SenseReID数据集抽取出来

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')

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

第七步 将prid数据集抽取出来

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)

转换后的prid数据集一共有2268张图片, ID从009662到010795。

第八步 将ilids数据集抽取出来

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)

转换后的ilids数据集一共有600张图片, ID从010796到011114。

第九步 将grid数据集抽取出来

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)

转换后的grid数据集一共有500张图片, ID从011115到011364

最终的数据集统计结果如下图所示,一共有将近十八万张图片和11103个不同ID的行人:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

行人重识别数据集转换--统一为market1501数据集进行多数据集联合训练 的相关文章

  • 【Python】如何根据时间序列数据提取星期几的信息?(如2023-04-05提取为Wednesday)

    一 问题描述 在Python中 可以使用datetime模块来处理日期和时间数据 并从中提取星期几 以下是一个示例代码 import datetime 定义一个日期字符串 date string 2023 04 05 将日期字符串转换为日期
  • 关键路径求法

    关键路径概念 在无回路的有向网络中 假设只有一个入度为0的顶点 称为源点 和一个出度为0的顶点 称为汇点 则从源点到汇点之间的最长的路径称为关键路径 AOE网 无回路有向网络可以用来表示一个包含多项活动的工程计划 有向边表示一项活动 边上的
  • 请教100位行业专家后,我总结出第三方支付“断直连”的8大疑问!

    2018年4月11日 央行行长易纲在博鳌亚洲论坛上表示 中国的第三方支付是走在世界前列的 但行业在发展过程中也出现了一些风险 如何在有效防范风险的同时鼓励竞争 鼓励创新 这是一个挺难解的题目 要做好平衡 断直连 监管细则已经落地 市场格局和
  • mysql 配置多个数据库连接_SpringBoot和Mybatis配置多数据源连接多个数据库

    目前业界操作数据库的框架一般是 Mybatis 但在很多业务场景下 我们需要在一个工程里配置多个数据源来实现业务逻辑 在SpringBoot中也可以实现多数据源并配合Mybatis框架编写xml文件来执行SQL 在SpringBoot中 配
  • 浅谈ChatGPT在一个IT运维人眼中的日常使用场景

    前言 其实AI的概念已经存在了十多年 包括在运维领域 也从传统运维演化到了所有AIOps的概念 但一直以来对当前的AI并不是太看好 始终觉得当前的AI只是停留在 撞库 从海量的库里去匹配关键字触发语句 所谓的 小爱同学 小度小度 包括Sir
  • 高内聚与低耦合实现小记

    总所周知 实际软件开发中要实现高内聚 低耦合的设计原则 c语言和c 不同 c语言面向过程 c 面向对象 真正的项目中 要对业务升级 原来的业务函数需要保留 要保证老的功能继续维持 不能直接删除 这时候 c语言面向过程 通常使用回调的方法 c
  • 为什么面试狂问Redis,阿里面试官把我问到哑口无言…

    Redis在国内各大公司都很热门 比如新浪 阿里 腾讯 百度 美团 小米等 Redis也是大厂面试最爱问的 尤其是Redis客户端 Redis高级功能 Redis持久化和开发运维常用问题探讨 Redis复制的原理和优化策略 Redis分布式
  • Delegate总结

    关于Delegate已经写了很多 现总结如下 一 一条线是观察delegate从 net framework 1 1 到目前为止4 5的变迁 例如如果你用delegate来模拟事件 你需要自己 Add member to the invoc
  • 辅助信息服务器,我开启了辅助核算 要去哪里增加新的辅助信息?

    亲 您好 亿企代账提供三种辅助核算 应收账款 预收账款科目启用 客户 核算 应付账款 预付账款科目启用 供应商 核算 库存商品 原材料等科目启用 存货 核算 如果需要增加辅助信息 可按以下两种方法操作 方法一 在 设置 辅助设置 客户 处添
  • vue函数定义的多种写法

    vue定义方法 methods a e c alert aaa a e c alert aaa a function e c alert aaa 在JS中箭头函数根据是否书写大小括号可分为以下四种情况 不省略 const fun value
  • RocketMQ Rebalance流程分析

    这节介绍Rebalance流程 在介绍Consumer消费消息流程前 先介绍Rebalance得流程 该过程涉及到Consumer的启动 之前介绍过 Topic是一个逻辑概念 Topic下可以划分多个Queue以增加Consumer消费的并
  • react+antd+vscode的运行环境搭建

    初学者 在学着做一个前端项目 有时候要换新电脑 或者重装系统 前端代码就不能用了 解决时候总是忘记还遇到麻烦 记录一下 按步骤来吧 也不知道对不对 先这样用着 1 下载vscode 就去官网下就完事 好像点下载会根据电脑的系统版本位数啥的下
  • 接口测试&管理续集

    今天应大家需要 接着谈app端数据返回层面的用例设计方法 第二部分给大家安利一个 接口管理平台 以帮助大家解决接口文档维护 接口测试数据Mock 接口自动化测试等问题 希望对小伙伴们有用 言归正传 进入今天的话题 一 用例设计 查漏补缺 数

随机推荐

  • Python网络爬虫之js逆向之远程调用(rpc)免去抠代码补环境简介

    点击上方 Python共享之家 进行关注 回复 资源 即可获赠Python学习资料 今 日 鸡 汤 折戟沉沙铁未销 自将磨洗认前朝 大家好 我是黑脸怪 这篇文章主要给大家介绍jsrpc 方便大家日后在遇到JS逆向的时候派上用场 前言 jsr
  • Unity编辑器拓展(一)实现快速制作书本效果插件

    目录 前言 自定义窗口实现使用的方法 效果演示 前言 Unity自定义书本编辑器窗口 书本功能实现参考教程 Unity代码实现翻书效果 自定义窗口实现使用的方法 EditorWindow GetWindow EditorGUILayout
  • 数据库学习(6)MySQL数据库DDL——索引

    MySQL数据库DDL 索引 创建索引 添加与删除索引 索引的使用原则 数据排序的好处 一旦数据排序之后 查找的速度就会翻倍 现实世界跟程序世界都是如此 创建索引 CREATE TABLE 表名称 INDEX 索引名称 字段 注 排序方法为
  • ToDesk远程控制

    实现远程控制有多简单 https www todesk com download htmlhttps www todesk com download htmlhttps www todesk com download html 电脑浏览器打
  • vue-pdf使用+分页预览+第一查看正常,第二次查看空白解决方案

    重点提示 全网通用pdf查看的功能都是使用vue pdf这个插件 除了各种坑外 最致命的一点就是 它的npm包有一个Bug 在第一次查看之后 再次查看 页面会空白并报错 Error during font loading Failed to
  • jsp、freemarker、velocity、thymeleaf页面方案分析

    1 概述 在java领域 表现层技术主要有三种 1 jsp 2 freemarker 3 velocity 4 thymeleaf 2 jsp 优点 1 功能强大 可以写java代码 2 支持jsp标签 jsp tag 3 支持表达式语言
  • Kattis Doors

    Problem open kattis com problems doors vjudge net contest 183886 problem B Reference 点到线段的最短距离算法 Meaning 有两个球 Alex 和 Bob
  • FastDFS性能调优 know how

    FastDFS性能调优 本篇文章转载于FastDFS作者 余庆 大佬的 FastDFS分享与交流 公众号 众所周知 软件性能调优不是一撮而就的事情 它是一个反复磨合的过程 下面介绍FastDFS 几个性能调优相关的重要参数 供大家参考 1
  • React官网API模块知识点整理(三)

    react版本 16 13 1 1 React 顶层 API React Component React Component 是使用 ES6 classes 方式定义 React 组件的基类 React PureComponent Reac
  • formatter function (value,row,index){ } 参数的含义

    datagarid的formatter属性 formatter function value row index if value 1 return 提交 else if value 99 return 完成 else return 保存
  • 【python爬虫】爬取链家二手房数据

    相信大家买房前都会在网上找找资料 看看行情 问问朋友 今天就带大家扒一扒 链家二手房 的数据 一 查找数据所在位置 打开链家官网 进入二手房页面 选取某个城市 可以看到该城市房源总数以及房源列表数据 二 确定数据存放位置 某些网站的数据是存
  • LocalDate与Date介绍与转换

    一 介绍 java util Date和SimpleDateFormatter都不是线程安全的 而LocalDate和LocalTime和最基本的String一样 是不变类型 不单线程安全 而且不能修改 java util Date月份是从
  • Linux 脚本文件第一行的特殊注释符(井号和感叹号组合)的含义

    我的CSDN主页 My Python 学习个人备忘录 我的HOT博 usr bin env python 的含义 Python 代码存储文件 py 中 经常看到在首行最前端 都是半角符号 输入法英文状态下输入 这是 Linux 系统下指定脚
  • 图像 ISP 处理流程以及新人学习图像的注意点

    1 什么是 ISP ISP 全称 Image Signal Processing 即图像信号处理 景物通过光学图像投射到 sensor 表面后 光电转换为模拟电信号 消除噪声后经过 A D 转换后变为数字图像信号 由于原始的图像是 Baye
  • 2.1 信息的存储

    整数 虽然只能编码一个相对较小的数值范围 但是这种表示是精确的 符点数 虽然可以编码一个较大的数值范围 但是这种表示只是近似的 c c 完全相同的数字表示和运算 java 创建了一套新的数字表示和运算标准 gcc版本 gcc std c11
  • CSS特性---------继承性

    一 继承性 1 1 特性 子元素有默认继承父元素的特点 1 2 可继承的常见属性 font size font weight font family font style text indent text align line height
  • MATLAB医学DICOM影像读取与预处理

    来点有用的 MATLAB医学DICOM影像读取与预处理 一 DICOM文件的读取与解析 二 MR与CT像素处理 三 其他 by HPC ZY DICOM 是医学图像和相关信息的国际标准 常见类型有MR和CT 而它们在处理上有细微的不同 一
  • 【解决 vue-router 报错:Navigation cancelled from “/...“ to “/...“ with a new navigation】

    问题 项目中需要对用户是否登录进行判断 如果用户未登录或者 token 过期就需要跳转登录页面 进行登录验证 所以需要做一个拦截 在跳转登录页面时报了一个错 报错如下图所示 原因 这个错误是 vue router 内部错误 没有进行 cat
  • template的使用,泛式编程

    一个偶然的机会 让我接触到了泛式编程 它的美妙简直让我沉迷其中 短时间的学习 让我喜欢上了这个方法 它的出现让我想到了之前许多不理解的地方 C 中的STl库非常频繁的使用了它 因此特地去学习了一下 对template的学习 泛型编程 作为一
  • 行人重识别数据集转换--统一为market1501数据集进行多数据集联合训练

    0 前言 常用的reID数据集如图所示 下载好数据集 我的数据集一开始是这样的 第一步 创建出来market1501的数据集文件夹格式 market1501数据集的具体介绍可以看看这个 http blog fangchengjin cn r