EgoSocial 实战指南:基于 Ego4D 的社交智能干预检测数据集与 EgoSoD 多模态评估方法
【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research
导读
EgoSocial 是 Google Research 开源项目 google-research 中面向 AR/VR 场景 AI 助手社交感知能力的一项研究代码库(位于 EgoSocial/)。它提供了一套从 Ego4D 视频构建的大规模第一视角(egocentric)社交交互数据集(13,500 个视频-问题对),并配套了名为 EgoSoD(EgoSocial Detection)的社会思维图方法,用于评测与提升大模型判断"何时该介入社交场景"的能力。阅读本文后,你将掌握:从 Ego4D 原始视频裁剪生成 EgoSocial 数据集的完整流程、Gemini 与 Phi-4 两条模型推理链路的环境搭建与命令用法、8 个社交子信号的配置细节,以及如何用宏 F1 等指标复现干预时机检测的评测。
注意:该代码库目前仍在开发中(README 明确标注 "under development"),部分模块可能不完整或需要按实际环境修改后才能按预期运行。
背景:为什么需要 EgoSocial
当前的大语言模型普遍缺乏足够的社交意识,难以在增强现实/虚拟现实(AR/VR)环境中胜任 AI 助手的角色。核心痛点在于:模型很难判断在社交场合中什么时候介入才不会打断自然的人际互动——介入太晚会错过帮助时机,介入太早则会破坏正在进行的交流。
为此,EgoSocial 项目做了两件事:
- 构建数据集:一个大规模的第一视角数据集,包含从 Ego4D 派生的13,500 个视频-问题对,专门聚焦社交交互,作为评估 AI 感知社交动态、判断合适干预时机的基准。
- 提出方法:名为EgoSoD(EgoSocial Detection)的新方法,通过"社会思维图(social thinking graph)"整合音频、视觉等多模态线索,对参与者和他们的交互进行建模,从而精确定位 AI 助手应当介入的时机。
数据集:结构、生成与格式
数据来源
EgoSocial 数据集基于 Ego4D 数据集的标注文件,从对应的 Ego4D 视频片段中抽取视频帧与音频片段构建而成。因此,生成数据集的必要前提是先下载对应的 Ego4D 视频片段(本仓库不包含原始视频,仅包含标注文件)。
数据生成流程
生成脚本位于 scripts/generate_data.sh,其内部调用 scripts/data.py 完成实际的帧与音频抽取。完整的操作步骤如下:
第 1 步:安装前置依赖
ffmpeg:必须安装并加入系统 PATH,用于从视频中抽取帧与音频。- 已下载好的 Ego4D 视频片段。
第 2 步:配置生成脚本
打开 scripts/generate_data.sh,将以下变量替换为你的本地路径:
| 变量 | 含义 | 脚本中的默认占位值 |
|---|---|---|
ANNOTATION_FILE | 标注文件路径 | ../annotations/egosocial_annotations.json |
EGO4D_CLIPS_DIR | 已下载的 Ego4D 视频片段目录 | /path/to/ego4d/clips/ |
OUTPUT_DIR | 生成数据集的输出目录 | /path/to/output/dir |
第 3 步:执行脚本
cd scripts bash generate_data.sh脚本会调用python3 "${SCRIPT_PATH}" --annotation_file ... --ego4d_clips_dir ... --output_dir ...完成抽取,结束后打印Data extraction finished.。
底层抽取逻辑(源码级解析)
scripts/data.py 的核心逻辑非常清晰,值得了解以方便排查问题:
- 按标注逐条处理:脚本读取标注 JSON 后,以
clip_key遍历每个条目,从context字段中取出segment_parent_key(即 Ego4D 的clip_uid)、image/start_time_seconds与image/end_time_seconds;任一字段缺失或对应{clip_uid}.mp4不存在都会跳过该条(视频缺失时静默跳过)。 - 抽帧(
extract_frames):使用ffmpeg -ss <start> -to <end> -vf fps=1 -q:v 2以1 FPS抽取该时间段的帧,随后按step = max(1, num_frames // 10)均匀采样并重命名为0.jpg、1.jpg……最多保留10 帧,并清理临时文件。 - 抽音频(
extract_audio):抽取最多 10 秒的音频(actual_duration = min(duration, 10.0)),编码为 WAV(pcm_s16le)、采样率16 kHz、单声道。 - 健壮性:对非正时长(
duration <= 0)打印警告并跳过;ffmpeg 失败时会输出 stderr 便于排查。
生成后的目录结构
在OUTPUT_DIR下将得到如下结构:
egosocial_eval ├── annotation.json # 数据集的标注文件 ├── audio # 音频文件夹 │ ├── video1.wav │ ├── video2.wav │ └── ... ├── frames # 视频帧文件夹 │ ├── video1 │ │ ├── 0.jpg │ │ ├── 1.jpg │ │ └── ... │ ├── video2 │ │ ├── 0.jpg │ │ ├── 1.jpg │ │ └── ... │ └── video3 │ ├── 0.jpg │ ├── 1.jpg │ └── ...安装与环境配置
按以下步骤搭建运行环境:
安装 Python 依赖(仓库根目录下):
pip install -r requirements.txtrequirements.txt 固定了关键版本:
torch==2.6.0、transformers==4.48.2、flash_attn==2.7.4.post1、accelerate==1.3.0、soundfile==0.13.1、pillow==11.1.0、scipy==1.15.2、torchvision==0.21.0、backoff==2.2.1、peft==0.13.2。安装 ffmpeg:通常可用系统包管理器安装,例如 Debian/Ubuntu 上执行
sudo apt-get install ffmpeg。Gemini 模型:需要 Gemini API key。
Phi-4 模型:参照官方站点
microsoft/Phi-4-multimodal-instruct配置环境(Hugging Face 上的多模态指令模型)。解压标注文件:在仓库根目录执行
tar -xvzf annotations/annotations.tar.gz(annotations/annotations.tar.gz 即标注压缩包。)
项目结构总览
EgoSocial/ ├── annotations/ # 标注文件 ├── Gemini/ # Gemini 模型相关脚本与代码 │ ├── configs # Gemini 实验配置文件 │ ├── src # Gemini 模型源码 │ └── runs # 运行 Gemini 实验的脚本 ├── Phi4/ # Phi-4 模型相关脚本与代码 │ ├── phi4_video_audio_SI_baseline.py │ ├── phi4_video_audio_SI_baseline_audio2text_conv_all.py │ ├── phi4_video_audio_SI_baseline_audio2text_conv_all_graph.py │ └── run.sh ├── scripts/ # 数据预处理脚本 │ ├── data.py # 从视频抽取帧与音频 │ └── generate_data.sh # 运行 data.py 的 Shell 脚本 ├── config.json # 数据路径基础配置 ├── evaluation_res.py # 模型预测评测脚本 ├── requirements.txt # 依赖包 └── README.md # 项目文档配置参数详解
Gemini 实验通过configs/xxx.json配置,Gemini/configs/ 下按模型版本(gemini1.5pro / gemini2.5pro / gemini2f)与信号模式(baseline / aud2text_conv_all / aud2text_conv_graph 等)提供了多份现成配置。核心参数如下:
| 参数 | 说明 | 示例值 |
|---|---|---|
model | 模型名称 | gemini-2.5-pro-preview-03-25 |
question | 提示词问题(prompt) | 见下方详细示例 |
frame_num | 从视频中使用的帧数 | 10 |
dataset | 标注文件路径 | .../annotation_new_full_social_interaction_focus_v3.json |
audio_folder | 音频文件夹路径 | .../egosocial_eval/audio/ |
audio_text_path | 若已把音频预处理为文本,指向该文本文件 | .../logs/gemini2.5_aud2text_conv_dic.json |
save_json_path | 日志(预测结果)保存路径 | .../egosocial_eval/logs |
提示词模板与 8 大社交因子
以 gemini2.5pro_SI_baseline_aud2text_conv_all_rea_H.json 为例,question字段设计了一套结构化的提示词,要求模型:分析第一人称视频与音频、结合音频转文本(<audio_text>占位符)、参考 8 个社交因子(<sub_signal>占位符,由代码注入),并输出固定格式(Answer: [Yes/No]、Confidence: [High/Medium/Low]、Reasoning:列出所用因子索引)。
这 8 个核心因子在 Gemini/src/main.py 中硬编码:
| 编号 | 因子(sub-signal) | 问题 |
|---|---|---|
| 1 | someone talk | Is there anyone else talking? |
| 2 | turn talk | Are there alternating speech turns? (or are there multiple people talking?) |
| 3 | talk to me | Is there anybody talking to the wearer? |
| 4 | i talk | Is the wearer talking? |
| 5 | personal space | Is there any person within person space to the wearer? (Person space means within 1.2 meters.) |
| 6 | look at me | Is there someone looking at the wearer? |
| 7 | i look at | Is the wearer looking at someone? |
| 8 | i focus | Is the wearer focusing? |
提示词还内嵌了这些因子之间的层级关系:问题 1 和 5 是第一层(若两者均为 False 则无需继续分析);问题 2、6、7 是中间层(任一为 True 时继续深入);问题 3、4、8 是第三层,非常重要。
--signal参数与信号模式
在 Gemini/src/main.py 中,--signal参数控制注入到提示词中的子信号内容:
s1–s8:分别对应上述 8 个单因子问题;all_H/all_rea_H:将全部 8 个问题拼接后注入(all_rea_H还会启用社会思维图分支,见下文);graph_H/graph_rea_H/graph100_H:从已保存的每个 cue 的预测日志中读取答案,将其解析为形如<someone, is, talking>、<the wearer, is not, focusing>的三元组事实并拼接注入,即"社会思维图"路径。
社会思维图(graph)的构建是 EgoSoD 方法的关键:main.py 会按前缀读取 8 个 cue 各自的预测 JSON(_someone_else_talk.json、_alternating_speech_turns.json、_talk_to_me.json、_I_am_talk.json、_personal_space.json、_looking_at_me.json、_I_look_at_someone.json、_I_focus.json,均位于data_base_path/logs/),通过断言校验 8 份日志的key顺序一致后,把每个response归一化为 yes/no 并转成三元组描述,最终按 clip 聚合为graph[key]。graph100_audio/graph100_video模式则分别只注入前 4 个(音频相关:说话、轮流、对我说话、我在说话)或后 4 个(视频相关:个人空间、看我、我看、专注)因子。
运行模型推理
1. 运行 Gemini
在仓库根目录执行(README 中的命令):
cd Gemini python ../src/main.py --prefix gemini2.5 --signal all_rea_H --api Gemini_API_key --config ../configs/xxx.json注意:README 与 Gemini/runs/run.sh 的写法存在出入(后者调用的是
main_vis_aud_audio2text_graph.py且--config前缺少空格)。实际可用源码文件为 Gemini/src/main.py,其命令行参数为--config(必需)、--signal(必需,取值 s1-s8 / all_H / all_rea_H / graph_H / graph_rea_H / graph100_H / graph100_audio / graph100_video)、--api(必需,API key)、--prefix(必需,如 gemini1.5 / gemini2.5,用于拼接日志文件名)。请按你的实际需求替换参数;若使用非 graph 模式,prefix主要用于日志命名。
运行过程中的关键行为(源码级):
- 从
config['dataset']加载标注,排序后得到全部 clip key,并打印Total number; - 从
audio_text_path加载音频转文本字典audio_text_all,将question中的<audio_text>与<sub_signal>占位符替换为实际内容; - 对每个 clip,上传对应
.wav音频(client.files.upload),读取data_base_path/frames/{clip_id}/{i}.jpg的 10 帧图像(若frame_num < 10,用np.linspace均匀采样缩帧),然后调用client.models.generate_content(model=..., contents=[images, audio_file, prompt])生成多模态回复; - 断点续跑:结果逐条追加写入
save_json_path/{model}_{signal}_{frame_num}f.json,下次运行会自动跳过已处理条数; - 调用失败时休眠 120 秒后重建 client 重试;
- 全部完成后调用
evaluation()(Gemini/src/evaluation.py)计算指标,并把结果写入../res/{model}_{signal}_{frame_num}f.json。
2. 运行 Phi-4
进入Phi4目录后按需选择脚本(README 原始命令):
cd Phi4 # graph think with raw question(结合原始问题的图谱思考) CUDA_VISIBLE_DEVICES=0 python phi4_video_audio_SI_baseline_audio2text_conv_all.py --signal all_rea_H --frame_num 10 # graph think with predicted cue answers(结合预测出的 cue 答案的图谱思考) CUDA_VISIBLE_DEVICES=0 python phi4_video_audio_SI_baseline_audio2text_conv_all_graph.py --signal graph_100_H --frame_num 10 # baseline(基线) CUDA_VISIBLE_DEVICES=0 python phi4_video_audio_SI_baseline.pyPhi4/run.sh 与第三条命令一致(--signal graph_100_H --frame_num 10)。三个脚本分别对应三种评测设定:纯基线(无图谱)、音频转文本 + 全部因子问题(raw question 图谱思考)、音频转文本 + 已预测 cue 答案注入(predicted cue 图谱思考)。Phi-4 需要在本地具备多模态推理环境(GPU、flash_attn、transformers 等,见 requirements.txt)。
评测指标与评估脚本
评测指标定义
Gemini/src/evaluation.py 与 evaluation_res.py 实现了统一的评测逻辑。评测以"social interaction"标注(annotation[key]['sequence']['person/bbox/social_interaction'])为真值:若序列和不为 0 则为正样本(应回答answer: yes),否则为负样本(应回答answer: no)。基于 TP/TN/FP/FN 计算:
- Accuracy(正类):
acc_yes = correct_yes / total_yes - 干预度量(负类准确率):
acc_no = correct_no / total_no——对"该不该介入"这一核心任务,正确判断"不需要介入"(no)的准确率被定义为干预度量; - 总体准确率:
acc_all - Macro F1:正负两类的 F1 取平均,即
macro_f1 = (f1_pos + f1_neg) / 2,作为社交交互检测的主指标; - Weighted F1:按数据集分布加权,权重硬编码为
(1269/1500) * f1_pos + (231/1500) * f1_neg。
用 evaluation_res.py 复现评估
如果你已经拿到预测日志文件,可以在仓库根目录运行(README 原始命令):
python evaluation_res.py该脚本会读取 config.json 中的data_base_path,默认加载logs/gemini2.5_SI_baseline.json作为预测结果、annotation_new_full_social_interaction_focus_v3.json作为标注。针对不同 cue 的评估通过取消注释对应代码块实现——文件里为 8 个 cue 各准备了一段注释代码(someone else is talking、alternating speech turns、talking_to_me、I am talking、personal_space、looking at me、I look at someone、focus),取消某段的注释即可评估对应因子的检测结果,并注意相应调整result_path与annotation_path指向你的日志与标注文件。默认启用的 social interaction 评估会输出四行结果:Yes/No 各自的准确率(含干预度量)、总体准确率,以及Overall social interaction的 Macro F1。
快速上手路线图
把以上内容串成一条可执行的实践路径:
- 准备数据:下载 Ego4D 视频片段 → 配置 scripts/generate_data.sh 中的三个路径 → 运行脚本生成
egosocial_eval(含annotation.json、audio/、frames/); - 解压标注:
tar -xvzf annotations/annotations.tar.gz; - 搭建环境:
pip install -r requirements.txt,安装 ffmpeg,准备 Gemini API key 或 Phi-4 环境; - 配置路径:把 Gemini/configs/ 下所选配置与根目录 config.json 中的
/path/to/your/data/egosocial_eval等占位路径替换为实际路径; - 运行推理:按上文命令运行 Gemini(Gemini/src/main.py)或 Phi-4 脚本,得到
{model}_{signal}_{frame_num}f.json预测日志; - 评估:运行 evaluation_res.py(或复用 Gemini/src/evaluation.py 的
evaluation())得到各 cue 与 social interaction 的准确率与 Macro F1,对比 baseline(SI_baseline)与图谱增强(aud2text_conv_graph*)两种设定下模型对"介入时机"判断能力的差异。
这套流程覆盖了从原始视频到干预时机评测的完整闭环,既可直接复现 EgoSoD 的评估设定,也可作为在 AR/VR 社交感知场景下评测多模态大模型的标准基线流程。由于代码库仍在开发中,运行前请务必核对源码中的参数名与配置文件路径是否与 README 一致(本文已在关键差异处做了标注)。
【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考