SARAS-ESAD — 内窥镜术者动作检测 AI-Ready Wikipedia

4 台真实 RARP 手术 53,370 帧内窥镜动作检测标注

来源 SARAS 项目(牛津布鲁克斯大学视觉人工智能实验室等) url: https://saras-esad.grand-challenge.org发布时间: 2026-09-15最后更新: 2026-09-25 阅读 38
SARAS-ESAD — 内窥镜术者动作检测 AI-Ready Wikipedia

信息速览

数据集名称SARAS-ESAD — 内窥镜术者动作检测 AI-Ready Wikipedia
数据类型53,370 帧手术视频帧,46,325 个动作实例,21 个动作类别,约 13 GB JPG+TXT,CC BY-NC-SA 免费下载
规模4 台真实 RARP 手术(前列腺癌患者,获录制与分发同意)
接入方式SARAS 项目(牛津布鲁克斯大学视觉人工智能实验室等) url: https://saras-esad.grand-challenge.org
AI 就绪度

数据集封面

SARAS-ESAD — 内窥镜术者动作检测基准数据集 AI-Ready Wikipedia

INFOBOX

字段 内容
数据集名称 SARAS-ESAD(ESAD 数据集)
英文全称 The SARAS Endoscopic Surgeon Action Detection (ESAD) Dataset
别名/简称 ESAD;SARAS-ESAD 2020;SARAS Endoscopic Vision Challenge 数据集
疾病分类(ICD-11 编码+中文名) 2C82 前列腺恶性肿瘤(手术场景:机器人辅助根治性前列腺切除术)
SNOMED CT 126906006(前列腺恶性肿瘤);手术操作概念见 §2.1b 映射表
数据模态 机器人辅助手术单目内窥镜视频帧(1920×1080 JPG)+ 边界框动作标注
AI 任务类型 术者动作检测(定位+分类,spatio-temporal action detection)、手术场景理解
样本总数 53,370 帧图像;46,325 个标注动作实例;21 个动作类别
数据大小 约 13 GB
数据格式 JPG 图像 + YOLO 风格 TXT 标注 + obj.names 类别表
许可证 CC BY-NC-SA 3.0
访问级别 开放(挑战赛结束后免费直接下载,无需注册)
DUO 标签 NCU(非商业);PUB(使用须注明来源并引用官方论文)
语言 英文(文档与类别名);影像无语言
首发日期 2020-04-01(训练/验证集发布,MIDL 2020 挑战赛)
最后更新 2020-06-10(测试集发布)
发布机构 SARAS 项目:牛津布鲁克斯大学视觉 AI 实验室、维罗纳大学、米兰圣拉斐尔医院等
官方主页 https://saras-esad.grand-challenge.org
下载地址 https://saras-esad.grand-challenge.org/download/
DOI 10.48550/arXiv.2104.03178(数据集主论文)
引用次数 63+(Google Scholar,截至 2026-09,对应主论文 arXiv:2104.03178)
AI 就绪度评分 ⭐⭐⭐⭐(4/5)— 有官方按手术划分与可运行 baseline 及评测脚本,但需自行实现数据加载、空标签甄别与坐标转换
页面状态 published

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

医学审核声明:本页面由[千方病案医学编辑部]交叉审核:§2 医学背景(前列腺癌与机器人辅助根治性前列腺切除术临床背景、ICD-11 与 SNOMED CT 映射)、§7 偏倚分析。审核日期:2026-09-05。

数据工程审核声明:[千方病案医学编辑部交叉审核] 医疗 AI 数据工程师,审核范围:§4 DAIMS 数据字典、§5 数据划分策略、§6 预处理 Pipeline 和坑点。

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

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

数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。SARAS-ESAD 采用 CC BY-NC-SA 3.0 许可发布,禁止商业使用,二次分发须以相同许可且注明原始出处;数据录制与分发已获患者与医院同意,具体使用限制以 SARAS 官方伦理与数据合规文档为准。


§1 数据集概览

§1.0 30 秒速览

这是什么? SARAS-ESAD(简称 ESAD)是欧盟"智能自主机器人助理外科医生"(Smart Autonomous Robotic Assistant Surgeon,SARAS)项目发布的第一个内窥镜术者动作检测数据集。它来自 4 台真实前列腺癌患者的机器人辅助根治性前列腺切除术(RARP)完整手术录像,以每秒 1 帧抽取成 53,370 张 1920×1080 图像,由人工智能研究者与医学专家共同标注出 46,325 个"边界框 + 动作类别"实例,覆盖 21 种 RARP 特异动作,如牵拉组织、吸血、膀胱颈吻合等(官方主页)。

为什么重要? 在它之前,手术视频理解数据集要么基于模拟器任务(如 JIGSAWS),要么只做手术阶段/器械识别,没有一个数据集要求算法"在真实手术画面中同时定位并识别术者正在做的动作"。真实手术场景中器官外观相似、器械细微差别难辨、内窥镜持续晃动,使这一任务远难于常规人体动作检测——挑战赛最优方法的 mAP 仅 19.28%,说明问题远未解决(主论文)。

我能用它做什么? 训练和评测术者动作检测器(目标检测框架即可上手);研究手术场景理解、器械-组织交互建模;开展真实→仿体、跨手术的域适应实验(配套 2021 年 SARAS-MESAD 挑战提供了仿体域数据);为手术机器人"自主助理"系统构建感知原型。注意:该数据集明确禁止商业用途(CC BY-NC-SA 3.0)。

§1.1 技术摘要

ESAD 数据集由 SARAS 项目团队于 2019-2020 年构建:在米兰圣拉斐尔医院等临床合作机构,使用集成双目内窥镜(直径 8 mm,0°/30° 镜头)的 da Vinci Xi 机器人系统录制 4 台真实患者完整 RARP 手术,发布版本采用单目视频流。团队以 1 FPS 抽帧以保留场景变化,由医学专家与 AI 研究者按"边界框须同时覆盖操作器械与被操作器官、二者面积占比各限 30%-70%、器械靠近器官动作开始/离开即停止"的协议标注,每帧最多 2 个动作实例且框允许重叠。数据划分为训练(2 台手术,22,601 个标注帧、28,055 实例)、验证(1 台,4,574 帧、7,133 实例)与测试(1 台,6,223 帧、11,565 实例),以 YOLO 风格归一化中心点 TXT 文件发布。2020 年 4-6 月,该数据集支撑了 MIDL 2020 的 SARAS-ESAD 挑战赛,评测采用 IoU 0.1/0.3/0.5 三档平均 mAP;官方 baseline(FPN+ResNet)mAP 约 10-12%,冠军方案 19.28%(主论文、下载页)。

与 JIGSAWS 的关键差异(迁移经验前必读):JIGSAWS 拍摄于干实验室模拟器,8 名外科医生执行缝合、打结等短任务,提供手势序列与双臂运动学标注,主打技能评估与动作分段;ESAD 则是真实患者的完整长程手术,只有视觉单模态(无运动学、无深度),标注形态是实例级边界框而非手势序列。两个数据集的类别体系不可互译、任务指标不可互比;从 JIGSAWS 迁移到 ESAD 的团队,需要重建"检测式"训练评估管线,并接受真实场景带来的类不平衡与域噪声(主论文)。

§1.2 战略价值

维度一:填补"真实手术 + 动作检测"的基准空白。 JIGSAWS 等经典手术数据集拍摄于干实验室模拟器,任务短、场景受控;Cholec80 等腹腔镜数据集标注的是手术阶段而非动作实例。ESAD 首次将"动作检测"(classification + localization 联合任务)引入真实机器人手术场景,并证明该任务的难度量级:患者解剖差异、术者操作风格差异使 SOTA 检测器的性能显著低于非手术动作检测基准(主论文)。对研究者而言,这是一个能真实反映"手术自主化感知短板"的试金石。

维度二:面向机器人助理的直接应用牵引。 SARAS 项目的目标是让两条辅助机械臂替代人类助理外科医生,这要求系统能实时理解主刀医生正在做什么,进而规划辅助臂动作轨迹。ESAD 的 21 个动作类不是学术抽象,而是与 RARP 手术流程中的器械-器官交互一一对应(如 ClippingBladderNeck、UrethraDissection),标注语义(工具+器官联合框)直接服务于"动作→辅助臂响应"的决策链路(挑战赛描述)。

维度三:跨域手术 AI 研究的起点资产。 2021 年,同团队以 ESAD 为真实域(MESAD-Real),补充 5 台仿体(phantom)手术构建 SARAS-MESAD 多域挑战,使该数据集族成为"真实 vs 仿真域偏移"研究的标准素材;SARAS 生态还衍生出无监督手术异常检测等工作(MESAD 数据页、SARAS 项目页)。

对工程团队的直接意义:如果团队只有预算维护一套手术动作检测管线,ESAD 提供了"真实域训练 + 三档 IoU 评测 + 官方 baseline 对照"的最小闭环,而 MESAD 的仿体域可以按需接入,无需推倒既有管线设计。

§1.3 同类数据集横向对比

数据集 规模 模态 标注类型 与 ESAD 的差异化
SARAS-ESAD 4 台真实 RARP;53,370 帧;46,325 实例;21 类 da Vinci Xi 单目内窥镜 1920×1080 逐帧边界框 + 21 类动作(1 FPS) 首个真实手术动作检测基准;类不平衡与真实场景噪声
JIGSAWS 8 名外科医生 × 3 任务(缝合、打结、穿线圈);39 个 trial da Vinci 模拟器视频 + 双臂运动学 手势序列(15 类)、技能评分 模拟器任务短、场景受控;主打技能评估与动作分段,非实例检测
Cholec80 80 台腹腔镜胆囊切除术视频 腹腔镜视频 7 个手术阶段 + 器械存在性 阶段级粗粒度标注,无实例级边界框
SARAS-MESAD MESAD-Real(4 台真实,21 类)+ MESAD-Phantom(5 台仿体,14 类),共享 11 类 da Vinci Xi 720×576 TSV 边界框 + 类别 ESAD 的多域扩展版,主打跨域联合学习

§1.4 版本时间轴

时间 事件 说明
2020-03-01 SARAS-ESAD 挑战赛开放注册 MIDL 2020 官方挑战(主页)
2020-04-01 训练/验证集发布 含 set1、set2 两台手术训练数据与 RARP1 验证数据
2020-04-14 Baseline 开源 GitHub 仓库 SARAS-ESAD-Baseline(PyTorch 1.5)
2020-06-10 测试集发布 含图像与标签,评测阶段开启
2020-06-30 挑战结果公布 冠军 mAP 19.28%(三档 IoU 平均)
2021-04-07 主论文发布 arXiv:2104.03178 系统总结数据集、协议与挑战方法
2021-03 至 2021-05 SARAS-MESAD(MICCAI 2021) 数据重组为 MESAD-Real/MESAD-Phantom 双域,TSV 格式、720×576,2021-05-10 修正小幅标注错误

时间轴的两点提示:其一,ESAD 本体自 2020-06 测试集发布后未再更新,之后的所有变动(重打包、降采样、格式转换)都发生在 SARAS-MESAD 框架内,做结果复现时应以 2020 年官方下载包为唯一快照;其二,MESAD 的早期 proposal(Zenodo 2021-03)与最终数据页在 phantom 视频数(6 台→5 台)与类别数(15→14、共享 10→11)上存在口径差异,引用时以 MICCAI 挑战最终数据页为准。

§1.5 典型应用场景

  1. 术者动作检测器训练与基准评测:以官方三档 IoU mAP 协议复现挑战赛可比结果。
  2. 手术机器人助理感知原型:将动作检测结果映射为辅助机械臂的响应策略输入(SARAS 项目的原始动机)。
  3. 手术流程统计与质控分析:离线统计各动作的时长分布与序列规律,辅助手术复盘与教学。
  4. 跨域/域适应研究:配合 MESAD-Phantom 仿体域数据研究真实→仿真外观偏移下的动作检测鲁棒性。
  5. 术中异常场景感知预研:利用 SuckingBlood、SuckingSmoke 等与不良场景相关的动作类别,探索术中风险事件的视觉线索。

落地提示:场景 1 与 2 是该数据集的"原生用法",可直接对齐官方协议与排行榜;场景 3 需要自行把实例序列聚合为流程单元,建议先在验证手术(RARP1)上人工核对聚合结果;场景 4 的实验设计应直接复用 MESAD 双域协议以获得可比性;场景 5 属于"借用动作特征的风险研究",结论外推时须声明 ESAD 并未标注真实不良事件,只是部分动作类别与不良场景相关。


§2 医学背景

§2.1 ICD-11 编码映射表

标签/场景 ICD-11 编码 中文名称 说明
手术适应证(患者人群) 2C82 前列腺恶性肿瘤 4 台手术均为前列腺癌患者的根治性切除(ICD-11 for Mortality and Morbidity Statistics)
手术场景延伸:盆腔器官操作 2C8Z 男性生殖器官恶性肿瘤,未特指 部分动作类(精囊、输精管处理)涉及盆腔解剖结构操作

§2.1b SNOMED CT 映射表

标签/概念 ICD-11 SNOMED CT 码 术语
前列腺恶性肿瘤 2C82 126906006 Malignant neoplasm of prostate(disorder)
机器人辅助手术场景 — 246422005 Robotic surgical procedure 需以官方术语服务器核验后引用;本表仅列疾病概念映射
腺癌(主要病理类型) 2C82 35917007 Adenocarcinoma(disease/morphologic abnormality)

§2.2 疾病简介与流行病学

前列腺癌是全球男性最常见的恶性肿瘤之一,在男性癌症发病中位居前列,其发病率随年龄显著上升,是多参数 MRI、前列腺特异性抗原(PSA)筛查与穿刺活检联合诊断的重点癌种。对于局限性前列腺癌,根治性前列腺切除术是主要治愈性手段之一;自 2000 年代起,机器人辅助根治性前列腺切除术(Robot-Assisted Radical Prostatectomy,RARP)凭借三维放大视野、腕式器械灵活性与出血量优势,在欧美及中国的大型泌尿外科中心逐步成为主流术式。RARP 流程围绕前列腺游离、膀胱颈处理、神经血管束保留、尿道膀胱吻合等关键步骤展开,这些步骤正对应 ESAD 的 21 个动作类别(如 BladderNeckDissection、BladderAnastomosis、UrethraDissection)。数据集中 4 台手术均来自前列腺癌患者的真实完整术程(挑战赛描述)。

从手术数据科学视角看,RARP 具有两个使它成为动作识别理想对象的特征:其一,术程长、步骤结构化程度高,动作类别可以沿解剖路径清晰枚举(见 §2.3b);其二,盆腔操作空间狭小、器官质地相近,动作的视觉区分高度依赖"器械类型 × 目标器官"的组合判断,这正是通用动作检测方法最容易失效的形态。ESAD 把这两个特征固化成了带边界的评测任务,也因此成为手术视频理解方法论文的标准试金石之一。

§2.3 临床任务定义

任务类型 在本数据集中的形态 临床/AI 意义
术者动作检测(核心) 逐帧多实例边界框分类:识别"哪支器械+哪个器官"正在执行 21 类动作中的哪一类 为自主辅助臂提供"主刀当前行为"的实时感知输入,是助理机器人决策的前置条件
手术流程理解 动作实例串接后可恢复手术步骤序列(膀胱颈解剖→前列腺切除→吻合等) 支撑手术阶段自动标注、手术质控与复盘教学
场景风险线索感知 SuckingBlood、SuckingSmoke 等类别间接反映出血与电凝烟雾场景 为术中异常检测与提醒系统提供视觉特征
跨域泛化研究 真实手术域(ESAD/MESAD-Real)→ 仿体域(MESAD-Phantom) 检验手术 AI 在仿真培训数据上的可迁移性

§2.3b 手术阶段与动作类别对应

21 个动作类别并非随机集合,而是沿着 RARP 术程的组织解剖路径展开。将类别按手术阶段归组,有助于理解标注语义、设计阶段感知模型与解读逐类 AP:

RARP 手术阶段 对应动作类 说明
通用组织操作 PullingTissue、CuttingTissue、ClippingTissue 全程高频出现,占实例总量的主体
止血与视野维护 SuckingBlood、SuckingSmoke 吸引积血、吸除电凝烟雾,反映术中即时风险场景
精囊与输精管处理 PullingVasDeferens、ClippingVasDeferens、CuttingVasDeferens、PullingSeminalVesicle、ClippingSeminalVesicle、CuttingSeminalVesicle 盆腔后部解剖,动作持续时间短、实例稀少
前列腺游离与切除 PullingProstate、CuttingProstate、CuttingMesocolon、BaggingProstate 标本装袋(BaggingProstate)仅术末短暂出现,为最稀有类
膀胱颈与尿道处理 BladderNeckDissection、ClippingBladderNeck、PullingBladderNeck、UrethraDissection 尿道侧精细解剖,与术后控尿功能直接相关
膀胱尿道重建 BladderAnastomosis、CuttingThread 膀胱尿道吻合与缝线剪断,实例量高且持续时间长

这一归组源自 21 个类别名的解剖语义(类别全表见 §4.2),可作为阶段先验用于时序平滑与稀有类增强设计。

§2.4 患者人群构成

维度 内容 来源
来源 SARAS 项目临床合作机构(米兰圣拉斐尔医院等)真实手术 挑战赛描述
手术台次 4 台完整 RARP 术程 主论文
疾病 前列腺癌(接受机器人辅助根治性前列腺切除术) 挑战赛描述
术者 专家级外科医生(expert surgeons) 挑战赛描述
伦理 患者同意录制与数据分发;SARAS 伦理与数据合规文档公开可查 MESAD 数据页

患者年龄、性别构成(RARP 患者均为男性)、种族等人口学细分未在公开资料中披露,故不在此列示,使用者应以官方伦理文档为准。

§2.5 临床价值

RARP 的学习曲线陡峭,术中动作的精细程度直接影响控尿功能与勃起功能保存。若 AI 系统能实时识别主刀动作并推断下一步意图,则可:(1) 让两条辅助机械臂自动递送器械、牵拉暴露,减轻人类助理负担;(2) 在术中为年轻术者提供基于动作序列的实时提示;(3) 术后自动生成动作级手术报告,支撑质控与培训。ESAD 为上述能力的感知层提供了首个真实场景训练与评测基底(主论文)。

同样重要的是它的"负向价值":19.28% 的冠军 mAP 清晰量化了"手术自主化感知"与通用视觉任务之间的真实差距,为项目排期、投资决策与安全论证提供了可引用的难度标尺——在动作检测未能稳定超过人类助理水平之前,任何"自主助理外科医生"的系统设计都应以人在环中为前提。

§2.6 金标准参考表

维度 内容
划分 官方按手术划分:训练 2 台(set1/set2)、验证 1 台(RARP1)、测试 1 台(RARP3),杜绝同一手术跨集合
标注方式 人工绘制边界框 + 21 类动作标签;1 FPS 抽帧标注;框须同时覆盖工具与器官,二者面积占比各限 30%-70%
标注者 医学专家与 AI 专业人员协作标注,经多外科医生咨询确定类别体系
性质 实例级空间标注(检测式),非全帧密集标注;约 45% 帧无标注框(多为无动作区间)
一致性 未公布标注者间一致系数;框界主观性由获胜方法的 jitter 增强间接佐证

§3 数据集规格

§3.0 版本抉择矩阵

你的需求 推荐版本 大小 理由
复现 MIDL 2020 挑战赛 / 对齐主论文口径 ESAD 原版(grand-challenge 下载页,YOLO TXT,1920×1080) 约 13 GB 与 46,325 实例、21 类、三档 IoU mAP 的论文口径一一对应
跨域/多任务学习研究 SARAS-MESAD 2021(MESAD-Real + MESAD-Phantom,TSV,720×576) 官方未公布总量 提供仿体域 5 台手术与 11 个共享类,支持联合训练实验
快速原型验证 OpenDataLab ESAD 镜像 13.3 GB 国内镜像加速,含数据集介绍与文件索引
空间细节分析(器械形态) ESAD 原版 1920×1080 约 13 GB MESAD 版已降采样至 720×576,损失器械细节

§3.1 模态详情

单目内窥镜视频帧(核心模态):原始录像由集成于 da Vinci Xi 机器人系统的双目内窥镜(直径 8 mm,Intuitive Surgical)采集,镜头可选 0° 或 30°(30° 镜在手术不同阶段上视/下视以改善视野);数据集发布单目画面,双目深度信息未随数据分发。按 1 FPS 抽帧为 JPG 图像,分辨率 1920×1080,帧文件名按时间顺序编号(如 RARP2_frame_137.jpg),支持通过文件名恢复时间序列(MESAD 数据页、下载页)。

边界框动作标注(监督信号):每帧对应同名 TXT 文件,每行为一个动作实例:label x y w h,其中 x、y 为归一化的边界框中心坐标,w、h 为归一化宽高;label 为类别索引,对应 obj.names 文件中的行号(第 11 行对应索引 10)。部分帧的 TXT 为空,表示该帧无标注动作实例(下载页)。

未随数据发布的模态:器械运动学数据(Kinematics)、双目深度、音频均未包含。若研究需要运动学,JIGSAWS 是目前公开可得的替代来源。

§3.2 按子集样本数统计

子集 手术台次 帧总数(图像) 标注帧数 动作实例数 说明
train(set1+set2) 2 40,152 22,601 28,055 set1、set2 各为一台独立完整手术
val(RARP1) 1 7,130 4,574 7,133 挑战赛提供标签供参赛者自行评估
test(RARP3) 1 6,088 6,223* 11,565 官方测试集口径 6,223 标注帧;Dataset Ninja 统计图像 6,088 张
合计 4 53,370 — 46,325 无标注帧 23,919 张(约占 45%)

*注:test 子集标注帧数(6,223)与图像张数(6,088)来自两个公开统计口径(Dataset Ninja 与 OpenDataLab 转引的官方论文数据),以官方下载页数据为准。数值来源:Dataset Ninja、主论文。

§3.3 数据格式表

文件/字段 格式 说明
图像帧 JPG(1920×1080) RARP{N}frame.jpg,按出现顺序编号
边界框标签 TXT(YOLO 风格) 每行 label,x,y,w,h;x,y 为归一化中心坐标
类别表 obj.names 每行一个类名,行号-1 即标签索引
目录 train/set1、train/set2、val、test、test_labels 每个划分独立目录;train 含 obj.names
提交文件(挑战赛) submission.txt(ZIP 压缩) 特定行列格式,自动评测系统解析

§3.4 存储大小

数据集压缩发布约 13 GB(Dataset Ninja 记录 13 GB;OpenDataLab 镜像 13.3 GB)。解压后因 53,370 张 1920×1080 JPG,建议预留 20 GB 以上磁盘与 4 万+ 文件的 inode 余量;逐帧读取的 DataLoader 缓存建议再预留 15-30 GB(Dataset Ninja、OpenDataLab)。

§3.5 标注方式

项目 内容
方式 人工标注(医学专家 + AI 专业人员协作),非自动生成
抽帧策略 1 FPS 标注,以维持场景变化覆盖
空间协议 每框须同时包含"执行动作的器械"与"被操作器官";框内器械与器官面积占比各限 30%-70% 以平衡二者
时间协议 器械足够靠近目标器官时动作开始,器械离开即停止;因此标注实例在时间上天然不连续
多实例 每帧最多 2 个动作实例(对应主刀双手操作),边界框允许重叠
类别确定 21 个动作类别经多位外科医生与医学专家咨询后选定

§3.6 标注者资质与一致性

标注由"专家 AI 研究者 + 医学专业人员"团队完成,类别体系与协议经多位外科医生会商确定(挑战赛描述、Dataset Ninja)。主论文未公布标注者间一致性系数(如 IoU 一致性或 Cohen’s kappa),这是使用者在评估标签噪声时应自行留意的空白;主论文分析显示边界框存在主观性导致的边界抖动,而"边界框随机抖动(bbox jitter)"增强恰恰成为挑战赛获胜队伍的有效技巧,侧面印证了框界的主观空间。

使用者可自行执行的标签质量三步体检:(1) 抽样 200 帧人工核查"框是否同时覆盖工具与器官"这一核心协议;(2) 统计每帧实例数分布,确认"最多 2 实例"约束无违反;(3) 对同一帧做两次标注的试点(若有标注人力),估计框级 IoU 一致性基线。三项结果写入数据卡,可为后续多标注者扩展提供起点。

§3.7 采集周期

4 台手术的录制在 SARAS 项目执行期内、MIDL 2020 挑战赛(2020-04 发布数据)之前完成;单台手术录像时长,主论文口径为"每台约 4 小时",Dataset Ninja 口径为"每台约 2 小时 20 分",两个口径可能分别对应含准备段与仅体内操作段的不同计时范围(主论文、Dataset Ninja)。具体逐台手术日期未公开。

§3.8 地域覆盖

数据采集自意大利的 SARAS 项目临床合作机构(米兰圣拉斐尔医院为临床演示与合作单位);单一国家、单一医疗中心体系,不代表多中心分布(MESAD challenge proposal)。

§3.9 设备规格

项目 规格
手术平台 da Vinci Xi 机器人手术系统(Intuitive Surgical)
内窥镜 集成双目内窥镜,直径 8 mm;0°/30° 两种镜头
发布画面 单目视频流
帧分辨率 1920×1080(ESAD 原版);MESAD 2021 再发布版为 720×576
抽帧输出 1 FPS JPG 帧序列,按手术目录组织,随附逐帧 TXT 标注
未发布通道 双目深度流、器械运动学、原始完整视频文件均未随数据分发

§3.10 深度溯源链

环节 执行方 可追溯凭据
原始手术录像(da Vinci Xi 录制) SARAS 临床合作机构 挑战赛描述、伦理合规文档
1 FPS 抽帧与 JPG 编码 SARAS 团队(Oxford Brookes 等) 官方下载页帧序列
人工边界框标注(21 类协议) 医学专家 + AI 研究者 主论文协议章节、Dataset Ninja 协议页
质量校验与按手术划分 SARAS 团队 官方 train/val/test 目录与挑战赛规则
MIDL 2020 挑战赛发布 grand-challenge.org 托管 挑战赛主页时间线公告
论文固化口径 arXiv:2104.03178(2021-04-07) 主论文与前置论文 arXiv:2006.07164
多域重组再发布 SARAS-MESAD(MICCAI 2021) MESAD 数据页与 2021-05-10 修正公告

每一步均由牛津布鲁克斯大学视觉 AI 实验室团队主导,任一环节的疑问都可回溯至对应官方凭据;这也是该数据集虽无正式版本号、但口径仍可考证的原因。


§4 数据结构

§4.0 目录树

数据解压后的目录结构如下(依据官方下载页与社区整理):

ESAD/
├── train/                          # 训练集:两台独立完整手术
│   ├── obj.names                   # 21 个类名,每行一个;行号-1 = 标签索引
│   ├── set1/                       # 第一台手术(如 RARP2_frame_1.jpg ...)
│   │   ├── RARP2_frame_1.jpg
│   │   ├── RARP2_frame_1.txt       # 同名标签文件;可为空(无标注实例)
│   │   ├── RARP2_frame_2.jpg
│   │   ├── RARP2_frame_2.txt
│   │   └── ...
│   └── set2/                       # 第二台手术(RARP4_frame_1.jpg ...)
│       ├── RARP4_frame_1.jpg
│       └── ...
├── val/                            # 验证集:第三台手术(RARP1)
│   ├── obj.names
│   ├── RARP1_frame_1.jpg
│   ├── RARP1_frame_1.txt
│   └── ...
├── test/                           # 测试集:第四台手术(RARP3)图像
│   ├── RARP3_frame_10.jpg
│   └── ...
└── test_labels/                    # 测试集标签(挑战赛评测期发布)
    ├── RARP3_frame_10.txt
    └── ...

§4.1 DAIMS 字段字典

字段名 类型 说明 示例值 AI 用途 观测误差 信息性缺失编码 取值范围
frame_id string 帧唯一标识(文件名去扩展名) RARP2_frame_137 主键;时间序列恢复 无 无 RARPframe
session/split string 手术台次与划分 train-set1 按手术分组防泄漏 无 无 set1/set2/RARP1/RARP3
label int 动作类别索引(对应 obj.names 行号-1) 10 → PullingTissue 分类目标 类别体系经专家会商,无一致系数量化 无 0-20
x_center float 边界框中心 x(归一化) 0.5132 定位目标 框界主观性(论文证实) 无 (0,1)
y_center float 边界框中心 y(归一化) 0.4827 定位目标 同上 无 (0,1)
width float 边界框宽(归一化) 0.2145 定位目标 同上 无 (0,1)
height float 边界框高(归一化) 0.1876 定位目标 同上 无 (0,1)
has_annotation 派生 bool TXT 是否含实例行 False 背景帧甄别 空 TXT ≠ 语义上确认无动作,见坑点 1 — 0/1
instance_index 派生 int 帧内实例序号 0/1 每帧最多 2 实例约束 无 — 0-1

§4.2 标签分布

21 类动作实例分布(总 29,294 类可统计口径之外的完整 46,325 实例覆盖 train/val/test;下表为公开逐类统计):

类别 实例数 占比 类别 实例数 占比
PullingTissue 5,408 18.27% SuckingSmoke 1,092 3.69%
CuttingTissue 4,832 16.32% PullingProstate 895 3.02%
SuckingBlood 3,886 13.13% UrethraDissection 642 2.17%
BladderAnastomosis 3,766 12.72% PullingBladderNeck 618 2.09%
PullingSeminalVesicle 2,213 7.48% CuttingMesocolon 555 1.87%
CuttingSeminalVesicle 1,838 6.21% PullingVasDeferens 551 1.86%
BladderNeckDissection 1,627 5.50% ClippingSeminalVesicle 124 0.42%
CuttingProstate 1,005 3.40% ClippingTissue 101 0.34%
ClippingBladderNeck 117 0.40% CuttingThread 100 0.34%
ClippingVasDeferens 90 0.30% CuttingVasDeferens 87 0.29%
BaggingProstate 54 0.18%

(来源:openmedlab 数据整理、Dataset Ninja;占比基于该统计口径的实例分母。)

最高频类 PullingTissue(5,408)与最低频类 BaggingProstate(54)相差约 100 倍,是所有下游建模决策的第一约束。

阅读这张分布表的三条建议:(1) 把它当作采样先验——验证集抽帧评估时按此分布分层,避免稀有类在抽样中"消失";(2) 把它当作风险地图——任何按实例平均的指标都会被前 4 个高频类主导,稀有类结论必须单独给出置信区间;(3) 把它当作部署预期——线上系统若在真实 RARP 视频流中出现"ClippingVasDeferens 高频告警",第一怀疑对象应是模型偏差而非手术异常,因为该类在自然术程中本来就稀少。

§4.3 关键统计

统计项 数值 来源
总帧数(图像) 53,370 Dataset Ninja
总动作实例 46,325 主论文
无标注帧占比 45%(23,919 张) Dataset Ninja
动作类别数 21 挑战赛主页
帧内最大实例数 2(允许框重叠) 挑战赛描述
标注抽帧率 1 FPS Dataset Ninja
手术台次 4(训练 2 / 验证 1 / 测试 1) 下载页

§4.3b 帧命名规则与时间序列恢复

帧文件名是数据集中唯一的时间线索。命名规则为 RARP{手术号}_frame_{帧号}.jpg,其中帧号按原始视频中帧的出现顺序递增(1 FPS 抽帧)。由于数据包不含原始视频时间戳,任何"动作时长/节奏"分析都建立在该命名假设之上,使用前应先校验序号连续性:

from pathlib import Path
import re

def check_sequence_continuity(img_dir: Path, session: str = "RARP2"):
    """校验某一台手术的帧序号是否连续(无缺口、无重复)。"""
    nums = sorted(int(re.search(r"frame_(\d+)", p.name).group(1))
                  for p in img_dir.glob(f"{session}_frame_*.jpg"))
    gaps = [(a, b) for a, b in zip(nums, nums[1:]) if b != a + 1]
    return {"n_frames": len(nums), "first": nums[0], "last": nums[-1],
            "gaps": gaps}   # gaps 非空则存在缺号,需在数据卡中记录

三点工程提醒:(1) 恢复出的"帧号即秒"仅是 1 FPS 抽帧的近似时间,不代表原始视频的真实秒数;(2) 不同手术目录(set1/set2/val/test)的帧号各自独立计数,跨目录拼接前必须带手术前缀;(3) 挑战赛官方未公布抽帧丢弃规则,若发现缺号应以官方为准而非自行插补。

§4.4 数据层级

数据集(4 台 RARP 手术)
└── 手术台次(session:RARP1-RARP4,对应 set1/set2/val/test)
    └── 帧序列(1 FPS 抽帧,文件名即时间序)
        └── 动作实例(每帧 0-2 个:边界框 + 21 类动作标签)

层级含义:同一手术台次内帧高度相关(相邻帧近乎相同画面),任何随机划分都必须以"手术台次"为最小分组单位;不存在"患者→多次检查"的多级结构,每台手术来自独立患者。

把层级写进代码的方法:所有采样器、评估器与增强器都从"手术前缀"派生分组键,而非从目录名硬编码——这样当未来官方或社区扩展更多手术时,管线无需改动即可继承正确的分组语义。

§4.5 缺失值与信息性缺失

情形 编码方式 是否信息性缺失 处理建议
帧无标注实例 同名 TXT 为 0 字节 是:官方说明为"并非所有帧都标注了边界框",无标注区间多对应无器械-器官交互时段,但官方未逐帧声明"确认无动作" 训练检测器时作为背景帧使用;评估精确率口径时注意区分
帧缺失(抽帧间隔) 文件名序号连续,无缺口信号 官方未公布抽帧丢弃规则 勿假设文件序号到原始视频时间戳的线性映射精确成立
患者人口学字段 不存在 是:数据包不含任何临床表格 需要临床协变量的研究应另行设计

缺失处理决策树(落地为代码断言):

def classify_frame(txt_path: Path) -> str:
    """帧级缺失语义判定:三种状态的处理路径完全不同。"""
    if not txt_path.exists():
        return "MISSING_FILE"      # 文件缺失:记录并上报,禁止静默跳过
    lines = txt_path.read_text().strip()
    if not lines:
        return "NO_BOX"            # 官方说明的合法空标签帧:背景帧候选
    return "LABELED"               # 常规标注帧

§5 划分与使用建议

§5.1 官方划分

官方按手术台次划分:训练集含 set1、set2 两台完整手术(40,152 帧、28,055 实例),验证集为 RARP1(7,130 帧、7,133 实例,标签公开发布、由参赛者自行评估),测试集为 RARP3(挑战评测期发布,评测仅针对测试集,且每人每天限提交一次)。验证集被明确禁止并入训练,否则取消资格(主页、下载页)。

官方划分的手术台次映射固定为下表,任何自定义实验都应先断言这一映射未被破坏:

划分 手术前缀 物理目录
train RARP2、RARP4 train/set1、train/set2
val RARP1 val
test RARP3 test、test_labels
from pathlib import Path

SESSION_SPLIT = {"RARP2": "train", "RARP4": "train",
                 "RARP1": "val",   "RARP3": "test"}

def assert_official_split(root: Path):
    """断言数据树未被重排:每台手术只出现在其官方划分目录内。"""
    for split_dir in ("train/set1", "train/set2", "val", "test"):
        d = root / split_dir
        sessions = {p.name.split("_frame")[0]
                    for p in d.glob("RARP*_frame_*.jpg")}
        expected = {"train/set1": {"RARP2"}, "train/set2": {"RARP4"},
                    "val": {"RARP1"}, "test": {"RARP3"}}[split_dir]
        assert sessions == expected, f"{split_dir}: {sessions} != {expected}"

§5.2 社区惯例划分

社区论文(如 ESAD 后续方法研究)通常沿用官方 train/val/test 或在训练两台手术内做时间前缀切分自建内部验证。跨域研究则采用 SARAS-MESAD 的 Real/Phantom 双域设定(MESAD-Real 训练 23,366 帧 + MESAD-Phantom 训练 22,609 帧,验证各 2,024/2,285 帧,测试:验证 = 4:1)(MESAD 数据页)。

§5.3 泄漏风险(重点)

  1. 按帧随机划分 = 严重泄漏:1 FPS 抽帧下相邻帧几乎相同,逐帧随机 train/val 切分会使验证集成为训练画面的复制,指标虚高且完全失真。正确做法是以手术台次为分组单位。
  2. 验证集并入训练:官方明确禁止;即使自建实验也应保持 RARP1 或 RARP3 作为纯留出集。
  3. 测试标签过拟合循环:挑战赛限每天一次提交即是抑制对测试集的迭代选择偏差;自评研究中应以验证集驱动迭代。
  4. 类级泄漏(增强端):对稀有类做 copy-paste 增强时,若把验证/测试帧的实例复制进训练集,等同标签泄漏;增强素材只能来自训练集。
  5. 评测脚本泄漏(时间端):自建"时间前缀切分"时若允许训练窗口向后滑入验证窗口,等于偷看未来帧;切分边界一旦确定,增补训练数据只能向更早的时段扩展。

§5.4 交叉验证建议

4 台手术基数过小,不建议 k 折随机交叉验证;若需方差估计,可采用"留一台手术"(leave-one-session-out)4 折协议,但每折训练仅 3 台手术,与官方口径不可直接比较,报告中须注明。留出折的配置示例:

from itertools import product

SESSIONS = ["RARP1", "RARP2", "RARP3", "RARP4"]

def leave_one_out_folds():
    """留一台手术 4 折:每折 train=3 台 / test=1 台。"""
    for held_out in SESSIONS:
        yield {"train": [s for s in SESSIONS if s != held_out],
               "test": held_out}

# for fold in leave_one_out_folds():
#     print(fold)   # 折间方差报告:每折分别训练并按 §6.9 口径评测

配套约束:每折内部的稀有类评估仍按 §4.2 类分布检查;若某折的测试手术恰好缺少某稀有类(如 BaggingProstate 出现极少),该折逐类 AP 应记为"类缺席"而非 0 分,避免制造虚假的跨折方差。

§5.5 外部验证建议

真正的泛化检验应跨越:手术台次(官方口径已覆盖)→ 域(真实→仿体,SARAS-MESAD 提供)→ 手术类型(RARP→其他术式,需 Cholec80 等外部数据,注意类别体系不同需重映射)→ 中心与设备(目前无公开的多中心 RARP 检测数据,需自行协作采集)。

每一跳的代价都应预先声明:跨手术跳(官方口径内)主要损失是术者风格方差;跨域跳额外叠加外观与分辨率偏移;跨术式跳则本质上是重新定义任务,只能做特征级迁移评估;跨中心跳在公开数据上尚无先例,任何结论都应标注为探索性。


§6 AI 就绪指南

§6.0 云端快速启动

数据集托管于 grand-challenge.org,无官方云镜像。快速上云的两条路径:(1) 下载至本地后上传至对象存储(如 AWS S3 / 阿里云 OSS),训练节点挂载读取;(2) 使用 OpenDataLab CLI 拉取镜像(opendatalab download OpenDataLab/ESAD,需注册账号)。约 13 GB 体积建议先在云端解压、以目录形式挂载,避免每次训练重复解压。

两个云端工程要点:其一,5 万余小文件的逐帧随机读取对对象存储延迟敏感,训练前建议把 JPG 转为分片归档(如每台手术一个 LMDB/WebDataset 分片),或至少把 num_workers 与预取调大掩盖 IO 尾延迟;其二,多机训练时以共享只读挂载方式分发数据,禁止各节点独立重复下载造成版本漂移——2021 年 MESAD 的标注修正先例说明快照不一致会直接污染对比实验。

§6.1 快速上手

以下代码假定目录结构为 §4.0 所示,data_root 指向 ESAD 解压根目录(data_root/train/set1 为图像+TXT 对的最小可用子集)。脚本演示:扫描帧-TXT 对、统计空标签、读取 YOLO 归一化框并转绝对坐标。

# 目录预期:
#   data_root/train/obj.names
#   data_root/train/set1/RARP2_frame_1.jpg + RARP2_frame_1.txt
# data_root 与图像路径拼接关系:data_root / split_dir / fname
# 最小可用子集:train/set1(单台手术即可跑通加载与可视化)

from pathlib import Path
import cv2
import numpy as np

def load_frame_labels(txt_path: Path):
    """读取一个 YOLO 风格标签文件;空文件返回空列表(合法!不是损坏)。"""
    if not txt_path.exists():
        return []
    rows = []
    for line in txt_path.read_text().strip().splitlines():
        if not line:
            continue
        label, x, y, w, h = [float(v) for v in line.split()[:5]]
        rows.append({"label": int(label), "xc": x, "yc": y, "w": w, "h": h})
    return rows

def denormalize(box, img_w=1920, img_h=1080):
    """YOLO 中心点格式 -> 左上/右下像素坐标。"""
    xc, yc, w, h = box["xc"] * img_w, box["yc"] * img_h, box["w"] * img_w, box["h"] * img_h
    return int(xc - w / 2), int(yc - h / 2), int(xc + w / 2), int(yc + h / 2)

data_root = Path("data_root/esad")
img_dir = data_root / "train" / "set1"
names = (data_root / "train" / "obj.names").read_text().strip().splitlines()

n_empty = 0
for txt in sorted(img_dir.glob("*.txt"))[:200]:
    boxes = load_frame_labels(txt)
    if len(boxes) == 0:
        n_empty += 1
        continue
    img = cv2.imread(str(txt.with_suffix(".jpg")))  # 建议可视化 20 张核对框位置
print(f"前 200 帧中空标签帧:{n_empty}")

§6.2 数据获取

渠道 链接 内容 要求
官方(推荐) saras-esad.grand-challenge.org/download/ train / val / test 图像与标签 + baseline 仓库链接 免注册直接下载;CC BY-NC-SA 3.0
OpenDataLab 镜像 opendatalab.com/OpenDataLab/ESAD 13.3 GB 整包,国内加速 注册 OpenDataLab 账号,CLI 下载
Dataset Ninja datasetninja.com/saras-esad-2020 统计面板 + 格式转换导出 免费浏览,导出走其 SDK

申请流程:ESAD 无需提交申请、无需签署 DUA;唯一合规义务是遵守 CC BY-NC-SA 3.0(禁商业、同方式共享、署名并引用官方论文)并在使用中遵循患者同意范围(不得尝试身份重识别)。

# 官方渠道示例:浏览器下载三个压缩包(train/val/test)后:
unzip esad_training_data.zip -d esad/train_root
unzip esad_validation_data.zip -d esad/val
unzip esad_test_data.zip       -d esad/test
ls esad/train_root             # 应看到 set1/ set2/ obj.names

下载后先做完整性抽检再开训:

# 1) 图像-TXT 成对性:每张图应有同名 TXT(允许 TXT 为空)
find esad/train_root/set1 -name "*.jpg" | wc -l
find esad/train_root/set1 -name "*.txt" | wc -l
# 2) 类别表行数应为 21
wc -l esad/train_root/obj.names
# 3) 随机抽 5 帧,确认 TXT 行数 ≤ 2(每帧最多 2 实例)
shuf -n 5 -e esad/train_root/set1/*.txt | xargs -I{} sh -c 'echo {}; wc -l < {}'

§6.3 预处理全流程

流程:YOLO TXT → 内存框对象 →(可选)COCO JSON 转换 → 尺寸标准化 → 增强投递。以下为可直接运行的核心转换脚本:

import json
from pathlib import Path

def yolo_dir_to_coco(img_dir: Path, names_path: Path, out_json: Path):
    """把一个 YOLO 风格目录转成 COCO detections JSON,便于接 mmdet/detectron2。"""
    names = names_path.read_text().strip().splitlines()
    coco = {"images": [], "annotations": [], "categories": [
        {"id": i, "name": n} for i, n in enumerate(names)]}
    ann_id = 0
    for i, txt in enumerate(sorted(img_dir.glob("*.txt"))):
        img_id = i + 1
        coco["images"].append({
            "id": img_id,
            "file_name": txt.with_suffix(".jpg").name,
            "width": 1920, "height": 1080})
        for row in load_frame_labels(txt):          # §6.1 中的函数
            x1, y1, x2, y2 = denormalize(row)
            coco["annotations"].append({
                "id": ann_id, "image_id": img_id, "category_id": row["label"],
                "bbox": [x1, y1, x2 - x1, y2 - y1], "area": (x2 - x1) * (y2 - y1),
                "iscrowd": 0})
            ann_id += 1
    out_json.write_text(json.dumps(coco))

# yolo_dir_to_coco(Path("data_root/esad/train/set1"),
#                  Path("data_root/esad/train/obj.names"),
#                  Path("set1_coco.json"))

清洗与标准化要点按优先级排列:

  1. 空标签帧保留为背景帧(见坑点 1),训练期按比例子采样而非全量丢弃;
  2. 坐标统一:全管道仅保留一处 YOLO→COCO 转换函数,内部一律使用绝对像素 [x, y, w, h];
  3. 合法性断言:0 ≤ x1 < x2 ≤ 1920、0 ≤ y1 < y2 ≤ 1080、label ∈ [0, 20],违例帧记录到清洗日志并人工抽看;
  4. 尺寸标准化:训练短边 resize 至 600-800(baseline 消融显示更大输入更优,见 §8.2);
  5. 手术前缀透传:DataLoader 返回值携带 session 前缀,供分组评估与防泄漏审计;
  6. 锁定清单:预处理完成后输出 manifest.json(帧数、实例数、按类计数),与 §4.2/§4.3 官方统计对照,偏差超 1% 即中断并核查。

以下为 manifest 生成脚本:

from collections import Counter
from pathlib import Path
import json

def build_manifest(img_dir: Path, names_path: Path, split: str):
    names = names_path.read_text().strip().splitlines()
    n_frames = n_empty = 0
    per_class = Counter()
    for txt in sorted(img_dir.glob("*.txt")):
        n_frames += 1
        rows = load_frame_labels(txt)
        if not rows:
            n_empty += 1
        for r in rows:
            per_class[names[r["label"]]] += 1
    return {"split": split, "n_frames": n_frames, "n_empty": n_empty,
            "n_instances": sum(per_class.values()),
            "per_class": dict(sorted(per_class.items(),
                                     key=lambda kv: -kv[1]))}

# manifest = build_manifest(Path("data_root/esad/train/set1"),
#                           Path("data_root/esad/train/obj.names"), "train-set1")
# Path("manifest_set1.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=2))

§6.4 PyTorch DataLoader 完整代码

import torch
from torch.utils.data import Dataset, DataLoader
from pathlib import Path
import cv2

class ESADDataset(Dataset):
    """SARAS-ESAD 逐帧动作检测数据集(检测训练通用格式)。"""
    def __init__(self, root: Path, splits=("set1", "set2"),
                 img_size=768, augment=False):
        self.samples, self.img_size, self.augment = [], img_size, augment
        names_path = root / "train" / "obj.names"
        self.names = names_path.read_text().strip().splitlines()
        for split in splits:
            d = root / "train" / split
            for txt in sorted(d.glob("*.txt")):
                self.samples.append((txt.with_suffix(".jpg"), txt, split))

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

    def _load_boxes(self, txt: Path):
        out = []
        for row in load_frame_labels(txt):              # §6.1
            x1, y1, x2, y2 = denormalize(row)
            out.append((row["label"], x1, y1, x2, y2))
        return out

    def __getitem__(self, idx):
        img_path, txt, split = self.samples[idx]
        img = cv2.cvtColor(cv2.imread(str(img_path)), cv2.COLOR_BGR2RGB)
        boxes = self._load_boxes(txt)
        scale = self.img_size / max(img.shape[:2])
        img = cv2.resize(img, None, fx=scale, fy=scale)
        if self.augment:                                 # bbox 抖动(论文证实有效)
            img, boxes = self._jitter(img, boxes)
        img_t = torch.from_numpy(img).permute(2, 0, 1).float() / 255.0
        return {"image": img_t, "boxes": torch.tensor(
            [b[1:] for b in boxes], dtype=torch.float32).reshape(-1, 4),
            "labels": torch.tensor([b[0] for b in boxes], dtype=torch.long),
            "session": split, "path": str(img_path)}

    def _jitter(self, img, boxes):
        import random
        out = []
        for label, x1, y1, x2, y2 in boxes:
            dx, dy = random.randint(-8, 8), random.randint(-8, 8)
            s = random.uniform(0.92, 1.08)
            cx, cy = (x1 + x2) / 2 + dx, (y1 + y2) / 2 + dy
            w, h = (x2 - x1) * s, (y2 - y1) * s
            out.append((label, int(cx - w/2), int(cy - h/2),
                        int(cx + w/2), int(cy + h/2)))
        return img, out

loader = DataLoader(ESADDataset(Path("data_root/esad"), augment=True),
                    batch_size=8, shuffle=True, num_workers=8,
                    collate_fn=lambda b: b)   # 变长实例需自定义 collate

变长目标需要显式 collate 与最小训练循环(以 torchvision 检测模型接口为例):

def esad_collate(batch):
    """检测任务变长 collate:图像堆叠,目标保持列表。"""
    images = torch.stack([b["image"] for b in batch])
    targets = []
    for b in batch:
        boxes, labels = b["boxes"], b["labels"]
        keep = labels >= 0                     # 无实例帧给出 (0,0,0,0) 空 box
        targets.append({
            "boxes": boxes[keep] if keep.any() else torch.zeros(0, 4),
            "labels": labels[keep]})
    return images, targets, [b["session"] for b in batch]

def train_one_epoch(model, loader, optimizer, device):
    model.train()
    for images, targets, _ in loader:
        images = [img.to(device) for img in images]
        targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
        loss_dict = model(images, targets)     # Faster R-CNN 返回损失字典
        loss = sum(loss_dict.values())
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    return loss.item()

要点:无实例帧必须以 boxes=torch.zeros(0, 4)、labels=torch.zeros(0, dtype=torch.long) 的空目标参与训练,这既是 torchvision 接口约定,也保证背景帧真正发挥负样本作用。

§6.5 坑点清单(8 个)

⚠️ 坑点 1:空标签 TXT ≠ 数据损坏,45% 的帧是"无框帧"(分类:预处理陷阱)

问题:官方说明并非所有帧都标注了边界框,下载的数据中存在大量 0 字节 TXT(全数据集约 45% 图像无标注框)。新手预处理脚本常把"读不到行"当文件损坏而跳过整帧,或反过来把所有空标签帧都当"确认无动作"的强负样本,两种做法都会扭曲训练分布。
症状:跳过空帧后,检测器在无器械交互画面上假阳性飙升(训练分布里几乎全是"有动作"画面);而把空帧全当硬负样本又会让分类分支偏向背景。
解决:

  1. 简单方法:以"TXT 存在但 0 行"为合法背景帧照常参与训练,检测框架的默认采样机制(如 FPN 的正负样本分配)会自动处理背景比例。
  2. 进阶方法:统计每台手术中空帧的连续区段,将区段级背景帧按 20%-40% 比例子采样入训练,控制正负帧比例:
from pathlib import Path
import random

def subsample_background(txt_paths, keep=0.3, seed=0):
    """空标签帧按比例子采样,其余返回 None 表示丢弃该 epoch。"""
    random.seed(seed)
    out = []
    for p in txt_paths:
        empty = not p.exists() or p.read_text().strip() == ""
        out.append(p if (not empty or random.random() < keep) else None)
    return [p for p in out if p is not None]
  1. SOTA 方法:训练用 OHEM 或 Focal loss(官方 baseline 即提供 OHEM/Focal 两种损失)自动加权难背景样本;评估阶段则用全帧(含空帧)计算 AP,与挑战赛口径对齐。
    参考:官方下载页说明、Dataset Ninja 统计、baseline 论文。

⚠️ 坑点 2:类别不平衡高达 100 倍,整体 mAP 掩盖稀有类崩塌(分类:偏倚陷阱)

问题:PullingTissue 5,408 实例 vs BaggingProstate 54 实例,相差约 100 倍;官方论文明确指出数据集"在类别不平衡上高度偏斜"。整体 mAP 主要由高频类贡献,稀有类(剪输精管、装袋前列腺等)AP 常接近 0。
症状:模型整体 mAP 尚可,但按类 AP 表中尾部类别全为个位数甚至 0;混淆矩阵显示稀有类被系统性预测为 Cut/PullTissue 等高频类。
解决:

  1. 简单方法:报告必须按类展开 + 宏平均,禁止只报整体 mAP;训练按类别做帧级过采样。
  2. 进阶方法:Focal loss + 类平衡采样;对稀有类实例做受控 copy-paste(源只能来自训练集手术,且须保持"工具+器官"完整框语义)。
  3. SOTA 方法:挑战赛冠军组合了多骨干集成与加权框融合(weighted box fusion of ResNeXt/ResNet/SENet),在稀有类上的召回改善显著;后续研究可叠加稀有类合成与两阶段微调(先全类、再稀有类低学习率微调)。
    参考:主论文、openmedlab 逐类统计。

⚠️ 坑点 3:边界框的语义是"工具+器官"联合框,不是器械检测框(分类:标签理解)

问题:标注协议要求每个框同时覆盖"执行动作的器械"与"被操作器官",且二者面积占比各限 30%-70%。许多团队拿通用器械分割/检测预训练模型迁移,其框只包器械,与 ESAD 标注语义不匹配,微调后 AP 仍低。
症状:可视化对比时发现模型预测框明显小于 GT 框;AP 随 IoU 阈值提升急剧衰减;把 GT 框当"器械框"训练定位分支时不收敛。
解决:

  1. 简单方法:先可视化 ≥100 张标注图,牢记框覆盖"器械尖端到器官接触面"的范围。
  2. 进阶方法:anchor/先验框按数据分布重设——挑战赛分析显示 k-means 聚类得边界框长宽比接近 1:1(方形框),调整 anchor 后收敛显著加快。
  3. SOTA 方法:两阶段 Faster R-CNN 配 ResNeSt/Split-Attention、CBAM 等注意力骨干,对"器械+器官"复合目标的特征表达更强,是挑战赛主流获胜架构。
    参考:Dataset Ninja 标注协议、主论文挑战方法分析。

⚠️ 坑点 4:按帧随机划分会制造相邻帧泄漏,指标虚高到不可信(分类:数据泄漏)

问题:1 FPS 抽帧使相邻帧几乎逐像素相同;若在帧级随机切分 train/val,验证集大部分画面在训练集中有"孪生帧"。官方划分严格按手术台次(train 2 台 / val 1 台 / test 1 台)正是为了堵住这个洞。
症状:帧级随机划分下 val mAP 可能轻松翻倍;模型换一台"没见过的手术"测试时性能断崖下跌,且下跌幅度与该手术术者风格、解剖差异正相关。
解决:

  1. 简单方法:无条件沿用官方划分(set1/set2 训练,RARP1 验证,RARP3 测试),并把验证集排除出训练(官方规定违规即取消资格)。
  2. 进阶方法:自建内部验证时用"手术前缀切分"——按帧序号前 80%/后 20% 切分单台手术,至少保证时间上不回看;跨手术泛化评估用 leave-one-session-out。
  3. SOTA 方法:采用 SARAS-MESAD 的多域协议(Real/Phantom 联合训练)显式测量域偏移下的泛化,Joint mAP 作为指标。
    参考:官方下载页、MESAD 数据页。

⚠️ 坑点 5:评测口径是 IoU 0.1/0.3/0.5 三档平均,单报 AP50 会严重误读(分类:评估误用)

问题:官方评测取 IoU 0.1/0.3/0.5 三档 AP 的均值(AP10/AP30/AP50)。论文分析显示性能随 IoU 阈值上升急剧衰减——模型"知道发生了什么动作"但"框不准位置"。只报宽松阈值下的高分或只报 AP50 的低分都会误导读者。
症状:论文间数字不可比:A 报 22(AP10 主导),B 报 9(AP50),实际同一模型;NMS 阈值不同又叠加一层差异。
解决:

  1. 简单方法:始终同时报告 AP10/AP30/AP50 与三者均值,注明沿用官方评测脚本(baseline 仓库含评测代码)。
  2. 进阶方法:利用"每帧最多 2 个实例"的先验,在推理端把 top-k 截断到 k=2 再做 NMS,可消除部分重复框惩罚。
  3. SOTA 方法:Soft-NMS / 加权框融合降低重叠实例误删;时序维度的检测链接(action tube linking)改善跨帧一致性。
    参考:baseline 论文评测节、主论文。

⚠️ 坑点 6:YOLO 归一化中心点坐标与 VOC/TSV 角点坐标混用,框整体错位(分类:预处理陷阱)

问题:ESAD 原版用 YOLO 风格 label x y w h(中心点、归一化),而 SARAS-MESAD 2021 再发布版用 TSV 角点格式 x1 y1 x2 y2(像素坐标)。两套口径在数据集族内并存,混用会让框偏移一半宽高或缩放错位。
症状:可视化时框出现在画面右下角偏移位置;或 resize 图像后框尺寸不随图像变化;训练损失不降。
解决:

  1. 简单方法:任何加载器落地前先做可视化抽检(每类至少 5 张)。
  2. 进阶方法:统一内部表示为 COCO 绝对像素 [x, y, w, h],转换函数单一化(见 §6.3 代码),禁止在数据管道里散布手写坐标换算。
  3. SOTA 方法:在数据卡中固化"格式契约"断言:x_center/y_center ∈ (0,1)、w/h ∈ (0,1)、角点坐标 ≤ 图像宽高,加载时逐批校验,违例即 fail-fast。
    参考:官方下载页(YOLO 格式说明)、MESAD 数据页(TSV 格式说明)。

⚠️ 坑点 7:真实域模型迁移到仿体域/其他术式会大幅掉点,别把"域偏移"当"模型 bug"(分类:偏倚陷阱)

问题:SARAS 团队明确指出:患者解剖、术者风格等差异已让 SOTA 检测器在真实数据上显著低于非手术基准;而仿体(phantom)视频与真实手术在外观上差异显著(MESAD 版分辨率还降为 720×576)。把 ESAD 模型直接用于 phantom 数据或其他术式(如胆囊切除)表现崩坏属于预期行为。
症状:跨域测试 mAP 跌至域内的几分之一;特征图可视化显示模型依赖器械颜色/纹理等域特异线索。
解决:

  1. 简单方法:输入分辨率与色彩归一化对齐目标域;多尺度训练增强尺度鲁棒性。
  2. 进阶方法:用 MESAD 协议做联合训练——两个域共享 11 个动作类,Joint mAP 联合评测,显式优化跨域共享表征。
  3. SOTA 方法:域自适应检测(对抗对齐/自训练);将"异常监测"拆为独立无监督通路——SARAS 生态的深残差自编码器方案在 phantom 域达 95.6% recall / 88.1% precision,证明把异常检测与动作检测解耦是可行路线。
    参考:MESAD challenge proposal、Samuel & Cuzzolin 2021、主论文。

⚠️ 坑点 8:1 FPS 标注在时间上不连续,把逐帧检测串成"动作段"会引入系统性偏差(分类:工程陷阱)

问题:动作标签遵循"器械靠近器官才开始、离开即停止"的协议,因此同一动作在时间轴上是断续的实例序列,且抽帧不含原始时间戳。直接把连续帧的检测框按类相连(naive tube linking)会把"器械穿过/接近器官的路过帧"误并入动作段,或把真实的长动作切成多段。
症状:动作时长统计呈双峰畸形;视频级动作检索查全率异常低;下游"动作→辅助臂响应"决策在帧间隙反复触发/取消。
解决:

  1. 简单方法:任务定位在"逐帧静态动作检测",评估与报告均按帧级实例口径,不做时间串接。
  2. 进阶方法:时序平滑——挑战赛获奖方法引入 ConvLSTM 在帧序列上传播检测置信度,抑制单帧误检与抖动;间隙短于阈值的同类检测段做前后向合并。
  3. SOTA 方法:显式 action tube 建模(检测+时间链接联合优化),并把"时间不连续"写进评测协议:tube 级指标仅用于方法间相对比较,不与帧级 mAP 混报。
    参考:Dataset Ninja 标注协议、主论文挑战方法分析。

§6.6 数据增强建议

策略 是否安全 说明
边界框随机抖动(jitter ±8px 与 ±8% 缩放) ✅ 挑战赛验证有效,抵消框界主观性
水平翻转 ✅(需重映射左右手语义) 画面镜像合理,但注意左右臂动作组合的先验变化
亮度/对比度/色调抖动 ✅ 模拟内窥镜光源与白平衡漂移
随机缩放裁剪(保持框中心) ✅ baseline 采用多输入尺寸训练
模糊/噪声 ✅ 模拟镜头沾污与组织运动模糊
翻转后不更新框坐标 ❌ 框与图像错位,直接毁掉定位监督
复制验证/测试集实例到训练集 ❌ 数据泄漏,违反官方协议
大角度旋转(>15°) ❌ 破坏"重力方向+器械进入方向"的解剖先验
copy-paste 稀有类不保完整"工具+器官"框 ❌ 违反标注语义,生成不可存在的动作实例

增强强度参考起点(与挑战赛获胜经验对齐):

AUGMENT_CFG = {
    "bbox_jitter_px": 8,          # 随机平移 ±8 像素(1920×1080 下约 0.4%)
    "bbox_jitter_scale": 0.08,    # 随机缩放 ±8%
    "color_jitter": 0.2,          # 亮度/对比度/饱和度抖动幅度
    "p_horizontal_flip": 0.5,     # 水平翻转概率(翻转后同步翻转框)
    "scale_range": (0.7, 1.3),    # 多尺度训练范围
}

参数不是越大越好:jitter 超过 ±15 像素会制造"框脱离器械尖端"的伪标签,与标注协议冲突;多尺度上限超过短边 1000 时,显存消耗增长显著而精度收益边际递减(baseline 消融趋势),应按验证集逐项回归后定型。

§6.7 模型推荐

模型 适用场景 依据
Faster R-CNN(ResNeSt / ResNeXt + FPN) 精度优先的动作检测 挑战赛显示两阶段架构整体优于单阶段;注意力骨干是获胜要素
RetinaNet / FCOS(FPN 变体) 速度优先的近实时检测 单阶段实现简单;PAAS-FPN 等后续工作在此路线改进
FPN + ResNet + OHEM/Focal(官方 baseline) 快速复现与公平对照 官方开源,PyTorch 1.5 代码与评测脚本齐备
检测头 + ConvLSTM 时序平滑的视频流检测 挑战赛获奖方案要素之一

选型决策路径:先用官方 baseline 建立可复现底线;若逐类 AP 显示定位而非分类是短板(AP10 远好于 AP50),优先升级两阶段架构与注意力骨干;若分类本身混淆(各阈值 AP 同步低),优先处理类不平衡与框语义(jitter、类平衡采样);若部署目标是视频流,在上述基础上叠加时序模块,并以"帧级 mAP 不降、时序稳定性提升"双指标验收。

§6.8 硬件需求

阶段 最低配置 推荐配置
数据准备(解压/转换/可视化) 8 核 CPU、20 GB 磁盘、16 GB 内存 16 核 CPU、50 GB SSD
训练(检测模型,输入短边 600-800) 1× 11 GB 显存 GPU(batch 4,禁 AMP 之外花哨项) 2-4× 24 GB GPU(baseline 支持 2/4/8 卡)
推理 6 GB 显存 GPU 8 GB 显存 GPU(近实时目标)

显存预算的粗略公式(Faster R-CNN + ResNet-50 骨干):显存 ≈ 1.2 GB(模型与优化器)+ 0.6 GB × batch × (输入短边/600)。按此推算,24 GB 单卡可支撑短边 800、batch 8 的训练;开启混合精度可再省约三分之一,但需复核检测头在 FP16 下的数值稳定性。

§6.9 评估指标代码

import torch
from torchmetrics.detection import MeanAveragePrecision

metric = MeanAveragePrecision(iou_thresholds=[0.1, 0.3, 0.5],
                              class_metrics=True)
# 验证循环内:
#   preds = [{"boxes": ..., "scores": ..., "labels": ...}, ...]
#   targets = [{"boxes": ..., "labels": ...}, ...]
#   metric.update(preds, targets)
result = metric.compute()
official_map = torch.stack([result[f"map_{t}"] for t in (0.1, 0.3, 0.5)]).mean()
print(f"官方口径 mAP(三档平均): {official_map:.4f}")
print("逐类 AP:", {k: v for k, v in result.items() if k.startswith("map_per_class")})

结果表导出建议:把三档 mAP 与逐类 AP 一起写入 results.json,并在实验管理工具中把"三档均值"设为唯一的主排序指标。逐类 AP 表的列结构推荐固定为:class | n_instances | AP10 | AP30 | AP50 | AP_mean,其中 n_instances 取自 §4.2,便于审稿人直接核对"稀有类是否被平均数掩盖"。

§6.10 MLOps 笔记

  • 数据版本化:以"官方压缩包 SHA256 + 目录清单"固化数据版本;MESAD 2021-05-10 的标注修正公告说明该数据集族存在历史修正,务必锁定下载快照。
  • 实验分组:所有 run 记录 train/val/test 对应的手术台次映射(set1/set2→train,RARP1→val,RARP3→test),防止后续同事"优化"成帧级划分。
  • 评测一致性:统一使用 baseline 仓库评测脚本或 torchmetrics 三档平均口径,并在结果表中标注 IoU 阈值集合。
  • 标签漂移监控:线上/跨中心部署时监控按类实例分布漂移(相对 §4.2 基线),高频类占比突变往往预示术式或术者改变。
  • 稀有类守护:为尾部 4 类(实例数 <110)单独建立最小召回门槛,任何训练配置变更须回归这些类的 AP,防止"整体指标微涨、稀有类归零"的隐性回退。
  • 跨域开关:若实验管线同时覆盖 ESAD 与 MESAD 数据,域标识(real/phantom、分辨率、标注格式)必须作为一等公民写入实验配置,禁止隐式混用两套坐标格式。
  • 合规留存:CC BY-NC-SA 3.0 要求分发衍生数据时同许可署名;项目内部应留存数据来源页快照与引用条目(§9 BibTeX)。

§7 质量评估与局限性

§7.1 已知偏倚

偏倚类型 描述 严重程度 缓解建议
类别不平衡 高频类与稀有类实例数差约 100 倍(18.27% vs 0.18%) 高 按类报告、Focal loss、稀有类重采样/合成
单中心单平台 4 台手术均来自同一项目合作体系、同一 da Vinci Xi 平台 高 外部多中心数据验证;域自适应
专家术者偏倚 术者均为 expert surgeons,缺学习曲线期操作样本 中 谨慎外推到培训场景;补充低年资术者数据
帧级标注稀疏 45% 帧无框;1 FPS 时间不连续 中 背景帧子采样策略;帧级口径评估
标注主观性 框界含主观判断(论文以 jitter 增强缓解) 中 多标注者一致性研究;jitter 增强

§7.2 标注质量

标注协议(工具+器官联合框、30%-70% 占比、靠近即开始/离开即停止)由多位外科医生与医学专家会商制定,类别体系经专业咨询确定;主论文以 baseline 实验对数据集做了系统分析,但未公布标注者间一致性数值。间接证据表明框界存在可感主观性:挑战赛获胜方法的 bbox jitter 增强带来实际增益。MESAD 2021 版曾在 2021-05-10 修正训练/验证集的小幅标注错误,提示使用时应锁定数据快照(MESAD 公告页)。

§7.3 泛化性评估

目标场景 失效风险 证据
同中心新手术台次 中:术者风格与解剖差异导致性能下降 主论文:真实数据上 SOTA 检测器显著低于非手术基准
真实→仿体域 高:外观与分辨率双重偏移 MESAD 设定动机;phantom 外观随时间变化
RARP→其他术式 高:类别体系与场景完全不同 21 类均为 RARP 特异动作
da Vinci→其他机器人平台 高:器械形态、色彩特征失效 数据仅含单一平台器械形态
静态帧→实时视频流 中:时序抖动需平滑 挑战赛 ConvLSTM 方案的动机
专家术者→低年资术者操作 中-高:操作节奏与器械轨迹分布外移 数据集术者均为专家级

§7.4 伦理考量

数据录制与分发均获患者与医院同意,配套 SARAS 伦理与数据合规文档公开可查;画面为体腔内窥镜视野,不含患者面部等直接标识,发布亦不含临床表格与身份信息。许可为 CC BY-NC-SA 3.0:禁止商业使用、衍生数据须同方式共享、须署名引用。使用者不得尝试从画面或文件元数据重识别患者(MESAD 数据页)。

§7.5 公平性

数据集未公布患者人口学(年龄、种族、BMI 等)与术者人口学信息,无法进行亚组公平性审计;术者均为专家级,模型在低年资术者操作分布上的行为未知。涉及临床部署的后续研究应自行建立人口学分层评估。

在这一信息缺口下,最保守的公平性立场是:把"仅见过的专家术者分布"作为模型的已知适用域,对外发布任何性能承诺时都限定在该域内;若产品目标是培训场景(学员操作评估),必须先在学员数据上重新校准,因为学员的动作节奏、器械碰撞频率与专家分布存在系统性差异。

§7.6 数据漂移

内窥镜设备老化、白平衡校准变化、器械代际更新与术式细节演化都会造成视觉漂移;ESAD 单中心 4 台手术无法刻画这些维度。建议:部署前以部署环境采集的少量帧做特征分布对齐检查;按 §4.2 类分布监控动作构成漂移;跨域研究优先复用 SARAS-MESAD 的双域协议。

一个实用的漂移哨兵设计:对线上视频流按小时聚合"每帧实例数均值 + 高频类置信度均值"两条曲线,任一曲线相对训练期基线连续偏移(如超出基线 ±3 个标准差持续 30 分钟)即触发人工抽看。该哨兵不依赖真值标签,可先行发现镜头污染、光源变化与术者更换三类最常见漂移源。

§7.7 DAIMS 数据质量评估

# 检查项 状态 说明
1 宽格式 ✅ TXT/TSV 均可无损转为宽表与 COCO JSON
2 唯一标识 ✅ 帧文件名全局唯一(手术前缀+序号)
3 特殊字符 ✅ 类名与文件名均为 ASCII,无编码陷阱
4 重复行 ✅ 帧名唯一,无重复标注行风险
5 缺失编码 ⚠️ 空 TXT 语义需自行甄别(背景帧 vs 未标注区间)
6 标签标识 ✅ label 索引 ↔ obj.names 行号映射清晰
7 罕见类分组 ⚠️ 尾部 4 类实例数 <110,评估需按类细看
8 偏倚评估 ✅ 官方论文明确讨论类不平衡与场景难度
9 数据字典 ⚠️ 官方文档简短,无正式机器可读 schema
10 信息性缺失解释 ⚠️ 无标注帧的语义边界未逐帧声明
11 设备记录 ✅ 平台/镜头/分辨率记录完整
12 共线性 ✅ 检测任务无表格特征共线性问题
13 编码映射 ✅ 类别索引约定明确(行号-1)
14 时间戳处理 ⚠️ 仅 1 FPS 序号,无原始时间戳与抽帧映射表
15 划分建议 ✅ 官方按手术划分并给出使用规则
16 泄漏讨论 ✅ 官方明文禁止验证集入训;划分天然防帧泄漏
17 标签分布 ✅ 逐类实例数公开可得
18 测量偏倚 ⚠️ 框界主观性存在,无标注者一致系数量化
19 外部验证建议 ✅ 官方 MESAD 跨域协议提供外推路径
20 版本记录 ⚠️ ESAD 本体无版本号;MESAD 有修正公告可循
21 预处理脚本 ✅ baseline 仓库含数据读取管线与评测脚本
22 合规要求 ✅ 许可、伦理与数据合规文档公开
23 多模态对齐 ❌ 仅单目帧;双目深度/运动学未发布,无法跨模态对齐
24 去标识化 ✅ 患者同意 + 体腔画面无直接标识,无附加文本数据

DAIMS 评分:19.5 / 24

评分解读:16 项通过、7 项带警告、1 项不通过。通过项集中在结构规范(唯一标识、编码映射、划分与防泄漏)与合规透明(许可、伦理文档);警告项主要源于"学术挑战赛数据"的共性短板——无正式 schema、无逐帧缺失语义声明、无标注者一致性量化;唯一不通过项是多模态对齐,因为双目深度与器械运动学均未随数据发布,任何"视频+传感"联合建模设想在该数据集上都无法落地。

对你意味着什么:

  1. 可以放心把它当作"结构干净、口径清晰"的检测基准使用,工程风险集中在空标签语义与坐标格式两个已知的预处理陷阱上。
  2. 任何需要时间戳精度的研究(动作时长、节奏分析)都必须接受 1 FPS 序号的精度上限,或在协议设计阶段就放弃该需求。
  3. 不要在该数据集上规划多模态(视觉+运动学+深度)实验;若课题必需,转向 JIGSAWS 或自行采集,并在论文中明确与 ESAD 的可比性边界。
  4. 发表结果时按类报告 + 三档 IoU 均值,是让审稿人认可的唯一口径;单值 mAP 会被视为不合格报告。
  5. 锁定数据快照并留存下载日期与 SHA256,2021 年的标注修正先例说明快照管理不是过度工程。

§7.8 外部验证矩阵

外部数据集/场景 来源机构 评估任务 性能指标 相对内部变化 关键发现
SARAS-MESAD Phantom 域(5 台仿体手术) SARAS 项目(Oxford Brookes 等) 跨域动作检测(11 共享类 Joint mAP) Joint mAP(官方口径) 相对真实域显著下降 仿体外观与真实手术差异显著,跨域联合学习被设为 MICCAI 2021 挑战任务(challenge proposal)
Cholec80(外推异常检测) SARAS 项目 / 公开数据 无监督异常事件检测(深残差自编码器) recall 78.4% / precision 91.5% 低于其 phantom 域(95.6%/88.1%) 同一模型跨术式(胆囊切除)性能下降但可用,支持"异常检测与动作检测解耦"路线(Samuel & Cuzzolin 2021)

§8 基准性能与生态

§8.1 排行榜

⚠️ 数字不可直接比较提示:不同论文的输入尺寸、训练划分、评测脚本实现存在差异;下表严格区分官方挑战赛口径与作者自报口径。

排名 模型 性能(官方三档 IoU 平均 mAP) 年份 关键技术 完整引用 代码
1 挑战赛冠军(多骨干集成) 19.28% 2021 ResNeXt/ResNet/SENet 加权框融合、bbox jitter、anchor k-means Bawa, V.S., Singh, G., KapingA, F., et al. The SARAS Endoscopic Surgeon Action Detection (ESAD) dataset: Challenges and methods. arXiv preprint arXiv:2104.03178 (2021). DOI: 10.48550/arXiv.2104.03178 未公开
对照 官方 Baseline(FPN+ResNet) 约 10-12% 2020/2021 FPN、ResNet 骨干、OHEM/Focal loss、多输入尺寸消融 Bawa, V.S., Singh, G., KapingA, F., et al. ESAD: Endoscopic Surgeon Action Detection Dataset. arXiv preprint arXiv:2006.07164 (2020). DOI: 10.48550/arXiv.2006.07164 GitHub
后续 PAAS-FPN(路径聚合自适应空间网络) 自报优于挑战赛最高精度模型(未公开统一口径数值) 2023 FCOS 基础 + 改进 FPN、ResNet-50/101 Surgical action detection based on path aggregation adaptive spatial network(中科院深圳先进院团队,2023) 未公开

除排名方法外,MIDL 2020 挑战赛线上活动还公开分享了若干代表性技术路线(报告顺序与官方议程一致,未公布完整排名数字,故单列为技术分享而非排名):

团队 技术路线 机构
Xi Xiang 等 Faster-RCNN 在 SARAS-ESAD 上的适配 哈尔滨工业大学
Shang Zhao 等 Split Attention 增强术者动作检测 乔治华盛顿大学
Liangzhi Li 等 数据与骨干工程(Data and Backbone Engineering) 大阪大学
Ruijia Wu 等 RetinaNet + ResNeXt 的应用 北京邮电大学

(来源:挑战赛主页活动议程。)

§8.2 SOTA 总结与选型建议

至 2021 年主论文发表,该基准的最优公开成绩为 19.28% mAP(三档 IoU 平均),距实用化仍有数量级差距——这正是该数据集作为"硬基准"的价值。选型建议:(1) 复现/对照研究首选官方 baseline(代码、评测脚本齐备);(2) 追求精度用 Faster R-CNN + 注意力骨干 + 加权框融合;(3) 追求实时性用单阶段检测器 + 每帧 2 实例截断;(4) 任何新方法都应同时报告 AP10/AP30/AP50 与逐类 AP。

两点解读补充:第一,ResNet-34 在挑战赛分析中常优于 ResNet-101,提示该基准的瓶颈不在模型容量而在"框界主观性 + 类不平衡 + 域偏移"的组合,盲目加深骨干收益有限;第二,19.28% 的绝对数值不应被直接解读为"方法不行"——三档 IoU 平均中 AP50 贡献被拉低,且跨手术泛化的方差远大于方法间差距,方法比较必须固定划分与评测脚本。

§8.3 评测协议

官方协议:测试集(RARP3)评测,每人每天限一次提交;指标为 IoU 0.1/0.3/0.5 三档 AP 的平均值(mAP);验证集标签公开、自行评估且禁止并入训练;提交文件为指定格式的 submission.txt(ZIP 压缩)。社区后续论文若在 val 上评测或修改划分,均与挑战赛口径不可直接比较(主页、baseline 论文)。

协议细节的四点澄清:(1) AP 计算按 21 类逐类平均,挑战赛官方"放宽"到低 IoU 阈值正是承认手术场景定位难度;(2) 提交格式错误(行列不匹配)会被自动评测系统直接拒收,赛前应先用样例提交文件验证;(3) baseline 仓库自带的评测脚本与线上评测同源,是本地迭代的标准工具;(4) SARAS-MESAD 将协议升级为两域 Joint mAP,比较 2020 与 2021 结果时必须指明所用协议版本。

数据集 机构/年份 规模与模态 与 ESAD 关系
JIGSAWS 约翰霍普金斯大学,2014 8 名外科医生 × 3 模拟任务,39 trial;视频+双臂运动学 干实验室对照物:任务短、场景受控、含运动学;ESAD 则真实但无运动学
Cholec80 IRCAD / Uni. Strasbourg 团队,2017 80 台腹腔镜胆囊切除视频,7 阶段+器械标注 阶段级标注路线的代表;可作为跨术式外部验证
SARAS-MESAD SARAS 项目,2021 Real(4 台,21 类)+ Phantom(5 台,14 类),720×576,TSV ESAD 的多域扩展与再发布,共享 11 类
SARAS phantom 异常检测集 SARAS 项目,2021 18 段仿体机器人前列腺切除视频 承载术中异常事件(出血、烟雾、镜头模糊、器械移位)检测研究

选择参照系的建议:做动作检测方法研究,以 ESAD 官方口径为主表、JIGSAWS 为次要对照(说明任务差异);做手术阶段/流程研究,Cholec80 的阶段标注更对口;做跨域与仿真迁移,以 SARAS-MESAD 为主基准;做异常事件感知,SARAS phantom 异常检测集与 Cholec80 异常标注是仅有两条公开路径。跨数据集比较时,类别体系与评测指标必须分别声明,禁止直接搬用数值。

§8.5 关键论文 Top 6

  1. Bawa, V.S., Singh, G., KapingA, F., et al. “The SARAS Endoscopic Surgeon Action Detection (ESAD) dataset: Challenges and methods.” arXiv:2104.03178 (2021). — 数据集主论文:口径固化、协议说明、挑战赛方法系统分析。
  2. Bawa, V.S., Singh, G., KapingA, F., et al. “ESAD: Endoscopic Surgeon Action Detection Dataset.” arXiv:2006.07164 (2020). — 前置论文:baseline 架构、损失函数与输入尺寸消融。
  3. Cuzzolin, F., Bawa, V.S., Skarga-Bandurova, I., et al. “SARAS challenge on Multi-domain Endoscopic Surgeon Action Detection.” Zenodo, DOI 10.5281/zenodo.4575197 (2021). — MICCAI 2021 多域挑战设计文档,跨域学习问题定义。
  4. Samuel, R.D.J., Cuzzolin, F. “Unsupervised anomaly detection for a Smart Autonomous Robotic Assistant Surgeon (SARAS) using a deep residual autoencoder.” arXiv (2021). — SARAS 生态异常检测:出血/烟雾/镜头模糊/器械移位事件的无监督路线。
  5. “Surgical action detection based on path aggregation adaptive spatial network.”(PAAS-FPN,2023)— 在 ESAD 上改进 FPN 的后续方法学工作。
  6. SARAS-MESAD Grand Challenge 官方数据与公告页(2021)— 数据再发布口径(720×576、TSV)与 2021-05-10 标注修正记录。

阅读顺序建议:先读 2(前置论文,工程细节最全)再读 1(主论文,全局视角与方法分析);3 用于设计跨域实验;4 是把数据集延伸到异常检测方向的唯一公开技术文档;5、6 用于跟踪后续方法学与数据修正。

§8.6 社区活跃度

主论文 Google Scholar 引用 63+(截至 2026-09),在手术动作检测方法论文中作为基准被稳定引用;MIDL 2020 挑战赛吸引了大量参赛队伍与提交(主论文口径),线上活动讲者覆盖 HIT、GWU、大阪大学、北邮等多国团队;数据集被 OpenDataLab、Dataset Ninja 等主流数据平台收录镜像。后续热度部分转移至 SARAS-MESAD(MICCAI 2021)与内窥镜视觉挑战系列(Scholar、主页)。

活跃度判断的三条线索:方法论文引用以"使用基准 + 改进检测器"为主,尚未形成如 Cholec80 阶段识别那样的自持续排行榜文化,这是新方法发表时需要主动与挑战赛数字对齐的原因;挑战赛页面与论坛在赛后仍保持可访问,公告含修正与再发布信息,是事实核查的第一落点;社区镜像(OpenDataLab、Dataset Ninja、openmedlab)持续维护统计与格式转换,说明工程社区仍存在稳定使用需求。

§8.7 生态快照

资源 类型 链接 推荐理由
SARAS-ESAD-Baseline 官方代码 github.com/Viveksbawa/SARAS-ESAD-Baseline 数据读取管线+评测脚本,复现起点
挑战赛主页与下载页 官方数据 saras-esad.grand-challenge.org 唯一权威下载与协议来源
SARAS-MESAD 挑战页 官方数据(后续版) saras-mesad.grand-challenge.org 多域数据与修正公告
SARAS 项目站 项目主页 saras-project.eu 项目背景与后续挑战总览
OpenDataLab ESAD 镜像 opendatalab.com/OpenDataLab/ESAD 国内加速下载
Dataset Ninja 页 统计面板 datasetninja.com/saras-esad-2020 可视化统计与标注协议速查
openmedlab 汇编 社区整理 GitHub Awesome-Medical-Dataset 逐类实例数统计表

§9 相关资源与引用

§9.1 官方资源

§9.1b 学习路径与社区入口

  • 第一步(理解任务):通读主论文 §1 与 §4(任务定义与标注协议),配合挑战赛主页的示例标注图。
  • 第二步(跑通管线):克隆 baseline 仓库,按其 README 在训练子集上复现一次评测,熟悉三档 IoU 口径。
  • 第三步(自建方法):以本词条 §6.4 的 DataLoader 为起点替换骨干/损失,逐项消融(输入尺寸、jitter、类平衡采样)。
  • 第四步(进阶研究):进入 SARAS-MESAD 双域协议做跨域实验,或转向 SARAS 生态的异常检测线。
  • 社区入口:grand-challenge.org 各挑战页的论坛与公告、SARAS 项目站新闻页、以及 GitHub baseline 仓库的 issue 区。

§9.2 BibTeX

@article{bawa2021saras,
  title   = {The {SARAS} Endoscopic Surgeon Action Detection ({ESAD}) dataset:
             Challenges and methods},
  author  = {Bawa, Vivek Singh and Singh, Gurkirt and KapingA, Francis and
             Skarga-Bandurova, Inna and Oleari, Elettra and Leporini, Alice and
             Landolfo, Carmela and Zhao, Pengfei and Xiang, Xi and Luo, Gongning
             and Wang, Kuanquan and Li, Liangzhi and Wang, Bowen and
             Zhao, Shang and Li, Li and Stabile, Armando and Setti, Francesco and
             Muradore, Riccardo and Cuzzolin, Fabio},
  journal = {arXiv preprint arXiv:2104.03178},
  year    = {2021},
  doi     = {10.48550/arXiv.2104.03178}
}

@article{bawa2020esad,
  title   = {{ESAD}: Endoscopic Surgeon Action Detection Dataset},
  author  = {Bawa, Vivek Singh and Singh, Gurkirt and KapingA, Francis and
             Skarga-Bandurova, Inna and Oleari, Elettra and Leporini, Alice and
             Landolfo, Carmela and Stabile, Armando and Setti, Francesco and
             Muradore, Riccardo and Cuzzolin, Fabio},
  journal = {arXiv preprint arXiv:2006.07164},
  year    = {2020},
  doi     = {10.48550/arXiv.2006.07164}
}

@misc{cuzzolin2021mesad,
  title        = {{SARAS} challenge on Multi-domain Endoscopic Surgeon Action
                  Detection},
  author       = {Cuzzolin, Fabio and Bawa, Vivek Singh and
                  Skarga-Bandurova, Inna and Mohamed, Mohamed and
                  Charles, Jackson Ravindran and Oleari, Elettra and
                  Leporini, Alice and Landolfo, Carmela and Stabile, Armando and
                  Setti, Francesco and Muradore, Riccardo},
  howpublished = {MICCAI 2021 Challenge, Zenodo},
  year         = {2021},
  doi          = {10.5281/zenodo.4575197}
}

§9.3 引用指南

使用该数据集的论文/产品页应同时引用主论文(bawa2021saras)与官方挑战赛页;若使用了 baseline 代码或评测脚本,还应引用 bawa2020esad;若涉及多域/仿体设定,补充引用 cuzzolin2021mesad。页面与衍生数据集的再分发须保留 CC BY-NC-SA 3.0 声明与来源链接。

致谢句模板(可直接用于论文 Data Availability 段):

The SARAS-ESAD dataset was obtained from the SARAS Endoscopic Vision Challenge (https://saras-esad.grand-challenge.org), released under the CC BY-NC-SA 3.0 license as part of the EU SARAS project. We used the official train/validation/test split by procedure and followed the official mAP protocol at IoU thresholds of 0.1, 0.3 and 0.5, citing Bawa et al., arXiv:2104.03178 (2021).

英文致谢句中的项目缩写、许可与协议口径均与官方页面一致,使用时按论文语境微调即可。


§10 AI 使用声明卡

§10.1 AI 模型列表

用途 模型/工具 版本
词条初稿撰写与结构组织 CodeBuddy Code(fast-model) 2026-09
事实核查辅助(网络检索) WebSearch 2026-09

§10.2 AI 参与范围

AI 参与了资料检索汇总、正文撰写与代码示例起草;全部事实性数字经 AI 汇总后由编辑对照来源复核;结构性规范(frontmatter、DAIMS、坑点格式)依宪法执行。最终内容由千方病案医学编辑部人工审核通过后发布。

边界声明:AI 不承担医学判断的最终责任——疾病编码映射、手术流程描述与临床价值论述均以编辑部核验后的版本为准;AI 起草的代码未在原始数据上执行(数据获取受许可与体积限制),其可运行性以静态走查加社区常用接口约定为担保,使用者首次运行时应先在单台手术子集上验证。

§10.3 输入来源列表

  1. Bawa, V.S., et al. The SARAS Endoscopic Surgeon Action Detection (ESAD) dataset: Challenges and methods. arXiv:2104.03178 (2021). https://arxiv.org/abs/2104.03178
  2. Bawa, V.S., et al. ESAD: Endoscopic Surgeon Action Detection Dataset. arXiv:2006.07164 (2020). https://arxiv.org/abs/2006.07164
  3. SARAS-ESAD Grand Challenge 主页. https://saras-esad.grand-challenge.org
  4. SARAS-ESAD Download 页. https://saras-esad.grand-challenge.org/download/
  5. SARAS-MESAD Grand Challenge Dataset 页. https://saras-mesad.grand-challenge.org/dataset
  6. SARAS-MESAD Announcements 页. https://saras-mesad.grand-challenge.org/announcements
  7. SARAS 项目:SARAS-MESAD 挑战介绍. https://saras-project.eu/?p=1589
  8. Cuzzolin, F., et al. SARAS challenge on Multi-domain Endoscopic Surgeon Action Detection. Zenodo (2021). https://zenodo.org/record/4575197
  9. Google Scholar 引用记录(arXiv:2104.03178). https://scholar.google.com
  10. Dataset Ninja: SARAS-ESAD 2020. https://datasetninja.com/saras-esad-2020
  11. OpenDataLab: ESAD. https://opendatalab.com/OpenDataLab/ESAD
  12. openmedlab/Awesome-Medical-Dataset: SARAS-ESAD. https://github.com/openmedlab/Awesome-Medical-Dataset
  13. Samuel, R.D.J., Cuzzolin, F. Unsupervised anomaly detection for a SARAS using a deep residual autoencoder. arXiv (2021). https://arxiv.org/abs/2104.00633
  14. Surgical action detection based on path aggregation adaptive spatial network (PAAS-FPN, 2023). https://ir.siat.ac.cn
  15. SARAS challenge proposal 全文(BIAS Initiative 格式). https://www.academia.edu/116685381

§10.4 人工校验记录

内容模块 审核者 审核方式 审核状态
§2 医学背景(ICD-11/SNOMED 映射、疾病描述) 千方病案医学编辑部 对照 ICD-11/SNOMED 官方术语与文献逐条核验 ✅ 已通过
§3/§4 数据规格与结构(规模数字、格式、目录) 千方病案数据工程组 对照官方下载页/论文/Dataset Ninja 三源交叉核验 ✅ 已通过
§6 代码与坑点(可运行性、协议准确性) 千方病案数据工程组 代码逻辑走查 + 坑点逐条溯源 ✅ 已通过
§7 质量评估与 DAIMS 评分 千方病案医学编辑部 24 项逐项核对证据链 ✅ 已通过
§8 基准数字(19.28%、10-12%、63 引用) 千方病案数据工程组 对照主论文与 Google Scholar ✅ 已通过
合规与许可(CC BY-NC-SA、伦理声明) 千方病案医学编辑部 对照官方许可页与伦理文档 ✅ 已通过

§10.5 AI 生成章节标注

除本声明卡所列人工复核范围外,全文章节(§1-§9)初稿由 AI 生成,经 §10.4 所列模块化人工校验后发布;代码示例为 AI 起草、人工走查。

§10.6 最后人工审核日期

2026-09-05(与 §0 审核声明一致)。

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


相关数据集导航

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

  • cholect50 — 共享标签:医学影像 / 生理信号 / 手术视频 / 内窥镜影像 / 步态与运动
  • sar-rarp50 — 共享标签:医学影像 / 生理信号 / 手术视频 / 内窥镜影像 / 步态与运动
  • vitaldb — 共享标签:医学影像 / 生理信号 / 手术视频
  • SLAM-3D-Endoscopic — 共享标签:医学影像 / 手术视频 / 内窥镜影像
  • jigsaws — 共享标签:医学影像 / 手术视频 / 内窥镜影像
  • m2cai16-tool — 共享标签:医学影像 / 手术视频 / 内窥镜影像
  • multibypass140 — 共享标签:医学影像 / 手术视频 / 内窥镜影像
  • scared — 共享标签:医学影像 / 手术视频 / 内窥镜影像
  • hamlyn-datasets — 共享标签:医学影像 / 手术视频 / 内窥镜影像
  • c3vd — 共享标签:医学影像 / 手术视频 / 内窥镜影像

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

返回 AI-Ready 数据集