2026-08-28 09:36:35 +08:00
|
|
|
|
# Ego4D:不输入 Thinker 状态的 encoder-only 对照
|
|
|
|
|
|
|
2026-08-28 10:44:13 +08:00
|
|
|
|
先做 EasyCom 时请用 [EasyCom encoder-only 命令](easycom_encoder_only.md)。
|
|
|
|
|
|
整理脚本现支持 `--dataset easycom`,默认仍为 Ego4D,本页已有命令不变。
|
|
|
|
|
|
|
2026-08-28 09:36:35 +08:00
|
|
|
|
本实验复用已经提取完的 `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`:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
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、前台运行)
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
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。
|
|
|
|
|
|
训练前仍逐条检查所有导出输入,不能仅靠完成标记绕过缺文件或模式检查。
|
|
|
|
|
|
|
|
|
|
|
|
入口结束后自动汇总,也可单独打印:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
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 语义沿用原实验,不因重新打包而改变。
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python -m unittest -q test_encoder_only_workflow
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
CPU 测试覆盖三种模态的精确输入构造、缺失/不完整/混合配置拒绝、无 Thinker 依赖、
|
|
|
|
|
|
输出防覆盖与完成标记,以及三组各 4 epochs 的真实小规模训练/推理。L20 真实数据效果需另跑。
|