# 从 pooled local evidence 到逐人跨模态交融:渐进实验路线(2026-09-02) ## 1. 目的和当前决策 这份路线回答一个具体问题: > 在严格因果的 egocentric 多人对话中,如何逐步保留和利用可变数量人物的结构,使模型 > 在相同 wearer 开口召回率下,减少 other-to-other 交谈期间的错误开口,同时不损害真正 > wearer 接话和让话行为? 当前实现把每帧人物 crop 的 Qwen visual encoder token 先平均为逐人向量,再对人物等权 平均,最后对最近约 1 秒的有效帧平均。局部音频也被池化,之后与全局 Thinker state G 拼接进入 MLP。这个基线计算简单,但会丢失: - 同一帧内有几个人以及哪一个人更相关; - 人与人之间的空间关系; - 同一匿名人物在多帧中的连续运动和说话状态; - 某个人与同期音频、Omni 历史之间的对应关系。 因此,普通 pooling 保留为 F0 基线,不再把继续加深 pooled MLP 当作主方法。第一项新 融合实验从 F1 Frame-set Attention 开始。后续模块只有在前一级通过预先定义的 gate 后 才实施。 实现状态(更新于 2026-09-07):F1 已完成三 seed、四 epoch 的远程筛选,得到 `81.77745 +/- 0.15638` 的 0.2 秒 mAP 和 `64.95099 +/- 0.09451` 的十 horizon mean mAP。它表现稳定,但与旧 pooled 结果的 split/dev 协议并不匹配,而且尚无 correct/wrong 视觉控制,因此不能写成注意力优于 pooling。另加入两个仅用 当前 sidecar 的 F5/F6 **screening** 模式:`audio-person-frame-set` 和 `gated-person-state-adapter`。前者没有 F4 人物历史,后者位于 Thinker readout 之后;二者 都不能写成完整 F5/F6。第一版 F3 `track-gru-residual` 已完成远程运行,但因 zero-gate 阻塞早期梯度只能记为优化失败,不能用于判断 track continuity。随后完成的 oracle information screen 表明及时的 aggregate visible activity 有明显价值,而逐人历史与 shuffled-ID 无差别。因此当前优先级已从“继续加深 track 模型”改为“先从真实 AV 学出及时 的局部 floor evidence”;F2、F4、真正的 F5/F6 和 D1 仍然只是计划。 ## 2. 不可改变的实验条件 所有阶段共同遵守: - 目标与全局 state 均为 5 Hz;第 t 行只能使用截止到 (t+1)/5 秒的媒体。 - 视频人物特征若为 2 FPS,在 5 Hz 预测点选择严格早于 cutoff 的最新人物集合,与已有 half-open local audio/visual 契约一致。 - 不允许用未来帧插值;同一 2 FPS 人物集合可以供多个 5 Hz query 读取,但不能伪装成 新观测去重复更新时序状态。 - EasyCom Session 4--12 为官方训练集,Session 1--3 为最终测试集。模型和阈值选择使用 训练集内部 calibration/dev;建议先固定 Session 12,训练使用 Session 4--11。 - G 是可能已经融合音频、视频和语言上下文的 Thinker state,不能称为纯全局视觉。 - 局部音频 A 始终直接进入最终预测头。即使它也参与 attention query,也不能只把 A 藏在 query 中,否则无法公平保留当前很强的 G+A 基线。 - 人物数量用 mask 和 NULL person 处理,不通过截断后静默补零改变语义。 - 所有新增模型与 G+A、pooled-V 以及参数量匹配的非结构化模型使用相同历史长度、 optimizer、epoch、seed 和有效样本。 - 至少运行 3 个 seed,并保存逐事件或逐 session 输出,支持 paired bootstrap。 当前事件 evaluator 尚缺 competing-risk censoring。正式训练选型前必须先完成 P0: - other offset 后的 response 窗口在下一次 other onset 处截止; - other onset 后的 yield 窗口在下一次 other offset 处截止。 P0 修正前的 entry/yield 数值只能称为 timing-derived proxy,不得作为模块通过 gate 的 最终依据。 ## 3. 总路线 | 阶段 | 增量 | 核心问题 | 通过后才进入 | |---|---|---|---| | F0 | 当前 equal-person/equal-frame pool | 建立可复现起点 | F1 | | F1 | Frame-set Attention | 当前对话状态能否选择相关人物 | F2 | | F2 | Spatial person interaction | 人物相对位置是否提供额外多人线索 | F3 | | F3 | Track-temporal shared encoder | 匿名人物连续性是否必要 | F4 | | F4 | Person-conditioned AV history | 每个人读取音频和 Omni 历史是否改善 grounding | F5 | | F5 | 双向 person/audio interaction | 更深交互是否优于单向读取 | F6 | | F6 | Thinker person-memory adapter | 旁路证据能否安全接入 Omni 内部 | D1 | | D1 | 在线 detector + causal tracker | 部署管线与 provided-box 上限的差距 | 完整系统 | F1 已完成初筛,但尚未通过视觉错位/错人和事件 gate。当前先执行下面的 oracle 驱动 学习步骤;F2 及以后仍不并行堆叠,避免无法判断收益来自哪一层。 ### 3.1 Oracle 信息门对路线的修正 2026-09-07 的 Session 12 seed-0、四 epoch screen 使用严格 past/current-only 的 transcript-derived activity 作为 analysis-only sidecar。`aggregate-visible` 相对相同的 G+A baseline 提升 `+6.96649` 个点的 0.2 秒 mAP 和 `+2.91047` 个点的十 horizon mean mAP;visibility-only 和延迟 1 秒的 activity 仍接近 G+A。这说明当前模型缺少的是及时的 局部 floor activity,而不只是“画面里有人”或额外参数。 但是 `aggregate-visible` 高于 `per-person`,且 `per-person` 与 `shuffled-id` 的差异仅为 `-0.05826`(0.2 秒)和 `-0.07725`(mean mAP)个百分点。当前 dense aggregate-others 目标没有显示人物 ID 连续性的额外信息价值。因此,下一项学习模块首先应是从因果音频与 人物 crop 估计 aggregate visible-person floor evidence,并报告它恢复了多少 oracle gap。 只有正确人物/时间的逐人表示进一步稳定优于 aggregate、no-ID、broken-continuity 和错时 控制,F3/F4 的 track 叙事才恢复为主线。完整结果见 [`oracle result record`](../results/easycom_oracle_information_4ep_2026-09-07/README.md)。 ## 4. F0:冻结现有 pooling 基线 在同一训练协议下至少保留: | ID | 输入 | 作用 | |---|---|---| | B0 | G | 全局 Omni 表示 | | B1 | G + A | 当前强局部音频基线 | | B2 | G + pooled V | 普通视觉池化的边际作用 | | B3 | G + A + pooled V | 当前完整 pooling 基线 | | B4 | G + A + parameter-matched MLP | 排除收益仅来自更多参数 | 还应保存以下视觉干预: - remove-V; - time-shift-V:只允许向过去错位,绝不能使用未来视觉; - wrong-clip-V 或 session 内无关时间的人物集合; - correct-V。 如果 correct-V 与错位/错误视觉没有稳定差异,不能把 B3 的变化解释为视觉 grounding。 ## 5. F1:Frame-set Attention ### 5.1 输入和数据结构 预测时刻 t 使用: - G_t:5 Hz 全局 Thinker state; - A_t:截止到 t 的因果局部音频表示; - P_t = {p_t,i}:最新可用视频帧中 N_t 个逐人 visual encoder 特征; - M_t:人物有效 mask; - 一个学习的 NULL person,负责没有检测到人物或当前人物均不相关的情况。 F1 不使用 track ID、不使用人物绝对身份 embedding,也不跨帧递归,因此对同一帧的人物 排列天然不敏感。 ### 5.2 最小架构 先把不同来源投影到共同维度 d,首轮建议 d=256、4 heads、单层 attention: q_t = W_g LN(G_t) + W_a LN(A_t) K_t = W_k LN([NULL; P_t]) V_t = W_v LN([NULL; P_t]) U_t = MHA(q_t, K_t, V_t, mask=M_t) logits_t = Head([G_t, A_t, U_t, valid_bits]) 这里的语义是:G+A 描述当前 floor 和语境,作为 query 从当前可见人物集合中选择证据。 人物是 key/value,而不是先被无条件平均。A 仍然直接进入 Head,保证对 B1 的公平比较。 F1 暂不加入 bbox、track GRU、人物自注意力或 audio-to-person 反向 attention;这些都留给 后续独立消融。 ### 5.3 空人物和可变人数 - 始终保留 NULL person,因此全部人物无效时 attention 仍有确定输出。 - 真实人物用 padding 加 mask 组成 batch;padding token 不得参与 softmax。 - 不设固定身份 slot。若训练需要 max_people,只允许按确定、与标签无关的规则截断,并 报告截断比例。 - 人物顺序改变后输出应在数值误差范围内不变,作为单元测试。 ### 5.4 严格因果映射 对每个 5 Hz cutoff c_t: 1. 找到 frame_time 严格小于 c_t 的最新 local frame; 2. 读取该帧 frame_offsets 范围内全部逐人 feature; 3. 如果尚无帧,使用仅含 NULL person 的集合; 4. 不允许 nearest-neighbor 选到 c_t 之后的帧; 5. 记录 chosen_frame_time,测试所有 chosen_frame_time 严格小于 cutoff。 ### 5.5 F1 必跑对照 | ID | 模型或干预 | 回答的问题 | |---|---|---| | F1-a | G+A+Frame-set Attention | 主模型 | | F1-b | G+A+pooled V | 是否优于现有普通池化 | | F1-c | 参数匹配的 learned pooling/MLP | 是否只是参数或非线性增加 | | F1-d | correct set 换成 past-shifted set | 是否依赖正确时间 | | F1-e | correct set 换成 wrong-clip set | 是否依赖正确画面 | | F1-f | 随机排列同一 set | 验证 permutation invariance | | F1-g | remove person set,仅 NULL | 视觉是否真正被使用 | 可额外训练逐人 active-speaker probe,但它只诊断人物和声音是否可对齐,不能替代 wearer floor-action 结果。 ### 5.6 F1 通过条件 必须同时满足: 1. correct F1 在训练内固定 dev 上稳定优于 B3 和参数匹配 F1-c; 2. correct set 优于 past-shifted、wrong-clip 和 NULL 控制; 3. 在相同 wearer onset recall 下,third-party false entry/min 下降; 4. wearer 应接话时的 recall/latency 和 wearer yield 不出现有意义退化; 5. 三个 seed 方向一致,paired session/event bootstrap 不显示收益完全由单一 session 驱动。 如果只提高逐帧 mAP 而事件指标无变化,则记录为 representation gain,不进入复杂 spatial 或 track 叙事。若 correct 与错误视觉没有差异,停止增加 attention 层,先审计 crop、 时间对齐和 person feature。 ## 6. F2:加入空间人物交互 只有 F1 通过后才加入: - 每人的归一化 bbox 几何:中心、宽高和面积; - 一层共享 person self-attention; - 可选相对几何 bias:dx、dy、宽高比的对数以及中心距离; - 再由同一个 G+A floor query 读取增强后的人物集合。 关键对照为 F1、仅绝对 bbox、相对几何 bias 和错误 bbox。只有相对几何版本稳定优于这些 对照,才可以主张模型利用了多人空间关系;否则保留更简单的 F1。 ## 7. F3:匿名 track-temporal 编码 只有空间或 frame-set 证据成立后,才测试跨帧人物连续性: - 每条在线 track 维护共享参数的 causal GRU 或轻量 TCN; - track ID 只用于路由隐状态,不能成为可学习身份; - 只有新 2 FPS 帧到达时才更新一次,5 Hz 中间状态只读取最近缓存; - track 丢失超过固定 max_age 后重置,所有 reset 规则预先冻结; - 全局重命名 track ID 后预测必须不变。 对照包括 frame-set、无 ID temporal pool、正确 track、打断连续性的 track 以及 past-shift。 正确 track 必须优于无 ID 和打断 track,才能说明身份连续性有价值。 第一版实现为 `track-gru-residual`。它没有直接替换 pooled 头,而是从同 seed、同 split、 同 local contract 的 `G+A+pooled-V` checkpoint 精确复制并默认冻结 base path,再增加共享 track GRU、G+A 对 track states 的 masked attention 以及零初始化 scalar gate。这样训练 开始前 logits 与 pooled baseline 逐元素相同,空人物时 correction 恒为零,实验首先回答 “track continuity 是否提供增量信息”,而不会把随机重训 base 的波动误当作 GRU 收益。 实现、契约和命令见 [`easycom_track_gru_residual.md`](easycom_track_gru_residual.md)。 2026-09-07 的实测暴露了这个第一版参数化的优化缺陷:Session 12 三个 seed 的 ten-horizon mean mAP 配对增量仅为 `+0.01306 +/- 0.02368` 个百分点,保存 checkpoint 的 `tanh(gate)` 只有 `-0.0015` 到 `+0.0108`。零 gate 在第一步也会把 residual branch 的参数 梯度乘为零,因此该结果不能用于否定 track continuity。下一版应删除 scalar gate、将 residual 最后输出层零初始化,并在 dev 上记录 delta-logit、概率变化和非零梯度;详见 [`结果记录`](../results/easycom_track_gru_residual_4ep_2026-09-07/README.md)。 修正版已实现为 `causal-person-adapter-v2`,但尚无 GPU 结果。它仍从 matched pooled `G+A+V` checkpoint 精确初始化并默认冻结 base;每条当前 track 经共享因果 GRU 后由 G+A query 读取,再与直接 local audio 构成局部 state。模型使用逐样本向量 gate,并仅把最终 residual-logit projection 的 weight/bias 置零。这样初始 logits 与 pooled baseline 逐元素相同,第一次更新 residual output,后续更新才可进入 GRU、attention 和动态 gate。 运行契约与命令见 [`easycom_causal_person_adapter_v2.md`](easycom_causal_person_adapter_v2.md)。它保留 pooled V, 因此若结果通过,还必须补一个移除 pooled V 的 replacement ablation,才能决定最终方法。 为减少“GRU 具体写法”这一实验变量,另实现 `causal-person-adapter-egospeak-gru`:保留 V2 的所有下游融合与优化设计,只把逐人输入改成 EgoSpeak MiniROADA 风格的 `Linear-LN-ReLU-Dropout-GRU-ReLU`。这不是 EgoSpeak 的全局 5 Hz RGB+audio GRU 复现,而是人物 track 上的受控 temporal-stem 消融;运行说明见 [`easycom_egospeak_style_person_gru.md`](easycom_egospeak_style_person_gru.md)。 为直接检验“低频 Qwen crop 是否遗漏唇音动态”,另实现独立的 `highrate-person-av-attention` 分支。它不把同一张 2 FPS 人脸重复送进 GRU:MuVAP CPC 在 25 Hz 上只编码一次 mixed audio 得到共享 `U`,每条人脸轨迹另产生 causal visual state 和 一个 AV speaking score,只在每个 5 Hz 右边界保存。随后由 `G+U` query 做集合注意力,并 用零初始化 residual 修正已经训练且冻结的 matched `G+U` logits。它首先回答传统高频 audio/person 证据能否弥补全局 Omni,而不是检验 identity continuity。实现和命令见 [`easycom_highrate_person_av.md`](easycom_highrate_person_av.md)。 ## 8. F4:Person-conditioned audio/Omni history F4 让每个匿名人物分别读取已有的 5 Hz 因果历史: C_A = MHA(H_person, A_history, A_history) C_G = MHA(H_person, G_history, G_history) H_prime = LN(H_person + tanh(alpha_A) C_A + tanh(alpha_G) C_G) alpha 从 0 初始化,使新分支开始时退化为已验证的人物表示。增强后的 H_prime 再由 G+A floor query 读取。 这里必须使用一段真实的 5 Hz token history,而不是对单个 pooled audio vector 做形式上 的 attention。人物级 active-speaker 标签可以作为训练辅助监督,但人物声音标签永远不能 作为推理输入。 通过条件是 floor event 指标改善,而不只是 active-speaker probe 改善;同时 correct AV 必须优于 audio-only、visual-only、错位 audio 和错位 visual。 ## 9. F5--F6:只在旁路证据充分后增加复杂度 F5 可增加一次 audio query 到人物 memory 的反向读取,形成单块双向 interaction。必须和 参数匹配 MLP、单向 F4、modality dropout 做比较。若收益不稳定,保留 F4。 代码中的 `audio-person-frame-set` 只用当前帧人物集合和当前 pooled audio 做上述反向读取, 并以零初始化 gate 从 F1 开始优化。它用于判断是否值得继续构建 F3/F4 历史,不满足本节 完整 F5 的输入和对照要求。 F6 才把验证过的人物 memory 通过零初始化 gate 接入 Thinker 上层,并比较: - 无人物 memory 的参数匹配 Thinker LoRA; - 冻结 Thinker 的 person-memory adapter; - adapter 加上层 LoRA。 若 F6 不优于旁路,不为追求端到端表述牺牲可解释性,论文采用更简单的旁路模型。 代码中的 `gated-person-state-adapter` 把当前人物 context 以零初始化 residual 加到已经保存 的最终 Thinker state,只是 post-Thinker screening control。真正 F6 必须重新运行 Omni、 在指定上层 transformer block 内注入 memory,并和参数匹配 LoRA 比较。 ## 10. D1:实际在线检测与追踪 方法验证阶段先使用数据集提供的 bbox/track,隔离融合能力。最终再替换为在线人脸或人物 检测器加严格因果 tracker,并报告: - detection recall/coverage; - ID switch 和轨迹碎片; - max_people 截断比例; - P50/P95 单步延迟; - provided track 与 online track 的 floor 指标差距。 论文可以把在线 detector/tracker 作为部署前端,但不能把 provided ID 的结果直接称为完整 在线系统结果。 ## 11. 评价和记录规范 P0 冻结后,主指标为: - third-party false entry/min at matched wearer onset recall,至少报告 R=0.7/0.8/0.9; - wearer onset event recall、precision 和 latency; - wearer yield event recall、precision 和 latency; - addressed-to-wearer recall/latency,仅用于有可靠 addressee 标注的 EasyCom 子集; - 0.2--2.0 秒逐帧 AP/mAP,作为 EgoSpeak 可比的次级指标。 每阶段结果放在: results/easycom_fusion_fN__/ README.md metrics.json or metrics.csv run configuration and checkpoint references README 必须写明 split、seed、checkpoint、输入特征版本、评测协议和所有干预条件。最终 测试集不能反向用于选择 attention 维度、heads、历史长度或 stopping gate。 ## 12. 最近执行顺序 1. 用 seeds 1--2 复核六个 oracle 条件;只看 Session 12,不能根据 Sessions 1--3 调整结构。 2. 从真实因果 AV 学习 aggregate visible-person activity/floor evidence,和 G+A、visibility、 past-shift、wrong-person/wrong-time、参数匹配分支比较,并报告 oracle-gap recovery。 3. 若正确视觉没有稳定优于错时/错人控制,停止复杂 fusion,先修复局部编码或 AV 对齐。 4. 只有 learned person-organized evidence 优于 aggregate/no-ID 时,才用零初始化 residual 输出层修复 track-GRU 梯度路径,并补 broken-track、past-shift 和 remove-person 控制。 5. correct track 通过上述控制后,再实现 F4 person-conditioned audio/Omni history;否则 论文采用更简单的 global Omni + local aggregate floor-evidence 模型。 6. 在形成论文事件结论前,仍须完成 P0 competing-risk censoring,并人工打印 response 与 yield 时间轴。当前事件结果只能称为 timing-derived proxy。