Market1501/DukeMTMC-reID/MSMT17_V2 3大ReID数据集:统一格式与torchreid 1.4.0加载实战

发布时间:2026/7/6 12:25:32
Market1501/DukeMTMC-reID/MSMT17_V2 3大ReID数据集:统一格式与torchreid 1.4.0加载实战 三大ReID数据集格式统一与torchreid实战指南行人重识别ReID作为计算机视觉领域的重要研究方向其性能高度依赖于数据集的规模和质量。Market1501、DukeMTMC-reID和MSMT17_V2作为当前最主流的三大基准数据集各自具有独特的采集环境和数据特点。但在实际项目中不同数据集间的格式差异往往成为算法验证和模型训练的障碍。1. 数据集核心差异与统一必要性三大数据集虽然在整体结构上都包含训练集、查询集query和测试集gallery但在目录组织、命名规则和标注方式上存在显著差异特征Market1501DukeMTMC-reIDMSMT17_V2原始图像分辨率128×64统一尺寸原始多样尺寸原始多样尺寸命名规则0001_c1s1_000151_01.jpg0005_c2_f0046985.jpg0001_c001_000152_00.jpg摄像头数量6台8台15台跨摄像头标注确保每人≥2摄像头每人≥2摄像头自然场景分布干扰项处理专用500K干扰集包含408干扰ID自然背景干扰这种差异会导致工程适配成本高每次切换数据集都需要重写数据加载逻辑评估标准不统一相同指标在不同数据集上可能含义不同模型泛化测试难难以快速验证模型在多场景下的表现通过将DukeMTMC-reID和MSMT17_V2转换为Market1501格式我们可以使用同一套数据加载代码保持评估协议的一致性方便进行跨数据集实验2. 格式转换实战2.1 DukeMTMC-reID转换方案DukeMTMC-reID的原始结构为DukeMTMC-reID/ bounding_box_train/ # 训练集 bounding_box_test/ # 测试集 query/ # 查询集转换脚本核心逻辑import os import shutil from tqdm import tqdm def convert_duke_to_market(src_root, dst_root): splits [train, test, query] for split in splits: src_dir os.path.join(src_root, fbounding_box_{split}) dst_dir os.path.join(dst_root, fbounding_box_{split}) os.makedirs(dst_dir, exist_okTrue) for img_name in tqdm(os.listdir(src_dir)): if not img_name.endswith(.jpg): continue # 解析原始信息0005_c2_f0046985.jpg pid, cam, frame img_name.split(_)[:3] new_name f{pid.zfill(4)}_c{cam[1:]}_duke{frame[1:]}.jpg shutil.copy(os.path.join(src_dir, img_name), os.path.join(dst_dir, new_name))关键转换点保持ID编号不变但统一为4位数字摄像头编号从c2变为c2保持兼容添加duke前缀避免帧号冲突2.2 MSMT17_V2转换方案MSMT17_V2的原始结构更为复杂MSMT17_V2/ mask_train_v2/ # 训练图像 mask_test_v2/ # 测试图像 list_train.txt # 训练集标注 list_query.txt # 查询集标注 list_gallery.txt # 测试集标注转换时需要特别注意从标注文件中解析图像路径和ID处理多时段采集带来的复杂命名def convert_msmt_to_market(src_root, dst_root): # 建立ID映射以避免与现有ID冲突 id_map {} current_max_id 1501 # Market1501的最大ID for split, dst_subdir in [(train, bounding_box_train), (query, query), (gallery, bounding_box_test)]: with open(os.path.join(src_root, flist_{split}.txt)) as f: lines f.readlines() dst_dir os.path.join(dst_root, dst_subdir) os.makedirs(dst_dir, exist_okTrue) for line in tqdm(lines): img_path, pid line.strip().split() pid int(pid) # 分配新ID if pid not in id_map: id_map[pid] current_max_id current_max_id 1 # 解析摄像头和帧信息0001_c001_000152_00.jpg parts os.path.basename(img_path).split(_) cam parts[1][1:] # 去掉c前缀 frame parts[2] new_name f{id_map[pid]:04d}_c{cam}_msmt{frame}.jpg shutil.copy(os.path.join(src_root, img_path), os.path.join(dst_dir, new_name))注意MSMT17_V2的测试集规模较大约93k图像转换过程可能需要较长时间建议在服务器环境下执行。3. torchreid集成实战torchreid 1.4.0提供了统一的ImageDataManager接口来加载数据集。格式统一后我们可以用相同方式加载所有数据集import torchreid # 初始化数据管理器 datamanager torchreid.data.ImageDataManager( rootreid_data, sources[market1501, dukemtmc_reid, msmt17], targets[market1501], height256, width128, batch_size_train32, batch_size_test100, transforms[random_flip, color_jitter] ) # 获取训练加载器 train_loader datamanager.train_loader # 获取测试加载器 test_loader datamanager.test_loader3.1 多数据集联合训练格式统一后可以轻松实现多数据集联合训练class CombinedDataset(torchreid.data.ImageDataset): def __init__(self, datasets): self.img_items [] pid_offset 0 for dataset in datasets: for img_path, pid, camid in dataset.img_items: self.img_items.append((img_path, pidpid_offset, camid)) pid_offset len(set([x[1] for x in dataset.img_items])) self.num_pids pid_offset3.2 跨数据集评估统一格式使得跨数据集评估变得直观def cross_dataset_eval(model, source, target): # 加载源数据集训练 train_loader get_loader(source) # 在目标数据集测试 test_loader get_loader(target) model.fit(train_loader) metrics model.evaluate(test_loader) print(f{source}-{target}: {metrics})4. 性能对比与选择建议通过统一格式我们可以系统对比各数据集特性指标Market1501DukeMTMC-reIDMSMT17_V2训练集图像数12,93616,52232,621查询集图像数3,3682,22811,659测试集图像数19,73217,66182,161平均每ID图像数17.223.530.8场景多样性校园超市大学校园多场景混合主要挑战光照变化视角变化天气时段变化选择建议算法验证优先使用Market1501因其社区认可度高模型鲁棒性测试加入MSMT17_V2的多场景数据跨摄像头性能DukeMTMC-reID提供丰富的跨视角样本实际项目中我通常会采用分阶段训练策略在Market1501上快速验证模型结构加入DukeMTMC-reID提升跨视角能力最后用MSMT17_V2增强泛化性能格式统一后这种工作流可以无缝衔接大幅提升实验效率。