Files
modeling_zhaocui/final/README.md
T

186 lines
12 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/` | Q3 训练、验证、附件 4 全量预测和逐样本解释卡片 |
| `output/q1/` | 已整理的 Q1 100 个特征文件、对齐审计和已有结果 |
| `output/q2/` | 已整理的 Q2 未对齐数据模型对比结果表 |
| `output/q3/` | Q3 运行后生成的预测、解释和验证结果 |
| `experiments/q2/` | 本项目最新未对齐 Q2 对比运行、权重和审计结果 |
| `REPORTS.md` | Q1、Q2 实验结果和方法说明 |
| `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 归档保留逐情景指标和模型参数;逐行遮蔽/测试门控审计及官方测试单样本明细可由完整重训重新生成,未放入紧凑归档。
把两次运行的结果重新汇总到统一对比表:
```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:可解释预测与附件 4 输出
Q3 使用附件 2 训练集训练 EarlyConcat + BiGRU;只用官方验证集选择 epoch。默认最多 12 轮、耐心值 3、batch size 64,AdamW 学习率 `3e-4`、权重衰减 `1e-3`,目标函数为交叉熵加 `0.5 × SmoothL1` 强度回归。验证选择使用自然缺失、30% 单模态/同步缺失和 50% 异步缺失情景。附件 4 的 20 个未对齐样本经同一 adapter 投影,生成类别、情感分数、三类概率、模态贡献、主导模态及逐样本解释卡片。
```bash
python -m final.q3.train_interpretable \
--input-version unaligned_50 \
--attachment4-version unaligned_50 \
--output-dir final/output/q3 \
--device auto
```
输出目录包含:
- `attachment4_predictions.csv`:20 条完整预测及类别概率。
- `attachment4_explanations.csv`:预测、各模态遮蔽影响、主导模态和原始转写。
- `attachment4_local_evidence.csv`:文本 token、音频/视频来源行、归一化进程区间和单位置遮蔽影响。
- `attachment4_input_audit.csv`:输入哈希、adapter 模式、长度和可见位置审计。
- `explanation_cards/`:逐样本 Markdown 解释卡;`typical_explanation_card.md` 为置信度接近样本中位数的代表样例。
- `validation_metrics.json`、`validation_predictions.csv`、`validation_errors.csv`、`validation_diagnostics.png`:验证指标、误差样本和图示。
附件 4 未对齐特征没有可靠物理时间戳,因此音频/视频证据位置以归一化进程和原始特征行表示,不伪造秒级时间。模态/位置分数由遮蔽特征前后的模型概率差计算,表示模型敏感性,不是因果效应或情感成因证明。输出中提供源视频相对路径,便于回到原片段查看。
## 模型与对齐约定
- `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 表格和结果摘要保存在 `output/`、`experiments/` 与 [REPORTS.md](REPORTS.md)。若要重建所有模型权重和预测,按上面的 Q1、Q2、Q3 顺序运行相应入口;Q1 原生视觉特征还需要单独准备 OpenFace 2.2.0。