Files
icassp2027-experiment/docs/ego4d_local_baselines.md
2026-08-28 00:46:05 +08:00

189 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Ego4D:近期音频/逐人视觉增强的四组对照
目标是检验 EasyCom 上的局部特征收益能否迁移到 Ego4D,而不是预先承诺提分。
保留现有 Ego4D 全局 Omni 特征 G、EgoSpeak manifest 和 target;不重提 Thinker,
不重新编码视频,不重划 train/test。新增的两路侧路特征一次提取、三组复用:
| 实验名 | 输入 | 回答的问题 |
|---|---|---|
| baseline | G | 同训练配置下的基准 |
| audio | G + A | 最近 1s 音频是否补回全局 readout 丢失的信息? |
| visual | G + V | 人物局部视觉是否有效? |
| av | G + A + V | 在音频增强之外,视觉是否仍有增益?重点比较 AV − A |
`audio` **不是纯音频模型**;四组都包含 G。A 是同一 clip 的视频音轨,
16kHz mono 后按 `[max(0,t-1),t)` 切窗,每 200ms 用冻结 Qwen audio encoder 重编码。
V 在原视频的固定 2FPS 网格读取可见人物框,冻结 Qwen vision encoder 后依次做
空间、逐人、最近 1s 有效帧的均值池化。Qwen 3B 的 A/V 均保存原生 2048D;
训练时各投影到 256D,融合后沿用现有预测 head。无有效框时 V=0 且 validity=False,
不能拿缺框当损坏样本直接删掉,否则四组测试样本不一致。
默认统一 **4 epochs、无 dev、LSTR-MCE、无 transition auxiliary**;batch=512、
lr=7e-5、weight_decay=5e-5、warmup=1.6 epochs、warmup_factor=0.3、dropout=0.2。
训练只取 manifest 的 train,评测只取 test。现有正式 manifest 应显示 346 train / 87 test;
程序读取该文件,不会自行随机拆分。预检 test 只检查输入完整性,不计算指标或选模型。
## 1. 设置远程路径
在 `/data/wangx/Code/icassp2027-experiment` 的 Bash 中执行。只需把 `FEATURE_ROOT`
改成**实际已提完的 Ego4D 全局特征目录**;不能误用 EasyCom 的 Session 文件。
建议本轮固定已有 8s 全局特征,四组不要混用不同 context、层数或 checkpoint。
```bash
cd /data/wangx/Code/icassp2027-experiment
export CUDA_VISIBLE_DEVICES=0
export OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4
DATA_ROOT=/data/wangx/Datasets/ego4d
MODEL=/data/wangx/Models/Qwen2.5-Omni-3B
FEATURE_ROOT=/替换为实际的/Ego4D全局特征目录
TARGET_ROOT="${DATA_ROOT}/ego4d_target_frame"
MANIFEST="${DATA_ROOT}/ego4d_egospeak.tsv"
LOCAL_ROOT="${DATA_ROOT}/omni_features/local_qwen_1s"
LOCAL_ARGS=(
--dataset ego4d --data-root "$DATA_ROOT" --manifest "$MANIFEST"
--feature-root "$FEATURE_ROOT" --target-root "$TARGET_ROOT"
--model-id "$MODEL" --device cuda:0 --dtype bfloat16 --flash-attention-2
--video-fps 2 --visual-window-seconds 1 --audio-window-seconds 1
)
```
原始输入应存在:`v1/clips/<uid>.mp4`、`v1/annotations/av_train.json` 和 `av_val.json`。
这里 `av_val.json` 是原 AVD 标注的文件名,不意味着把它直接当作本实验的 test 划分;
train/test 始终按 EgoSpeak manifest。非标准导出路径可加 `--ego4d-annotations <path1> <path2>`。
局部编码器支持现有 Transformers 4.57.6,也支持 4.52.3;同一次实验所有 clips 应统一版本。
## 2. 先检查一条,再做 4s smoke
```bash
# 检查文件、全局时间网格和 target 长度;不加载模型,不解码,不写输出。
python extract_turn_local_features.py "${LOCAL_ARGS[@]}" \
--limit 1 --dry-run --output-root "$LOCAL_ROOT"
# 不加载模型,写带框预览;确认框落在人脸上、clip-local 帧号正确。
python extract_turn_local_features.py "${LOCAL_ARGS[@]}" \
--limit 1 --max-steps 20 --preview-only \
--output-root features/ego4d_local_preview
# 同时提取 V 和 A;无需另跑音频脚本。
python extract_turn_local_features.py "${LOCAL_ARGS[@]}" \
--limit 1 --max-steps 20 \
--output-root features/ego4d_local_smoke
```
预览位于 `features/ego4d_local_preview/<uid>_preview/`,包含图片与 `boxes.json`。
最好再用 `--split test --limit 1` 检查一条 test clip;`--dry-run` 不能替代像素与框检查。
4s smoke 应得到 V/A 各 `[20,2048]`、`partial=True`;此目录不能用于正式训练。
V-valid 不必是 100%,Ego4D 有无可见人物和缺框的时刻;若有明显人物却长期无有效框,先停下来检查标注。
### 前 4s 没有人物:增加预览范围和数量
旧预览固定最多 4 张;`--max-steps 20` 又把范围限制到前 4s。
现在可指定数量和时间范围,并仅从有有效人物框的网格帧中均匀抽样:
```bash
# 前三条 clip:在整条 clip 中各取最多 40 张有效带框图片。
# 不要再带 --max-steps 20;不传 preview-end 就使用完整可用时间范围。
python extract_turn_local_features.py "${LOCAL_ARGS[@]}" \
--limit 3 --preview-only --preview-count 40 --preview-with-boxes \
--output-root features/ego4d_local_preview_people
# 也可聚焦第一条 clip 的 30–120s;实际不足 120s 时截到 clip 结束。
python extract_turn_local_features.py "${LOCAL_ARGS[@]}" \
--limit 1 --preview-only --preview-count 60 \
--preview-start 30 --preview-end 120 --preview-with-boxes \
--output-root features/ego4d_local_preview_30_120s
```
每张图标注时间、源帧号和有效人数;`preview.json` 记录候选帧数、有效帧数、实际输出数,
`boxes.json` 记录当前这次输出的图片和框。无有效框时明确报告 0 张,可换片段或核对帧号对齐,
不会伪造框或强行当作成功。`--preview-with-boxes` 只筛选预览,**不删除特征提取或评测中的无框帧**。
默认仍最多 4 张。改变范围时建议换输出目录;旧 JPG 不会自动删除,以当前 JSON 清单为准。
## 3. 提取完整 manifest:前台、模型只加载一次
```bash
python extract_turn_local_features.py "${LOCAL_ARGS[@]}" \
--reuse-existing --output-root "$LOCAL_ROOT"
```
前台显示 clip 编号、视觉 frame 进度和音频 state 进度。中断后可重跑同一命令:
只复用完整且样本、时间、特征维度、版本及提取配置一致的 `.pt`;部分或不兼容文件会报错。
输出原子替换,失败的临时文件不会被当作成功样本。不要用 `--overwrite` 当作“继续”。
checkpoint 的 ID 是用户声明,不是权重文件校验和:不要在同一个 ID/路径下替换权重再复用旧特征。
可用 `--split train|test`、`--start-index N --end-index M` 或 `--limit N` 选择子集。
索引是**先按 split 过滤,再按 manifest 顺序的 1-based 闭区间**;不传 split 时保留整个文件的行顺序。
如果自行在多卡不同终端运行,必须选择互不重叠的区间和同一套编码器配置;默认不启动后台任务。
## 4. 跑 seed0 四组
```bash
EXP_ARGS=(
--data-root "$DATA_ROOT" --manifest "$MANIFEST"
--feature-root "$FEATURE_ROOT" --target-root "$TARGET_ROOT"
--local-feature-root "$LOCAL_ROOT"
--checkpoint-root checkpoints/ego4d_local_b1
--result-root results/ego4d_local_b1
)
# 逐 clip 校验全部 train/test 输入、局部配置,打印命令但不训练。
python run_ego4d_local_baselines.py "${EXP_ARGS[@]}" --seeds 0 --dry-run
# 前台顺序训练/评测 baseline、audio、visual、av,并自动汇总。
python run_ego4d_local_baselines.py "${EXP_ARGS[@]}" --seeds 0
# 补同设置 seed1/2,不覆盖 seed0。
python run_ego4d_local_baselines.py "${EXP_ARGS[@]}" --seeds 1 2
```
自动检测 G:`[T,L,D]` 使用 concat-MLP,`[T,D]` 使用原单层 head;不要求为 last4 重提全局特征。
如果原 stacked baseline 使用 fixed-mean,可在四组统一加 `--layer-fusion fixed-mean`。
不要拿不同 epoch/layer-fusion 的旧 baseline 直接计算新增分支的增量。
预检不会一次把 433 条全局特征全部装进 RAM;实际训练仍沿用原训练器,会加载整个 train split。
last4 特征可能需要数十 GB 主机内存。多卡并行 head 训练也会复制主机内存,不是只看 GPU 是否空闲。
若只跑一组,增加 `--variants audio`;若某一组训练中断,默认拒绝覆盖现有 checkpoint/result。
可先运行剩余组合,例如 `--variants visual av --seeds 0`,或为重跑选择新的输出根。
baseline 单独运行不要求局部特征;整个四组 family 会在任何训练前检查所有必要局部特征。
## 5. 打印结果
```bash
python summarize_local_baselines.py \
--root results/ego4d_local_b1 --dataset ego4d \
--protocol causal_valid_only --paired-deltas
# 对齐 EgoSpeak 的 full-timeline 表格时,单独报告这个协议。
python summarize_local_baselines.py \
--root results/ego4d_local_b1 --dataset ego4d \
--protocol egospeak_full_timeline --paired-deltas
```
表格给出每个 seed、均值与 sample std,以及匹配 seed 的 `A−G`、`V−G`、`AV−G`、`AV−A`。
不要混用两个评测协议。优先看 10-horizon mean mAP、wearer AP 和 AV−A,
不要只凭单 seed 的 0.2s mAP 宣称跨数据集提升。
## 论文可解释的范围
这轮回答“在冻结的全局 Omni readout 上加入近期编码器特征是否有用”,不是 Qwen 对 wav2vec
的受控替换实验,也不是逐人音视频对齐模型。使用提供的人物 tracks,忽略 wearer 框、讲话区间和
说话人标签;缺框不向未来插值。但提供框本身不是在线检测,不能据此声称端到端在线视觉系统。
新增分支带来额外参数,若收益稳定,再补参数量匹配的全局 head 控制。
本轮不改变已有的音频重采样、标签索引和 horizon 定义。5Hz 是输出网格;
不等于视觉获得 5FPS 唇动信息,也不等于已完成原始波形层面的端到端因果审计。
如后续修正物理时间协议,必须在所有对照组统一修正并重新跑,不能只改增强组。
## 回归测试
```bash
python -m unittest -q test_easycom_head_objectives test_local_turn_features test_ego4d_local_workflow
```
CPU 回归包括 manifest 顺序/防交叉重复、完整批量提取的模型复用、断点文件校验、
单层/多层全局特征、测试集输入预检,以及合成 Ego4D 上四组各 4 epochs 的训练/推理与增量汇总。
真实 Ego4D 像素、提供框和 3B/L20 提取仍需按上面的 preview/smoke 步骤验证。