78.43 / 70.45
TS + PACL 消融行
我跑出的 Rank-1 / mAP,与论文 Table 3 逐位吻合
15.56 pt
Rank-1 落差
简单加法融合相对残差门控的跌幅
37.99 GFLOPs
模型总计算量
token 选择与融合不改变模型结构
17 页
正式发表版
含方法主图、消融表与检索可视化
要解决的问题
给定一句自然语言描述,比如「穿黑色外套、背双肩包的男子」,系统要从大规模行人图库中检索出对应的人。这件事比图像行人重识别更难,原因有两个。
第一是文本与图像之间存在语义鸿沟,同一句话可以对应姿态、光照、视角完全不同的图像。第二是真正能区分身份的信息往往是细粒度局部线索,例如「黑色衬衫上的白色 logo」与「纯黑衬衫」,而全局特征容易把这些差异抹平。
CATSANet 没有继续堆叠模块,而是把三个互补的环节按顺序串起来:先减少视觉 token 的冗余与噪声,再让图像部件与文本 token 做可解释的软对齐,最后把对齐后的局部信息以残差方式融回全局检索表示。
方法三段式
跨图像语义一致性 token 选择
把 class token 与 patch 特征分离,对每个 patch 计算跨图像余弦一致性评分,用可学习温度与可学习保留比例(0.8)采样;3 倍超采样后做唯一性筛选与长度对齐,避免索引不足或输出维度不一致。
基于最优传输的部件对齐
用负余弦相似度构造代价矩阵,以 Sinkhorn 迭代求解熵正则最优传输(9 个部件、均匀边缘分布、ε = 0.05、迭代 10 次)。传输矩阵的对角线均值即损失,只在正样本对上计算,权重 0.02。
C = -F_img · F_txtᵀK = exp(-C / ε)u = 1/(K v), v = 1/(Kᵀ u), P = diag(u) K diag(v)L_PACL = -log(mean(diag(P)))对齐后残差交互融合
把部件特征 F_p 与全局特征 F_g 用可学习门控融合:乘性项调节局部与全局的交互强度,残差项保证原始信息不被破坏。
F = α (F_p ⊙ F_g) + (F_p + F_g)我做了什么
一句话概括:第一作者负责把方法定义出来,我负责把方法跑出来、验证出来、写出来。下面按时间线展开。
接手复现,建立可重复的基线
前身方法已有代码,但运行环境、依赖版本与实验记录不完整,需要先在干净环境里把结果复现出来。
- 在原压缩包基础上只替换改动过的文件,避免把混乱的本地修改一并带进来,并在新服务器上重建环境。
- 完成 100 epoch 训练(sdm+id+mlm,batch 64,lr 1e-5),得到 R1 79.305 / R5 91.147 / R10 94.282 / mAP 71.070,高于原记录 78.05。
- 对比 95 / 100 / 105 epoch,把 rank-1 的最优区间收窄到 90 至 110 epoch。
- 这套配置在 2025-03、2025-08、2026-01 三次运行中 best R1 均为 79.30474 @ epoch 87,逐位一致;后两次的代码快照可确认包含融合段。
训练诊断:先判断瓶颈在哪
复现成功后,继续加 epoch 或调学习率并不能稳定提升指标,需要先从日志里判断问题来源。
- 按损失项拆分训练日志,发现 id_loss 在总损失中占比接近一半,文本侧 loss 始终略高于图像侧。
- 确认学习率调度是「按批次衰减」而不是「按 epoch 衰减」,200 epoch 被拆成 200 次下降,导致后期学习率过低、指标回落。
- 提出「单纯改参数已经不够」,把讨论推进到方法层面,而不是继续在超参上打转。
PACL 工程落地:修复从未生效的损失
PACL 的公式与实现已经写进模型代码,但训练日志显示指标没有预期变化,需要确认损失是否真的参与优化。
- 逐项比对训练启动参数与 options.py,发现 pacl_loss_weight、pacl_ot_reg、pacl_ot_iters 三个参数没有在解析器中注册,命令行传入后并未生效;同时核查 loss_names 是否真的包含 pacl。
- 补全 PACL 的四处接入:objectives.py 的 Sinkhorn 与损失函数、build.py 的前向集成、options.py 的参数注册、processor.py 的日志输出;并在损失内部把 SAFL part 特征从 float16 转成 float32,避免半精度下的溢出与除零。
- 修正 MLM 相关配置冲突后,按正式配置启动 150 epoch 训练;2026-01-25 12:02 的云端运行得到 R1 78.42755(论文记为 78.43)/ R5 90.55 / R10 94.19 / mAP 70.45,best 出现在第 150 epoch。
- 保留了一组「PACL + 复杂融合」但 loss_names 只有 sdm+id+mlm 的 100 epoch 运行,best R1 79.01,与无 PACL 基线基本持平,说明收益来自损失真正生效,而不是「加个模块总会涨一点」。
- 与第一作者共同整理《PACL 实现说明》和《PACL 方法文档》,覆盖接入方式、参数含义、调参区间、日志格式与最优传输的理论推导。
融合模块的对照验证
残差交互融合是团队讨论中形成的方案,但「为什么不能直接把部件特征和全局特征相加」需要一个可复核的答案。
- 设计控制变量对照:两组均为 sdm+id+mlm、100 epoch、batch 64、lr 1e-5、ID 与 MLM 权重各 1.0、CUHK-PEDES,唯一差异是 build.py 中的融合代码段。
- 残差门控版本 best R1 79.30474 @ epoch 87(2025-08-20);简单加法版本 best R1 63.74269 @ epoch 86(2026-01-30),下降 15.56 个百分点。
- 同一组超参在 2025-03、2025-08、2026-01 三次运行中 best R1 逐位一致,整条实验链路可复现。
跨数据集调参与过拟合诊断
CUHK-PEDES 上的结论需要在另一个数据集上验证,RSTPReid 的文本更短、场景更复杂,是常见的泛化测试集。
- 2026-02-19 02:00 一轮:sdm+mlm+id+itc+pacl,lr 1e-5,100 epoch,batch 64,random sampler,PACL 权重 0.02,best R1 62.60 出现在第 7 epoch,此后不再提升。
- 同日 10:53 一轮:同损失组合,lr 2e-5,30 epoch,identity sampler,PACL 权重 0.01,ID 权重 1.0,weight decay 1e-4,warmup 10 epoch,best R1 60.25 出现在第 27 epoch,曲线更平缓但未超过第一轮。
- 结论:RSTPReid 的最优点出现很早,继续训练只会过拟合;PACL 权重不是越大越好,identity sampler 也不适合这个跨模态对比设置。论文最终报告的 67.05 / 54.37 是团队后续配置的结果,这两轮的作用是定位过拟合与权重敏感性。
论文写作、主图与检索配图
论文第 16 页的贡献声明写的是主稿撰写、算法设计与实验执行,我的工作还覆盖了图、文档与排版。
- 参与论文主图设计:提出在图像分支后增加「减少 patch」的步骤示意、调整箭头长度与层级关系,并补充对应的英文标注。
- 2025-07 参与论文初稿撰写,并与第一作者共同整理方法材料:减 Token 的处理流程、特征融合前后对比、FLOPs 结构表与可视化说明。
- 本地维护论文 LaTeX 工程(main.tex、pepadun.bib 与编译产物 prj.pdf)。早期稿件标题为 “Fine-Grained Token Selection and Post-alignment Fusion for Cross-Modal Person ReID”、方法名 GRFNet,加入 PACL 后扩展为 CATSANet。
- 2026-02-02 制作三行 top-10 检索对比图(原始、减 token、PACL + 减 token),准备五组覆盖三个检查点的样例并撰写图注英文描述;与第一作者共同完成公式整理与 LaTeX 排版检查。
评估口径、指标工具与可复现性
指标口径和留档方式决定了实验结论能不能被复核,这部分工作贯穿整个项目。
- 修改评估代码,使其只输出文本到图像(t2i)方向的指标,避免 i2t 指标干扰模型选择。
- 增加指标落盘与绘图脚本 plot_metrics.py,把每个 epoch 的 rank-1/5/10、mAP、mINP 写成 metrics.json,再生成单指标与全指标曲线,便于跨实验对比。
- 修复指标 JSON 序列化、checkpoint 路径与绘图依赖问题;改造可视化脚本,支持切换数据集、导出 top-10 检索结果图。
- 维护多份代码快照(改版4、pacl_01、VERSION)与每次运行的 configs、train_log,使关键数字可以回溯到具体日期、配置与代码版本。
关键数据
论文报告结果
| 数据集 | Rank-1 | Rank-5 | Rank-10 | mAP |
|---|---|---|---|---|
| CUHK-PEDES | 78.79 | 90.84 | 94.25 | 70.35 |
| RSTPReid | 67.05 | 83.55 | 89.30 | 54.37 |
这是团队整体结果,不是我单独跑出的数字。
CUHK-PEDES 消融(Table 3)
| 配置 | Rank-1 | ΔR1 | mAP | ΔmAP |
|---|---|---|---|---|
| Baseline | 77.23 | — | — | — |
| + Token Selection | 78.10 | +0.87 | — | +0.48 |
| + PACL | 77.73 | +0.50 | — | +0.18 |
| + Fusion | 77.79 | +0.56 | — | +0.17 |
| + TS + PACL | 78.43 | +1.20 | — | +0.70 |
| Full | 78.79 | +1.56 | — | +0.60 |
其中「+ TS + PACL」这一行,是我在 2026-01-25 云端训练得到的 78.43 / 70.45。
RSTPReid 消融(Table 4)
| 配置 | Rank-1 | ΔR1 | mAP | ΔmAP |
|---|---|---|---|---|
| CMLFA | 65.05 | — | 51.03 | — |
| + Token Selection | 65.65 | +0.60 | 53.34 | +2.31 |
| + TS + PACL | 66.95 | +1.90 | 54.34 | +3.31 |
| Full | 67.05 | +2.00 | 54.37 | +3.34 |
我亲手执行的主要实验
| 时间 | 配置 | 数据集 / 轮数 | 结果 | 用途 |
|---|---|---|---|---|
| 2025-03-04 | sdm+id+mlm,100 ep | CUHK-PEDES / 100 | R1 79.305 / mAP 71.070 | 复现基线 |
| 2025-03-08 | 95 / 100 / 105 ep 对比 | CUHK-PEDES / 95–105 | 约 77 / 79.30 / 78.85 | 确认 epoch 敏感区间 |
| 2025-03-15 | sdm+mlm+id+itc,150 ep | CUHK-PEDES / 150 | R1 78.10 @ ep130 | 无融合基线 |
| 2025-08-20 | 残差门控融合 | CUHK-PEDES / 100 | R1 79.30474 @ ep87 | 融合方案验证 |
| 2026-01-25 12:02 | sdm+mlm+id+itc+pacl,150 ep | CUHK-PEDES / 150 | R1 78.43 / mAP 70.45 | 论文 Table 3 关键行 |
| 2026-01-25 15:12 | PACL + 复杂融合,loss_names 无 pacl | CUHK-PEDES / 100 | R1 79.01234 @ ep87 | PACL 未启用证据 |
| 2026-01-26 | 同配置独立复跑(第三次) | CUHK-PEDES / 100 | R1 79.30474 @ ep87 | 证明可复现 |
| 2026-01-30 | 简单加法融合 | CUHK-PEDES / 100 | R1 63.74269 @ ep86 | 反证门控必要性 |
| 2026-02-19 02:00 | pacl 0.02,random sampler | RSTPReid / 100 | R1 62.60 @ ep7 | 过拟合诊断 |
| 2026-02-19 10:53 | pacl 0.01,identity sampler | RSTPReid / 30 | R1 60.25 @ ep27 | 缩轮与降权对照 |
论文 full model 的 78.79 / 70.35 是团队整体结果;2026-02-18 的 75.55 异常运行未列入,待核对运行环境与数据路径。
工程排错清单
不报错、日志也正常,只有指标不对——这类静默失效最难查
PACL 参数未注册→
- 表现
- 训练正常,无报错,指标不涨
- 处理
- 逐项比对命令行参数与 options.py,补注册三个 PACL 参数后重新训练
PACL 未进入损失列表→
- 表现
- 参数已传,但日志 loss_names 不含 pacl,结果与无 PACL 持平(79.01 vs 79.30)
- 处理
- 在 loss_names 中加入 pacl,并确认日志出现 pacl_loss 字段
半精度数值不稳定→
- 表现
- Sinkhorn 输入在 float16 下可能溢出或除零
- 处理
- 损失内部把 SAFL part 特征转成 float32 再计算代价矩阵
MLM 配置冲突→
- 表现
- 掩码策略与损失配置互相矛盾
- 处理
- 对照配置项与模型前向逻辑,统一配置后重启训练
指标 JSON 序列化失败→
- 表现
- 评估结束后保存结果报错
- 处理
- 从 traceback 定位到张量类型,转换为 Python 标量后写入
checkpoint 路径错误→
- 表现
- 恢复训练找不到权重
- 处理
- 检查保存路径与加载路径的拼接,统一路径并复跑
绘图依赖缺失→
- 表现
- 训练曲线无法生成
- 处理
- 查看绘图函数调用栈,补齐依赖并改用无界面后端
评估方向干扰模型选择→
- 表现
- i2t 与 t2i 指标同时参与选模
- 处理
- 阅读评估器逻辑,只保留 t2i 指标用于选模
这段经历对应什么能力
复现与建基线
换硬件后复跑 79.305 / 71.070;同超参三次独立运行 best R1 逐位一致
实验设计与诊断
95/100/105 epoch 对比、loss 分解、学习率调度分析、RSTPReid 两轮过拟合诊断
工程排错
定位 PACL 三参数未注册、loss_names 未含 pacl、float16 数值不稳定、MLM 配置冲突等静默故障
对照验证
融合对照 79.30 与 63.74,两组 sdm+id+mlm、100 ep、batch 64、lr 1e-5 逐项一致
论文写作与可视化
初稿参与、主图设计、五组检索样例与 top-10 图、共同整理 PACL 文档、LaTeX 工程
数据严谨性
消融行与论文逐位吻合,配置与日志留存,异常结果单独标注不引用