165 lines
8.7 KiB
Markdown
165 lines
8.7 KiB
Markdown
# 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 有无可见人物和缺框的时刻;若有明显人物却长期无有效框,先停下来检查标注。
|
||
|
||
## 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 步骤验证。
|