读取图像与标注
数据集给出一张道路图像,以及训练时使用的类别和真实框。测试时没有真实框参与预测。
configs/cauvis/...sdgod.py:15–21这张图把官方代码的实际执行路径放在主层,把论文中存在但代码未执行的机制作为红色审计层。所有“因果”“解耦”等词只代表论文命名,不把它们当成代码已经证明的性质。
从一张道路图像开始,逐步跟踪它怎样变成候选框。每一步都列出输入、计算、输出和作用;先理解主干流程,再到下一节放大 Cauvis 内部。
数据集给出一张道路图像,以及训练时使用的类别和真实框。测试时没有真实框参与预测。
configs/cauvis/...sdgod.py:15–21把像素调整到预训练 DINOv2 熟悉的数值分布,生成真正送入 backbone 的张量。
configs/_base_/models/dinov2_dinohead.py:13–18ViT 不逐像素计算,而把每个 16×16 图像块编码为一条 1024 维向量。
B×3×640×640 → B×1601×1024这是方法真正改动 backbone 的位置。DINOv2 block 提取上下文特征,随后共享的 Cauvis 对 patch tokens 做一次小幅修正。
cauvis_backbone.py:35–42 · cauvis.py:123–134检测器需要不同尺度的信息,所以在四个深度截取 token,并重新排成二维特征图。
cauvis_backbone.py:43–50DINOv2 原生只有单一 patch 尺度,代码用插值构造检测器需要的四级金字塔。
dino_v2.py:358–386Transformer 检测器使用 256 维特征,因此 neck 把 backbone 的 1024 通道压缩到 256。
dinov2_dinohead.py:39–466 层 deformable encoder 跨尺度聚合信息;two-stage 机制再从 encoder 输出中选择高分候选,初始化 decoder queries。
dinov2_dinohead.py:8–12, 47–53, 64–696 层 decoder 让 queries 彼此交互,并从四尺度 encoder memory 中寻找与各自目标相关的信息。
dinov2_dinohead.py:54–63检测头把 decoder 特征翻译为 7 类得分和归一化框坐标。训练与推理在这里采取不同的收尾方式。
dinov2_dinohead.py:70–89 · detr_head.py:605–620max_per_img=300)。下面只按 cauvis.py 的算子画图。变量名 main / causal / auxiliary 沿用代码与论文,但这些名称本身不能证明特征具有因果含义。
CLS token 不参加 Cauvis 内部计算,结束后再拼回。空间 H、W 参数传入模块,但当前前向没有用它们做二维频域变换。
m = SiLU(Linear(R))
output = α · m
u = SiLU(MLP(R))
f = FourierBranch(u) + u
output = β · f
Wq/Wk,也没有对 A 做 SVD、top-k 截断或软阈值。论文 §4.1 的“最大奇异值因果子空间”没有进入这条可执行路径。三者都是 nn.Parameter,因此融合比例可学习。它们控制分支强度,但不是按样本动态生成的门控权重。
1600 → zero pad 2048 → FFT(dim=1) → mask → iFFT → crop掩码保留索引 820…1227,即围绕 Nyquist 的最高约 20% 双边频带;它不是最低 20% 低频。由于 FFT 沿 token 序列做,所谓“高频”取决于 token 排列顺序,并非直接的二维图像空间频率。
每个圆形 C 都是对同一个 self.cauvis 的调用;青色底线表示送到 neck 的层 7 / 11 / 15 / 23。不是 24 份独立 prompt。
Cauvis 没有独立损失函数,也没有推理时开关。它通过标准检测损失的梯度学习;训练专用的 denoising queries 属于标准 DINO,而不是 Cauvis 的训练/推理不对称。
backbone 内名称包含 cauvis 的参数可训练,其余 DINOv2 backbone 参数冻结。detector 的 neck/head 在 backbone 外,照常训练。
Focal Loss,sigmoid,γ=2,α=0.25。论文中笼统写“cross-entropy”并不精确。
L1 Loss(权重 5)+ GIoU Loss(权重 2),没有额外蒸馏、解耦、频谱或对抗损失。
Cauvis 仍在 24 层后执行。分类结果做 sigmoid + top-k,最多 300 个框;代码路径没有 NMS。
红色是会改变方法定义或理论支撑的结构差异;琥珀色是实现选择、配置或表述边界。严重度按对论文核心机制可复验性的影响排序。
论文把 top-k 大奇异值方向、对小奇异值软阈值作为后门调整解释核心;cross_attention 只有点积、缩放、softmax、加权求和与线性层。
论文 Appendix D:backbone 中间特征 Z∈RC×H×W 做 2D DFT;代码:对 cross-attention 输出 R 沿 token 维做 1D FFT。
论文 Q=XWq、K=PWk、V=PWv;代码 Q/K 直接使用 X/P,只对 prompt 值做 mlp_prompt 投影。
论文要求 y=σ(MLP(p̃)) 且输出位于 [0,1];代码是 Linear + SiLU,输出无 [0,1] 约束。
正文 high-pass,附录 low-pass/幅度阈值;代码使用固定索引窗,保留 Nyquist 周围约 20% 的最高频带。
论文消融称约 100 近最优并建议默认 100;官方配置是 token_length=1600。这不能解释 SVD 缺失,因为代码无论长度多少都没有 SVD 分支。
AuxiliaryBranch 返回 out + x,论文 Eq.10–11 的文字/公式没有清楚呈现这一实现残差。
实际检测头使用 Focal + L1 + GIoU。这仍是标准检测损失,但不是只有交叉熵。
冻结逻辑方向正确;日志记录 backbone 可训练 4,919,363 / 304,255,082 参数,约 1.6%。且 neck/head 仍需训练。
代码没有监督 prompt 对应 confounder 状态,也没有显式独立性/干预约束。“causal branch”是模块名,不是可执行保证。
link_token_to_query=False 被传入并保存,但在 Cauvis 前向中未读取;use_softmax 也未决定是否 softmax,代码始终执行 softmax。
所有 prompt token 初始完全相同。初始注意力对 1600 prompts 均匀;训练能否快速打破对称取决于梯度路径,这是数学风险,不是仅凭源码能判定的性能结论。
行号针对工作区当前文件。表中把“论文声称什么”和“代码真正执行什么”并列,便于回到原文复核。
| 核对项 | 论文证据 | 代码证据 | 判定 |
|---|---|---|---|
| SVD / 软阈值 | 全文文本 268–313、402–406、1186–1205:SVD、top-k causal subspace、抑制小奇异值。 | cauvis.py:108–116:einsum → scale → softmax → value aggregation → to_out;无 SVD/截断/阈值。 | 不一致 |
| Fourier 输入 | Appendix D,1053:输入为 backbone 中间特征 Z=f(x)。 | cauvis.py:129–131:aux_branch(res_prompt),输入来自 cross-attention。 | 不一致 |
| DFT 维度 | Appendix D,1053:C×H×W 特征的 2D DFT。 | cauvis.py:38:torch.fft.fft(..., dim=1),沿 token 维做 1D FFT。 | 不一致 |
| 频段 | 正文 510:high-pass;Appendix D 1073:low-pass / amplitude threshold 抑制高频。 | cauvis.py:40–46:中心 index 1024 开窗;未 shift 的 FFT 中该处是 Nyquist。 | 论文自相矛盾;代码高通 |
| 激活 | Eq.9,434:σ 为 sigmoid,y∈[0,1]d。 | cauvis.py:56–66:Linear + SiLU。 | 不一致 |
| Q / K / V | Appendix E,1156–1161:Q=XWq、K=PWk、V=PWv。 | cauvis.py:112–115:X 与 P 直接点积;V=mlp_prompt(P)。 | 部分实现 |
| Prompt 初始化 | §3.2,237:prompts initialized to zero;同句“random perturbations”描述其作用语境,不等于随机参数初始化。 | cauvis.py:97:nn.Parameter(torch.zeros(...))。 | 一致 |
| Prompt 长度 | 605–610:约 100 near-optimal,并推荐 100 为默认。 | ...sdgod.py:35:token_length=1600。 | 不一致 |
| 逐层插入/共享 | 论文图示与实现描述:模块集成进 backbone 层。 | cauvis_backbone.py:24,35–42:单一 self.cauvis 在每个 block 后调用。 | 逐层一致;参数共享 |
| 融合比例 | 245:learnable parameters dynamically adjust fusion ratio。 | cauvis.py:101–103,132:α、β、δ 为可学习标量。 | 基本一致;非样本自适应 |
| 冻结 | 891:all backbone parameters remain frozen;正文称通常约 1%。 | cauvis_backbone.py:56–57:只解冻名称含 cauvis 的 backbone 模块。 | 策略一致 |
| 损失 | 1102:classifier and cross-entropy,学习信号来自标准检测目标。 | dinov2_dinohead.py:73–76:Focal、L1、GIoU;未发现 Cauvis 额外 loss。 | “无额外 loss”一致;具体损失不精确 |
| 训练/推理 | 方法未声明推理时移除 Cauvis。 | cauvis_backbone.py:35–42:前向无 train/test 条件分支。 | 一致 |