Files
icassp2027-experiment/docs/ego4d_encoder_only.md
2026-08-28 09:36:35 +08:00

5.0 KiB
Raw Blame History

Ego4D:不输入 Thinker 状态的 encoder-only 对照

本实验复用已经提取完的 local_qwen_1s/<uid>.pt,仅将选定的 Qwen 编码器向量和 有效性标志作为 anticipation MLP 的输入。不读取全局 Thinker .pt,不运行 Qwen, 不重新处理视频,不使用软链接。 原来的 run_ego4d_local_baselines.py 跑的是 G / G+A / G+V / G+A+V,并不是本实验的 encoder-only。

沿用原 EgoSpeak manifest 的 train/test、5Hz 行索引、十个预测 horizon、LSTR-MCE, 固定 4 epochs、无 dev set,保存并评测最后一轮,不按 test 选择 epoch。

1. 一次性整理输入(CPU)

必须先完成全部 manifest clips 的局部特征提取;不要用 preview 或 partial smoke 文件。 下面的默认路径就是 L20 上的 /data1/yfzx/wangx:

cd /data1/yfzx/wangx/Code/icassp2027-experiment

python prepare_encoder_only_features.py \
  --data-root /data1/yfzx/wangx/Datasets/ego4d \
  --local-feature-root /data1/yfzx/wangx/Datasets/ego4d/omni_features/local_qwen_1s \
  --modalities av \
  --dry-run

# 校验通过后,去掉 --dry-run 写出实体文件。
python prepare_encoder_only_features.py \
  --data-root /data1/yfzx/wangx/Datasets/ego4d \
  --local-feature-root /data1/yfzx/wangx/Datasets/ego4d/omni_features/local_qwen_1s \
  --modalities av

默认输出为 omni_features/encoder_only_av_1s。换成 --modalities audio 或 visual 会分别写入 encoder_only_audio_1s / encoder_only_visual_1s。 可显式指定 --manifest、--target-root、--output-root。 局部输入支持平铺目录和 train/test 子目录,不改变 manifest 中的 split。

整理前逐条检查全部 train/test 的完整性、时间/索引、选定向量/有效性掩码、编码器配置一致性 及 target 长度,再创建新目录。整理时逐条重新校验并原子保存;不保留全数据集张量。 同名目录已存在时拒绝覆盖。中断或磁盘写入失败的目录不会有 complete.txt,不能拿来训练; 修复原因后用新的 --output-root,不要手工补写完成标记。

每个输出文件明确标记 mode=encoder-only-av/audio/visual、uses_thinker_states=False, 保存原始 times/label_indices 和编码器配置。export_manifest.json 记录 clip 行数、总量、 路径和输入维度;complete.txt 最后写出。更换 seed 只重新训练,不重复整理。 此前内联 Python 命令完整生成的文件和 complete.txt 也兼容下面的训练入口。

2. 训练和评测(单张空闲 GPU、前台运行)

CUDA_VISIBLE_DEVICES=0 \
OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 \
python run_ego4d_encoder_only.py \
  --data-root /data1/yfzx/wangx/Datasets/ego4d \
  --feature-root /data1/yfzx/wangx/Datasets/ego4d/omni_features/encoder_only_av_1s \
  --modalities av \
  --seeds 0 1 2

可先加 --dry-run:只检查全部 train/test 输入和已有输出,打印命令,不训练或写结果。 默认结果为 results/ego4d_encoder_only_1s/encoder_av_seed0 等,checkpoint 位于 checkpoints/ego4d_encoder_only_1s。已有 checkpoint、训练摘要或结果目录时拒绝覆盖; 补跑时选择未完成的 seeds,或指定新的 --checkpoint-root / --result-root。

换模态时同时修改 --feature-root 和 --modalities,不能只改其中一个。 不传 --local-feature-root、--layer-fusion 或 --dev-sessions;原训练/推理文件无需修改。 训练超参是 batch=512、lr=7e-5、weight_decay=5e-5、warmup_epochs=1.6、 warmup_factor=0.3、dropout=0.2、transition_objective=none。 训练前仍逐条检查所有导出输入,不能仅靠完成标记绕过缺文件或模式检查。

入口结束后自动汇总,也可单独打印:

python summarize_local_baselines.py \
  --root results/ego4d_encoder_only_1s --dataset ego4d

如何解释比较

以两路原生向量均为 2048D 为例,audio/visual 单模态输入各 2049D(一个有效标志), AV 为 4098D,顺序是 [visual, visual_valid, audio, audio_valid]。 不做原 B1 的 trainable 256D 分支投影;仍用原 MLP 类,但输入宽度决定其隐藏层宽度, 即单模态 1024、AV 2049。因此应报告参数量,不是相同 head 容量的 Thinker 消融。

窗口和视觉视野也不同:这些 sidecars 是已保存的近期音频/人物局部 crop pooling, 不是把 Thinker 的相同输入 token 绕过 decoder。目录名中的 1s 只是默认实验命名, 真实窗口以 config.encoder_contract.config 为准。它回答“这些编码器 readout 本身能预测多好”, 不能单独证明 Thinker 有用或无用。严格归因仍需统一窗口、视野、pooling 与 head 容量。 5Hz 时间及 horizon 语义沿用原实验,不因重新打包而改变。

python -m unittest -q test_encoder_only_workflow

CPU 测试覆盖三种模态的精确输入构造、缺失/不完整/混合配置拒绝、无 Thinker 依赖、 输出防覆盖与完成标记,以及三组各 4 epochs 的真实小规模训练/推理。L20 真实数据效果需另跑。