返回首页
RESEARCH / CATSANET

CATSANet:实验执行、工程落地与成稿

从接手复现到论文发表

角色: 第二作者2025.02 — 2026.08Pattern Analysis and Applications, 2026, 29:176

文本到图像行人重识别。把「筛掉冗余视觉 token、在部件级别做软对齐、再把局部线索融回全局表示」串成一条渐进式对齐流水线。我负责把方法跑起来、验证出来、写出来。

78.43 / 70.45

TS + PACL 消融行

我跑出的 Rank-1 / mAP,与论文 Table 3 逐位吻合

15.56 pt

Rank-1 落差

简单加法融合相对残差门控的跌幅

37.99 GFLOPs

模型总计算量

token 选择与融合不改变模型结构

17 页

正式发表版

含方法主图、消融表与检索可视化

CONTEXT / 01

要解决的问题

给定一句自然语言描述,比如「穿黑色外套、背双肩包的男子」,系统要从大规模行人图库中检索出对应的人。这件事比图像行人重识别更难,原因有两个。

第一是文本与图像之间存在语义鸿沟,同一句话可以对应姿态、光照、视角完全不同的图像。第二是真正能区分身份的信息往往是细粒度局部线索,例如「黑色衬衫上的白色 logo」与「纯黑衬衫」,而全局特征容易把这些差异抹平。

CATSANet 没有继续堆叠模块,而是把三个互补的环节按顺序串起来:先减少视觉 token 的冗余与噪声,再让图像部件与文本 token 做可解释的软对齐,最后把对齐后的局部信息以残差方式融回全局检索表示。

METHOD / 02

方法三段式

CTS

跨图像语义一致性 token 选择

把 class token 与 patch 特征分离,对每个 patch 计算跨图像余弦一致性评分,用可学习温度与可学习保留比例(0.8)采样;3 倍超采样后做唯一性筛选与长度对齐,避免索引不足或输出维度不一致。

PACL

基于最优传输的部件对齐

用负余弦相似度构造代价矩阵,以 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)))
PRIF

对齐后残差交互融合

把部件特征 F_p 与全局特征 F_g 用可学习门控融合:乘性项调节局部与全局的交互强度,残差项保证原始信息不被破坏。

F = α (F_p ⊙ F_g) + (F_p + F_g)
WORK / 03

我做了什么

一句话概括:第一作者负责把方法定义出来,我负责把方法跑出来、验证出来、写出来。下面按时间线展开。

2025.02 — 2025.03

接手复现,建立可重复的基线

前身方法已有代码,但运行环境、依赖版本与实验记录不完整,需要先在干净环境里把结果复现出来。

  • 在原压缩包基础上只替换改动过的文件,避免把混乱的本地修改一并带进来,并在新服务器上重建环境。
  • 完成 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,逐位一致;后两次的代码快照可确认包含融合段。
2025.03

训练诊断:先判断瓶颈在哪

复现成功后,继续加 epoch 或调学习率并不能稳定提升指标,需要先从日志里判断问题来源。

  • 按损失项拆分训练日志,发现 id_loss 在总损失中占比接近一半,文本侧 loss 始终略高于图像侧。
  • 确认学习率调度是「按批次衰减」而不是「按 epoch 衰减」,200 epoch 被拆成 200 次下降,导致后期学习率过低、指标回落。
  • 提出「单纯改参数已经不够」,把讨论推进到方法层面,而不是继续在超参上打转。
2026.01

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 方法文档》,覆盖接入方式、参数含义、调参区间、日志格式与最优传输的理论推导。
2025.08 — 2026.01

融合模块的对照验证

残差交互融合是团队讨论中形成的方案,但「为什么不能直接把部件特征和全局特征相加」需要一个可复核的答案。

  • 设计控制变量对照:两组均为 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 逐位一致,整条实验链路可复现。
2025 — 2026

跨数据集调参与过拟合诊断

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 是团队后续配置的结果,这两轮的作用是定位过拟合与权重敏感性。
2025.03 — 2026.02

论文写作、主图与检索配图

论文第 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 排版检查。
2025 — 2026

评估口径、指标工具与可复现性

指标口径和留档方式决定了实验结论能不能被复核,这部分工作贯穿整个项目。

  • 修改评估代码,使其只输出文本到图像(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,使关键数字可以回溯到具体日期、配置与代码版本。
DATA / 04

关键数据

论文报告结果

数据集Rank-1Rank-5Rank-10mAP
CUHK-PEDES78.7990.8494.2570.35
RSTPReid67.0583.5589.3054.37

这是团队整体结果,不是我单独跑出的数字。

CUHK-PEDES 消融(Table 3)

配置Rank-1ΔR1mAPΔmAP
Baseline77.23———
+ Token Selection78.10+0.87—+0.48
+ PACL77.73+0.50—+0.18
+ Fusion77.79+0.56—+0.17
+ TS + PACL78.43+1.20—+0.70
Full78.79+1.56—+0.60

其中「+ TS + PACL」这一行,是我在 2026-01-25 云端训练得到的 78.43 / 70.45。

RSTPReid 消融(Table 4)

配置Rank-1ΔR1mAPΔmAP
CMLFA65.05—51.03—
+ Token Selection65.65+0.6053.34+2.31
+ TS + PACL66.95+1.9054.34+3.31
Full67.05+2.0054.37+3.34

我亲手执行的主要实验

时间配置数据集 / 轮数结果用途
2025-03-04sdm+id+mlm,100 epCUHK-PEDES / 100R1 79.305 / mAP 71.070复现基线
2025-03-0895 / 100 / 105 ep 对比CUHK-PEDES / 95–105约 77 / 79.30 / 78.85确认 epoch 敏感区间
2025-03-15sdm+mlm+id+itc,150 epCUHK-PEDES / 150R1 78.10 @ ep130无融合基线
2025-08-20残差门控融合CUHK-PEDES / 100R1 79.30474 @ ep87融合方案验证
2026-01-25 12:02sdm+mlm+id+itc+pacl,150 epCUHK-PEDES / 150R1 78.43 / mAP 70.45论文 Table 3 关键行
2026-01-25 15:12PACL + 复杂融合,loss_names 无 paclCUHK-PEDES / 100R1 79.01234 @ ep87PACL 未启用证据
2026-01-26同配置独立复跑(第三次)CUHK-PEDES / 100R1 79.30474 @ ep87证明可复现
2026-01-30简单加法融合CUHK-PEDES / 100R1 63.74269 @ ep86反证门控必要性
2026-02-19 02:00pacl 0.02,random samplerRSTPReid / 100R1 62.60 @ ep7过拟合诊断
2026-02-19 10:53pacl 0.01,identity samplerRSTPReid / 30R1 60.25 @ ep27缩轮与降权对照

论文 full model 的 78.79 / 70.35 是团队整体结果;2026-02-18 的 75.55 异常运行未列入,待核对运行环境与数据路径。

DEBUG / 05

工程排错清单

不报错、日志也正常,只有指标不对——这类静默失效最难查

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 指标用于选模
TAKEAWAY / 06

这段经历对应什么能力

复现与建基线

换硬件后复跑 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 工程

数据严谨性

消融行与论文逐位吻合,配置与日志留存,异常结果单独标注不引用

论文与代码

CATSANet 发表于 Pattern Analysis and Applications(2026, 29:176)。论文 full model 的 78.79 / 70.35 是团队整体结果,不是我单独跑出的数字;我的工作就是上面记录的实验执行、工程落地、与第一作者共同整理的方法文档与部分成稿。

内容依据训练日志、论文表格与工作记录整理;2026-02-18 的异常运行已排除在外。