打造你自己的行人重识别模型:基于 cosine_metric_learning 框架扩展自定义数据集开发指南
2026/9/16 17:08:55 网站建设 项目流程

打造你自己的行人重识别模型:基于 cosine_metric_learning 框架扩展自定义数据集开发指南

【免费下载链接】cosine_metric_learningDeep Cosine Metric Learning for Person Re-identification项目地址: https://gitcode.com/gh_mirrors/co/cosine_metric_learning

cosine_metric_learning 是一个基于 Deep Cosine Metric Learning 论文的开源行人重识别(Person Re-ID)训练框架,支持在 Market1501、MARS 等公开数据集上训练余弦度量模型,并一键导出为 Deep SORT 追踪器可直接使用的推理图。本文带你从零搭建属于自己的 Re-ID 模型——只需四步,就能把自己的数据集接入训练流程。


🧩 框架架构:5 个核心文件一次看懂

在动手之前,先花 1 分钟建立全局认知:

文件职责
train_app.py训练引擎:封装了train_loopeval_loopfreeze等核心函数,接收图片路径列表 + 标签数组即可启动训练
datasets/数据加载器:Market1501、MARS 各自一个文件,负责扫描目录并返回(文件名列表, 身份 ID 列表, 摄像头索引列表)
nets/deep_sort/network_definition.py卷积网络定义:4 层残差块 → 128 维特征 → L2 归一化,支持 cosine-softmax / magnet / triplet 三种损失
losses.py损失函数实现:soft-margin triplet loss 与 magnet loss
queued_trainer.py异步预取队列,保证 GPU 不等待数据 IO

💡 关键认知:train_loop的输入是任意图片路径列表 + 任意整数标签数组,并不绑定具体数据集。这就是扩展自定义数据集的"突破口"。


🚀 快速上手:先跑通一个公开数据集

克隆仓库

git clone https://gitcode.com/gh_mirrors/co/cosine_metric_learning cd cosine_metric_learning

用 Market1501 训练

将 Market-1501 数据集解压到./Market-1501-v15.09.15/后执行:

python train_market1501.py \ --dataset_dir=./Market-1501-v15.09.15/ \ --loss_mode=cosine-softmax \ --log_dir=./output/market1501/ \ --run_id=my-first-run

训练日志和 TensorBoard checkpoint 会保存在./output/market1501/my-first-run/

并行启动验证集 CMC 评估

CUDA_VISIBLE_DEVICES="" python train_market1501.py \ --mode=eval \ --dataset_dir=./Market-1501-v15.09.15/ \ --loss_mode=cosine-softmax \ --log_dir=./output/market1501/ \ --run_id=my-first-run \ --eval_log_dir=./eval_output/market1501

然后用 TensorBoard 监控两个目录(训练 loss 和验证 CMC@1/5/10/20),即可实时追踪模型收敛情况。


🛠 扩展自定义数据集:四步走

第一步:规划数据目录结构

框架不关心你的数据是怎么来的,只关心三样东西

  1. 每张图片的绝对路径
  2. 对应的身份 ID(整数,≥ 0,同一个人的所有图片共享同一 ID)
  3. 对应的摄像头/视角索引(整数,用于交叉视角验证;单摄像头场景可全部填 0)

推荐目录组织方式(最直观):

my_dataset/ ├── 001/ # 身份 001 │ ├── cam1_000.jpg │ └── cam2_001.jpg ├── 002/ │ └── ... └── ...

⚠️ 注意:身份 ID 建议从 0 开始连续编号,最大 ID + 1 决定了网络的分类头大小(num_classes)。

第二步:编写数据加载模块

新建datasets/custom.py,核心函数只需返回三个列表:

# datasets/custom.py import os def read_train_split_to_str(dataset_dir): """扫描数据集目录,返回 (filenames, ids, camera_indices)。""" filenames, ids, camera_indices = [], [], [] for person_dir in sorted(os.listdir(dataset_dir)): person_path = os.path.join(dataset_dir, person_dir) if not os.path.isdir(person_path): continue person_id = int(person_dir) for cam_dir in sorted(os.listdir(person_path)): cam_idx = int(cam_dir.replace("cam", "")) img_dir = os.path.join(person_path, cam_dir) for fname in sorted(os.listdir(img_dir)): if not fname.endswith(".jpg"): continue filenames.append(os.path.join(img_dir, fname)) ids.append(person_id) camera_indices.append(cam_idx) return filenames, ids, camera_indices

📌 可复用datasets/util.py中的create_validation_split自动按身份划分训练/验证集,create_cmc_probe_and_gallery生成跨视角 CMC 评估对。

第三步:编写训练入口脚本

新建train_custom.py,仿照 train_market1501.py 的结构,核心调用如下:

# train_custom.py(核心片段) import train_app import datasets.custom as custom import nets.deep_sort.network_definition as net MAX_LABEL = 100 # 改成你数据集中最大 ID IMAGE_SHAPE = (128, 64, 3) # 高×宽×通道,可按需调整 # —— 训练 —— network_factory = net.create_network_factory( is_training=True, num_classes=MAX_LABEL + 1, add_logits=True) train_app.train_loop( net.preprocess, network_factory, train_x=filenames, train_y=ids, num_images_per_id=4, image_shape=IMAGE_SHAPE, batch_size=128, log_dir="./output/custom/", loss_mode="cosine-softmax", run_id="v1")

几个容易踩的坑

问题原因解决方案
batch_size报错必须能被num_images_per_id整除128 能被 4 整除 ✓
特征维度不匹配num_classes必须 ≥ 最大 ID + 1确认MAX_LABEL
图片读不出来框架内部用tf.image.decode_jpeg解码确保图片是JPEG 格式、BGR 色彩空间
验证集为空某身份只有 1 张图,无法组成 probe-gallery 对每个身份至少 2 张图

第四步:训练、评估与导出

# 训练 python train_custom.py --dataset_dir=./my_dataset/ --run_id=v1 # 并行 CMC 评估(新终端) CUDA_VISIBLE_DEVICES="" python train_custom.py --mode=eval \ --dataset_dir=./my_dataset/ --run_id=v1 # 导出 .pb 推理图(供 Deep SORT 使用) python train_custom.py --mode=freeze --restore_path=./output/custom/v1/model.ckpt

导出的.pb文件可直接加载到 Deep SORT 追踪器中,完成从训练到部署的闭环。


📊 损失函数怎么选?

框架内置三种损失模式,通过--loss_mode切换:

模式适用场景特点
cosine-softmax(默认)大多数 Re-ID 任务用余弦相似度 + 可学习 scale,训练稳定,推荐首选
triplet小数据集、类内差异大Soft-margin triplet loss,对 hard negative 敏感
magnet中等规模数据自适应密度判别,类间间隔自动调节

论文实验表明,在 Market1501 上cosine-softmax综合表现最优,新手建议从这里起步。


🎯 总结:扩展清单

  • ✅ 组织数据目录:按身份ID/摄像头/图片.jpg三级结构存放
  • ✅ 编写datasets/custom.py:返回(路径列表, ID 列表, 摄像头列表)
  • ✅ 编写train_custom.py:调用train_app.train_loop,设置正确的num_classesimage_shape
  • ✅ 训练 → CMC 验证 → 导出.pb,三步完成模型交付

掌握这套流程后,无论你的数据来自园区摄像头、商场监控还是手机相册,都能在cosine_metric_learning框架上快速训练出专属的行人重识别模型 🎉

【免费下载链接】cosine_metric_learningDeep Cosine Metric Learning for Person Re-identification项目地址: https://gitcode.com/gh_mirrors/co/cosine_metric_learning

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询