Ophora-160K 眼科手术视频指令集 — 十六万段五秒切片

外科手术视频 / 指令微调 / Apache-2.0

来源 https://huggingface.co/datasets/General-Medical-AI/Ophora-160K发布时间: 2026-10-26最后更新: 2026-10-26 阅读 4
Ophora-160K 眼科手术视频指令集 — 十六万段五秒切片

信息速览

数据集名称Ophora-160K 眼科手术视频指令集 — 十六万段五秒切片
数据类型原始影像,文本语料,元数据
规模不适用(片段级计数十六万二千一百八十五个,源自九千八百一十九段术者叙事视频;未按患者计数,同一患者可能对应多段视频)
接入方式https://huggingface.co/datasets/General-Medical-AI/Ophora-160K
AI 就绪度

Ophora-160K 不是一本相册,而是一叠被切成小段的录像带。它的基本单位是「几秒钟的画面 + 一句让模型照做的话」,全库合计十六万余条。它出自一篇 MICCAI 2025 的早期接收论文,论文的主角其实是一个生成模型,数据集是那个模型的燃料。这一点决定了整篇资料的取向:它被设计出来是为了让模型学会「照着一句话,画出一段手术」,而不是为了让模型学会「看懂一台手术」。

它的时间单位小得反常。片段平均只有 5.54 秒,短到不足以完成一个可以被命名的操作步骤,长到足以包含一次器械入眼、一次组织接触、一次离开。这个尺度不是随便定的,它来自底部素材——一批由术者自己配旁白的公开手术视频,旁白本身就按这个颗粒度在讲。

库内眼科词条已有很多,但几乎全是静态画面——眼底照、光学相干断层、裂隙灯照片、血管造影。它们回答的问题是「这是什么」;这一份回答的问题是「接下来该做什么」。这是两个不同的认识层级,前者的对象是状态,后者的对象是过程。一屏速览见下表。

维度 内容
官方名称 Ophora-160K
发布方 General-Medical-AI(Hugging Face 组织)
论文 Ophora: A Large-Scale Data-Driven Text-Guided Ophthalmic Surgical Video Generation Model
论文出处 arXiv:2505.07449,MICCAI 2025 早期接收
记录单位 一个视频片段 + 一条祈使式生成指令
规模 十六万二千一百八十五个片段-指令对,源自九千八百一十九段叙事视频
平均片段时长 5.54 秒
视频来源 公开网络平台的术者叙事型眼科手术视频
分发格式 十个分卷的 tar.gz 压缩包 + 两张 CSV 清单
总体积 约 418 GB(分卷合计,未解压)
隐私保护子集 约两万八千条,经视觉语言模型筛查去除字幕与水印
许可字段 Apache License 2.0
访问方式 仓储为自动审批门(gated: auto),需登录并同意条款
基线模型 CogVideoX-2b,两阶段渐进式指令微调
术式覆盖 眼科手术,论文以白内障手术的十二个阶段做验证
患者级信息 未披露

§1 它要解决的具体麻烦

1.1 手术视频有画面,但没有句子

任何一家做得起手术录像的医院,硬盘里都堆着几百上千小时的眼科手术视频。这些视频的价值显而易见——它们完整记录了一个熟练术者的手怎么动、器械怎么进、什么时候停。麻烦在于,这些视频几乎没有配得上机器阅读的句子。录像系统会给你时间戳、给你文件名、给你手术间编号,但不会告诉你「第十四分钟正在做撕囊」。

而做文本引导的视频生成或视觉-语言对齐,需要的正是句子,还得是同一套语法、同一种颗粒度、同一批术语。这个翻译成本高得离谱:一位眼科医师看一小时手术视频写出可训练的描述,保守估计要两三倍于视频本身的时长,且换一个医师就是另一套说法。

Ophora-160K 的做法绕开了这个成本。它找了另一类视频——术者一边做一边讲的那种。这类视频在公开平台上大量存在,本来是为了教学和同行交流拍的,旁白里天然带着「现在我在做角膜切口」「这里是超声乳化头」这样的句子。这批句子不是为机器学习写的,但它们已经具备了指令的骨架:有动作、有对象、有时序。剩下的工作只是把口语化的叙述改写成祈使句,把冗余的教学性议论删掉,然后按画面切成段。这是一条从「已有的公开素材」到「可训练语料」的捷径,也是它能在 2025 年一次性做出十六万条的原因。

1.2 三条常见的错误期待

第一条错误期待,是以为这是一个手术阶段数据集。它不是。它的标注是自由文本,不是受控标签。你在里面找不到「phacoemulsification」这个枚举值,你只能找到一句可能包含这个意思的英文祈使句,而且这句话的表达方式每一段都不一样。要做阶段识别,你得自己把这些句子归到一套分类体系上,这个映射没有现成的答案。

第二条错误期待,是以为十六万条意味着十六万个独立病例。不是。所有片段来自九千八百余段视频,平均每段视频被切成十六七个片段。这意味着片段之间存在极强的相关性——同一台手术的相邻片段共享同一个患者、同一套照明、同一台显微镜、同一副手套。你的有效样本量远小于行数,任何按行随机划分训练集与测试集的做法都会导致泄漏。

第三条错误期待,是以为 Apache-2.0 等于「可以放心商用」。许可字段是真的,许可文本也是真的,但许可只能处分发布方有权处分的部分。视频画面本身来自公开平台的第三方上传,那些上传者是否获得了患者同意、是否允许再分发,不在这个许可的射程之内。这一点在后面的 §3 会单独展开。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
训练一个能按文字生成手术画面的模型 十六万余条片段-指令对,含统一预处理与训练配方 够,这是它设计的初衷
做手术阶段识别 无阶段标签,只有自由文本指令 不够,需自行映射或另找标注集
做器械检测或分割 无边界框、无像素掩码 不够,一条都没有
研究手术视频的视觉-语言对齐 大量弱对齐的片段-句子对 够用,但需接受标注噪声
给手术视频做检索或摘要 整齐的时间区间与文本 够,但需自建索引
拿到患者年龄、性别、合并症 未披露任何患者级字段 不够,无法按人群横切
拿到术者资历与机构来源 未披露 不够
直接用于临床教学放映 生成内容是合成画面,未经逐帧复核 不够,也不应该
商用部署 许可字段允许,上游权利需自评 部分够,需法务过一遍
复现论文的生成质量 训练配方、超参、评测指标均已公开 够,前提是有对应算力

1.4 你的处境与它能帮到的事

这张表不按数据集特性排,按你此刻手上有什么排。

你的处境 它能帮你什么 下一步该做什么
手里有几百小时本院手术录像,但没有一句配文 提供一套「把旁白改写成指令」的流程参考,以及现成的指令句式分布 先抽本院有术者讲解的几十台做试点,验证改写流程能否迁移
想训练手术视频生成模型,但缺数据也缺算力底子 给出可复用的片段切分、分辨率门槛、采样到 49 帧的预处理规范 先用小分卷跑通数据管道,再决定是否全量下载 418 GB
在做手术流程理解,想要额外监督信号 提供与画面时间对齐的弱文本,可作为辅助任务 与带阶段标签的数据联合训练,把文本当作辅助头
需要一份能商用的手术视频语料 许可字段为 Apache-2.0,比研究专用的同类宽松 让法务评估上游素材风险,同时保留许可文件与版本号
要在综述里讲「手术视频指令微调」这个品类 一个 2025 年的时间锚点与完整的方法链 同时引用同期同类工作,说明它不是唯一解
关心患者隐私如何在大规模视频里落地 一套「视觉语言模型全帧筛查 + 子集化微调」的工程范式 不要把范式当成保证,自己再做一遍可识别信息核查
想验证合成手术视频能否做数据增强 论文报告了下游分类器的精度提升 在本地基准上重跑,不要直接引用论文数字

1.5 一句话判断

如果你要的是「手术视频 + 自然语言」的规模化配对,这是目前能公开拿到的最直接的一份;如果你要的是「有了它就能做出可用的手术 AI」,那它只是链条上的一环,而且是最不缺的一环。

1.6 不适合谁:四条边界

不适合把它当成带标签的监督集来用的人。它的文本是自由形式的,没有任何受控词表,也没有一致性校验。你拿它直接做分类,标签维度会随着句子的措辞无限展开,训出来的分类头在多中心数据上几乎必然失效。

不适合需要患者级元数据的人。年龄、性别、术前视力、合并症、术后结局,一个都没有。如果你的研究问题是「这个动作在老年患者身上是否更危险」,这份数据一句话都答不了。

不适合拿它做临床部署前最后一道验证的人。它的片段太短,无法覆盖一个完整术式;它的来源是公开平台,无法代表任何一家具体医院的设备条件、术者习惯与患者构成。用它训出来的模型,在一家真实医院里表现如何,这份数据给不出证据。

不适合对许可链条零容忍的法务环境。视频来自第三方上传,发布方的 Apache-2.0 声明覆盖的是它在数据集层面的贡献,不覆盖上游素材。如果你的合规要求是「每一帧都可追溯授权」,这份数据过不了。

§2 数据构成与规格

2.1 两个清单、十个分卷

仓储里只有十几个文件,结构简单得近乎朴素。文件树里躺着十个大小几乎一致的压缩分卷,每个约 41 GB,合计约 418 GB;另有 .gitattributes、一份总清单、一份子集清单,以及一个在网页端都要点「同意」才能看的 README。

十卷的大小几乎一致,说明打包是按定长字节切的,不是按内容边界切的。你无法只下载某一卷就拿到某个完整术式,分卷是字节块,不是语义块。这一点在 §5 会反复咬人。

清单方面,总清单约 24 MB,子集清单约 3.8 MB。按每行一条记录、每行一两百字节粗估,两份文件的量级与官方公布的片段数、子集条数是自洽的。官方 README 在网页端需要同意条款才能读取,仓储 API 的概览端点则给出了摘要,两者对规模的表述一致。

文件 体积(官方文件树) 内容 可否单独使用
ophora161k.csv 约 24 MB 全量片段标识与对应指令 可以,作为索引
ophora28k.csv 约 3.8 MB 去字幕去水印子集 可以,作为索引
Ophora-160K_clips.tar.gz.part_00 约 41 GB 视频分卷第一块 不可以,需全部分卷
part_01 至 part_08 各约 41 GB 视频分卷中间块 不可以
part_09 约 41 GB 视频分卷末块 不可以
README.md 约 1 KB 说明文档 网页端需授权
.gitattributes 约 2.5 KB Git LFS 配置 无关内容

2.2 字段与记录的完整字典

CSV 的具体列名官方未在公开摘要里逐列列出,以下按论文描述与同类剪辑清单的通行结构整理,标注为「论文口径」的字段有明确来源,标注「推定」的字段需在拿到 CSV 后核对。

字段(推定名) 类型 含义 来源 是否必有
clip_id 字符串 片段唯一标识,同时用作视频文件名 论文口径 是
video_id 字符串 所属源视频的标识 论文口径 是
clip_index 整数 该片段在源视频中的序号 推定 推定必有
start 浮点或时间串 片段在源视频中的起始时刻 推定 推定必有
end 浮点或时间串 片段在源视频中的结束时刻 推定 推定必有
duration 浮点 片段时长,全库均值 5.54 秒 论文口径 是
instruction 字符串 经大模型改写的生成指令 论文口径 是
caption_raw 字符串 原始术者旁白 推定 可能不含
resolution 字符串或整数对 片段分辨率,下限 720×480 论文口径 推定必有
keyframe_count 整数 场景检测抽出的关键帧数,用于质量过滤 论文口径 可能不含
sensitive 布尔或标记 是否检出字幕水印等敏感信息 论文口径 子集清单才有
split 字符串 训练或测试归属,八二开 论文口径 推定必有

有一件事需要提前说明:上表里带「推定」的字段,是因为仓储网页端 README 需要登录而未能读到原文,公开摘要只给出了片段数、源视频数、平均时长与两个清单的用途。这些推定项不改变任何结论——它们只影响解析脚本第一行的健壮性。

2.3 一条记录的完整解剖

把一条记录摊开,它由三段东西构成:一段能被解码成画面的字节流、一行指向它的索引、一句由语言模型写的话。三段之间用标识列缝合,缝合处最容易断。

#-- ophora161k.csv 的一条记录(字段名为推定,值仅示意结构)

clip_id,video_id,clip_index,start,end,duration,instruction,resolution,split
oph_0031287_clip_014,oph_0031287,14,00:01:12.400,00:01:17.940,5.54,"Create a video in which the surgeon lifts the corneal flap with forceps while the anterior chamber stays formed",720x480,train
#-- ophora28k.csv 的同一条记录(仅当该片段通过敏感信息筛查时存在)

clip_id,sensitive_flag,instruction
oph_0031287_clip_014,clean,"Create a video in which the surgeon lifts the corneal flap with forceps while the anterior chamber stays formed"

指令的语法有一个固定骨架值得注意:它几乎都是祈使句,动词在最前,主体是被描述的操作,常常带上约束条件(保持前房成形、器械不得越过瞳孔缘之类)。这种句式的优点是模型容易学——生成模型最擅长处理「画一个 X,满足 Y」的结构;缺点是它把一段连续的术者动作压成了一次性的总体描述,动作内部的先后与节奏被折平了。

对使用者来说,这个骨架意味着两件事。第一,你不能指望从指令里恢复精确的动作时序,它描述的是这一段画面的整体意图,不是逐帧脚本。第二,指令的语言风格高度同质,因为它们都出自同一个大模型的改写,这会带来一种隐蔽的同质化:你的生成模型学到的可能是这个改写模型的措辞习惯,而不是手术本身的分歧。

2.4 结构分布表

以下按官方已公布的维度整理,未公布的留空并注明。

维度 取值或范围 来源
片段总数 十六万二千一百八十五 官方摘要
源视频数 九千八百一十九 官方摘要
平均片段时长 5.54 秒 官方摘要
片段时长范围 未公布上下界 未核实
源视频单条时长 未公布 未核实
去水印子集条数 约两万八千 论文
训练测试划分 八比二 论文
最短分辨率下限 720×480 论文
关键帧数过滤阈值 少于 2 或多于 100 剔除 论文
模型输入帧数 统一采样至 49 帧,不足补零 论文
术式覆盖 眼科手术,验证聚焦白内障 论文
手术阶段数(验证用) 十二个 论文
术者与机构数 未公布 未核实
国别与语种 指令为英文,术者国别未公布 未核实

2.5 与同类资源的字段差异

把这份数据放进同期的手术视频数据集里横向看,差异不在规模,在「字段的野心」。

资源 基本单位 标注形式 时间颗粒度 许可 是否含指令文本
Ophora-160K 片段 + 指令 自由文本 秒级片段 Apache-2.0 是,核心字段
Cataract-101 整台手术 十个阶段的边界时刻 帧级索引 学术用途 否
Cataract-1K 整台手术 十二阶段、器械分割、异常检测 帧级 CC BY 4.0 否
通用的腹腔镜手术视频集 整台手术 阶段、器械、动作三元组 帧级 多为非商用 否
公开网络平台原视频 整段视频 无 无 平台条款 人工旁白,非结构化

这张表想说明的是:Ophora-160K 是横向里唯一一个把「句子」当作一等公民的。代价也随之而来——它的结构化程度最低。Cataract-101 给你一个可以直接算指标的时间轴,它给你的是一段需要你自己解释的话。

§3 它是什么:从叙事视频到生成指令

3.1 品类定位:手术视频指令集,而不是手术视频库

要理解这份数据,得先接受一个分类上的事实:2025 年之前,公开的手术视频数据集基本都能归入「带标注的影像库」这个筐里,无论标注是阶段、器械还是动作,形态都是受控的。而 2025 年前后出现了一批新的东西,它们的标注是自然语言,训练目标是「生成」而不是「判别」。这批东西可以统称为手术视频指令集,Ophora-160K 是其中体量最大的一份之一。

这个分类差别会改变你手上所有工具的用法。判别式数据集的评测是分类精度、召回、F1;生成式数据集的评测是分布距离与跨模态一致性指标。论文用的是 FID、FVD 与一个基于 CLIP 的文本-视频一致性分数,三者都不衡量「这段画面在临床上是否成立」。临床成立性在论文里靠另一个东西兜底——眼科医师对六百段合成视频按七个标准打分,每项零到三分。

这两套评测的关系需要讲清楚。分布指标说你画得像不像这批手术视频,医生打分说你画的这段在手术逻辑上站不站得住。前者容易刷高,后者样本量小、主观性强。任何只看前者的结论都是不完整的。

3.2 三条来路:旁白、切分、改写

数据从「原始视频」到「可训练的一行」,中间走了三步,每一步都有信息损耗。

第一步是旁白。原始视频里术者一边操作一边说话,说的内容包括当前在做什么、为什么这么做、下一步准备做什么,还夹着大量与画面对应得比较松的教学性议论。旁白是整条链的源头,也是最脆弱的环节——它依赖于术者愿意讲,且讲得细。平台上有大量手术视频是完全无声的,或者只有背景音乐,这批视频在源头就被排除了。

第二步是切分。切分的依据是画面而不是旁白,论文用场景检测抽关键帧,再用关键帧密度判断这一段的动态是否足够。太静的段落(关键帧少于两个)被剔除,太闹的段落(关键帧超过一百个)也被剔除。这个规则隐含一个假设:一段好片段应该有几个可以分辨的画面变化。这个假设对快速切换的动作段落不太友好,对长镜头缓慢推进的段落同样不友好。

第三步是改写。原始旁白被送进一个大语言模型,让它把叙述改成生成指令。为了让改写稳定,人工先挑出十条旁白,仔细标出其中的冗余部分作为示例,再用这十条示例去约束剩余部分的改写行为。这一步是整个流程里最像「工程」也最像「手艺」的地方。

步骤 输入 处理 输出 主要损耗
采集 公开平台叙事视频 仅保留有术者讲解的视频 带旁白的视频 无声视频全部丢失
切分 完整视频 场景检测、关键帧密度过滤 固定颗粒度片段 跨越动作边界的段落被切碎
清洗 片段 分辨率低于 720×480 剔除 可用的片段 低清但内容珍贵的素材丢失
改写 原始旁白 大模型按十条示例改写 生成指令 说法被统一,分歧被抹平
预处理 片段 缩放并均匀采样至 49 帧 模型输入张量 时长差异被压缩为同一长度

3.3 许可的两层:字段层与内容层

这是整篇里最需要耐心的一段。

仓储的许可字段写的是 Apache-2.0,这个字段会被镜像站、爬虫、数据集目录一站一站地抄下去,最后出现在各种「可商用医学数据集」的清单里。许可文本本身也确实宽容:允许商用、允许修改、允许再分发,只要求保留声明与变更说明。

但许可字段描述的是「发布方对其贡献授予的许可」,不是「对全部内容的完整权利」。视频画面来自公开网络平台的第三方上传,发布方在论文里的表述是「从互联网收集的叙事视频」,以及把底本归到另一批公开的叙事视频集合上。这意味着权利链条至少有三段:患者对自身影像的权利、术者对录制内容的权利、发布方对整理加工成果的权利。Apache-2.0 只解决第三段。

这个结构在手术视频领域不是孤例,但它的后果在商用场景下会被放大。如果你的用途是内部研究,风险主要落在合规审查层面;如果用途是把生成的画面放进产品演示或培训材料,风险就从「数据合规」变成了「内容合规」,性质不同。

值得注意的是,这个领域里多数同类数据的许可比它更紧。腹腔镜胆囊切除的经典数据集系列用的是非商用共享许可,明确禁止商业利用;白内障手术的公开视频集多用学术用途条款或知识共享署名条款。相比之下,Apache-2.0 在这个品类里是少见的一方。少见到什么程度,可以说:在需要把手术视频塞进商业产品的场景里,可选项本来就少,而这份数据因为许可字段的关系,经常是被第一个想到的——尽管它的内容层风险和别的数据其实一样存在。

3.4 隐私处理的两道工序

隐私在这份数据里被处理成了两个阶段,而不是一次过滤。

第一道工序在数据层。对每个片段,从首帧到末帧按每秒一帧采样,把所有采到的帧喂给一个视觉语言模型,让它判断画面里是否含字幕、水印等敏感元素。只要有一帧被判为含敏感信息,整段视频——注意是整段视频而不是单个片段——就被剔除。剔除之后剩下的部分作为独立子集发布,规模约两万八千条。

第二道工序在训练层。模型先在完整数据上做迁移预训练,再在这个干净子集上做一轮学习率更低的微调,目的有两个:让模型学会不生成带字幕水印的画面,同时又不至于把预训练学到的时空知识冲掉。这个设计相当务实,它承认了一件事——如果你只拿干净数据训练,模型学不到足够的手术多样性;如果你只拿脏数据训练,模型会把字幕当成手术的一部分画出来。

工序 作用对象 方法 覆盖范围 留下的缺口
数据层筛查 整段源视频 每秒一帧送视觉语言模型判断 全量,产出干净子集 判定粒度是整段,一粒坏帧废掉整段
训练层微调 模型参数 在干净子集上低学习率微调 训练流程 不改变数据本身
人工复核 无 论文未报告对数据的逐条复核 无 可识别信息不限于字幕水印
面部与声音 无 未报告处理 无 手术视频通常不露脸,但旁白声音在

最后一行值得说清楚。字幕和水印是可识别信息里最容易自动检出的一类,也是最不危险的一类。真正敏感的是罕见病例的画面特征、器械上的机构标识、旁白里偶尔出现的患者信息。论文报告的筛查只针对前者,后几类没有任何处理说明。这不是批评,任何大规模数据集都有同样的盲区;但对使用者来说,这个盲区必须在自己的流程里补上。

§4 质量与特色:这一批切片的实际成色

4.1 三条质量线:分辨率、动态、语义

评价这批切片,可以拆成三条彼此独立的线。

分辨率线是硬门槛,低于 720×480 的一律剔除,这一条执行得干净。好处是标准化,坏处是把有教学价值但设备老旧的高清以下素材挡在门外。眼科手术视频的拍摄设备在过去十年里换代很快,老素材被系统性排除,等于给数据加了一层「设备新近度」偏置。

动态线用的是关键帧密度,这一条是针对画面冗余的。手术视频里有大量时间镜头几乎不动——等待粘弹剂排出、等待晶体展开、等待切口闭合。这些段落对生成模型是负担,因为它们容易被学成「静止画面」的默认状态。剔除太少关键帧的段落,就是在压缩这部分冗余。剔除太多关键帧的段落,则是在排除剧烈切换,比如器械频繁进出视野的瞬间。

语义线最难衡量,也最容易被忽略。一段画面通过了分辨率与动态两道筛,仍可能因为旁白与画面对不上而失去价值——术者在讲十分钟之后的一次操作,画面却停在一个无关的角度。论文没有报告这一类一致性的量化结果,改写的十条示例也主要是在处理冗余,不是在处理错配。

质量线 判据 优点 风险
分辨率 不低于 720×480 标准统一,便于批量预处理 系统性排除老旧设备素材
动态 关键帧数介于 2 与 100 之间 压缩静止冗余,保留动作段落 可能误伤快切与长镜头
语义 大模型改写,人工十条示例 句式统一,指令可训练 未报告画面与文本的一致性
隐私 每秒一帧送视觉语言模型 覆盖全帧,规则可复现 只查字幕水印,不查其他标识
一致性 未报告 无 无量化证据

4.2 案例:一段被切成十四节的撕囊片段

下面用一条具体片段把上面的抽象说法落到地上。序号与数值按常理构造,用于说明结构,不作为真实记录引用。

设想源视频中有一段超声乳化之前的连续撕囊过程,术者一边用镊子夹住前囊膜边缘沿瞳孔缘走一圈,一边讲「现在夹住这里,慢慢往这边拉,注意不要往下压,压力大了囊膜会裂」。这段操作在真实手术里大约二十秒。按五秒多一点的颗粒度切分,它会被切成四到五段,每段对应一圈的四分之一到五分之一。

再看 §2.3 里那条示意记录。它描述的是一次掀瓣动作,时长五点五秒,指令是一句祈使句,带了一个约束条件——前房保持成形。这个约束不是从画面里读出来的,是从术者的旁白里带过来的,术者当时说「别让前房塌了」。改写模型把它保留进了指令,这是改写做得好的地方:它保住了语义关键,而没有把口语原样搬进去。

做得不好的地方在边界。四段各自的指令都在描述「沿这个方向拉」,但没有一段提到撕囊的起点在哪、终点在哪、这一圈走到第几象限了。生成模型学到的是一连串方向相似的动作,学不到「一圈」这个整体结构。这就是 §4.2 的案例想说明的核心问题:片段化把进展感切掉了。后面的 §7.3 会回到这一点,说明它对下游任务的实际影响。

4.3 训练配方:两段式为什么不是三段式

论文的训练是两段:先在完整数据上做迁移预训练,只训练去噪网络,冻结文本编码器与变分自编码器;再在干净子集上做隐私保护微调,学习率降一半,迭代次数不到预训练的十分之一。

两段式的逻辑是「先学手术,再学体面」。第一段解决的是领域差距——预训练模型见过大量自然视频,但没见过显微镜下的眼球;第二段解决的是内容规范——模型学会不把字幕画出来。两段的冻结策略不同,第一段只放开去噪网络,是因为文本编码器与变分自编码器的权重已经在自然视频上训得很扎实,改它们反而会破坏语义对齐。

这个配方之所以值得单独讲,是因为它给使用者提供了一个可以照抄的最小可行设置。如果你的算力只够跑一段,先跑预训练那一段,把隐私那一段留到你真的要把模型往外发布时再做。

阶段 数据 可训练部分 学习率 迭代次数 目标
预训练 全量片段 仅去噪网络 千分之一 数万次 学手术画面的时空结构
隐私微调 干净子集 部分参数 万分之五 数千次 抑制字幕水印的复现
评测 六百段合成 无 无 无 分布指标与医师打分

4.4 与静态眼科数据的分工

放在千方医数集的眼科谱系里看,这份数据占据的位置很清楚。

数据形态 代表类型 回答的问题 输出形态 与本文数据的关系
眼底照 彩色眼底、超广角 有没有病变、在哪 分类、分割 互补,都是静态但对象不同
断层扫描 光学相干断层、血管成像 层间结构是否异常 分层、定量 互补,深度方向的信息
裂隙灯照片 眼前段照相 前节是否正常 分类 互补,术前的状态
手术视频(判别式) 阶段与器械标注集 现在进行到哪一步 时序分类 可当作阶段标签的来源
手术视频(生成式) 本文数据这一档 下一步该怎么动 指令与画面 自成一档,训练目标不同

第四行与第五行的关系要特别说清。判别式数据给你的是正确答案,生成式数据给你的是参考答案的分布。前者能算指标,后者能扩增样本。两者不是替代关系,是上下游关系——用判别式数据训练分类器,用生成式数据合成额外样本来增强那个分类器,这就是论文在下游任务里做的事。

§5 怎么拿到:取数、解包与最小管道

5.1 仓储是自动门,不是公开直链

仓储的访问状态是自动审批的门禁。意思是你需要用账号登录并点一次同意,之后下载链接才生效。这一步不影响许可条款,它只是平台对数据发布者的一个形式保护。对脚本化取数来说,这意味着必须带一个访问令牌,匿名请求会被挡回去。

令牌放在环境变量里,不要写进代码。下面这一行只打印长度,不打印内容,是一个安全的自检方式。

#-- 检查令牌是否已注入(只回显长度,不泄露内容)
test -n "${HF_TOKEN:-}" && echo "token length = ${#HF_TOKEN}" || echo "HF_TOKEN 未设置"

5.2 先拿清单,再决定要不要下全量

418 GB 不是一个应该顺手点下去的体量。合理的顺序是先只下两张 CSV,把指令分布、源视频分布、时长分布摸清楚,再决定下哪几卷。

清单文件很小,几十 MB 以内,可以直接下载。

#-- 只取清单,不碰视频本体
from pathlib import Path
import os
import requests

TOKEN = os.environ.get("HF_TOKEN", "")
REPO = "General-Medical-AI/Ophora-160K"
BASE = "https://huggingface.co/datasets/" + REPO + "/resolve/main/"

def fetch(name: str, dest: Path) -> Path:
    url = BASE + name
    headers = {"Authorization": "Bearer " + TOKEN} if TOKEN else {}
    with requests.get(url, headers=headers, stream=True, timeout=120) as r:
        r.raise_for_status()
        dest.parent.mkdir(parents=True, exist_ok=True)
        with open(dest, "wb") as f:
            for chunk in r.iter_content(chunk_size=1 << 20):
                if chunk:
                    f.write(chunk)
    return dest

for name in ("ophora161k.csv", "ophora28k.csv"):
    p = fetch(name, Path("data") / name)
    print(name, p.stat().st_size, "bytes")

5.3 用体量反推规模,别用行数硬算

拿到清单之后第一件事是核对它的体量与官方数字是否矛盾。字节数除以行数的粗算,可以给出每行平均字节数;再结合指令句式长度,就能判断这份 CSV 里有没有嵌入很长的原文。这一步不做,你在后面算「平均每条指令多少 token」时会得到荒谬的结果。

#-- 文本层统计:行数、字节数、平均行长、粗略 token 估计
import csv
from pathlib import Path

p = Path("data/ophora161k.csv")
n_bytes = p.stat().st_size
n_rows = 0
n_chars = 0
with open(p, encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        n_rows += 1
        for v in row.values():
            if v:
                n_chars += len(v)

print("bytes", n_bytes)
print("rows", n_rows)
print("avg bytes per row", round(n_bytes / max(n_rows, 1), 1))
print("avg chars per row", round(n_chars / max(n_rows, 1), 1))

5.4 解包时的分卷陷阱

十个分卷是字节流的分块,不是内容的分块。拼接必须先按序合并成一个完整的 tar.gz,再解压,顺序错一个字节整个包就坏了。

#-- 按序拼接十个分卷,再解压(顺序错了整个包就废)
cd data
cat Ophora-160K_clips.tar.gz.part_0[0-9] > Ophora-160K_clips.tar.gz
tar -tzf Ophora-160K_clips.tar.gz | head -20
tar -xzf Ophora-160K_clips.tar.gz -C clips

解压前先 tar -tzf 看一眼清单是好习惯。这一步能提前发现包内路径是否带目录层级,避免解压出一万多个文件铺在同一个目录里。

5.5 按源视频划分,而不是按行划分

这条是最容易踩、后果最深的一个坑。片段之间存在同源相关性,同一台手术的十几个片段共享照明、白平衡、器械、术者习惯。按行随机划分,等于让模型在测试集里看到训练集同一台手术的其他片段。

正确做法是先按源视频聚合,再在源视频层面划分。

#-- 按源视频分组划分,杜绝同一台手术跨集泄漏
import csv
import random
from collections import defaultdict

groups = defaultdict(list)
with open("data/ophora161k.csv", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        groups[row["video_id"]].append(row["clip_id"])

vids = sorted(groups)
random.seed(20261026)
random.shuffle(vids)
cut = int(len(vids) * 0.8)
train_v = set(vids[:cut])
test_v = set(vids[cut:])

train_n = sum(len(groups[v]) for v in train_v)
test_n = sum(len(groups[v]) for v in test_v)
print("videos", len(vids), "train clips", train_n, "test clips", test_n)
assert not (train_v & test_v)

注意最后那行断言。它不是装饰,它是这条管道唯一能自动发现泄漏的地方,也是 §4.2 的案例里那条「四段高度相似」的记录会被抓到的地方。

5.6 搭一个最小可用的读取器

视频本体是常见的容器格式,用 PyAV 或 OpenCV 都能解。论文的预处理是缩放至 720×480 并均匀采样 49 帧,不足补零。下面这一段实现了同样的采样,不做任何模型相关的假设。

#-- 均匀采样 49 帧,不足补零,与论文预处理一致
import numpy as np
import av

NUM_FRAMES = 49
SIZE = (480, 720)

def load_clip(path: str) -> np.ndarray:
    frames = []
    with av.open(path) as container:
        stream = container.streams.video[0]
        for frame in container.decode(stream):
            arr = frame.to_ndarray(format="rgb24")
            frames.append(arr)
    if not frames:
        raise ValueError("no frame decoded: " + path)
    idx = np.linspace(0, len(frames) - 1, NUM_FRAMES).round().astype(int)
    picked = [frames[i] for i in idx]
    out = np.stack(picked)
    if out.shape[1:3] != SIZE:
        out = np.stack([np.array(av.VideoFrame.from_ndarray(x, format="rgb24")
                                 .reformat(width=SIZE[1], height=SIZE[0])
                                 .to_ndarray(format="rgb24")) for x in out])
    if len(out) < NUM_FRAMES:
        pad = np.zeros((NUM_FRAMES - len(out),) + out.shape[1:], dtype=out.dtype)
        out = np.concatenate([out, pad], axis=0)
    return out

sample = load_clip("clips/oph_0031287_clip_014.mp4")
print(sample.shape, sample.dtype)

5.7 取数前该确认的五件事

事项 为什么 怎么确认
令牌有效且有权访问 门禁是自动的但仍需登录 用清单接口试拉一次
磁盘余量 压缩 418 GB,解压后数倍 预留五倍压缩体积
分卷完整 缺一卷整包就坏 核对每卷字节数与文件树
CSV 列名 推定列可能不同 打印表头再写解析代码
许可文件留存 商用审计需要证据链 保存仓储卡片与许可文本快照

§6 与库内条目的关系

6.1 关系图谱

这份数据在千方医数集的眼科谱系里不是孤立的一点,它和三类邻居各有关系。

第一类是白内障手术视频的判别式数据集。它们提供阶段边界、器械掩码、异常标注,正好是这份数据缺的那一层。反过来,这份数据能提供海量的「句子」,可以为那些数据集补充说明性文本——虽然这个补充需要人工映射。

第二类是术前的静态影像数据。眼底照、断层扫描、裂隙灯照片描述术前状态与术后结果,手术视频描述中间过程,三者串起来才是完整病程线。

第三类是通用视频生成数据。训练配方直接继承了自然视频模型的预训练权重,冻结的文本编码器就是在自然图文对上学的。

关联类型 典型邻居 关系 联合使用的方式
同术式的判别式视频集 白内障手术视频阶段集 互补,一个有标签一个没标签 用标签集训分类头,用本文数据做辅助与增强
同术式的分段视频集 白内障手术分段集 时间轴更细 用分段集校准片段边界
术前静态影像 眼底照、断层扫描 病程前后 三者拼成术前术中术后
通用生成模型数据 自然视频-文本对 上游预训练 继承权重后做领域迁移
图像质量基准 手术视频质量评估集 评测互补 用质量集评估合成画面的可信度

6.2 检索路径

在千方医数集里找这批邻居,按标签比按名字可靠。手术视频这一类目前挂「医学影像」下,再细分到「手术视频」与「眼科影像」两个二级标签,多模态的指令对齐则挂到「多模态」下的「影像-文本对齐」。三条路径都能到这个页面,但落点不同:从手术视频进来的人多半关心阶段与流程,从多模态进来的人多半关心文本与生成。

入口标签 二级标签 会捡到的东西 适合谁
医学影像 手术视频 各类手术的视频数据集 做流程理解的工程师
医学影像 眼科影像 眼底、断层、前节、手术 眼科方向的算法与临床
多模态 影像-文本对齐 图文与视频-文本配对 做视觉语言模型的人
医学影像 医学图像分割 带掩码的器械与组织集 需要像素级标签的人

§7 质量评估与局限性

7.0 阅读本节前的一个前置校正

在看这一节的评分之前,需要先纠正一个常见的定位误判。很多人在打开这份数据时,脑子里想的是「手术视频数据集」,于是按手术视频数据集的评价体系去打分——阶段划分细不细、器械标注全不全、帧级标签密不密。按这套标准,这份数据会得一个很低的分,因为它一项都不占。

这个错位的根源在于把它放错了品类。它属于生成式的指令集,评价它应该看三件事:指令与画面的对齐度、画面的多样性、以及训练出来的模型能不能在下游派上用场。前两件决定了它作为燃料的质量,第三件决定了它作为研究材料的价值。用判别式数据集的标准来评它,就像用词典的收录量去评价一本语法书——两件事都重要,但问的不是一个问题。

下面五个维度里,「标注」这一项的分被压得比较低,这不是因为它做得差,而是因为它本来就不打算做那件事。同样,「人群代表性」这一项几乎无法评分,因为数据里根本没有人口学字段。

7.1 五维评分

维度 得分(五分制) 依据 主要扣分点
规模 4.5 十余万条配对,覆盖近万段源视频 片段平均五秒多,有效时长有限
结构规范性 4.0 两个清单、统一预处理、固定帧数 CSV 列名未在公开摘要中列全
标注丰富度 2.5 只有一句自然语言,无结构化标签 无阶段、无器械、无动作原子
人群与场景代表性 1.5 无任何人口学字段,来源机构未披露 无法评估偏置,也无法校正
许可清晰度 3.0 字段为 Apache-2.0,在本品类中少见 上游素材权利链条未披露
文档完整度 3.5 论文方法链完整,预处理明确 数据卡需登录,字段字典未公开

合计(简单平均)为 3.17。这个分数放到同类的生成式指令集里算中上,放到全部手术视频数据集里算中等偏下,原因就是 §7.0 说的定位。

按 DAIMS 的框架换个角度再评一遍,结论会更清楚。DAO 与 DAIMS 关注的是数据本身的可得性与可用性,而不是模型效果,两者混在一起评容易把问题归错地方。下表按可得性、可用性、可理解性、可链接性四个面向给分,每个面向再落到具体子项。

DAIMS 面向 子项 评分 说明
可得性 公开访问 3 门禁自动审批,需账号
可得性 下载成本 2 418 GB 分卷,五倍磁盘余量
可得性 许可明确度 3 字段明确,上游链条不明
可得性 长期可获取性 4 托管于大型公共平台
可用性 记录完整性 4 字段基本齐备,少量未知
可用性 格式易解析 5 CSV 加通用视频容器
可用性 预处理一致性 4 统一分辨率与帧数
可用性 标注粒度 2 只有整段级句子
可理解性 文档完备度 3 论文详尽,数据卡需登录
可理解性 字段语义清晰 3 列名未公开,需自建字典
可理解性 溯源信息 2 源视频标识有,机构无
可链接性 标识稳定性 4 片段标识可作为主键
可链接性 与外部本体映射 1 无本体映射,需自建
可链接性 跨数据集对齐 2 需靠人工判断同术式

八个可得性与可用性子项的平均为 3.375,六个可理解性与可链接性子项的平均为 2.5。两者差得不算大,但差距的方向很有信息量:这份数据的「能不能下载、能不能读」做得比「能不能对上别的东西」好得多。这与它的设计目标一致——它想让你拿去训模型,不太在意你拿去连本体。

7.2 与满分之间的距离

如果一份手术视频指令集能做到满分,它应该长什么样?

它应该有时间断点标注,告诉你一个片段从哪里开始到哪里结束,而不只是一个固定的五秒多切法。它应该有阶段标签,让指令文本与受控类别并存。它应该披露采集机构,让人能判断设备与术者习惯的分布。它应该逐条给出画面与指令的一致性强弱标记,让人知道哪些行可以信、哪些行只是聊备一格。它应该公开 CSV 的完整列名与字段字典。

这份数据在最后一条上只是没有公开,不代表没有;在前四条上是设计上的取舍,不是疏漏。分辨清楚哪些是「做不到」、哪些是「没做」,比笼统地说它不完美有用得多。

应有能力 本数据的状态 性质 使用者能补吗
时间断点标注 有,但按固定颗粒度切 设计取舍 部分可以,用场景检测重切
阶段标签 无 设计取舍 可以,需另一套标注集
采集机构披露 无 未披露 不可以
一致性标记 无 未做 可以,用模型自评加抽样人工
字段字典 未公开 未公开 可以,拿到 CSV 后自建
器械与动作原子 无 设计取舍 需另行标注

7.3 已知的、可枚举的偏差

第一类是同源偏差。近万段源视频撑起十六万余条记录,单段视频平均贡献十几条。任何按行统计得到的「多样性」都是虚高的,真实多样性由源视频数决定。这一点在 §4.2 的案例里已经露过一次面——同一圈撕囊被切成四段,四段高度相似。

第二类是设备偏差。分辨率下限把老设备挡在门外,等于系统性地偏向近十年的显微摄像系统。不同厂家的白平衡、对比度、视场直径都会渗进画面,模型很可能把「某品牌的成像风格」当成「眼科手术的样子」。

第三类是语言偏差。指令由同一个大模型改写,措辞同质,模型会连改写者的表达习惯一起学走。

第四类是时长偏差。五秒多的颗粒度把快慢不一的步骤压成同一长度,手术的节奏差异消失了。

第五类是流程偏差。片段不携带它在整台手术中的位置,看到撕囊不知道是开场还是中场。手术的本质是序列,这份数据把它拆成了散点。

偏差 由来 表现 缓解方式
同源 单段视频贡献多片段 多样性虚高 按源视频分组划分与统计
设备 分辨率门槛与平台上传 偏向近十年设备 按成像风格分层评估
语言 单一模型统一改写 指令句式同质 引入人工改写子集做校准
时长 固定颗粒度切分 快慢节奏被抹平 记录原时长并做重采样实验
流程 片段脱离序列位置 丢失阶段进展 保留源视频内序号,做序列建模
隐私 只查字幕水印 其他标识未处理 自建二次筛查

7.4 外部验证矩阵

一份数据集的可信度,很大程度上取决于它被多少外部工作引用、被多少种任务复现。按目前公开可得的信息整理如下。

验证方 验证内容 结果 可信度
论文作者(同源) 生成质量:分布距离与一致性分数 三个指标均优于对比基线 中,自评
论文作者(同源) 医师主观评分,三名眼科医师,六百段样本 七个标准均在有效区间 中高,有第三方参与
论文作者(同源) 下游阶段识别增强 分类器精度有提升 中,自评
欧洲文献库检索 检索该数据集相关文献 未检出一篇被索引的论文 低,数据库覆盖不全
独立复现 无公开报告 无 未核实
数据集目录收录 多个目录站收录 已收录 低,只反映传播

第四行需要解释。按题名在欧洲文献库检索,命中数为零;该论文的预印本尚未进入生物医学文献索引。这不说明论文不存在——预印本在计算机视觉会议体系中本就常常不进这类索引——但它说明一件事:如果你的引用需要生物医学索引层面的可查性,这条你得自己补。

7.5 它为何能持续:靠的是一条别人不愿走的路

一份数据集能持续存在,通常靠三种东西之一:独家内容、持续更新、或者极低的获取成本。这份数据靠的是第一种加上一点第三种。

独家内容的部分在于「叙事视频」这四个字。绝大多数手术视频数据集来自医院内部录制,摄制条件可控但覆盖窄;这份数据反其道而行,去找那些术者自己拍了、自己讲了、自己传到公开平台上的视频。这个池子的规模远大于任何单中心内部录制,增长由整个外科教育社区的分享行为驱动,不依赖某个实验室的经费周期。流程可以复制,池子复制不了。

极低成本的部分在于处理链条的自动化程度。切分靠场景检测,筛选靠关键帧密度,改写靠大语言模型,隐私筛查靠视觉语言模型。整条链上人工只出现在两处:十条示例的标注,和六百段合成视频的评分。这意味着边际成本随规模增长得很慢,别人做一万条和做十万条的工作量差距不大。

风险也在这里。它的持续依赖于两个外部条件:公开平台上叙事视频的持续供给,以及平台对这类内容的政策不变。前者目前稳定,后者不由发布方控制。如果平台收紧医学内容的公开传播,这个池子会萎缩,而医院内部录制那条路它已经放弃了。

§8 生态位与历史

8.1 一条时间线

2025 年 5 月,论文首次挂上预印本平台。同月中旬连续修订,六月下旬到七月中旬又改了两轮,七月十六日仓储最后一次更新。仓储创建时间是七月十四日。论文被一个医学影像计算领域的会议早期接收。

这个时间线的密度值得注意:从首次提交到最终版,两个月内七次修订,中间夹着仓储上线。这说明数据集的整理与论文的写作是同步推进的,不是先有论文再补数据。对使用者来说,这意味着数据卡与论文方法在时间上是贴合的,不太会出现「论文描述的处理流程与实际发布内容不符」这种经典问题。

时间 事件 意义
2025-05-12 论文首版提交 方法链首次公开
2025-05-13 第二版 错字与格式修订
2025-06-06 第四版 内容实质修订
2025-06-26 第六版 实验补充
2025-07-14 仓储创建 数据对外发布
2025-07-16 仓储最后更新 文件树定型
2025-07-12 第七版 最终定稿

8.2 它继承了什么

这份数据的方法几乎每一环都能找到上游。

叙事视频这个概念来自更早的一批公开手术视频集合,那批集合的核心主张是「术者讲解本身就是一种标注」,把旁白当作弱标签来用。片段切分的思路来自通用视频理解,场景检测抽关键帧是标准做法。指令改写的做法来自大规模视觉-语言指令集的构建惯例,用少量人工示例约束大模型输出。隐私筛查用视觉语言模型,是 2024 年之后才开始普及的做法,它比传统检测器更灵活,因为可以处理「这道水印算不算敏感」这种需要语义判断的问题。

把这些上游拼起来,得到的就是这份数据。它没有发明任何单一环节,它的贡献是把这些环节串成了一条能处理十万量级的流水线,并且把生成模型这个下游目标放在了设计的最前面。

8.3 它改变了什么

在它之前,手术视频这个品类的关键词是「标注密度」——谁能标得更细,谁的数据集就更有价值。阶段要标到帧、器械要标到像素、动作要标到原子。

这份数据换了一套关键词:「指令可执行性」。它不关心你能不能在某一帧上数清有几把器械,它关心你写的那句话能不能指挥一台机器画出一段合理的画面。这个转向把评价中心从「标得细不细」挪到了「说得准不准」,并且顺带把标注成本从「医师逐帧」降到了「模型批量改写加少量校验」。

这个转向在 2025 年之后迅速铺开,形成了一批同类工作。它们的共同点是:以生成模型为下游,以自然语言为标注形态,以公开素材为来源。这类工作目前都面临同一个问题——生成的手术画面在临床可接受性上的证据都很薄。论文在这方面做得比较扎实,找了三位眼科医师、六百段样本、七个维度打分,但这也只是单次的小规模评定。

8.4 它在图谱中的位置

把眼科方向的公开数据按「静态与过程」「判别与生成」两个轴摆放,这份数据落在右下角。

象限 特点 代表类型 本文数据的位置
静态 × 判别 分类、分割 眼底照、断层扫描 无
静态 × 生成 合成影像 合成断层图 无
过程 × 判别 阶段、器械、动作 手术分期集、器械分割集 无
过程 × 生成 文本生成视频 手术视频生成集 就在这里

这个象限在 2024 年之前几乎空白,不是没人想到,是条件不成熟:生成模型不够强、公开供给不够多、隐私筛查没有低成本方案。三个条件在 2024 到 2025 年之间同时到位。

8.5 前身与近邻

  • OphVL 与同类叙事视频集合:提供原始视频与旁白,是本文数据的直接底本。
  • Cataract-1K:提供十二个阶段的标签体系,论文用它构造医师打分的指令。
  • Cataract-101:提供早期的阶段边界标注范式。
  • OphNet:提供手术流程基准,论文用它检验合成数据的下游增益。
  • CogVideoX-2b:提供基础生成能力,冻结其文本编码器与变分自编码器。
  • 腹腔镜手术视频三元组标注集:同属过程类数据,但标注是受控的,许可多为非商用。

§9 使用指引

9.1 三种角色的路径

做生成模型的人,路径最短。拿清单、验分布、按源视频划分、跑通单卷、照抄两段式训练配方、在一个小规模留出集上看分布指标,再找两位眼科医师做盲评。这条路上最容易翻车的不是模型,是数据管道——分卷拼接与泄漏划分,前面已经写过两遍。

做流程理解的人,路径要绕一下。这份数据本身不能直接训分类器,得先找一个有阶段标签的集合,把本文数据的指令映射过去。映射可以用文本嵌入加聚类的半自动方式,也可以用大模型做小样本归类,但无论哪种,都必须人工抽检。抽检比例建议不低于百分之五,且要按源视频分层抽。

做临床或教学质控的人,路径最不一样。你不该直接用它训练任何东西,你应该把它当成一个观察材料——看看公开平台上术者们都在讲什么、讲得多细、哪些步骤被反复强调、哪些被一带而过。这个视角下,它的价值不在训练,在于它是一份关于「外科教育内容供给」的普查底稿。

角色 第一步 最容易翻车 建议投入
生成模型研究者 只下清单,看指令分布 分卷拼接顺序 中等,先小后大
流程理解工程师 先找带标签的集合 指令到标签的映射 高,映射是主要工作
教学与质控 抽样读指令与旁白 误把它当临床证据 低,纯阅读
法务与合规 读许可字段与论文来源描述 把许可字段当完整授权 中等,需出书面意见

9.2 一条最短的可用流程

从零到能跑一次前向,最短的路径是下面这六步。它假设你已经拿到令牌、装好依赖。

#-- 六步:环境、清单、小卷、解包、抽检、前向
set -e
python -m venv .venv && . .venv/bin/activate
pip install huggingface_hub av numpy requests

huggingface-cli download General-Medical-AI/Ophora-160K \
  ophora161k.csv ophora28k.csv --local-dir data

python - <<'PY'
import csv
from collections import Counter
with open("data/ophora161k.csv", encoding="utf-8") as f:
    rows = list(csv.DictReader(f))
print("rows", len(rows))
print("columns", list(rows[0].keys()))
print("videos", len({r["video_id"] for r in rows}))
PY

跑完这一段,你应该能看到三行输出:行数、列名、源视频数。如果列名与 §2.2 的推定表对不上,先改解析代码,再往下走。

9.3 引用方式

引用这份数据,至少要给三层:数据本身、论文、以及你使用的版本。仓储在不断更新,论文有多个版次,只写一个名字在两年后无法回溯。

#-- 引用模板(GB/T 风格,三层齐备)
General-Medical-AI. Ophora-160K: a video-instruction dataset of ophthalmic surgery[DB/OL].
Hugging Face, 2025-07-16[2026-10-26]. https://huggingface.co/datasets/General-Medical-AI/Ophora-160K.

Li W, Hu M, Wang G, et al. Ophora: a large-scale data-driven text-guided ophthalmic
surgical video generation model[C]//MICCAI 2025. arXiv:2505.07449v7.

正文里提到规模时,建议写明「截至 2025 年 7 月版」,不要写「目前」。数据集会变,论文会改,写死的表述比写活的更可靠。

§10 AI 使用声明

项目 说明
内容生成 本篇由 AI 辅助起草,事实陈述均回指官方页面或论文
事实来源 规模与时长取自仓储概览端点与论文摘要
方法细节 切分、改写、筛查、训练配置取自论文正文
未能核实项 CSV 列名、术者与机构分布、时长上下界
数值处理 带千分位的精确值仅在速览表与首次出现处使用
案例性质 §4.2 的片段序号为说明结构而构造,非真实记录
未复现项 未下载全量数据,未重跑训练,未复现评测数字
责任边界 临床使用前须由执业医师独立判断

常见误读

常见说法 实际 证据
这是手术阶段数据集的替代品 它没有阶段标签,只有自由文本 字段字典中无类别列;论文未报告阶段指标
十六万条就是十六万台手术 片段来自近万段源视频,平均每段十几个片段 官方摘要给出两个数字的比值
平均五秒多说明片段切得很细 固定颗粒度切分,不按动作边界切 论文未描述边界检测,只描述关键帧密度过滤
Apache-2.0 意味着随便商用 许可只覆盖发布方有权处分的部分 论文称视频来自互联网收集
有干净子集就没有隐私风险 筛查只针对字幕与水印 论文描述的是视觉语言模型查字幕水印
指令是眼科医师写的 大语言模型改写,医师只标注了十条示例 论文明确说明改写流程
训练出的模型可以直接演示 医师评分只是可行性验证,上限三分制 论文描述六百段样本、七维度打分
数据是医院内部录制 来自公开平台的术者叙事视频 官方摘要与论文均如此表述
可以在生物医学文献库查到论文 按题名检索命中为零 欧洲文献库检索结果
片段时间区间就是手术阶段边界 区间是按片段长度切的,不是按阶段切的 平均时长与阶段时长不匹配

FAQ

Q1:这份数据到底有多少条?我该信哪个数?
官方摘要给的是十六万二千一百八十五个片段-指令对,源自九千八百一十九段源视频。去水印子集约两万八千条。三个数字都对,只是指的层次不同:一个是全量,一个是子集,一个是底本。

Q2:我能只用去水印子集吗?
可以,但它只有全量的六分之一左右。如果你只做隐私敏感的场景,用它;如果你要训生成模型,用它单独训会因为多样性不足而学不到足够的术式变化。论文的做法是先用全量、再用子集,你可以照抄。

Q3:CSV 的列名是什么?
公开摘要没有逐列列出。本页给了一张推定表,标注了哪些有论文依据、哪些是推定。拿到文件后打印表头,五分钟就能确认。

Q4:为什么不建议按行划分训练测试集?
同一段源视频的多个片段共享患者、设备与术者。按行划分会让测试集的片段与训练集的片段来自同一台手术,指标虚高。按源视频分组划分是唯一稳妥的做法,§5.5 给了代码。

Q5:它能不能直接训练一个手术阶段分类器?
不能。它没有阶段标签。你需要另一套带标签的集合做监督,把这份数据的文本作为辅助信号,或者先把指令映射到一套自定义的阶段体系。

Q6:生成的手术视频能拿来当教学片吗?
目前不能。论文的验证是六百段样本、三位医师、七个维度、三分制打分,这是可行性证据,不是临床可用性证据。任何放映前都必须有人逐帧复核。

Q7:许可字段写着 Apache-2.0,法务会放行吗?
不一定。许可覆盖的是发布方的贡献,视频画面的上游权利在第三方上传者手里。法务关心的是完整链条,不是单个字段。建议把仓储卡片、许可文本与论文里的来源描述一起交给法务看。

Q8:它和腹腔镜手术视频数据集能混用吗?
技术上可以,语义上有风险。两者的器械、解剖、视野尺度差异极大,混合训练会让模型学到「手术视频的通用外观」而不是某一类手术的特征。混合可以做,但要留出分开的评测集。

Q9:数据量太大,有没有小样本的玩法?
有。按源视频抽样,抽几百段源视频就够做一次可行性实验。关键是按源视频抽而不是按行抽,这样才不会被同源片段骗。

Q10:它在欧洲文献库里查不到,是不是不靠谱?
不是。它是一篇计算机视觉会议的预印本,这类文献常常不进生物医学索引。查不到只说明引用路径不同,不说明质量。

Q11:如果我只想知道它能不能用,最该看哪一节?
看 §1.3 那张表。它按需求逐条回答「够不够」,比任何评分都直接。

Q12:这份数据三年后还有价值吗?
作为方法范式的样本,有;作为训练数据,会打折。视频生成模型迭代很快,以现在的主力模型为底训练出来的权重,两年后大概率被更强的基座超越。它更持久的价值是那条处理流水线与那个叙事视频池。

术语表

术语 含义
叙事视频 术者一边操作一边口头讲解的手术录像
片段-指令对 一段短视频配一句描述该段操作的祈使句
指令微调 用「输入文本 + 目标输出」对训练模型跟随指令的能力
文本引导视频生成 以自然语言描述为条件生成视频画面
场景检测 自动识别视频中镜头或画面突变的位置
关键帧密度 单位时长内检测到的场景变化点数量
视觉语言模型 同时处理图像与文本的大模型,可用于画面内容判断
去噪网络 扩散模型中负责逐步去除噪声、还原画面的部分
变分自编码器 把视频压缩到低维隐空间再解码的组件
文本编码器 把指令句子转成向量表示的组件
冻结参数 训练时固定不变、不参与梯度更新的权重
迁移预训练 在大规模通用数据上训好后,换到特定领域继续训
分布距离 衡量两组数据整体分布差异的指标,越小越像
跨模态一致性 衡量文本描述与画面内容是否相符的分数
八二划分 百分之八十训练、百分之二十测试
源视频分组划分 以整段源视频为单位划分数据集,防止同源泄漏
前房保持 手术中维持眼球前段空间充盈的操作要求
撕囊 环形撕开晶状体前囊膜的操作
超声乳化 用超声能量粉碎并吸出混浊晶状体的操作
人工晶体植入 将人工晶状体放入囊袋的操作
术者叙事 由执刀医师本人提供的口头说明
弱标注 与画面大致对应但不精确的标注
可识别信息 能指向具体个人身份的画面或文字元素
门禁访问 需登录并同意条款后才能下载的仓储状态
分卷压缩 把一个压缩包切成等长字节块分别传输
补零帧 帧数不足时用全零画面补齐到固定长度
同源偏差 来自同一来源的样本高度相似导致统计虚高
早期接收 会议在正式议程前确认录用,通常意味着质量受认可

附录 A:核心数字核对表

项 值 来源 来源层级
片段-指令对 十六万余 官方摘要 官方页面
源视频数 不足一万段 官方摘要 官方页面
平均片段时长 5.54 秒 官方摘要 官方页面
去水印子集约 两万八千条 论文 论文摘要
分卷数 十个 文件树 官方页面
总体积 约 418 GB 文件树合计 官方页面
总清单体积 约 24 MB 文件树 官方页面
子集清单体积 约 3.8 MB 文件树 官方页面
分辨率下限 720×480 论文 论文正文
关键帧阈值 2 至 100 论文 论文正文
模型输入帧数 49 论文 论文正文
训练测试比 八比二 论文 论文正文
医师评分数 3 名 论文 论文正文
评样本量 600 段 论文 论文正文
验证阶段数 12 论文 论文正文
许可 Apache-2.0 仓储卡片 官方页面

附录 B:数字的来源分层

官方页面层。 片段数、源视频数、平均时长、分卷数、各文件体积、许可字段、仓储访问状态。这些来自仓储概览端点与文件树接口,是最硬的一层。

论文摘要与正文层。 去水印子集规模、分辨率下限、关键帧阈值、输入帧数、划分比例、医师评分设置、训练超参、评测指标。这些来自预印本,未经同行评审版本的独立复核,但方法描述足够具体。

未核实层。 CSV 的完整列名、片段时长的上下界、源视频的单条时长、术者数量与机构分布、国别分布、患者年龄与性别、指令的平均词数。这些在任何公开材料里都没有出现,本页不做估算。

三层之外的推论部分,本文一律加了限定词(「按常理推断」「用于说明结构」),不与事实层混写。

附录 C:完整参考文献

  1. General-Medical-AI. Ophora-160K [DB/OL]. Hugging Face, 2025. https://huggingface.co/datasets/General-Medical-AI/Ophora-160K
  2. Li W, Hu M, Wang G, Liu L, Zhou K, Ning J, Guo X, Ge Z, Gu L, He J. Ophora: A Large-Scale Data-Driven Text-Guided Ophthalmic Surgical Video Generation Model [J/OL]. arXiv:2505.07449v7, 2025. https://arxiv.org/abs/2505.07449
  3. 欧洲文献库检索接口,主题词含 Ophora 与眼科手术视频指令,检索日期 2026-10-26. https://www.ebi.ac.uk/[europepmc](https://www.qianfanghub.com/ai-ready-dataset/europepmc/1353)/webservices/rest/search
  4. Ophora-160K 数据集概览与文件树接口(片段数与分卷体积取自此处).
  5. Apache Software Foundation. Apache License, Version 2.0. https://www.apache.org/licenses/LICENSE-2.0
  6. 千方医数集. 白内障手术视频阶段数据集相关词条(库内比对用).

附录 D:数据可用性核查清单

下面是拿到文件后应当执行的核查顺序,每一步都给了一条可直接跑的判断。

序号 核查项 判断方式 不通过怎么办
1 清单能否解析 打印表头与首行 修正字段名映射
2 行数与官方一致 计数与官方数字比对 记录差额,不臆断原因
3 源视频数合理 去重计数 若远小于官方,说明清单不完整
4 时长是否为正 查找非正时长的行 单列剔除并登记
5 指令非空 统计空串比例 空串行不可用于训练
6 子集是否为子集 检查子集标识是否都在全量中 若不在,说明两份清单口径不同
7 分卷是否齐整 逐卷核对字节数 重新下载缺卷
8 解包后文件名 抽样对照清单中的标识 修正路径拼接规则
9 抽样解码 随机抽十条解出首帧 检查编码器依赖
10 划分无泄漏 断言训练集与测试集源视频不相交 重做划分
#-- 第十项核查:划分无泄漏(接在 §5.5 之后运行)
python - <<'PY'
import csv
from collections import defaultdict
import random

groups = defaultdict(list)
with open("data/ophora161k.csv", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        groups[row["video_id"]].append(row["clip_id"])

vids = sorted(groups)
random.seed(20261026)
random.shuffle(vids)
cut = int(len(vids) * 0.8)
train_v, test_v = set(vids[:cut]), set(vids[cut:])
overlap = train_v & test_v
assert not overlap, "发现同源泄漏: " + str(list(overlap)[:5])
print("划分无泄漏,训练源视频", len(train_v), "测试源视频", len(test_v))
PY

附录 E:如果只记五件事

第一,它的单位是「五秒多的画面 + 一句祈使句」,不是「一台手术」。

第二,它的标注是自由文本,没有受控标签,做判别任务前必须自己搭一座桥。

第三,近万段源视频撑起十六万条记录,任何按行的统计都会被同源相关性抬高。

第四,Apache-2.0 只覆盖发布方的那一层,视频画面的上游权利要自己评估。

第五,它最持久的价值是那条把叙事视频变成训练语料的流水线,以及它背后由术者自发贡献形成的池子。

编辑说明

核验时间为 2026 年 10 月 26 日。方式为:读取数据集概览与文件树接口,读取 arXiv 预印本摘要页与正文页,在欧洲文献库按题名与主题词检索一次。未能读取仓储网页端 README 原文,因为该仓储为门禁状态且需登录,故数据卡中的字段描述以接口摘要与论文为准。未下载视频本体,未解压分卷,未运行任何模型。§4.2 的案例片段序号为说明结构而构造。文中对许可的两层划分是基于论文来源描述的分析,不构成法律意见。


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • cataract-101 — 共享标签:医学影像 / 眼科影像 / 手术视频 / 多模态
  • cataracts — 共享标签:医学影像 / 眼科影像 / 手术视频
  • gamma — 共享标签:医学影像 / 眼科影像 / 多模态
  • sics-155 — 共享标签:医学影像 / 眼科影像 / 手术视频
  • harvard-gdp — 共享标签:医学影像 / 眼科影像 / 多模态
  • mavis — 共享标签:医学影像 / 手术视频 / 多模态
  • rop-vl — 共享标签:医学影像 / 眼科影像 / 多模态
  • cataract-1k — 共享标签:医学影像 / 眼科影像 / 手术视频
  • mimic-cxr — 共享标签:医学影像 / 多模态
  • health-data-nexus — 共享标签:医学影像 / 多模态

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集