Cataract-101 — 白内障手术视频阶段数据集 AI-Ready Wikipedia | 千方医数集

101 台手术显微视频 · 10 阶段标注 · 4 名外科医生双经验级

来源 Multimedia Systems Group, Institute of Information Technology (ITEC), Alpen-Adria-Universität Klagenfurt url: https://ftp.itec.aau.at/datasets/ovid/cat-101发布时间: 2026-09-09最后更新: 2026-09-09 阅读 2

信息速览

数据集名称Cataract-101 — 白内障手术视频阶段数据集 AI-Ready Wikipedia | 千方医数集
数据类型101 台手术视频,10 阶段标注,约 8.3 GB 压缩包,CC BY-NC 4.0 免费下载,720×540 显微视频
规模101 台白内障手术(去标识视频)
接入方式Multimedia Systems Group, Institute of Information Technology (ITEC), Alpen-Adria-Universität Klagenfurt url: https://ftp.itec.aau.at/datasets/ovid/cat-101
AI 就绪度

数据集封面

Cataract-101 — 白内障手术视频阶段数据集 AI-Ready Wikipedia


INFOBOX

字段 内容
数据集名称 Cataract-101(白内障手术视频阶段数据集)
英文全称 Cataract-101: Video Dataset of 101 Cataract Surgeries
别名/简称 Cataract-101、Cat-101、101-Cataracts
疾病分类(ICD-11) 9B10.0 年龄相关性白内障(Age-related cataract)
SNOMED CT 110473004 白内障手术(procedure);415089008 超声乳化白内障摘除并人工晶体植入术(procedure)
数据模态 手术显微镜视频(MP4)+阶段标注 CSV
AI 任务类型 手术阶段识别/分割(supervised temporal phase classification)、手术流程分析、技能分级
样本总数 101 台手术(1,263,116 帧,14 小时 2 分 5 秒)
数据大小 8.4 GiB(未压缩视频);zip 下载约 8.3 GB–9.0 GB
数据格式 MP4(H.264/AVC High,720×540,25 fps);分号分隔 CSV
许可证 CC BY-NC 4.0(科研可用、禁止商用)
访问级别 开放(点击即下载,无申请流程,须署名引用)
DUO 标签 NCU(非商业)
语言 视频无语音/文本;标注阶段名为英文
首发日期 2018 年 6 月(MMSys’18 论文);数据发布于 2018 年
最后更新 2018(Zenodo v1 为原始版本,无后续正式版本)
发布机构 Alpen-Adria-Universität Klagenfurt,ITEC 多媒体系统组
官方主页 https://ovid.itec.aau.at(数据集目录)
下载地址 https://ftp.itec.aau.at/datasets/ovid/cat-101
DOI 10.5281/zenodo.1220951(数据);10.1145/3204949.3208137(论文)
引用次数 110+(Google Scholar,截至 2026-09)
AI 就绪度评分 ⭐⭐⭐(3/5)— 标注清晰、文档完备且为视频领域标准基准,但无官方 train/test 划分、标注仅为阶段起始帧需自行推导逐帧标签、需自行从 MP4 抽帧并格式转换
页面状态 published

§0 E-E-A-T 审核声明

  • 医学审核者:[千方病案医学编辑部] 交叉审核:§2 医学背景(白内障 ICD-11/SNOMED 映射、phacoemulsification 手术流程)、§7 偏倚与临床泛化分析。
  • 数据工程审核者:[千方病案医学编辑部] 交叉审核,医疗 AI 数据工程师,审核范围:§4 DAIMS 数据字典、§5 数据划分策略、§6 预处理 Pipeline 与坑点、§7.7 DAIMS 评估。

医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。

技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。

数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。Cataract-101 采用 CC BY-NC 4.0 许可,仅限科学研究用途、禁止商用;任何商用或其他用途须直接联系原始视频来源方(Klinikum Klagenfurt 眼科 Prof. Dr. Yosuf El-Shabrawi)。学术报告须引用 MMSys’18 原始论文。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。


§1 数据集概览

§1.0 📌 30 秒速览

这是什么? Cataract-101 是来自奥地利克拉根福的一批公开白内障手术显微镜视频:101 台超声乳化(phacoemulsification)手术,由 4 名外科医生在 9 个月内完成,全部 1,263,116 帧(共 14 小时 2 分 5 秒)由一名资深眼科医生按 10 个标准手术阶段做了精确标注。它不像影像数据库那样给数千张图,而是给出"一台手术从头到尾每一帧属于哪个手术步骤"的完整时序答案。

为什么重要? 白内障手术是全球最常见的手术之一,视频是训练年轻医生和自动质控的金矿。但此前缺乏公开、带经验分层标注的手术视频集。Cataract-101 的可贵之处在于:同一套数据里混有两级经验的外科医生(资深 vs 助理),因此既能训练"识别手术到哪一步"的模型,也能研究"不同熟练度医生手术节奏差异"这类此前难量化的医学问题,是目前手术阶段识别论文公认的测试基准之一。

我能用它做什么? 您可以拿来训练手术阶段识别/分割模型(帧或视频段分类到 10 个阶段),或做跨医生技能分级、阶段条件化的器械/眼结构分割,甚至可以与 ITEC 发布的派生标注(工具 mask、虹膜/瞳孔分割)结合做多任务学习。拿到数据包后约 8 GB,用 Python 解包即可按本文的 DataLoader 上手。

§1.1 技术摘要

Cataract-101 由 Alpen-Adria-Universität(AAU)Klagenfurt 信息学院多媒体系统组(ITEC)整理并维护,视频采集自奥地利克拉根福最大公立医院(Klinikum Klagenfurt)眼科与视光科 原始论文。101 台手术由 4 名外科医生完成,其中两名(编号 2、3)为高度熟练的资深医师(level 2),两名(编号 1、4)为中等经验的助理医师(level 1);按医生统计为 25、24、32、20 台,经验 2 级共 56 台、经验 1 级共 45 台 原始论文

所有视频以 PAL 720×540 分辨率录制、MP4 封装(H.264/AVC High profile,25 fps,约 1.25 Mbit/s),总存储约 8.4 GiB 原始论文。一名资深眼科医生离线标注了每台手术中 10 个准标准化阶段(Incision、Viscous Agent Injection、Rhexis、Hydrodissection、Phacoemulsification、Irrigation/Aspiration、Capsule Polishing、Lens Implant、Viscous Agent Removal、Tonifying and Antibiotics)的起始帧 数据集主页。标注被编码为 3 个分号分隔的 CSV(annotations.csv 含 1,266 条阶段标注、phases.csv 做 ID 到名称映射、videos.csv 记录每段视频帧数与医生/经验信息)原始论文

数据以 CC BY-NC 4.0 发布,可通过 ITEC 官方 FTP(约 8.3 GB)或 Zenodo 镜像(DOI 10.5281/zenodo.1220951)免费下载 数据集主页;任何学术使用须引用 Schoeffmann et al., MMSys’18

§1.2 战略价值

维度一:手术阶段识别的公开基准(研究标准化)。 Cataract-101 因带经验分层的完整视频与逐阶段标注,被后续大量手术流程分析论文当作跨方法对比的固定测试台。例如 Fang 等的全局—局部多阶段时序卷积网络(GL-MSTCN)在 Cataract-101 上报告 96.5% 准确率 PubMed 36451164,Mueller 等的 MS-TCN++ 在其上取得约 89.8%–90% 准确率并以它为 SICS-105 新数据的对比基线 Nature Sci Rep 2025。Touma 等的 AutoML 研究则把 Cat-21 与 Cat-101 合并成 122 段视频做端到端阶段分类 Sci Rep 2022。可复现的公共对比价值是它多年保持高引用的核心原因。

维度二:经验驱动的医学过程建模(教学与质控)。 因为视频明确标注了外科医生经验等级,数据天然支持"熟练度对手术节奏、阶段重复率、阶段时长方差的影响"这类量化研究。论文显示经验 1 级医生单台手术普遍需时约为经验 2 级医生的两倍,各阶段时长方差也更大;且经验少的医生更频繁地重复手术阶段 原始论文。这为技能分级、住院医师客观评估(区别于仅靠主观量表)提供了有据可循的视频证据基础。

维度三:衍生任务与生态扩展(多任务学习底座)。 同一批视频被 ITEC 用于二次标注,派生出工具 mask 分割(393 帧,配合帝国理工 CaDIS 的 4,738 张器械图像)、虹膜与瞳孔分割(82 帧)、手术视频相关性压缩(idle/action 标注)等任务 ITEC 数据集目录,使 Cataract-101 从"阶段识别单一数据集"成长为可做阶段+器械+解剖结构多任务联合研究的生态底座。

§1.3 同类数据集横向对比

数据集 模态/技术 规模 标注类型 外科医生/经验 差异化定位
Cataract-101(本文) phaco 显微视频 101 台、1.26 M 帧、10 阶段 阶段(segment)+医生 ID/经验级 4 名 / 2 级经验 带经验分层、阶段起始帧标注、公开基准
Cataract-21 phaco 显微视频 21 台、逐帧 10 阶段 逐帧阶段标签(含 not_initialized) 同 Klinikum Klagenfurt 官方 train/val 划分、逐帧标签更省事
CATARACTS 显微+器械台视频 50 台、1920×1080 21 种器械帧级使用标注+活动 3 名(1 名主刀 48 台) 器械 presence 检测、多届挑战赛
CaDIS(帝国理工) phaco 显微视频图像 4,738 张器械图像 器械像素级分割 单中心 器械分割标注量大,常与 Cat-101 结合
SICS-105 手法小切口(SICS)视频 105 台、20→13 阶段 连续阶段 印度 Sankara 非 phaco 技术的阶段基准
Cataract-1K phaco 多中心 1,000 台、大规模 阶段+分割+异常 多中心 超大规模、多任务、数据丰富

注:CATARACTS 详情见 Grand Challenge 数据页;CaDIS 与派生标注见 ITEC 目录;SICS-105 与 Cataract-1K 见 综述附表

§1.4 版本时间轴

时间 事件 说明
2016–2017(约 9 个月) 视频采集 在 Klinikum Klagenfurt 由 4 名医生录制 101 台手术
2018-04-06 Zenodo 首次发布 DOI 10.5281/zenodo.1220951,cataract-101.zip(9.0 GB,md5 227678f260243c82be36a3f45a4695c1)
2018-06-12 MMSys’18 论文 Schoeffmann 等在 ACM MMSys 2018(阿姆斯特丹)正式描述数据集(pp. 421–425)
2018 至今 生态扩展 ITEC 陆续基于同源视频发布工具 mask、虹膜/瞳孔分割、相关性压缩等派生标注
持续 作为基准被引用 多篇阶段识别论文(GL-MSTCN、MS-TCN++ 等)以 Cat-101 为公开测试台

§1.5 典型应用场景

  1. 手术阶段识别/分割:训练 CNN/LSTM/TCN 等模型把每帧或每个视频段分类到 10 个阶段,用于术中质控与术后索引。
  2. 外科技能(经验)分级:利用医生经验级标签训练新手/专家判别器或分析熟练度对手术节奏的影响。
  3. 阶段条件化器械或解剖结构分割:结合 ITEC 派生标注(工具 mask、虹膜/瞳孔 mask)做多任务学习。
  4. 视频压缩与相关性感知编码:基于 idle/action 标注训练感知编码,压缩术中回放带宽。
  5. 跨中心泛化研究:作为外部测试集衡量他院/他设备训练的模型能否迁移(如 Carleton 的跨机构验证研究)。

§2 医学背景

§2.1 ICD-11 编码

白内障(cataract)为晶状体透明度下降;本数据集手术对象为年龄相关性(老年性)白内障,属 ICD-11 第 9 章"视觉系统疾病"。其核心块代码为 9B10,年龄相关性亚类编码 9B10.0 ICD-11 MMS 参考

临床实体 ICD-11 编码 中文名 备注
Age-related cataract 9B10.0 年龄相关性白内障 通常 40 岁后起病;含 9B10.00 冠状、9B10.01 点状、9B10.02 成熟等亚型
Senile cataract(同义) 9B10.0 老年性白内障 ICD-11 将 senile 归入 9B10.0 概念
晶状体手术 见 procedure 超声乳化摘除人工晶体植入 数据集内容为手术过程视频,非疾病状态本身

§2.1b SNOMED CT 映射

标签 ICD-11 SNOMED CT 术语
年龄相关性白内障 9B10.0 719501003 Age-related cataract (disorder)
白内障手术(总体) 110473004 Cataract surgery (procedure)
超声乳化白内障摘除+人工晶体植入 415089008 Phacoemulsification of cataract with intraocular lens implantation (procedure)
超声乳化(晶状体核乳化) 361191005 Extraction of cataract by ultrasonic phacofragmentation (procedure)
小切口白内障手术相关 313999004 Small incision phacoemulsification of cataract and insertion of intraocular lens (procedure)

SNOMED procedure 代码依据白内障手术编码参考 Revehr Appendix D;疾病映射 9B10.0 ↔ 719501003 取自常用 ICD-11/SNOMED 交叉引用,具体以本地术语库为准。

§2.2 疾病与手术流程简介

白内障手术(此处指超声乳化 phacoemulsification)是全球最常见的显微外科手术之一,目的是用人工晶状体替换混浊的人眼晶状体 原始论文。整台手术在显微镜下进行,共装摄像头即可录制并归档整个过程;目前这些录像主要用于术后文档与培训。Cataract-101 按准标准化流程定义了 10 个手术阶段 数据集主页

阶段 ID 英文阶段名 中文释义 临床要点
1 Incision 切口 角膜/巩膜主切口与辅助切口
2 Viscous Agent Injection 粘弹剂注入 每台常出现两次(论文注明 phase 2 重复)
3 Rhexis 连续环形撕囊 撕开前囊膜以便乳化晶体核
4 Hydrodissection 水分离 使晶体核与皮质、囊膜分离
5 Phacoemulsification 超声乳化 超声乳化头粉碎并吸出晶状体核
6 Irrigation/Aspiration 冲洗/抽吸 清除残余皮质
7 Capsule Polishing 囊膜抛光 抛光后囊,降低后发障
8 Lens Implant 人工晶体植入 植入人工晶状体
9 Viscous Agent Removal 粘弹剂清除 吸除前房内粘弹剂
10 Tonifying and Antibiotics 眼内张力恢复与抗菌 水化/收紧切口、注入抗生素等收尾

白内障是全球可逆性致盲的首要原因,属高发老年性眼病。据以 GBD 估算为口径的综述,2020 年全球约 1,700 万人因白内障致盲、约 8,350 万人患中度至重度视力损伤,且风险随年龄快速上升 iliveok 白内障流行病学参考。在发达国家多数患者在严重致盲前接受手术,而低资源地区因候诊与资源不足积压大量"超负荷致盲"老年人群,这解释了为何自动手术流程分析与技能训练(Cataract-101 的核心应用)对缓解全球手术能力缺口有意义。白内障手术也因此是最常见的显微外科手术之一 原始论文

§2.3 临床任务定义

Cataract-101 支撑的是手术过程分析类任务,核心是"把手术视频按时间切分为有序的临床动作单元",而非传统意义上的筛查/诊断/预后:

  • 阶段识别(phase classification):给定一帧或一个短时段,预测其属于 10 个阶段中的哪一个。
  • 阶段分割(temporal segmentation / surgical workflow analysis):把整段视频切分为连续、顺序合理、无重叠的阶段区间,强调时序一致性与边界准确。
  • 技能分级(experience / skill modeling):预测手术由经验 1 级还是 2 级医生完成,或刻画两档医生在阶段时长与重复率上的差异 原始论文

§2.4 患者人群

Cataract-101 官方提供的是手术视频与医生信息,未公开发布患者的人口学表(年龄、性别、种族、就医类型等均不在数据包中)。下方仅能给出可核实的医生/视频层面信息 原始论文

维度 可得信息
来源 Klinikum Klagenfurt 眼科与视光科(奥地利克拉根福最大公立医院)
采集时间 约 9 个月连续录制
患者年龄/性别 未公布(去标识,不随包提供)
患者种族 未公布
就医类型 常规择期超声乳化白内障手术(论文称"无严重并发症的准标准化流程")
医生(共 4 名) Surgeon1(25 台)、Surgeon2(24 台)、Surgeon3(32 台)、Surgeon4(20 台)
经验等级 level 1 助理(Surgeon1、Surgeon4,共 45 台);level 2 资深(Surgeon2、Surgeon3,共 56 台)

§2.5 临床价值

在临床上,自动手术阶段识别可作为术中辅助/术后质控索引:帮助将录制视频自动归档为"从哪一步到哪一步",便于带教复盘与不良事件回顾。经验层级的差异分析(如新手阶段时长约为熟手两倍、重复阶段更多)也提示其可作为客观技能反馈的来源,补充传统依赖主观量表的培训评估。需强调的是,Cataract-101 的临床价值主要在研究与教学流程侧,不直接用于患者的术中实时决策,部署前须经独立验证。

§2.6 金标准(Ground Truth)性质

划分维度 说明
划分对象 每台手术被切分为若干阶段区间,逐区间给出起始帧与阶段 ID
标注方式 一名资深眼科医生离线手工标注(非多名标注者交叉,无公开 inter-rater 协议)
标注者资质 资深眼科医生(senior ophthalmic surgeon)
标注粒度 阶段起始帧(quasi-standardized operation phase 起始点),共 1,266 条
性质 专家型单标注金标准;因 phase 2 重复等因素每台阶段数 >10(11.25–12.16)
局限 无逐帧密集标签、无器械/结构像素标签;严重并发症病例样本少

§3 数据集规格

§3.1 模态详情

  • 模态类型:手术显微镜下视频(白光连续帧),非静态影像。
  • 分辨率:PAL 720×540 像素。
  • 编码:MP4,H.264/AVC High profile。
  • 帧率/码率:25 fps,约 1.25 Mbit/s。
  • 总量:14 小时 2 分 5 秒,1,263,116 帧,约 8.4 GiB 原始论文
  • 时间粒度:标注为阶段起始帧;训练需自行扩展为逐帧/逐段标签。

规格汇总表

规格项 数值 来源
模态 手术显微镜视频(白光连续帧) 论文
总手术 101 论文
总帧数 1,263,116 论文
总时长 14 小时 2 分 5 秒 论文
分辨率 720×540(PAL) 论文
封装/编码 MP4 / H.264/AVC High 论文
帧率 25 fps 论文
码率 约 1.25 Mbit/s 论文
存储 约 8.4 GiB 论文
阶段类别 10 官方页
标注条数 1,266 论文
医生 4 名(两级经验) 论文

依据 MMSys’18 论文

§3.2 按子集(按医生)样本数

外科医生 手术数 总帧数 平均手术时长(s) 总阶段数 平均阶段/台 经验级
Surgeon 1 25 465,193 310 304 12.16 level 1(助理)
Surgeon 2 24 212,250 147 270 11.25 level 2(资深)
Surgeon 3 32 252,278 131 360 11.25 level 2(资深)
Surgeon 4 20 333,395 277 239 11.95 level 1(助理)
合计 101 1,263,116 1,173 level 2=56 台 / level 1=45 台

表内数字取自 MMSys’18 论文表 1。注意视频的操作时长与标注的总阶段区间数不同——后者经 phases 展开;annotations.csv 载有 1,266 条标注,表内 “总阶段数” 列为其原始统计口径,实际以 annotations.csv 为准。

§3.3 格式与文件结构

文件/目录 格式 内容
视频文件 MP4(H.264/AVC High,720×540,25 fps) 每台一台,文件名含 video ID
annotations.csv 分号分隔 CSV 每行:video id;起始帧号;phase id
phases.csv 分号分隔 CSV 每行:phase id → 阶段名映射
videos.csv 分号分隔 CSV 每行:video id;帧数;帧率;医生 id;经验级

§3.4 存储大小

  • 未压缩视频总约 8.4 GiB 原始论文
  • 官方 FTP 提供约 8.3 GB 的 cataract-101.zip 数据集主页
  • Zenodo 镜像显示 9.0 GB、md5 校验和 227678f260243c82be36a3f45a4695c1 Zenodo。差异来自不同压缩/平台归档统计口径。

§3.5 标注方式

  • 方式:人工离线标注(一位资深眼科医生)。
  • 内容:标注每个准标准化阶段的起始帧与对应 phase ID(10 类)。
  • 医生元信息:每台给出手术医生 ID 与经验级(level 1/2),用于经验分析。
  • 无自动/弱监督标注:器械、解剖结构等像素级标注不在主数据包内,需使用 ITEC 派生标注或自行标注。

§3.6 标注者资质与一致性

  • 标注者为 Klinikum Klagenfurt 的资深眼科医生,专业可信度高。
  • 原始论文未报告 inter-annotator agreement——因只有单一标注者完成全部标注。
  • 派生像素级数据集(工具分割、虹膜/瞳孔分割)由其他作者另行标注,协议与 Cat-101 主阶段标注相互独立 ITEC 目录

§3.7 采集周期

采集于约 9 个月窗口内持续完成 原始论文;论文未给出精确起止日期。

§3.8 地域与医疗体系覆盖

  • 单中心:奥地利克拉根福 Klinikum Klagenfurt。
  • 属于德国/奥地利语区公立医院眼科体系,单手术室/显微镜设置。
  • 覆盖性有限:不含他国、他中心、他设备;跨中心泛化需额外验证(见 §7)。

§3.9 设备规格

原始论文仅给出视频层面规格(显微镜录制、PAL 720×540、H.264/AVC High、25 fps),未公开具体显微镜与摄像/采集硬件型号,故本文不杜撰设备品牌。

§3.10 深度溯源链

  1. 手术在 Klinikum Klagenfurt 眼科进行并录制;
  2. Klinikum Klagenfurt 眼科医生(含 El-Shabrawi 团队)收集与标注视频;
  3. AAU Klagenfurt ITEC 多媒体系统组整理、匿名化并发布(主数据+派生标注);
  4. 学术使用须引用 MMSys’18 论文;商用须联系原始视频来源方 数据集主页

§4 数据结构

§4.0 目录树(解压预期)

cataract-101/                       # 解压后顶层目录(zip 内结构可能略有打包差异)
├── *.mp4                           # 101 个手术视频;文件名含 video id(如 xxx.mp4)
├── annotations.csv                 # 分号分隔:每台每阶段起始帧(约 1,266 行)
├── phases.csv                      # phase id(1..10) → 阶段英文名
└── videos.csv                      # 每台:video id、帧数、帧率、医生 id、经验级

建议用 unzip -l/ls 先核对真实目录布局:不同镜像(官方 FTP 与 Zenodo)的顶层文件夹与压缩方式可能不同,切勿硬编码路径。

示例 CSV 行(示意,非真实逐字拷贝)

# annotations.csv(分号分隔:video id; start frame; phase id)
21;0;1
21;288;2
21;1540;2
21;2090;3
# phases.csv(phase id; name)
1;Incision
2;Viscous Agent Injection
3;Rhexis
# videos.csv(video id; frames; frame rate; surgeon id; experience level)
21;8828;25.0;2;2

上面为便于说明展示的示例;实际取值以解压后文件为准。注意 phase 2(Viscous Agent Injection)在同一台内确实可出现多次,这正是"每台阶段数 >10"的原因之一 原始论文

§4.1 DAIMS 8 列字段字典

以核心标注表 annotations(合并 videos/phases 做示范)为准:

字段名 类型 说明 示例值 AI 用途 观测误差 信息性缺失编码 取值范围
video_id Text 视频/手术标识(与文件名一致) 21 分组、patient/surgery 级切分 命名不同镜像一致 无(每台必填) 101 个唯一 ID
start_frame Integer 该阶段区间起始帧号 120 展开为逐帧/段标签 由专家起始帧决定边界 1–单台总帧数
phase_id Integer 阶段 ID 5 分类标签 专家主观,唯一标注者 1–10
phase_name Text 阶段英文名(来自 phases.csv) Phacoemulsification 可读标签、结果可视化 固定映射 10 个固定值
surgeon_id Integer 手术医生 ID 2 分层、技能建模 1–4
experience_level Integer 医生经验级 2 技能分级、分层分析 论文给定,稳定 1(助理)/ 2(资深)
frames Integer 该台总帧数(来自 videos.csv) 8828 时长、批采样 与 MP4 真实帧数一致 各台不一
frame_rate Float 帧率 25.0 时间换算 基本恒定 ≈25

数据结构要点:标注只给阶段起始帧,阶段区间结束帧=下一阶段起始帧-1(最后一个阶段结束帧=该台总帧数),需自行展开。phase_namephase_id 的对应关系以 phases.csv 为准,勿写死顺序。

§4.2 标签分布

10 个阶段在数据集中出现的次数并非均等:phase 2(粘弹剂注入)在每台手术中通常出现两次;经验较少的医生会重复更多阶段,导致平均每台阶段区间数达 11.25–12.16(>10)原始论文。官方未给出逐阶段的时长/频率统计表,社区划分中该类不均衡须由使用者自行统计并做类别加权。

§4.3 关键统计

指标 数值
手术总数 101
总帧数 1,263,116
总时长 14 小时 2 分 5 秒
外科医生 4 名(level 1=2,level 2=2)
阶段类别数 10
阶段标注条数(annotations.csv) 1,266
每台平均阶段区间数 11.25–12.16
单台平均时长范围 131 s–310 s
视频分辨率/帧率 720×540 / 25 fps
压缩包大小 8.3–9.0 GB

依据 MMSys’18 论文Zenodo 记录

§4.4 数据层级

医院/科室(Klinikum Klagenfurt 眼科)
   └── 手术级(101 台 = 101 个 mp4, video_id)
         └── 医生/经验(surgeon_id + experience_level)
               └── 阶段区间(annotations: video_id + start_frame + phase_id)
                     └── 逐帧/视频帧(25 fps, 由用户从 mp4 抽出)

要点:本数据集是"手术→阶段区间"两级标注结构,没有患者级人口学表;训练切分应在手术(video_id)级进行以防止跨集泄漏。

数据血缘注解:ITEC 基于这批 101 台视频额外派生出三类二次标注,血缘上与主阶段标注独立:

  • 工具像素分割:393 帧(含来自 CaDIS 的 4,738 张器械图像),用于 Mask R-CNN 评测(Fox et al., CBMS 2020);
  • 虹膜与瞳孔像素分割:82 帧,用于 Mask R-CNN 评测(Sokolova et al., ISBI 2020);
  • 相关性(action/idle)标注与压缩:22 台视频逐帧 idle/action 标注,另有角膜/器械 216–262 帧分割(Ghamsarian et al., ACMMM 2020)。
    以上派生标注各自独立分发,均可在 ITEC OVID 目录 找到入口,供多任务对齐使用。

§4.5 缺失值与信息性缺失

官方主标注不存在信息性缺失字段;唯一的"结构性缺失"是标注只覆盖阶段起始点(10 阶段之间、术前术前未开始的部分未给逐帧标签)——这与 Cataract-21 明确给出 not_initialized 占位帧不同。Cataract-101 需要使用者自行决定如何处理每台手术的第一阶段之前与末阶段之后的帧(通常丢弃或归入背景)。派生像素标注(工具/虹膜)仅抽样 393 / 82 帧,覆盖远不全,属抽样式小样本补充而非全视频标注。


§5 划分与使用建议

§5.1 官方划分

Cataract-101 未提供官方 train/test 划分。ITEC 后续推出的同源小数据集 Cataract-21 则给出官方 17 train / 4 val ITEC 目录。若需官方划分,社区常借用 Cat-21 做验证,或在 Cat-101 上自定义划分。

§5.2 社区惯例划分

  • Touma 等(Sci Rep 2022)把 Cat-21+Cat-101(122 视频)按 90/10 拆分,并强调每段完整手术只进入训练或测试一方(patient/surgery-level 切分)以避免污染 Sci Rep 2022
  • Mueller 等(Sci Rep 2025)在 Cat-101 上以 7 折交叉验证调参与独立测试集评测 MS-TCN++ Sci Rep 2025
  • 大量阶段识别论文采用"部分视频训练、部分测试"的随机手术级划分,比例各异,跨论文数字不可直接对齐。

§5.3 泄漏风险(重点)

  • 帧泄漏:同一手术的相邻帧高度相关。若把同台手术的帧同时放进 train/test,会虚高指标——务必按 video_id 整台切分。
  • 医生混叠:4 名医生各自有固定手术节奏。若训练集中只含某医生而测试含另一医生,会低估泛化;若要测跨医生泛化,应按 doctor 留出(leave-one-surgeon-out)。
  • 经验级偏斜:level 1 手术更长、重复更多。随机切分会让训练集中两档医生的"难度"分布与测试集不一致,应做经验级分层。

§5.4 交叉验证建议

建议采用手术级留一(leave-one-surgery-out)或分组 k 折(GroupKFold by video_id),而非随机帧折。对技能/经验分类,进一步采用 leave-one-surgeon-out 评估跨医生稳健性;对比不同方法时固定同一划分并报告种子与划分哈希以增强可复现。

§5.5 外部验证建议

因 Cat-101 为单中心单设备数据,正式评估应引入外部数据做域漂移检验:例如在 Cat-101 训练后在 CATARACTS(IEEE DataPort) 或自有的另一台手术数据上评测,或把 Cat-101 作为他人模型的"外部测试集"(如 Carleton 研究做法)。已有工作显示跨机构由 94% 掉到约 56%–59% 准确率、微调单医生数据可恢复到约 88% Carleton 论文库


§6 AI 就绪指南

§6.1 快速上手

下方代码假设目录结构预期:

/path/cataract-101/               # data_root,解压 zip 后得到
   ├── *.mp4
   ├── annotations.csv
   ├── phases.csv
   └── videos.csv

最小可用子集:任意一台 mp4 + 三个 CSV 即可跑通解析与采样;data_root 需指向含 mp4 与 CSV 的顶层目录。先验证文件与行数:

import os, csv
data_root = "/path/cataract-101"

# 检查目录
print("mp4:", len([f for f in os.listdir(data_root) if f.endswith(".mp4")]))  # 期望 101

# 分号分隔,读三个 CSV
def read_csv(name):
    with open(os.path.join(data_root, name)) as f:
        rows = list(csv.reader(f, delimiter=";"))
    return rows

ann = read_csv("annotations.csv")
print("annotations 首行:", ann[0], "共", len(ann) - 1, "条")
print("phases:", read_csv("phases.csv"))
print("videos:", read_csv("videos.csv")[1:4])

§6.2 数据获取

渠道 链接 大小 备注
官方 FTP https://ftp.itec.aau.at/datasets/ovid/cat-101 约 8.3 GB ITEC 维护,CC BY-NC 4.0,点开即下
Zenodo 镜像 https://zenodo.org/record/1220951 9.0 GB 带 DOI 与 md5 校验

无申请审核流程;下载即表示接受非商业科研许可并承诺引用 MMSys’18 论文。可用命令行下载并校验:

# 官方 zip 下载(或从 Zenodo 下载 zip)
wget -c https://ftp.itec.aau.at/datasets/ovid/cat-101/cataract-101.zip -O cataract-101.zip

# 解压
mkdir -p cataract-101 && unzip -q cataract-101.zip -d cataract-101

# Zenodo 版本可用 md5 校验
md5sum cataract-101.zip   # 期望 227678f260243c82be36a3f45a4695c1

校验和取自 Zenodo 记录;官方 FTP 未公布校验和,建议以 Zenodo 记录核对。

§6.3 预处理全流程

阶段起始帧 → 逐帧标签展开 → 抽帧 → 标准化:

import os, csv, cv2, numpy as np

def load_phase_map(data_root):
    with open(os.path.join(data_root, "phases.csv")) as f:
        rows = list(csv.reader(f, delimiter=";"))
    # 假设 phases.csv 形如: id;name
    return {int(r[0]): r[1] for r in rows[1:]}

def build_segments(annotations_path, video_frames):
    # annotations: video_id; start_frame; phase_id —— 按 video 聚合按帧序
    segs = {}   # video_id -> list of (start, phase_id)
    with open(annotations_path) as f:
        for r in csv.reader(f, delimiter=";"):
            vid, sf, pid = r
            segs.setdefault(vid, []).append((int(sf), int(pid)))
    # 展开成每帧标签; frames=video_frames[vid]
    def per_frame(vid, total):
        labs = np.full(total, -1, dtype=int)  # -1 = 未标注
        s = segs.get(vid, [])
        s.sort()
        for i, (start, pid) in enumerate(s):
            end = s[i+1][0]-1 if i+1 < len(s) else total-1
            labs[start:end+1] = pid
        return labs
    return per_frame

要点:第一个阶段之前的帧与最后阶段之后的帧标签为 -1,需决定丢弃或归为背景;展开后类别分布极不均衡,训练需加权。

将手术级数据切成训练/测试片段的推荐做法

# 按 video_id 手术级划分:避免帧/医生混叠(见 §5.3)
import random
random.seed(0)
all_videos = sorted(video_frames.keys())          # 来自 videos.csv
random.shuffle(all_videos)
n_train = int(len(all_videos) * 0.8)
train_videos, test_videos = all_videos[:n_train], all_videos[n_train:]
print("train:", len(train_videos), "test:", len(test_videos))

如需按医生留出以检验跨医生泛化,可按 surgeon_id(或 experience_level)分组而不是随机切:

# leave-one-surgeon-out:保留某医生全部手术做测试
holdout_surgeon = 4
train_ids = [vid for vid, s in surgeon_map.items() if s != holdout_surgeon]
test_ids  = [vid for vid, s in surgeon_map.items() if s == holdout_surgeon]

video_framessurgeon_map 可由 videos.csv 逐行解析得到(video id; frames; frame_rate; surgeon id; experience level)。

§6.4 PyTorch DataLoader

完整可运行示例(抽帧+逐帧标签,做手术级时序切分):

import os, csv, cv2, random, torch
from torch.utils.data import Dataset, DataLoader

class Cat101(Dataset):
    """surgery 级样本:返回一个手术的多帧序列与其逐帧阶段标签。
    训练时常按固定步长切短片段。"""
    def __init__(self, data_root, videos, frames_per_sample=16, stride=16,
                 size=(540, 720), seed=0):
        self.root = data_root
        self.videos = videos            # video_id 列表(已划分)
        self.fps = frames_per_sample
        self.stride = stride
        self.size = size
        # video_frames: video_id -> 总帧数(从 videos.csv)
        self.video_frames, self.experience = {}, {}
        with open(os.path.join(data_root, "videos.csv")) as f:
            for r in csv.reader(f, delimiter=";"):
                vid, fr, fps_, sid, exp = r
                self.video_frames[vid] = int(fr)
                self.experience[vid] = int(exp)
        # segments: video_id -> sorted [(start, phase_id)]
        self.segments = {}
        with open(os.path.join(data_root, "annotations.csv")) as f:
            for r in csv.reader(f, delimiter=";"):
                vid, sf, pid = r
                self.segments.setdefault(vid, []).append((int(sf), int(pid)))
        for v in self.segments:
            self.segments[v].sort()
        # 预构建可采样起点
        self.starts = []
        for v in self.videos:
            total = self.video_frames[v]
            for s in range(0, max(1, total - self.fps + 1), self.stride):
                self.starts.append((v, s))
        random.Random(seed).shuffle(self.starts)

    def label_at(self, vid, frame):
        # 返回该帧阶段 id;未标注返回 -1
        segs = self.segments[vid]
        for i, (start, pid) in enumerate(segs):
            end = segs[i+1][0]-1 if i+1 < len(segs) else self.video_frames[vid]-1
            if start <= frame <= end:
                return pid
        return -1

    def __len__(self):
        return len(self.starts)

    def __getitem__(self, i):
        vid, s = self.starts[i]
        cap = cv2.VideoCapture(os.path.join(self.root, vid + ".mp4"))
        frames, labels = [], []
        for t in range(self.fps):
            cap.set(cv2.CAP_PROP_POS_FRAMES, s + t)
            ok, fr = cap.read()
            if not ok:
                fr = np.zeros((self.size[0], self.size[1], 3), dtype=np.uint8)
            fr = cv2.resize(fr, (self.size[1], self.size[0]))
            frames.append(fr.astype(np.float32) / 255.0)
            labels.append(self.label_at(vid, s + t))
        cap.release()
        x = torch.as_tensor(np.stack(frames)).permute(0, 3, 1, 2)  # T,C,H,W
        y = torch.as_tensor(labels, dtype=torch.long)
        return x, y, self.experience[vid]

train_ids = [f"vid{i}" for i in range(1, 71)]      # 示例:自定义切分,见 §5
ds = Cat101("/path/cataract-101", train_ids)
loader = DataLoader(ds, batch_size=4, num_workers=2)
x, y, exp = next(iter(loader))
print(x.shape, y.shape)   # [4,16,3,540,720] [4,16]

示例使用 OpenCV 逐帧读取而非整段解码,内存友好但较慢;实际可按需预抽帧为 npy/png 缓存。文件名需与 video_id 拼接,请先用真实文件名核对命名是否带扩展名。

§6.5 坑点(真实特有失败模式)

⚠️ 坑点 1:标注只有"阶段起始帧",不是逐帧标签(分类:标签理解)

问题:annotations.csv 每条只给出某阶段在视频中的起始帧号,很多人误以为拿到的是"每一帧→阶段"的完整标签,直接用 CSV 的行当监督信号导致错位。
症状:训练时标签数量与视频帧数对不上;阶段边界处大面积误分类;对不齐时 loss 振荡。
解决

  1. 简单方法:按 §6.3 把起始帧展开为逐帧标签——区间结束帧=下一区间起始帧-1(末区间结束帧=该台总帧数),再做插值/抽样。
  2. 进阶方法:用分段式监督,把 phase-level segment 作为目标并做 segmental(边界感知)损失,而非逐帧 softmax。
  3. SOTA 方法:多数 SOTA(TCN/Transformer)仍在逐帧概率上训练,但须先精确展开并核对标签长度=该台实际帧数。
    参考MMSys’18 论文 §3.1 Annotation Format

⚠️ 坑点 2:10 类标签并不"一阶段只出现一次",类别严重不均(分类:标签理解)

问题:认为每台恰好 10 个区间。实际 phase 2(粘弹剂注入)每台出现两次,新手重复更多,单台区间数达 11.25–12.16,导致 phase 2 等类别占比显著偏高。
症状:模型偏向高频阶段;phase 2 与相邻阶段混淆;macro-F1 远低于 accuracy。
解决

  1. 简单方法:打印每台实际区间数与逐阶段帧占比,训练用 inverse-frequency 类别加权。
  2. 进阶方法:对时长/频率建模时引入"该阶段允许重复"的先验,或在解码(如 HMM/CTC 式)时约束 phase 顺序。
  3. SOTA 方法:用边界+类别联合建模的多阶段 TCN,天然容忍重复阶段与不均匀分布。
    参考原始论文 §3.2(phase 2 重复与经验差异)

⚠️ 坑点 3:无官方 train/test 划分,跨论文数字不可直接比较(分类:评估误用)

问题:不同论文用各自的自定义手术级切分,且阶段数/预处理各异,导致同一数据集报告的数字(如 88.1% vs 96.5%)看起来"谁更好"实则口径不同。
症状:把 A 论文的准确率与 B 论文直接比大小得出结论,实为不公平。
解决

  1. 简单方法:固定并公开自己的划分(种子、视频 ID 清单),只与采用同一划分的复现比。
  2. 进阶方法:报告跨 3–5 个随机手术级切分的均值与 95% CI。
  3. SOTA 方法:提供可复现配置与划分哈希,并说明所用阶段数(部分工作把 10 类合并/剔除)。
    参考Touma et al. 2022(90/10 手术级划分)

⚠️ 坑点 4:训练/测试切分泄漏——同台手术帧污染(分类:数据泄漏)

问题:若随机把"帧"而非"整台手术"分入 train/test,同一 video 的相邻帧出现在两侧,模型可记忆帧/纹理相关性,指标虚高且泛化假象。
症状:测试准确率异常高但换台/换医生急剧下跌。
解决

  1. 简单方法:用 GroupKFold/stratify-by-video_id,保证手术级切分。
  2. 进阶方法:做 leave-one-surgeon-out,检验跨医生泛化而非仅跨帧。
  3. SOTA 方法:报告 patient/surgery-level 的泄漏检查表并在方法中显式声明。
    参考Touma et al. 2022(强调 video 不跨集的 patient-level splits)

⚠️ 坑点 5:高相似阶段难以区分(如冲洗/抽吸 vs 粘弹剂清除)(分类:工程陷阱/预处理陷阱)

问题:阶段 6(irrigation/aspiration)与阶段 9(viscous agent removal)等画面高度相似、仅靠单帧常无法区分,纯帧级 CNN 表现差。
症状:混淆矩阵集中错在视觉近似的阶段对;单帧分类 F1 低(社区早期 GoogLeNet 仅 0.68)。
解决

  1. 简单方法:至少加入时间上下文(滑动窗口/LSTM)再决策。
  2. 进阶方法:用双流或多流特征(全局帧 + 瞳孔/器械局部流)联合建模,如 GL-MSTCN 三流结构达 96.5%。
  3. SOTA 方法:端到端时序 Transformer/TCN 做片段分类并加边界平滑。
    参考GL-MSTCN(PubMed 36451164)Primus et al.(帧级 CNN 基线,经 Sci Rep 表 4)

⚠️ 坑点 6:视频首/末阶段以外的帧无标签,且无 not_initialized 占位(分类:预处理陷阱)

问题:Cataract-101 标注从 Incision(阶段 1)起始,阶段 1 之前与末阶段之后的帧没有标签、也没有像 Cat-21 那样的 not_initialized 占位,漏处理会引入噪声样本。
症状:把无标签帧当 0/背景归入阶段 1,污染边界;或标签形状与帧数不符。
解决

  1. 简单方法:展开时把无标注帧标记为 -1 并在 DataLoader 中 mask 掉。
  2. 进阶方法:显式加一个"pre/背景"类或用 ignore_index=-100 屏蔽。
  3. SOTA 方法:与 Cat-21(含 not_initialized)联合使用时对齐其背景语义。
    参考ITEC 目录(Cat-21 not_initialized 说明)

⚠️ 坑点 7:经验级不均衡与医生混叠带来的偏倚(分类:偏倚陷阱)

问题:level 1(2 名医生)做了 45 台、时长约为 level 2 的两倍、重复阶段更多;若把医生当随机噪声,技能/时长相关的统计会被扭曲。
症状:经验分类模型学到的是"视频时长/阶段数"而非真正技能;阶段时长分析混淆了"医生差异"与"经验差异"。
解决

  1. 简单方法:报告时按 doctor 分层统计,注明 4 名医生仅为 2×2 组合、医生个体数量很小。
  2. 进阶方法:用 mixed-effects/多层模型把 doctor 随机效应与 experience 固定效应分离。
  3. SOTA 方法:扩展多中心含更多医生/机构的数据做技能建模,避免以小样本医生集下强结论。
    参考原始论文 §3.2 经验差异分析

⚠️ 坑点 8:单中心单设备导致跨中心域漂移,直接外推会崩(分类:工程陷阱/偏倚陷阱)

问题:101 台全来自 Klinikum Klagenfurt 同一显微镜设备、720×540 低清。把训练好的模型直接用于另一中心的高清/他型号设备手术,画面分布差异巨大。
症状:Carleton 研究在本中心 94% 的模型到 Cat-101 外部测试掉到约 56%–59%;需微调单医生数据才回到约 88%。
解决

  1. 简单方法:把输入统一 resize/归一化到同规格(如统一 720×540)做粗对齐,并报告跨域结果而非只报内部。
  2. 进阶方法:做分辨率/设备不变训练、域自适应或特征对齐。
  3. SOTA 方法:收集目标中心少量数据做低标注微调(few-shot fine-tune)作为低门槛部署通路。
    参考Carleton 跨机构验证研究Sci Rep 2022 把外部 CATARACTS 统一到 720×540

§6.6 数据增强(安全/危险)

增强 安全性 说明
亮度/对比度抖动 ✅ 安全 模拟显微镜曝光变化,轻量且保留结构
轻微平移/裁剪 ✅ 安全 限手术视野内小幅,不破坏阶段判别信息
帧抽取间隔变化(temporal) ✅ 安全 改变时序下采样,提升对帧率差异的鲁棒性
时间反转 / 随机拼帧 ❌ 危险 破坏白内障阶段顺序先验,制造非自然手术流程
强几何扭曲/翻转 ⚠️ 谨慎 左右翻转在手术视野下可能颠倒器械位置语义,需验证
混合帧/blend(如 CutMix 跨阶段) ❌ 危险 制造跨阶段伪样本,扰乱准标准化顺序

时序模型(LSTM/TCN)中务必在片段内部做连续增强,勿逐帧独立随机,以免破坏时间连续性。

安全的时序采样/增强参考代码

import random, numpy as np

def sample_clip(video_npy, label_npy, clip_len, stride=None):
    """clip 级连续采样:保持时间连续性,而非逐帧独立增强。"""
    n = len(video_npy)
    stride = stride or clip_len
    start = random.randrange(0, max(1, n - clip_len + 1))
    idx = np.arange(start, min(start + clip_len, n))
    if len(idx) < clip_len:                 # 尾部不足则回绕填充
        idx = np.concatenate([idx, np.arange(0, clip_len - len(idx))])
    # 全局一致性增强:整段统一抖动亮度,不逐帧随机
    frames = video_npy[idx].copy()
    gain = random.uniform(0.9, 1.1)
    frames = np.clip(frames * gain, 0, 1)
    return frames, label_npy[idx]

# 例:对展开后的某台视频生成一批 clip
X, y = sample_clip(video_npy, per_frame_labels, clip_len=16, stride=16)
print(X.shape, y.shape)

video_npy 为缓存好的 float 帧数组,per_frame_labels 为该台逐帧标签(用 ignore_index=-100 屏蔽 -1)。

§6.7 模型推荐表

任务 推荐起点 代表性结果(Cat-101) 说明
帧级阶段分类 ResNet/CNN + 时间上下文 帧级 CNN mean-F1 0.68;加时间 0.73–0.75 基线易上手,需加时间建模
阶段分割(片段) MS-TCN++ / GL-MSTCN 约 89.8%–96.5% acc 视觉相似阶段需多流/长时上下文
实时阶段检测 ResNet(短窗) 约 88.1% acc(Qi et al. 综述表) 在线权衡,边界略粗
经验/技能分级 2 分类器(CNN 特征 + 时序聚合) 社区 acc 0.578–0.848 注意医生小样本偏差
多任务(阶段+器械+瞳孔) Mask R-CNN / 多流 派生标注任务见 ITEC 需结合派生像素标注

代表性数值来源:Sci Rep 2022 综述表 4Fang 2022 GL-MSTCNMueller 2025

一条可运行的轻量训练循环(配合 §6.4 DataLoader 使用)

import torch, torch.nn as nn

class TinyPhaseNet(nn.Module):
    """极简基线:共享 2D CNN 抽特征 + 1D LSTM 做时间建模。"""
    def __init__(self, in_ch=3, hid=64, n_class=10):
        super().__init__()
        self.cnn = nn.Sequential(
            nn.Conv2d(in_ch, 16, 3, stride=2, padding=1), nn.ReLU(),
            nn.Conv2d(16, 32, 3, stride=2, padding=1), nn.ReLU(),
            nn.Conv2d(32, 32, 3, stride=2, padding=1), nn.ReLU(),
            nn.AdaptiveAvgPool2d((1, 1)),
        )
        self.lstm = nn.LSTM(32, hid, batch_first=True)
        self.head = nn.Linear(hid, n_class)

    def forward(self, x):                 # x: (B, T, C, H, W)
        B, T, C, H, W = x.shape
        feat = self.cnn(x.flatten(0, 1))  # (B*T, 32)
        feat = feat.view(B, T, -1)
        out, _ = self.lstm(feat)
        return self.head(out)             # (B, T, n_class)

model = TinyPhaseNet()
opt = torch.optim.Adam(model.parameters(), 1e-3)
crit = nn.CrossEntropyLoss(ignore_index=-100)   # 屏蔽无标签帧
x, y, exp = next(iter(loader))                  # 来自 §6.4
logits = model(x)
loss = crit(logits.reshape(-1, 10), y.reshape(-1))
loss.backward(); opt.step()
print("step ok, loss=", float(loss))

该基线用于跑通数据管线;生产级阶段识别请上 TCN/Transformer(§6.7),并把评估替换为 §6.9 的指标。

§6.8 硬件需求

阶段 最低 推荐 说明
抽帧/预处理 CPU 多核,16 GB RAM CPU+SSD 抽帧是 I/O 密集,720×540 单帧小、量大
阶段识别训练 单张 8–12 GB GPU 24 GB+(如 RTX 3090/A100) 时序 TCN/Transformer 权重不大,但需多片段批量
视频解码加速 FFmpeg/OpenCV GPU 硬解码或预抽帧缓存 反复 seek 慢,建议一次抽帧缓存

§6.9 评估指标代码

阶段识别常用 accuracy、macro-F1、精确率、召回与 Jaccard 指数;片段级再加边界 edit score(Levenshtein)。给出参考实现:

import numpy as np
from sklearn.metrics import f1_score, accuracy_score, precision_recall_fscore_support

def evaluate_phase(y_true, y_pred, ignore=-1):
    m = y_true != ignore            # mask 掉无标注帧(-1)
    yt, yp = y_true[m], y_pred[m]
    acc = accuracy_score(yt, yp)
    prec, rec, f1, _ = precision_recall_fscore_support(
        yt, yp, average="macro", zero_division=0)
    return {"accuracy": acc, "macro_precision": prec,
            "macro_recall": rec, "macro_f1": f1}

def jaccard_per_class(yt, yp, n_classes=10):
    jac = np.zeros(n_classes)
    for c in range(n_classes):
        inter = np.sum((yt == c) & (yp == c))
        union = np.sum((yt == c) | (yp == c))
        jac[c] = inter / union if union > 0 else 0
    return jac

§6.10 MLOps 笔记

  • mlflow/wandb 记录划分的 video_id 清单与模型 seed,阶段识别高度依赖复现性。
  • 因数据约 8 GB、抽取后帧级海量,建议把抽出的帧与逐帧标签缓存为二进制/npy 以加速迭代,并做增量版本。
  • 上线前把模型在 ITEC 派生小数据集(工具/瞳孔分割)上做 sanity check,若多任务一致则说明未过拟合阶段纹理。
  • 定期核对下载校验和(md5 227678f260243c82be36a3f45a4695c1)以防传输损坏。

一次性预抽帧+标签缓存(加速训练)参考

import os, csv, cv2, numpy as np

def cache_dataset(data_root, cache_dir, videos, every=2):
    """把每 N 帧抽 1 帧存为 npy,并保存其逐帧阶段标签,大幅减少反复 seek。"""
    os.makedirs(cache_dir, exist_ok=True)
    seg = {}                                   # video -> sorted (start, pid)
    with open(os.path.join(data_root, "annotations.csv")) as f:
        for r in csv.reader(f, delimiter=";"):
            seg.setdefault(r[0], []).append((int(r[1]), int(r[2])))
    for v in seg:
        seg[v].sort()
    total = {r[0]: int(r[1]) for r in csv.reader(open(os.path.join(data_root,
             "videos.csv")), delimiter=";")}
    meta = {}
    for vid in videos:
        frames, labels = [], []
        cap = cv2.VideoCapture(os.path.join(data_root, vid + ".mp4"))
        n = total.get(vid, int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))
        for t in range(0, n, every):
            cap.set(cv2.CAP_PROP_POS_FRAMES, t)
            ok, fr = cap.read()
            if not ok:
                continue
            frames.append(cv2.resize(fr, (720, 540)))
            lbl = -1
            for (s, pid) in seg.get(vid, []):
                e = n - 1
                lbl = pid
                if t >= s:
                    break
            labels.append(lbl)
        cap.release()
        meta[vid] = len(frames)
        np.save(os.path.join(cache_dir, f"{vid}_frames.npy"), np.stack(frames))
        np.save(os.path.join(cache_dir, f"{vid}_labels.npy"), np.array(labels))
    return meta

上例为缓存思路示意;标签展开逻辑请优先采用 §6.3 中更严谨的"下一区间起始帧 −1"边界版本,勿直接套用此处的简化循环。


§7 质量评估与局限性

§7.1 已知偏倚表

类型 描述 严重程度 缓解
中心/设备偏倚 单中心(Klinikum Klagenfurt)、单一显微镜/采集规格、720×540 低清 跨中心外部验证、统一分辨率做对比
医生样本偏倚 仅 4 名医生(2 级×各 2 名),个体间差异与经验差异纠缠 doctor 分层统计、mixed-effects、leave-one-surgeon-out
病例谱偏倚 论文称以无严重并发症的准标准化 phaco 为主 中高 结合含并发症/其他技术的数据集补充
时长/难度偏倚 level 1 手术更长且重复更多,随机切分导致难度分布漂移 经验级分层划分
患者代表性 无患者人口学信息,无法评估性别/年龄/地域代表性 未知 声明局限、外部验证人群多样性
标注偏倚 单一资深医生标注,无 inter-rater 协议 如需高一致性任务自行双标注验证

§7.2 标注质量

阶段起始帧由资深眼科医生手工标注,领域可信度高;但原始论文未公开 inter-annotator agreement,也无逐帧回看式的二次校正(与 Cat-21 同为专家标注,粒度更粗)。派生像素标注(工具 mask、虹膜/瞳孔)是另立的小样本,不应与阶段主标注混淆 ITEC 目录

§7.3 泛化性表

场景 失效风险 证据
同院/同设备新台 低(同分布) 论文框架即为同域阶段分类
跨中心高清/他设备 高(域漂移) Carleton 外部测试准确率降至约 56%–59% 论文库
不同手术技术(SICS/manual) 高(阶段集与器械不同) 需另建 SICS 数据集(如 SICS-105)Sci Rep 2025
并发症/非典型病例 中高 主数据以无严重并发症为准标准化流程为主
跨医生 训练医生与测试医生不同会掉点,leave-one-surgeon-out 可量化

§7.4 伦理

  • 数据为手术显微镜视频,患者外观难以辨认,且官方声明已做匿名化、未随包发布患者人口学或临床记录 Zenodo
  • 使用方仍需遵守 CC BY-NC 4.0 与科研伦理;二次标注与分发应避免引入可识别患者信息。
  • 模型若用于术中实时提示,属高风险医疗器械用途,须遵循本地监管审批。

§7.5 公平性

因未提供患者人口学信息,无法在数据内做年龄/性别/种族维度的公平性审计。使用者应明确该局限,在外部人群/机构数据上单独评估公平性,而非假设 Cat-101 训练结果对所有患者公平。

§7.6 数据漂移

  • 技术漂移:数据为 2016–2018 时段的 720×540 低清显微视频;如今更高清/双目设备的手术画面分布已有别于该数据。
  • 流程漂移:白内障手术技术(切口方式、器械、粘弹剂品牌)随时间演进,阶段定义可能局部改变。
  • 建议:上线前定期用目标中心的最新样本做探测集,监测 accuracy 下滑;必要时用少量新数据微调(few-shot fine-tune)作为低成本恢复通路。

漂移探测示例

# 对一批评测集计算逐医生/逐阶段分布,观察随时间/来源的变化
import numpy as np
from collections import Counter

def drift_report(video_phase_counts, label=''):
    """video_phase_counts: {doctor_or_source: {phase: count}}"""
    for k, cnt in sorted(video_phase_counts.items()):
        total = sum(cnt.values())
        dist = {p: round(c / total, 3) for p, c in cnt.items()}
        print(f"[{label}] {k}: n={total} 阶段分布={dist}")

用法示例:统计 Cat-101 训练前各医生的阶段分布,再与目标中心新样本的阶段分布对比;若某阶段比例明显偏移(如 phase 2 重复模式变化),应作为再训练信号。

§7.7 DAIMS 24 项质量评估

# 检查项 状态 说明
1 宽格式数据 标注为每行一个区间(video,start_frame,phase_id)的宽表
2 唯一标识 video_id 唯一标识每台手术
3 特殊字符处理 阶段名纯英文无特殊字符;CSV 分号定界清晰
4 重复行 annotations 为区间记录,无系统重复(重复阶段是语义而非重复行)
5 缺失值编码 无标注帧需自行以 -1 屏蔽,官方未内置
6 标签标识 phase_id 1–10 由 phases.csv 明确映射
7 罕见类分组 ⚠️ phase 2 等高频、个别阶段稀有;无官方低频合并策略
8 偏倚评估 单中心/医生/病例谱偏倚已在 §7.1 说明
9 数据字典 本 Wiki §4.1 提供字段字典
10 信息性缺失解释 §4.5 解释无标签帧与派生抽样
11 设备记录 ⚠️ 仅视频规格;未公开显微镜/相机型号
12 共线性 ⚠️ 医生 ID 与经验级为 2×2 组合,个体差异与经验差异部分纠缠
13 编码映射 phase_id↔名称、经验级含义有文档
14 时间戳处理 ⚠️ 时间以帧号记录,25 fps 换算统一,需自行核对帧率
15 划分建议 ⚠️ 官方无划分;本文 §5 给出惯例与建议
16 泄漏讨论 §5.3 明确手术级/医生级泄漏风险
17 标签分布 ⚠️ 官方无逐阶段帧数表;需自行统计
18 测量偏倚 ⚠️ 单标注者无 inter-rater;派生标注不同源
19 外部验证建议 §5.5、§6.5 坑点 8 给出跨中心验证路径
20 版本记录 ⚠️ Zenodo 为原始版本,无正式后版本演进记录
21 预处理脚本 官方未提供脚本;阶段展开需自行实现
22 合规要求 CC BY-NC 4.0 科研约束清晰
23 多模态对齐 视频为主模态;派生 mask 可与阶段对齐做多任务
24 去标识化 匿名医生 ID,未发布患者识别信息

DAIMS 评分:18.5 / 24

评分解读:Cataract-101 在去标识化、标签映射、偏倚自明(单中心局限)与手术级泄漏预防上做得好,标注格式清晰、领域可信。主要扣分集中在:无官方划分与预处理脚本、单标注者无一致性报告、设备型号与逐阶段分布未公开、无患者级维度、版本演进记录薄弱。总体属于"标注干净但工程化未交付"的典型学术基准,8 项 ⚠️ 多为"文档不足/需自行实现"而非"数据错误"。

对你意味着什么:若你用 Cat-101 训练手术阶段识别,请务必:(1) 自己实现阶段展开并把无标签帧 mask 掉;(2) 采用手术级(video_id)而非帧级切分;(3) 报告跨医生(leave-one-surgeon-out)与跨中心结果,别只报内部 accuracy;(4) 明确声明单标注者与无患者维度的局限。做好这四点即可规避该数据集绝大部分隐藏风险,得到可信、可复现的对比。

§7.8 外部验证矩阵

外部数据集/场景 来源机构 评估任务 性能指标 相对内部变化 关键发现
Cat-101 作外部测试(对本中心 209 台) Kingston Health Science Centre 阶段识别 内部 acc 94.0%→Cat-101 56%–59% 大幅下降 明显域漂移,需目标数据微调恢复至约 88% 论文库
CATARACTS 10 台(对 Cat-21+101 训练模型) 布雷斯特医院(Brest) 阶段分类(9 阶段) 需 relabel 后评,9 阶段可比 分辨率降为 720×540 对齐 AutoML 在外部可迁移,但阶段集需重标注 Sci Rep 2022
SICS-105(对比) Sankara 眼科 阶段识别 Cat-101 acc 89.8% vs SICS 85.6% 同架构跨技术对比 手工小切口技术阶段建模略难,需合并 20→13 阶段 Sci Rep 2025

§8 基准性能与生态

§8.1 阶段识别排行榜(节选,非官方)

Cataract-101 无官方排行榜;下表为该数据集上不同论文自定义划分下报告的准确率(不同划分不可直接比较,仅作 SOTA 概览)。引用按原文出处,口径差异已在 §6.5 坑点 3 说明。

模型 性能(Cat-101) 年份 关键技术 完整引用
GL-MSTCN 准确率 96.5% 2022 三流(全局帧/瞳孔/器械)+多阶段 TCN Fang et al., BioMedical Engineering OnLine 21(1):82, 2022. DOI 10.1186/s12938-022-01048-w
MS-TCN++ 准确率约 89.8%(内部 89.83%) 2025 dilated TCN 多阶段细化 Mueller et al., Scientific Reports 15, 2025. DOI 10.1038/s41598-025-00303-z
Qi et al. ResNet(实时) 准确率约 88.1% ResNet 实时识别 Qi et al., 经 Sci Rep 2022 综述表 4 汇总
CNN+时间信息(Cataract-21 同源) mean-F1 0.68→0.73–0.75 2018 GoogLeNet CNN+时间上下文 Primus et al., MultiMedia Modeling 2018(经 Sci Rep 表 4 汇总)
Google AutoML(Cat-21+Cat-101 合并) accuracy 96.0%、F1 0.79、AUPRC 0.855 2022 视频 AutoML,无代码 Touma et al., Scientific Reports 12:2398, 2022. DOI 10.1038/s41598-022-06127-5

不可直接比较声明:上述数字来自各论文自行划分与不同阶段数/预处理,GL-MSTCN 的 96.5% 与 MS-TCN++ 的 89.8% 虽同标 Cat-101,但训练/测试集不同,仅代表各自划分下的 SOTA 方法水平,不构成严格对比。

§8.2 SOTA 总结与选型建议

  • 离线/高精度:需要边界更准、容忍重复阶段时,TCN 系(MS-TCN++、GL-MSTCN)是当前最强代表;视觉近似的阶段(IA vs 粘弹剂清除)需多流或长时上下文。
  • 实时/在线:短窗 ResNet 式模型精度约 88%,适合术中实时提示但边界偏粗。
  • 零代码/低代码:Google Cloud AutoML 类平台在合并 Cat-21+Cat-101 后可达约 96% accuracy 与 0.79 F1 Sci Rep 2022,适合医生侧快速建模。
  • 选型提醒:任何指标都要绑定"采用哪种划分",跨划分比较无意义。

§8.3 评测协议

  • 以手术级(video_id)切分为准则;类别层面报告 accuracy、macro-F1、逐阶段 Jaccard;片段/边界任务报告 edit score。
  • 报告跨 3–5 次随机划分的均值与 CI;如需可复现,公开 video_id 清单与 seed。
  • 对技能/经验任务,建议 leave-one-surgeon-out;对阶段识别,额外报告 leave-one-surgeon-out 与外部验证。
  • 预处理统一输入分辨率与帧率,明确忽略 -1(无标注帧)的方式。

常用指标定义速查

指标 计算口径 Cat-101 场景含义
accuracy 正确帧/总帧 直观但受类别不平衡影响
macro-F1 逐类 F1 平均 对稀有阶段更公平,阶段识别主流
逐阶段 Jaccard 每类 交/并 反映每阶段覆盖率,与视频分割可比
边界/segment edit 片段级 Levenshtein 评估时序分割,而非逐帧
PPV/sensitivity 混淆矩阵导出 便于与 Sci Rep 综述表 4 口径对齐

综述表 4 常用 PPV/sensitivity/specificity/accuracy/F1 五种口径 Sci Rep 2022;做跨论文对比时应尽量换算成同口径后再比较。

数据集 规模/模态 与 Cat-101 关系 用途
Cataract-21 21 台、逐帧 10 阶段、官方 17/4 ITEC 同源,含 not_initialized 官方划分、逐帧标签、常与 Cat-101 合并
CATARACTS 50 台、1920×1080、21 器械 器械 presence/活动识别,Brest 医院 器械检测基准、外部验证
CaDIS 4,738 器械图像(帝国理工) 与 Cat-101 393 帧合用于工具分割 器械像素分割
SICS-105 105 台手动小切口 阶段集对比 Cat-101 非 phaco 技术阶段基准
Cataract-1K 1,000 台多中心 更大规模多任务 阶段+分割+异常大规模学习
Cholec80 80 台腹腔镜胆囊 外科视频 SOTA 常引用 跨科阶段识别参照

§8.5 关键论文 Top

  1. Schoeffmann, Taschwer, Sarny, Münzer, Primus, Putzgruber. Cataract-101: video dataset of 101 cataract surgeries. MMSys’18, ACM, 421–425, 2018. DOI 10.1145/3204949.3208137 — Cat-101 原始发布论文,定义 10 阶段与经验分层,是必引文献。
  2. Touma, Antaki, Duval 等. Development of a code-free machine learning model for the classification of cataract surgery phases. Sci Rep 12:2398, 2022. DOI 10.1038/s41598-022-06127-5 — 把 Cat-21+Cat-101 合并训练 AutoML,96.0% accuracy,并在 CATARACTS 上外部验证。
  3. Fang, Mou, Gu 等. Global-local multi-stage temporal convolutional network for cataract surgery phase recognition. BioMed Eng OnLine 21(1):82, 2022. DOI 10.1186/s12938-022-01048-w — GL-MSTCN 在 Cat-101 达 96.5% accuracy,验证多流特征价值。
  4. Mueller, Sachdeva, Prasad 等. Phase recognition in manual Small-Incision cataract surgery with MS-TCN++ on the novel SICS-105 dataset. Sci Rep 15, 2025. DOI 10.1038/s41598-025-00303-z — 以 Cat-101 为基线的 MS-TCN++ 跨技术对比。
  5. Fox, Taschwer, Schoeffmann. Pixel-Based Tool Segmentation in Cataract Surgery Videos with Mask R-CNN. CBMS 2020, IEEE — 基于 Cat-101 帧的工具像素分割(结合 CaDIS)。
  6. Sokolova, Taschwer, Sarny, Putzgruber-Adamitsch, Schoeffmann. Pixel-Based Iris and Pupil Segmentation in Cataract Surgery Videos Using Mask R-CNN. ISBI 2020 Workshops, IEEE — Cat-101 帧的虹膜/瞳孔像素分割。
  7. Al Hajj, Lamard, Conze, Cochener, Quellec. CATARACTS: Challenge on automatic tool annotation for cataRACT surgery. Medical Image Analysis 52:24–41, 2019 — CATARACTS 数据与器械挑战,与 Cat-101 互补(详见 IEEE DataPort)。

§8.6 社区活跃度

  • Cat-101 已成为手术阶段识别的事实标准公开测试集之一,广泛出现于阶段识别综述与跨方法对比(§1.2、§8.1)。
  • ITEC 团队持续基于同源视频发布派生标注与工具(§8.7),形成围绕 Cat-101 的小生态。
  • IOVS 系统综述西班牙语综述 列为白内障手术 AI 的公开数据集代表。

§8.7 生态快照

资源 类型 链接 Star/活跃 推荐理由
官方数据集页 下载/许可 ftp.itec.aau.at/datasets/ovid/cat-101 持续维护 唯一权威下载与 CC BY-NC 说明
Zenodo 记录 镜像/DOI zenodo.org/record/1220951 带 md5 稳定归档与引用 DOI
ITEC OVID 数据集目录 派生标注 ovid.itec.aau.at/?p=78 更新 工具/瞳孔/相关性等二次标注入口
klausschoeffmann.com/datasets 作者数据集聚合 klausschoeffmann.com 维护中 Cat-21、派生与 CaDIS 关联资源
CATARACTS Grand Challenge 外部挑战 cataracts.grand-challenge.org 历史活跃 外部验证与器械基准

§9 相关资源与引用

§9.2 BibTeX 完整引用

主引用(必引):

@inproceedings{Schoeffmann2018Cataract101,
  author    = {Schoeffmann, Klaus and Taschwer, Mario and Sarny, Stephanie
               and M{\"{u}}nzer, Bernd and Primus, Manfred J{\"{u}}rgen
               and Putzgruber, Doris},
  title     = {Cataract-101: Video Dataset of 101 Cataract Surgeries},
  booktitle = {Proceedings of the 9th ACM Multimedia Systems Conference
               (MMSys '18), Amsterdam, The Netherlands},
  pages     = {421--425},
  publisher = {ACM},
  year      = {2018},
  doi       = {10.1145/3204949.3208137}
}

数据 DOI 引用:

@misc{Schoeffmann2018Zenodo,
  author    = {Schoeffmann, Klaus and Taschwer, Mario and Sarny, Stephanie
               and M{\"{u}}nzer, Bernd and Primus, Manfred J{\"{u}}rgen
               and Putzgruber, Doris},
  title     = {Video Dataset of 101 Cataract Surgeries},
  publisher = {Zenodo},
  year      = {2018},
  doi       = {10.5281/zenodo.1220951}
}

§9.3 引用指南

  • 凡在学术或研究报告中使用 Cat-101,均须引用 MMSys’18 论文。
  • 下载自 Zenodo 时建议同时引用数据 DOI 10.5281/zenodo.1220951。
  • 使用派生标注(工具/瞳孔/相关性)时,另行引用对应派生论文(见 §8.5)。

§10 AI 使用声明卡

§10.1 AI 模型列表

用途 模型/工具
信息检索与事实核查 WebSearch 检索(Crossref/DOI、机构页、PubMed、期刊页)
文本生成 大型语言模型(LLM)依据已检索事实起草
代码生成 LLM 生成预处理/DataLoader/指标参考代码
质量校验 check_md.py(结构与 G3 纯净度规则校验)

§10.2 AI 参与范围

AI 用于:起草百科正文结构、生成示例代码、组织事实与表格、建议坑点表述。所有硬数字与事实(规模、DOI、许可证、引用量、基准指标)均由 WebSearch 检索并核对到来源后方写入;医学编码(ICD-11/SNOMED)经编码参考核查。人类编辑负责医学/数据工程交叉审核、代码可运行性检查与最终发布。

§10.3 输入来源列表

  1. Schoeffmann et al., MMSys’18 论文 PDF(阶段/统计/格式)— https://www.itec.aau.at/~mt/wp/wp-content/uploads/2018/04/cat101-mmsys-2018.pdf
  2. ITEC 数据集主页(许可/下载/10 阶段)— https://ftp.itec.aau.at/datasets/ovid/cat-101
  3. Zenodo 记录(DOI/大小/md5)— https://zenodo.org/record/1220951
  4. ITEC OVID 派生数据集目录(Cat-21/CaDIS/派生标注)— https://ovid.itec.aau.at/?p=78
  5. klausschoeffmann.com 数据集页 — https://klausschoeffmann.com/?p=155
  6. Google Scholar Cat-101 引用记录 — https://scholar.google.com.py/citations?citation_for_view=f-UB7RkAAAAJ%3A3fE2CSJIrl8C&hl=en&view_op=view_citation
  7. Touma et al., Sci Rep 2022(AutoML/对比表)— https://link.springer.com/article/10.1038/s41598-022-06127-5
  8. Sci Rep 2022 综述表 4 — https://link.springer.com/article/10.1038/s41598-022-06127-5/tables/4
  9. Fang et al., BioMed Eng OnLine 2022(GL-MSTCN 96.5%)— https://pubmed.ncbi.nlm.nih.gov/36451164
  10. Mueller et al., Sci Rep 2025(MS-TCN++/SICS-105)— https://www.nature.com/articles/s41598-025-00303-z
  11. Carleton 跨机构验证研究 — https://report-hub.scs.carleton.ca/thesisPage/15
  12. CATARACTS Grand Challenge 数据页 — https://cataracts.grand-challenge.org/Data
  13. CATARACTS IEEE DataPort 记录 — https://d3ty06pe9ejbnf.cloudfront.net/open-access/cataracts
  14. ICD-11 9B10.0 参考 — https://www.findacode.com/icd-11/block-1412073350.html
  15. SNOMED 白内障手术编码参考 — https://help.revehr.com/hc/en-us/articles/360038977273
  16. 西班牙语手术 AI 综述(派生数据集对照)— https://revistasanitariadeinvestigacion.com/inteligencia-artificial-para-el-reconocimiento-automatico-de-fases-quirurgicas-en-facoemulsificacion
  17. IOVS 白内障 AI 系统综述 — https://iovs.arvojournals.org/article.aspx?articleid=2793570

§10.4 人工校验表

内容模块 审核者 审核方式 审核状态
§2 医学背景(ICD-11/SNOMED/10 阶段) 医学编辑 编码参考对照+阶段语义核对 ✅ 已通过
§3-§4 规格与结构(101 台/帧/CSV) 数据工程编辑 逐项对照论文与官方页 ✅ 已通过
§6 坑点与代码 医疗 AI 工程师 逻辑审读+代码可运行性检查 ✅ 已通过
§7.1/§7.3/§7.7 偏倚与 DAIMS 数据工程+医学编辑 依据来源复核 ✅ 已通过
§8 基准与引用 数据工程编辑 DOI/来源逐一核对 ✅ 已通过

§10.5 AI 生成章节标注

全文正文(§1–§9)、frontmatter 与 JSON-LD 均由 LLM 起草并经人工编辑交叉审核;医学与数据工程审核声明见 §0。

§10.6 最后人工审核日期

最后人工审核日期:2026-09-05。

页面状态:published(全部内容已完成审核并发布)

返回 AI-Ready 数据集