Files
modeling_zhaocui/final/README.md
T

207 lines
13 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.
# 复杂场景下多模态情感识别:独立运行项目
本目录包含题目 Q1、Q2、Q3 所需的模型、数据适配、训练、验证、推理、解释和实验记录代码。运行代码只依赖本目录;官方原始附件、预训练模型权重和 OpenFace 可执行程序需按下文准备,未复制进项目。
## 目录
| 路径 | 内容 |
|---|---|
| `adapter/` | 统一多模态对齐接口;区分真实时间对齐与未对齐序列的相对进程投影 |
| `model/` | 每个数学模型与保留的深度学习模型各自独立的定义文件 |
| `q1/` | Q1 原生特征提取、物理时间特征包构建、五折对照和可视化 |
| `q2/math/` | 数学方案 C0–C7、训练、缺失控制评估及附件 3 预测 |
| `q2/deep_learning/q2/` | EarlyConcat + BiGRU、MoFE-7 + MLP Router 及训练协议 |
| `q3/` | ATI–HO Q3 训练、结构审计、归因与附件 4 推理 |
| `output/q1/` | 已整理的 Q1 100 个特征文件、对齐审计和已有结果 |
| `output/q2/` | 已整理的 Q2 未对齐数据模型对比结果表 |
| `output/q3/` | ATI–HO 附件 4 题目输出;验证结果和实验审计放在 `experiments/q3/` |
| `experiments/q2/` | 本项目最新未对齐 Q2 对比运行、权重和审计结果 |
| `REPORTS.md` | Q1、Q2、Q3 实验结果和方法说明 |
| `data_paths.py` | 官方附件的默认位置与外部数据根目录设置 |
## 准备官方附件
把附件按以下目录放入 `final/data/`。也可以把它们放在其他位置,再通过 `FINAL_DATA_DIR` 指向包含这些附件文件夹的根目录。
| 附件 | 相对 `FINAL_DATA_DIR` 的目录/文件 |
|---|---|
| 附件 1 | `附件1-数据集原始多模态样本/MOSEI数据集部分原始视频-100条/`;内含 `label-100.xlsx` 以及按 `video_id/clip_id.mp4` 组织的视频 |
| 附件 2 | `附件2-数据集特征文件/aligned_50.pkl` 与 `unaligned_50.pkl` |
| 附件 3 | `附件3-模态缺失特征样本/对齐版本/` 与 `未对齐版本/`;每个目录含 30 个样本文件 |
| 附件 4 | `附件4-可解释专项视频样本与特征文件/附件4-可解释专项视频样本与特征文件/未对齐版本/` 及同级 `videos/` |
附件 2 的 pickle 文件约数 GB,Q2/Q3 训练需要较大内存;它们不会被复制进项目。附件 3 的未对齐样本缺少数值文本特征及可靠的音视频长度,本项目会从 `raw_text` 重建 BERT 文本表示,并从音视频非零行估计长度;对应限制会写入附件 3 审计 CSV。附件 4 未对齐样本具有数值文本特征和长度字段,可由统一 adapter 转换。
默认数据位置是 `final/data/`。Q2、Q3 会直接读取 `FINAL_DATA_DIR`。Q1 命令还需要把 `--data-dir` 指向附件 1 的视频目录。若使用其他数据根目录,在运行项目命令前设置:
```powershell
$env:FINAL_DATA_DIR = "D:\task-data"
```
```bash
export FINAL_DATA_DIR="/data/task-data"
```
## 安装环境
需要 Python 3.11 或更新版本。在 `final/` 的上级目录执行下列命令。Q1 的 OpenFace 特征提取脚本调用 Windows PowerShell;Q2/Q3 可在 Windows、Linux 或 WSL 上运行。
```bash
python -m venv final/.venv
```
Windows PowerShell:
```powershell
final\.venv\Scripts\Activate.ps1
python -m pip install -r final/requirements.txt
```
Linux 或 WSL:
```bash
source final/.venv/bin/activate
python -m pip install -r final/requirements.txt
```
也可使用 `uv sync --project final`。GPU 运行需安装与本机 CUDA 驱动匹配的 PyTorch 版本;CPU 可用于功能验证,但完整训练会更慢。首次运行 Q1/Q3 或附件 3 推理时,Transformers 会下载 `google-bert/bert-base-uncased`;Q1 还会用到 `facebook/wav2vec2-base-960h`。无网络环境需预先把权重放入 Hugging Face 缓存。
## Q1:构建物理时间对齐特征并比较方案
Q1 对附件 1 的 100 个视频生成原生时间特征和统一特征包。视频/音频时间戳来自媒体流与 OpenFace 帧;文本区间来自固定转写的 CTC 单调对齐。五折评估按 `video_id` 分组。分类探针衡量情感信息,不代表人工标注的边界准确率。
原生特征提取还需要 OpenFace 2.2.0 Windows 包。将其解压到 `final/q1/cache/openface/OpenFace_2.2.0_win_x64/`,其中应有 `FeatureExtraction.exe` 和 `model/main_clnf_general.txt`。项目提供 `q1/run_openface.ps1` 调用脚本,不附带 OpenFace 二进制文件。
```powershell
if (-not $env:FINAL_DATA_DIR) { $env:FINAL_DATA_DIR = "final/data" }
$a1 = Join-Path $env:FINAL_DATA_DIR "附件1-数据集原始多模态样本/MOSEI数据集部分原始视频-100条"
$run = "final/output/q1/rerun"
python -m final.q1.compare_models `
--data-dir $a1 `
--cache-dir final/q1/cache/native `
--output-dir "$run/model_comparison" `
--bootstrap-repeats 2000
python -m final.q1.build_v2 `
--data-dir $a1 `
--cache-dir final/q1/cache/native `
--run-manifest "$run/model_comparison/run_manifest.json" `
--output-dir "$run/features_v2"
python -m final.q1.compare_v2 `
--data-dir $a1 `
--feature-dir "$run/features_v2" `
--output-dir "$run/model_comparison_v2" `
--bootstrap-repeats 2000
```
完整重跑使用独立的 `output/q1/rerun/`,保留随项目提供的现有结果包。
主要产物:`output/q1/features_v2/` 中有 100 个样本文件、100 行 `sample_summary.csv`(含样本 ID 和来源时长)、300 行 `modality_summary.csv`(含模态维度、有效时长、对齐粒度和状态)、`manifest_q1.jsonl`、`feature_manifest.json`;`output/q1/` 下的 `typical_sample_correspondence.csv` 和 `typical_sample_frames.jpg` 展示典型样本的转写、物理时间区间、音频来源行和视频帧。`alignment_query_example.png` 对照展示文本词区间到原始音频/视频位置的查询权重。`model_comparison/` 和 `model_comparison_v2/` 中有 OOF 预测、折内指标、组 Bootstrap 和运行清单。
已整理的 100 个样本可直接通过接口读取:
```python
from pathlib import Path
from final.adapter import Q1AlignmentAdapter
sample = Q1AlignmentAdapter().from_q1_sample(
"-iRBcNs9oI8/8",
feature_dir=Path("final/output/q1/features_v2"),
)
features, observed_mask = sample.q2_arrays()
```
## Q2:在题目未对齐数据上训练和比较模型
两个训练入口都默认使用附件 2 的 `unaligned_50.pkl`。训练、验证、测试均经 `adapter/` 投影到 50 个相对进程区间;这个坐标只表达模态内部的先后顺序,不是物理秒数。验证集用于模型选择,官方测试集用于最终评估。数学方案会比较 C0–C7 和 C6 单因素诊断;深度学习只保留题目要求的 EarlyConcat + BiGRU 与 MoFE-7 + MLP Router。
深度学习两模型共用交叉熵分类损失与 `0.5 × SmoothL1` 强度回归损失,AdamW 学习率 `3e-4`、权重衰减 `1e-3`、最多 12 轮、耐心值 3、梯度裁剪 1.0;训练遮蔽率为 0/10/30/50/70%,覆盖单模态、同步、部分重叠和异步连续缺失。EarlyConcat 使用 128 维模态投影和双向 GRU;MoFE 使用 7 个模态子集专家、MLP Router 和共享双向 GRU。以下命令显式设 batch size 128,以匹配报告中的对比实验。数学分支各方案的目标函数与内部留组选择设置记录在模型代码及 [数学运行清单](experiments/q2/unaligned_math_all_b128/run_manifest.json)。
从空的结果目录开始训练。若目标目录已存在非空结果,脚本会停止以免覆盖:
```bash
python -m final.q2.math.train \
--input-version unaligned_50 \
--output-dir final/experiments/q2/math_rerun \
--batch-size 128 \
--device auto
python -m final.q2.deep_learning.q2.train_math_protocol \
--input-version unaligned_50 \
--output-dir final/experiments/q2/deep_rerun \
--batch-size 128 \
--device auto
```
数学方案默认会用附件 3 未对齐样本生成 30 条 `attachment3_predictions.csv` 和 `attachment3_audit.csv`,预测文件包含极性、情感强度及类别概率。如只检查训练流程,可以增加 `--skip-attachment3`。深度学习运行会输出两模型的官方测试指标、验证缺失情景、AURC-MAE、Bootstrap 区间、权重和运行清单。为满足总附件大小限制,随项目提供的 Q2 归档保留逐情景指标和模型参数;逐行遮蔽/测试门控审计及官方测试单样本明细可由完整重训重新生成,未放入紧凑归档。
若已存在数学分支检查点、只需重新生成附件 3 预测而不重训,可运行:
```bash
export FINAL_DATA_DIR="/path/to/E题数据"
python -m final.q2.math.predict_attachment3 \
--input-version unaligned_50 \
--results-dir final/experiments/q2/unaligned_math_all_b128 \
--output-dir final/output/q2 \
--device auto
```
该入口读取保存的模型、校准与预处理参数,输出 `attachment3_predictions.csv`、`attachment3_audit.csv` 和 `attachment3_prediction_manifest.json`;不会覆盖模型检查点目录中的运行清单。
把两次运行的结果重新汇总到统一对比表:
```bash
python final/compare_unaligned_q2.py \
--math-dir final/experiments/q2/math_rerun \
--deep-dir final/experiments/q2/deep_rerun \
--output-dir final/output/q2
```
结果文件包括 `comparison_validation.csv`(全模型验证对比)、`comparison_test.csv`(预先选出的数学模型及两种深度模型测试结果)、`comparison_aurc.csv`(四种缺失模式的 AURC-MAE)。指标定义、已有对比数值和边界说明见 [REPORTS.md](REPORTS.md)。
## Q3:ATI–HO 训练、评估与附件 4 预测
Q3 的当前方案是 ATI–HO。模型定义集中在 `model/ati_ho.py` 和 `model/ati_ho_config.py`,训练、结构审计、Shapley/Owen 归因与附件 4 推理入口位于 `q3/ati_ho/`。附件 4 只用于最终预测和解释,不参与训练、选型或指标计算。
训练与验证读取官方 `unaligned_50.pkl`,使用统一 Q1 adapter 投影到 50 个 Relative-Progress 槽,并复用只由 Q2 训练集拟合的 robust scaler。训练/验证/测试按来源视频组隔离;相对进度不是物理时间同步。
在项目根目录设置官方附件位置后,运行两阶段训练:
```bash
export FINAL_DATA_DIR="/path/to/E题数据"
python -m final.q3.ati_ho.train --phase all --device auto
```
Stage I 以 seed 42 训练 A0/A1/A2/A3 和未锚定诊断 D0,执行结构与 8 联盟 Shapley 检查。Stage II 以 seeds 42、3407、2026 训练 EarlyConcat + BiGRU、MoFE-7 + MLP Router、初选 ATI 方案和两项消融。检查点和运行记录写入 `final/experiments/q3/ati_ho/`。重训已有模型时显式加 `--force`。
训练完成后生成验证审计和附件 4 文件:
```bash
export FINAL_DATA_DIR="/path/to/E题数据"
python -m final.q3.ati_ho.evaluate --device auto
```
评估按 A0/A1/A2 三 seed 固定验证情景损失选择最终 ATI 方案,计算来源视频组配对 Bootstrap、验证集 Shapley、结构审计、Owen 稳定性、删除/保留诊断和计算成本。题目输出放在 `final/output/q3/ati_ho/`:
- `attachment4_predictions.csv`:20 个样本的预测类别、强度和类别概率。
- `attachment4_explanations.csv`:五个参数的主效应、pairwise 参数项、分类 Shapley 和强度 Shapley。
- `attachment4_local_evidence.csv`:分模态、分相对进度片段的 Owen 贡献与标准误。
- `attachment4_prediction_manifest.json`:数据、adapter/scaler、模型权重哈希和无标签推理信息。
完整指标和实验审计位于 `final/experiments/q3/ati_ho/results/ati_ho/`,主要报告为 `ATI_HO_RESULTS.md`、`ATI_HO_PAPER.md` 和 `EXECUTIVE_SUMMARY.md`。方法细节、训练协议与文件边界见 [Q3 说明](q3/README.md);Q1/Q2/当前 Q3 的合并结果写在 [REPORTS.md](REPORTS.md)。
## 模型与对齐约定
- `model/c0.py` 至 `model/c7_*.py` 分别保存数学方案;C6 的距离、重构和点遮蔽诊断也各有单独文件。
- `model/early_concat.py` 和 `model/mofe.py` 是仅保留的两种深度学习方案。训练辅助模块从 `model/` 导入模型类,架构定义以此处为准。
- `adapter/` 有两种坐标语义:Q1 原生数据需媒体时间戳、持续时长和来源哈希,才能物理时间对齐;附件 2 未对齐特征只支持相对进程投影。代码会检查输入证据,不从数组形状推断物理对齐。
- 未对齐输入没有逐行质量分数时,按可见行质量权重为 1 处理;这一假设写入运行清单。
## 实验复现与文件约定
训练结果写入传入的 `--output-dir`;建议为每轮实验使用新的空目录。检查点、训练历史、数据/划分哈希、随机种子、特征版本、adapter 审计和验证/测试指标随运行结果保存。官方附件不进入版本库;`final/.gitignore` 已忽略 `data/`、Q1 中间缓存和环境目录。
当前已整理的 Q1/Q2/Q3 表格和结果摘要保存在 `output/`、`experiments/` 与 [REPORTS.md](REPORTS.md)。若要重建所有模型权重和预测,按上面的 Q1、Q2、Q3 顺序运行相应入口;Q1 原生视觉特征还需要单独准备 OpenFace 2.2.0。