余弦度量的魔力:cosine_metric_learning的cosine-softmax损失如何让Deep SORT追得更准
【免费下载链接】cosine_metric_learningDeep Cosine Metric Learning for Person Re-identification项目地址: https://gitcode.com/gh_mirrors/co/cosine_metric_learning
cosine_metric_learning是 Deep SORT 多目标跟踪器的官方配套训练项目,通过 cosine-softmax 余弦度量损失训练行人重识别特征网络,让目标跟踪在多摄像头、遮挡场景下"追得更准"。本文带你快速理解其原理,并跑通 Market1501 与 MARS 数据集的完整训练流程。
🎯 什么是 cosine_metric_learning?
一句话概括:它训练一个"会认人"的神经网络,并把它冻结成mars.pb供 Deep SORT 调用。
在多目标跟踪中,当目标被遮挡几秒后再出现,跟踪器需要回答一个问题——"新出现的这个检测框,是不是刚才那个人?"答案就藏在**行人重识别(Person Re-identification)**特征里。本项目基于 2018 年 WACV 论文《Deep Cosine Metric Learning for Person Re-identification》,提供:
| 能力 | 对应文件 |
|---|---|
| 3 种损失函数(cosine-softmax / magnet / triplet) | train_app.py |
| Soft-margin 三元组损失与磁体损失实现 | losses.py |
| Deep SORT 残差骨干网络(ELU + 批归一化) | nets/deep_sort/network_definition.py |
| 余弦距离 / 平方距离度量与 CMC 指标 | metrics.py |
| 异步队列训练器 | queued_trainer.py |
| Market1501 / MARS 数据集加载 | datasets/market1501.py、datasets/mars.py |
| 训练与特征导出入口 | train_market1501.py、train_mars.py |
🧮 核心原理:cosine-softmax 到底"余弦"在哪里?
传统 softmax 分类器只做"分对人",但特征向量的长度会不受控,导致推理时用欧氏距离比较时不稳定。cosine-softmax 的巧妙之处在于三点:
- L2 归一化特征:网络输出的特征先被归一化为单位向量(见 network_definition.py 中的
l2_normalize),只保留"方向"、丢弃"长度"; - 球面原型(mean vectors):每个身份对应一个可学习的均值向量,同样被归一化到单位球面上;
- 可学习温度 scale:logits =
scale × (特征 · 原型),即对余弦相似度乘以缩放系数。
这样一来,损失函数优化的目标等价于:同一人的特征方向聚拢、不同人的特征方向远离——正是余弦度量学习(Cosine Metric Learning)的定义。而 metrics.py 中的cosine_distance函数(余弦距离 = 1 − 余弦相似度)在评估 CMC 指标时与训练目标完全一致,实现"训练什么、就度量什么"。
💡 项目同时内置
magnet(磁体损失)和triplet(软边界三元组损失,见 losses.py)作为对照基线,方便你用--loss_mode一键切换实验。
📦 项目结构与目录速览
cosine_metric_learning/ ├── train_market1501.py # Market1501 训练 / 评估 / 导出入口 ├── train_mars.py # MARS 训练 / 评估 / 导出入口 ├── train_app.py # 训练主循环、损失分发、模型冻结 ├── queued_trainer.py # 基于队列的异步数据训练器 ├── losses.py # 三元组损失、磁体损失 ├── metrics.py # 距离度量、CMC@k 流式指标 ├── vis_tools.py # t-SNE 特征可视化散点图 ├── datasets/ # Market1501 / MARS 数据读取 └── nets/deep_sort/ # Deep SORT 骨干网络定义训练时每个身份固定采样 4 张图片(num_images_per_id=4),由 queued_trainer.py 的random_sample_identities_forever生成器无限循环取样,配合 10% 训练集留出做验证——这是行人重识别训练的标准配方。
🚀 快速上手:三步跑通 Market1501 训练
第 1 步:启动训练(默认即 cosine-softmax 损失)
python train_market1501.py \ --dataset_dir=./Market-1501-v15.09.15/ \ --loss_mode=cosine-softmax \ --log_dir=./output/market1501/ \ --run_id=cosine-softmax第 2 步:TensorBoard 监控训练曲线
tensorboard --logdir ./output/market1501/cosine-softmax --port 6006第 3 步:并行运行 CMC 评估(CPU 上阻塞等待 checkpoint)
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=cosine-softmax \ --eval_log_dir=./eval_output/market1501评估结果(Precision@1 / 5 / 10 / 20)会实时写入 TensorBoard,随时确认模型是否在变强。MARS 数据集的完整流程见 README.md,命令结构与 Market1501 完全一致。
🔌 模型导出:一行命令接入 Deep SORT
训练结束后,只需把 checkpoint 冻结为纯推理图:
python train_mars.py --mode=freeze --restore_path=PATH_TO_CHECKPOINT生成的mars.pb可直接喂给 Deep SORT 跟踪器。同理,--mode=export能把测试集特征导出为.mat文件,配合数据集官方评测脚本完成最终测试(注意:评测侧需把最大池化换成平均池化并做二次归一化,与训练时的余弦度量对齐)。
❓ 常见问题
- 为什么不用现成的 ImageNet 预训练特征?行人重识别跨摄像头分布差异极大,需要按身份监督训练度量空间,这正是 cosine-softmax 解决的问题。
- 三种损失怎么选?论文结论是 cosine-softmax 最优且最稳;
magnet和triplet留作消融对比,切--loss_mode即可。 - 如何验证特征学得好?vis_tools.py 提供 t-SNE 散点工具,把特征+小图拼成一张大图,肉眼可见"同一个人聚成一团"。
- 预训练模型哪里找?论文配套的预训练模型下载地址与数据集说明均写在 README.md 中。
✅ 小结
cosine_metric_learning 用"单位球面上的余弦相似度"重新定义了行人重识别的训练目标,是 Deep SORT 能精准关联跨帧、跨摄像头检测的关键一环。理解它的三条主线——L2 归一化特征、球面原型、可学习温度——你就能举一反三地把它迁移到其他度量学习任务中。
【免费下载链接】cosine_metric_learningDeep Cosine Metric Learning for Person Re-identification项目地址: https://gitcode.com/gh_mirrors/co/cosine_metric_learning
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考