SLAM-3D-Endoscopic

SLAM 3D Endoscopic — 内窥镜三维重建与定位 AI-Ready Wikipedia | 千方病案医数集

来源 Bogazici University & UCL WEISS & University of Coimbra & Harvard Medical School & Stanford & NUS 发布时间: 2026-08-10最后更新: 2026-08-10 阅读 2

信息速览

数据集名称SLAM-3D-Endoscopic
数据类型35 子数据集(EndoSLAM),6 相机多分辨率,合成 + 真实数据,6D 位姿真值,MICCAI 2022 挑战赛
规模Ex-vivo 猪器官(EndoSLAM)+ 3 例患者真实结肠镜(SimCol3D)
接入方式 Bogazici University & UCL WEISS & University of Coimbra & Harvard Medical School & Stanford & NUS
AI 就绪度

INFOBOX

数据集名称 SLAM 3D Endoscopic (EndoSLAM + SimCol3D)
英文全称 Endoscopic Simultaneous Localization and Mapping 3D Dataset
别名 / 简称 EndoSLAM、SimCol3D、Endo-SfMLearner、SimCol
疾病分类 消化道疾病(DD00–DD9Z 消化系统疾病 / 结直肠癌筛查 / 息肉检测辅助)
SNOMED CT 71836004 Endoscopy / 232717009 Colonoscopy / 426601003 Capsule endoscopy / 254837009 Gastrointestinal tumor
数据模态 内窥镜视频(单目)+ 6D 位姿 + 深度图 + 3D 点云 + CT(硅胶模型)+ 合成数据
AI 任务类型 自监督单目深度估计、视觉里程计(VO)、3D 场景重建、SLAM、Sim-to-Real 迁移
样本总数 EndoSLAM: 35 子数据集(~64,577 帧)/ SimCol3D: ~23,421 帧(合成)+ 59 序列(真实)
数据大小 EndoSLAM ~9.65 GB / SimCol3D 合成 ~5 GB + 真实 15+ 小时视频
数据格式 PNG 图像 + TXT 位姿 + PLY 点云 + MP4 视频
许可证 EndoSLAM: CC-BY 4.0 / SimCol3D: 无明确许可证(公开下载)
访问级别 公开(Mendeley Data + GitHub + UCL 网站)
标注类型 6D 位姿(机械臂编码器)+ 3D 点云(高精度扫描仪)+ 像素级深度(合成)+ COLMAP 伪真值(真实)
相机数量 6 种:HighCam / LowCam / Pillcam / MiroCam / UnityCam / OlympusCam
器官类型 猪离体:结肠(18 子集)/ 胃(12 子集)/ 小肠(5 子集)+ 硅胶结肠模型
组织者 EndoSLAM: Ozyoruk, Turan (Bogazici) / Araujo, Durr, Gilbert (Coimbra/LSU) / Stoyanov (UCL) · SimCol3D: Rau, Bano, Stoyanov (UCL/Stanford) / Jin (NUS) / Montiel (Zaragoza)
会议 MICCAI 2022 (Singapore) — SimCol3D 挑战赛
官方网站 https://github.com/CapsuleEndoscope/EndoSLAM
SimCol3D https://www.ucl.ac.uk/interventional-surgical-sciences/simcol3d-data
DOI 10.1016/j.media.2021.102058 (EndoSLAM) / 10.1016/j.media.2024.103195 (SimCol3D)
引用次数 400+(EndoSLAM,Google Scholar,截至 2026-08)

§0 E-E-A-T 信任声明与免责声明

Experience(经验):本页面由千方病案医学编辑部撰写,内容基于 EndoSLAM 原始论文(Ozyoruk et al., Medical Image Analysis, 2021)、SimCol3D 挑战赛报告(Rau et al., Medical Image Analysis, 2024)、GitHub 仓库及多篇 SOTA 论文的交叉验证。

Expertise(专业性):编辑部成员具备医学影像分析和计算机视觉交叉背景,熟悉单目深度估计、视觉里程计、SLAM 系统和自监督学习框架,对消化道内窥镜检查临床流程有基本了解。

Authoritativeness(权威性):所有数据规格、排行榜结果和标注协议均引用自原始论文和官方 GitHub 仓库。SOTA 数据来自 Surgical-DINO 论文(arXiv:2401.06013)和 SimCol3D 挑战赛报告。

Trustworthiness(可信度):EndoSLAM 基准结果来自 GitHub README 中的官方表格。SimCol3D 排行榜数据来自 MICCAI 2022 挑战赛官方结果和 Medical Image Analysis 期刊论文。

免责声明:本页面仅供研究参考,不构成医疗建议。EndoSLAM 数据集采用 CC-BY 4.0 许可证,允许商业使用。SimCol3D 真实数据来自 EndoMapper 数据集,使用前须确认许可条款。数据为离体猪组织或合成数据,不可直接用于临床决策。

§1 数据集概览(Overview)

§1.1 定位

SLAM 3D Endoscopic 涵盖 EndoSLAMSimCol3D 两大内窥镜同步定位与建图(SLAM)基准数据集,专为医疗密闭腔体环境内的三维深度重建和 6D 位姿估计设计。由于腹腔/消化道表面平滑且缺乏稳定几何特征点,极大考验了底层视觉里程计算法的极限性能,为实现真正的全自动微创机器人手术探路。

EndoSLAM(Ozyoruk et al., Medical Image Analysis, 2021)是首个提供时间同步 6D 位姿真值和高精度 3D 地图真值的内窥镜 SLAM 数据集,也是首个支持胶囊内窥镜 SLAM 任务的公开数据集。它使用 Panda 机械臂搭载 6 种不同相机对 8 个离体猪消化道器官进行录制,并提供 Unity 合成数据用于 Sim-to-Real 迁移研究。

SimCol3D(Rau et al., Medical Image Analysis, 2024)是 MICCAI 2022 EndoVis 子挑战赛,首次同时提供合成和真实结肠镜数据,用于深度估计和 6D 位姿预测。挑战赛的关键发现:合成结肠镜图像的深度预测已可稳健解决,但位姿估计仍是开放研究问题。

§1.2 两大数据集对比

维度 EndoSLAM SimCol3D
发布年份 2021 2024(挑战赛 2022)
数据类型 离体猪器官 + 合成 合成结肠 + 真实结肠镜
子数据集 35(18 结肠 + 12 胃 + 5 小肠) 3 合成结肠网格 + 59 真实序列
总帧数 ~64,577(42,700 离体 + 21,887 合成) ~23,421(合成)+ 15+ 小时(真实)
相机数量 6 种 1 种(合成 Unity + 真实结肠镜)
真值类型 机械臂 6D 位姿 + 3D 扫描点云 Unity 深度/位姿(合成)+ COLMAP 伪真值(真实)
器官/部位 结肠、胃、小肠(猪) 结肠(人 CT 网格 + 真实患者)
息肉标注 4 个子集含息肉模拟隆起 无(关注深度/位姿)
许可证 CC-BY 4.0 无明确许可证(公开下载)
数据大小 ~9.65 GB ~5 GB(合成)+ 视频流
会议 MICCAI 2022 (Singapore)
参赛队伍 6 支
DOI 10.1016/j.media.2021.102058 10.1016/j.media.2024.103195

§1.3 核心价值

  1. 首个胶囊内窥镜 SLAM 数据集:EndoSLAM 是首个提供胶囊内窥镜时间同步 6D 位姿和高精度 3D 地图真值的公开数据集,填补了胶囊内窥镜导航研究的空白

  2. 多相机多分辨率基准:6 种相机(HighCam 1280×720 / LowCam 640×480 / Pillcam 256×256 / MiroCam 320×320 / UnityCam 320×320 / OlympusCam 1350×1080)覆盖了从胶囊到常规内窥镜的全谱系,支持跨相机泛化研究

  3. Sim-to-Real 迁移试验床:Unity 合成数据提供完美的深度和位姿真值,与真实数据配对使用可研究域适应和迁移学习

  4. 真实结肠镜 3D 重建的首次系统评估:SimCol3D 首次提供真实结肠镜序列的 COLMAP 伪真值,并系统评估了 6 支团队的方法,揭示了"深度可解但位姿不可解"的关键发现

  5. 自监督学习范式推动:Endo-SfMLearner 提出的亮度感知光度损失和空间注意力位姿网络,成为后续内窥镜深度估计方法(AF-SfMLearner、Surgical-DINO 等)的基础架构

§2 医学背景(Medical Context)

§2.1 消化道内窥镜检查与导航挑战

消化道内窥镜检查(包括胃镜、结肠镜和胶囊内窥镜)是消化道癌症筛查和诊断的核心手段。结直肠癌(Colorectal Cancer, CRC)是全球第三大常见癌症,每年新诊断超过 190 万例,死亡约 93 万例。结肠镜检查是 CRC 筛查的金标准——通过导航内窥镜穿过结肠,检测并切除癌前息肉,可有效降低 CRC 发病率和死亡率。

然而,内窥镜导航面临严峻挑战:

  1. 管腔结构复杂:结肠具有多个弯曲(脾曲、肝曲)和袋状结构(结肠袋),内窥镜推进时易形成袢(looping),导致检查不完整
  2. 视觉信息不足:单目内窥镜无法直接获取深度信息,术者只能通过经验判断肠道走向
  3. 表面纹理缺乏:消化道黏膜表面光滑,缺乏稳定特征点,传统 SLAM 方法(SIFT/ORB 特征匹配)容易失败
  4. 动态环境:肠道蠕动、液体覆盖、气泡和黏膜反射等动态因素干扰视觉里程计
  5. 非朗伯表面:黏膜表面的高光反射违反朗伯反射假设,光度一致性损失失效

§2.2 3D 重建的临床意义

内窥镜 3D 重建和定位技术有望解决以下临床问题:

  • 盲区检测:3D 地图可标记未检查区域,提高腺瘤检出率(ADR),降低间期癌发生率
  • 退镜时间质控:3D 地图可量化每个结肠段的检查时间,比总退镜时间更精确
  • 病变定位:3D 重建可精确记录息肉位置,便于随访时复查
  • 手术规划:术前 3D 地图辅助手术路径规划
  • 训练平台:3D 虚拟环境可用于内窥镜操作训练

§2.3 胶囊内窥镜的特殊挑战

胶囊内窥镜(Capsule Endoscopy, CE)是一种无创消化道检查技术,患者吞服含微型摄像头的胶囊,胶囊随消化道蠕动自然前行并拍摄图像。CE 面临的独特挑战:

  • 被动运动:胶囊无法主动控制方向和速度,运动完全依赖肠道蠕动
  • 低帧率:Pillcam 2-35 fps,MiroCam 3 fps,远低于常规内窥镜的 20-30 fps
  • 低分辨率:256×256(Pillcam)/ 320×320(MiroCam),远低于常规内窥镜的 640×480-1350×1080
  • 定位困难:无外部定位信息,胶囊在消化道中的位置完全未知

EndoSLAM 是首个提供胶囊内窥镜 6D 位姿真值的数据集,使胶囊定位研究成为可能。

§3 数据集规格(Specifications)

§3.1 EndoSLAM 数据采集

参数 规格
采集机构 Bogazici University (Turkey) + University of Coimbra (Portugal) + LSU (USA) + Harvard (USA)
采集时间 2020
动物来源 8 个离体猪消化道器官(来自不同动物个体)
机械臂 Franka Emika Panda(7 自由度)
3D 扫描仪 Artec Space Spider(精度 0.05 mm)
内窥镜相机 6 种(见下表)
合成引擎 Unity 3D
数据格式 PNG 图像 + TXT 位姿 + PLY 点云
存储介质 Mendeley Data

§3.2 EndoSLAM 相机规格

相机 类型 帧数 FPS 分辨率 用途
HighCam 常规内窥镜 21,428 20 1280×720 高分辨率离体录制
LowCam 常规内窥镜 17,978 20 640×480 低分辨率离体录制
Pillcam 胶囊内窥镜 239 4-35 256×256 胶囊内窥镜(Given Imaging)
MiroCam 胶囊内窥镜 3,055 3 320×320 胶囊内窥镜(IntroMedic)
UnityCam 合成数据 21,887 30 320×320 Unity 3D 合成胶囊内窥镜
OlympusCam 临床结肠镜 12,250 30 1350×1080 硅胶结肠模型录制

总帧数:42,700(离体)+ 21,887(合成)= 64,577 帧

§3.3 EndoSLAM 子数据集分布

器官 子数据集数 含息肉子集 相机覆盖
结肠 18 4 HighCam, LowCam, Pillcam, MiroCam, OlympusCam
12 HighCam, LowCam, Pillcam, MiroCam
小肠 5 HighCam, LowCam, Pillcam, MiroCam
合成 UnityCam 专用 UnityCam(胃/结肠/小肠)

4 个含息肉子集由专家胃肠病学家(Dr. Henrique Alexandrino)创建息肉模拟隆起,用于分析息肉作为可区分特征对 SLAM 性能的影响。

§3.4 EndoSLAM 真值获取

真值类型 获取方式 精度
6D 位姿 Panda 机械臂关节编码器(时间同步) 亚毫米级
3D 点云 Artec Space Spider 3D 扫描仪 0.05 mm
深度图(合成) Unity 3D 渲染引擎 像素级精确
位姿(合成) Unity 3D 渲染引擎 像素级精确
CT 扫描 硅胶结肠模型 临床 CT 分辨率

§3.5 SimCol3D 数据规格

参数 合成数据 真实数据
来源 Unity 3D 渲染 EndoMapper 数据集
结肠网格 3 个(从人 CT 提取)
训练帧数 14,412
测试帧数 9,009 7 条轨迹(3 位患者)
总序列数 59
视频时长 15+ 小时
深度真值 Unity 渲染(PNG)
位姿真值 Unity 渲染(7D: tx,ty,tz,qx,qy,qz,qw) COLMAP 伪真值
相机内参 3×3 矩阵(TXT) 结肠镜参数
验证者 2 位组织者 + 1 位胃肠病学家

§3.6 SimCol3D 合成数据详情

子数据集 训练轨迹 测试轨迹 帧数 网格来源
Synthetic Colon I 12 3 ~18,000 公开网格
Synthetic Colon II 12 3 ~18,000 患者A CT
Synthetic Colon III 0 3 ~1,800 患者B CT(未见训练数据)

Synthetic Colon III 的训练数据为 0——这是一个故意设计的泛化测试场景,评估模型在完全未见过的结肠解剖结构上的性能。

§3.7 许可证

数据集 许可证 商业使用 衍生要求
EndoSLAM CC-BY 4.0 ✅ 允许 仅需署名
EndoSLAM 代码 MIT ✅ 允许 保留版权声明
SimCol3D 合成 无明确许可证 ⚠️ 需确认
SimCol3D 真实(EndoMapper) 需注册访问 ⚠️ 需确认

§4 数据结构详解(Data Schema)

§4.1 EndoSLAM 目录结构

EndoSLAM/
├── 3D_Reconstruction/          # 3D 重建结果
│   ├── EndoSfMLearner/
│   ├── SC-SfMLearner/
│   └── Shape_from_Shading/
├── Calibration/                # 相机标定文件
├── Data_Augmentation/          # 数据增强工具
├── EndoSfMLearner/             # Endo-SfMLearner 代码
│   ├── models/
│   ├── dataloaders/
│   └── train.py
├── imgs/                       # 示例图片
├── docs/                       # HTML 报告
├── LICENSE                     # MIT 许可证
├── README.md
└── requirements.txt

§4.2 EndoSLAM 数据树结构(详细)

EndoSLAM Dataset/
├── Colon/
│   ├── HighCam/
│   │   ├── colon_trial1/
│   │   │   ├── frame_000000.png    # 1280×720 图像
│   │   │   ├── frame_000001.png
│   │   │   ├── ...
│   │   │   ├── pose.txt            # 6D 位姿序列
│   │   │   └── point_cloud.ply     # 3D 点云真值
│   │   ├── colon_trial2/
│   │   ├── colon_polyp_trial1/     # 含息肉模拟隆起
│   │   └── ...
│   ├── LowCam/
│   │   └── ...                     # 640×480 图像
│   ├── Pillcam/
│   │   └── ...                     # 256×256 图像
│   ├── MiroCam/
│   │   └── ...                     # 320×320 图像
│   └── OlympusCam/
│       └── ...                     # 1350×1080 硅胶模型
├── Stomach/
│   ├── HighCam/
│   ├── LowCam/
│   ├── Pillcam/
│   └── MiroCam/
├── SmallIntestine/
│   ├── HighCam/
│   ├── LowCam/
│   ├── Pillcam/
│   └── MiroCam/
└── Synthetic/
    └── UnityCam/
        ├── Stomach/
        ├── Colon/
        └── SmallIntestine/
            ├── frame_000000.png    # 320×320 合成图像
            ├── depth_000000.png    # 像素级深度图
            └── pose.txt            # 6D 位姿

§4.3 位姿文件格式

# pose.txt 格式(每行一个时间步的 4×4 齐次变换矩阵)
# 相对于起始帧的累积位姿
1.0000  0.0000  0.0000  0.0000
0.0000  1.0000  0.0000  0.0000
0.0000  0.0000  1.0000  0.0000
0.0123  0.0045  0.0089  1.0000  # 第 2 帧
...

§4.4 SimCol3D 数据结构

SimCol3D/
├── Synthetic_Colon_I/
│   ├── train/
│   │   ├── trajectory_01/
│   │   │   ├── frame_000000.png    # 合成结肠镜图像
│   │   │   ├── depth_000000.png    # 深度图
│   │   │   ├── pose_000000.txt     # 7D 位姿 [tx,ty,tz,qx,qy,qz,qw]
│   │   │   └── intrinsics.txt      # 3×3 相机内参
│   │   ├── trajectory_02/
│   │   └── ... (共 12 条)
│   └── test/
│       └── ... (共 3 条)
├── Synthetic_Colon_II/
│   └── ... (同上结构)
├── Synthetic_Colon_III/
│   └── test/                       # 仅测试,无训练数据
│       └── ... (共 3 条)
└── Real/
    └── EndoMapper_sequences/       # 59 个真实序列
        ├── sequence_01.mp4
        ├── ...
        └── sequence_59.mp4

§4.5 数据加载示例

import os
import numpy as np
import cv2

def load_endoslam_sequence(seq_dir, camera_type="HighCam"):
    """加载 EndoSLAM 序列"""
    frames = sorted([f for f in os.listdir(seq_dir) if f.endswith(''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''.png'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''')])
    
    images = []
    for frame_name in frames:
        img = cv2.imread(os.path.join(seq_dir, frame_name))
        images.append(img)
    
    # 加载位姿
    pose_file = os.path.join(seq_dir, "pose.txt")
    poses = np.loadtxt(pose_file)  # (N, 16) — 每行 4×4 矩阵的展平
    
    # 加载点云(如果存在)
    ply_file = os.path.join(seq_dir, "point_cloud.ply")
    point_cloud = None
    if os.path.exists(ply_file):
        point_cloud = load_ply(ply_file)
    
    return {
        "images": images,
        "poses": poses.reshape(-1, 4, 4),  # (N, 4, 4)
        "point_cloud": point_cloud,
        "camera_type": camera_type
    }

# 相机内参(示例,实际从标定文件加载)
CAMERA_PARAMS = {
    "HighCam":    {"fx": 800, "fy": 800, "cx": 640, "cy": 360, "fps": 20},
    "LowCam":     {"fx": 400, "fy": 400, "cx": 320, "cy": 240, "fps": 20},
    "Pillcam":    {"fx": 128, "fy": 128, "cx": 128, "cy": 128, "fps": 4},
    "MiroCam":    {"fx": 160, "fy": 160, "cx": 160, "cy": 160, "fps": 3},
    "UnityCam":   {"fx": 160, "fy": 160, "cx": 160, "cy": 160, "fps": 30},
    "OlympusCam": {"fx": 900, "fy": 900, "cx": 675, "cy": 540, "fps": 30}
}

§5 数据划分与使用建议(Splits & Usage)

§5.1 EndoSLAM 推荐划分

EndoSLAM 未提供官方训练/测试划分。推荐策略:

场景 训练集 测试集 说明
单器官自监督 同一序列的前 80% 后 20% 自监督深度+位姿
跨相机泛化 HighCam 序列 LowCam 序列(同一器官/轨迹) 跨分辨率泛化
跨器官泛化 结肠 + 胃 小肠 跨器官迁移
Sim-to-Real UnityCam 合成 HighCam/LowCam 真实 域适应
息肉影响分析 无息肉子集 有息肉子集 特征可区分性

§5.2 SimCol3D 官方划分

任务 训练数据 测试数据 评估指标
Task 1: 合成深度 SynCol I+II (14,412 帧) SynCol I+II+III (9,009 帧) L1 (cm), L_rel, L_RMSE
Task 2: 合成位姿 同上 同上 ATE (dm), RTE (cm), ROT (°)
Task 3: 真实位姿 无训练数据 7 条轨迹 (3 位患者) ATE, RTE, ROT

§5.3 版本选择矩阵

需求 推荐数据集 理由
胶囊内窥镜 SLAM EndoSLAM (Pillcam/MiroCam) 唯一含胶囊 6D 位姿真值的数据集
常规内窥镜深度估计 EndoSLAM (HighCam) + SCARED 高分辨率 + 机械臂真值
结肠镜 3D 重建 SimCol3D 合成+真实结肠镜数据
Sim-to-Real 迁移 EndoSLAM (UnityCam → HighCam) 同器官合成+真实配对
自监督深度+位姿 EndoSLAM (任意相机) 6D 位姿真值用于评估
跨相机泛化 EndoSLAM (6 相机) 分辨率/FPS 跨度大
商业用途 EndoSLAM (CC-BY 4.0) 允许商业使用

§6 AI 就绪指南(AI-Ready Guide)

§6.1 PyTorch DataLoader(EndoSLAM 自监督深度+位姿)

import os
import numpy as np
import cv2
import torch
from torch.utils.data import Dataset, DataLoader

class EndoSLAMDataset(Dataset):
    """
    EndoSLAM PyTorch Dataset
    支持自监督单目深度+位姿估计训练
    """
    def __init__(self, data_dir, subdataset_path, camera_type="HighCam",
                 frame_stride=1, sequence_length=3, img_size=(256, 256),
                 augment=False):
        self.data_dir = data_dir
        self.camera_type = camera_type
        self.frame_stride = frame_stride
        self.sequence_length = sequence_length
        self.img_size = img_size
        self.augment = augment
        
        # 加载图像帧列表
        self.seq_dir = os.path.join(data_dir, subdataset_path)
        self.frames = sorted([
            f for f in os.listdir(self.seq_dir) if f.endswith(''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''.png'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''')
        ])
        
        # 加载位姿真值(用于评估,不用于训练)
        pose_path = os.path.join(self.seq_dir, "pose.txt")
        if os.path.exists(pose_path):
            self.poses = np.loadtxt(pose_path).reshape(-1, 4, 4)
        else:
            self.poses = None
        
        # 相机内参
        self.cam_params = CAMERA_PARAMS[camera_type]
        
        # 生成有效序列索引
        self.valid_starts = []
        for i in range(len(self.frames) - (sequence_length - 1) * frame_stride):
            self.valid_starts.append(i)
    
    def __len__(self):
        return len(self.valid_starts)
    
    def __getitem__(self, idx):
        start = self.valid_starts[idx]
        indices = [
            start + i * self.frame_stride for i in range(self.sequence_length)
        ]
        
        # 加载图像序列
        images = []
        for i in indices:
            img = cv2.imread(os.path.join(self.seq_dir, self.frames[i]))
            img = cv2.resize(img, self.img_size[::-1])  # (W, H)
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            images.append(img)
        
        images = np.stack(images).astype(np.float32) / 255.0  # (S, H, W, 3)
        images = torch.from_numpy(images).permute(0, 3, 1, 2)  # (S, 3, H, W)
        
        # 加载位姿(如果有)
        if self.poses is not None:
            poses = np.array([self.poses[i] for i in indices])  # (S, 4, 4)
            # 计算相对位姿(相对于第一帧)
            ref_pose = poses[0]
            rel_poses = np.array([
                np.linalg.inv(ref_pose) @ p for p in poses
            ])
        else:
            rel_poses = np.zeros((self.sequence_length, 4, 4))
        
        # 数据增强
        if self.augment:
            images = self._augment(images)
        
        return {
            "images": images,                          # (S, 3, H, W)
            "poses": torch.from_numpy(rel_poses).float(),  # (S, 4, 4)
            "intrinsics": torch.tensor([
                self.cam_params["fx"] * self.img_size[1] / 1280,
                self.cam_params["fy"] * self.img_size[0] / 720,
                self.cam_params["cx"] * self.img_size[1] / 1280,
                self.cam_params["cy"] * self.img_size[0] / 720,
            ]),  # (4,) — fx, fy, cx, cy (缩放后)
        }
    
    def _augment(self, images):
        # 随机水平翻转(注意位姿也需翻转)
        if np.random.random() < 0.5:
            images = torch.flip(images, dims=[3])
        # 随机亮度调整
        if np.random.random() < 0.5:
            brightness = np.random.uniform(0.8, 1.2)
            images = torch.clamp(images * brightness, 0, 1)
        # 随机 gamma
        if np.random.random() < 0.5:
            gamma = np.random.uniform(0.7, 1.5)
            images = torch.pow(images, gamma)
        return images


CAMERA_PARAMS = {
    "HighCam":    {"fx": 800, "fy": 800, "cx": 640, "cy": 360, "fps": 20},
    "LowCam":     {"fx": 400, "fy": 400, "cx": 320, "cy": 240, "fps": 20},
    "Pillcam":    {"fx": 128, "fy": 128, "cx": 128, "cy": 128, "fps": 4},
    "MiroCam":    {"fx": 160, "fy": 160, "cx": 160, "cy": 160, "fps": 3},
    "UnityCam":   {"fx": 160, "fy": 160, "cx": 160, "cy": 160, "fps": 30},
    "OlympusCam": {"fx": 900, "fy": 900, "cx": 675, "cy": 540, "fps": 30}
}


# 使用示例
dataset = EndoSLAMDataset(
    data_dir="EndoSLAM",
    subdataset_path="Colon/HighCam/colon_trial1",
    camera_type="HighCam",
    sequence_length=3,
    img_size=(256, 256),
    augment=True
)

loader = DataLoader(dataset, batch_size=8, shuffle=True, num_workers=4)
for batch in loader:
    print(f"Images: {batch[''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''images''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''].shape}")        # (8, 3, 3, 256, 256)
    print(f"Poses: {batch[''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''poses''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''].shape}")          # (8, 3, 4, 4)
    print(f"Intrinsics: {batch[''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''intrinsics''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''].shape}") # (8, 4)
    break

§6.2 预处理 Pipeline

import numpy as np
import cv2

class EndoSLAMPreprocessor:
    """
    EndoSLAM 预处理 Pipeline
    针对内窥镜图像特性优化
    """
    def __init__(self, target_size=(256, 256), 
                 clip_limit=2.0, tile_grid=(8, 8)):
        self.target_size = target_size
        self.clip_limit = clip_limit
        self.tile_grid = tile_grid
    
    def process(self, image):
        """处理单帧图像"""
        # 1. CLAHE(对比度受限自适应直方图均衡化)
        # 内窥镜图像照明不均匀,CLAHE 增强局部对比度
        lab = cv2.cvtColor(image, cv2.COLOR_RGB2LAB)
        clahe = cv2.createCLAHE(
            clipLimit=self.clip_limit,
            tileGridSize=self.tile_grid
        )
        lab[:, :, 0] = clahe.apply(lab[:, :, 0])
        image = cv2.cvtColor(lab, cv2.COLOR_LAB2RGB)
        
        # 2. 镜面反射检测与掩码
        specular_mask = self._detect_specular(image)
        
        # 3. 调整大小
        image = cv2.resize(image, self.target_size[::-1])
        specular_mask = cv2.resize(
            specular_mask.astype(np.uint8), 
            self.target_size[::-1],
            interpolation=cv2.INTER_NEAREST
        )
        
        # 4. 归一化
        image = image.astype(np.float32) / 255.0
        
        return image, specular_mask
    
    def _detect_specular(self, image, threshold=0.85):
        """检测镜面反射区域"""
        gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
        # 高亮度像素 = 镜面反射
        specular = (gray.astype(np.float32) / 255.0) > threshold
        # 形态学闭操作填充孔洞
        kernel = np.ones((5, 5), np.uint8)
        specular = cv2.morphologyEx(
            specular.astype(np.uint8), cv2.MORPH_CLOSE, kernel
        )
        return specular.astype(bool)


class SimCol3DPreprocessor(EndoSLAMPreprocessor):
    """
    SimCol3D 预处理 Pipeline
    针对 SynCol 合成数据和真实结肠镜数据的差异优化
    """
    def __init__(self, *args, domain_adapt=False, **kwargs):
        super().__init__(*args, **kwargs)
        self.domain_adapt = domain_adapt
    
    def process_synthetic(self, image, depth, pose):
        """处理合成数据"""
        image, mask = self.process(image)
        depth = cv2.resize(depth, self.target_size[::-1],
                          interpolation=cv2.INTER_NEAREST)
        return image, depth, pose, mask
    
    def process_real(self, image):
        """处理真实结肠镜数据"""
        image, mask = self.process(image)
        if self.domain_adapt:
            # 域适应:添加合成数据的风格特征
            image = self._domain_adapt(image)
        return image, mask
    
    def _domain_adapt(self, image):
        """简单的域适应(颜色直方图匹配)"""
        # 此处可替换为 CycleGAN 等更复杂的域适应方法
        return image

§6.3 TensorFlow / Keras DataLoader

import tensorflow as tf
import numpy as np
import cv2
import os

def create_endoslam_tf_dataset(data_dir, subdataset_path, camera_type="HighCam",
                                 batch_size=8, sequence_length=3,
                                 img_size=(256, 256), augment=True):
    """TensorFlow Dataset for EndoSLAM"""
    
    seq_dir = os.path.join(data_dir, subdataset_path)
    frames = sorted([f for f in os.listdir(seq_dir) if f.endswith(''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''.png'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''')])
    cam_params = CAMERA_PARAMS[camera_type]
    
    def load_sequence(idx):
        idx = int(idx)
        indices = [idx + i for i in range(sequence_length)]
        images = []
        for i in indices:
            img = cv2.imread(os.path.join(seq_dir, frames[i]))
            img = cv2.resize(img, img_size[::-1])
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            images.append(img.astype(np.float32) / 255.0)
        return np.stack(images)
    
    def generator():
        for i in range(len(frames) - sequence_length + 1):
            yield load_sequence(i)
    
    dataset = tf.data.Dataset.from_generator(
        generator,
        output_signature=tf.TensorSpec(
            shape=(sequence_length, *img_size, 3), dtype=tf.float32
        )
    )
    
    if augment:
        def aug_fn(x):
            if tf.random.uniform(()) > 0.5:
                x = tf.image.flip_left_right(x)
            x = tf.image.random_brightness(x, 0.2)
            x = tf.image.random_contrast(x, 0.8, 1.2)
            return tf.clip_by_value(x, 0, 1)
        dataset = dataset.map(aug_fn, num_parallel_calls=tf.data.AUTOTUNE)
    
    dataset = dataset.batch(batch_size).prefetch(tf.data.AUTOTUNE)
    return dataset

§6.4 评估指标代码

import numpy as np

def depth_metrics(pred_depth, gt_depth, valid_mask=None):
    """
    深度估计评估指标
    pred_depth, gt_depth: (H, W) 或 (N, H, W)
    """
    if valid_mask is None:
        valid_mask = gt_depth > 0
    
    pred = pred_depth[valid_mask]
    gt = gt_depth[valid_mask]
    
    # 中位数缩放(自监督方法常用)
    scale = np.median(gt) / np.median(pred)
    pred_scaled = pred * scale
    
    # Abs Rel
    abs_rel = np.mean(np.abs(pred_scaled - gt) / gt)
    
    # Sq Rel
    sq_rel = np.mean(((pred_scaled - gt) ** 2) / gt)
    
    # RMSE
    rmse = np.sqrt(np.mean((pred_scaled - gt) ** 2))
    
    # RMSE log
    rmse_log = np.sqrt(np.mean(
        (np.log(pred_scaled) - np.log(gt)) ** 2
    ))
    
    # δ < 1.25
    ratio = np.maximum(pred_scaled / gt, gt / pred_scaled)
    delta_1 = np.mean(ratio < 1.25)
    delta_2 = np.mean(ratio < 1.25 ** 2)
    delta_3 = np.mean(ratio < 1.25 ** 3)
    
    return {
        "abs_rel": abs_rel,
        "sq_rel": sq_rel,
        "rmse": rmse,
        "rmse_log": rmse_log,
        "delta_1": delta_1,
        "delta_2": delta_2,
        "delta_3": delta_3
    }


def pose_metrics(pred_poses, gt_poses):
    """
    位姿估计评估指标
    pred_poses, gt_poses: (N, 4, 4) 齐次变换矩阵序列
    """
    # ATE (Absolute Trajectory Error)
    # 计算对齐后的轨迹误差
    pred_traj = pred_poses[:, :3, 3]  # (N, 3)
    gt_traj = gt_poses[:, :3, 3]
    
    # Sim(3) 对齐
    aligned_pred = align_trajectories(pred_traj, gt_traj)
    ate = np.sqrt(np.mean(np.sum(
        (aligned_pred - gt_traj) ** 2, axis=1
    )))
    
    # RTE (Relative Trajectory Error)
    rte_list = []
    for i in range(len(pred_poses) - 1):
        pred_rel = np.linalg.inv(pred_poses[i]) @ pred_poses[i+1]
        gt_rel = np.linalg.inv(gt_poses[i]) @ gt_poses[i+1]
        error = np.linalg.inv(gt_rel) @ pred_rel
        rte_list.append(np.linalg.norm(error[:3, 3]))
    rte = np.mean(rte_list)
    
    # ROT (Rotation Error)
    rot_errors = []
    for i in range(len(pred_poses) - 1):
        pred_rel = np.linalg.inv(pred_poses[i]) @ pred_poses[i+1]
        gt_rel = np.linalg.inv(gt_poses[i]) @ gt_poses[i+1]
        error_rot = np.linalg.inv(gt_rel[:3, :3]) @ pred_rel[:3, :3]
        # 旋转矩阵到旋转向量
        angle = np.arccos(
            np.clip((np.trace(error_rot) - 1) / 2, -1, 1)
        )
        rot_errors.append(np.degrees(angle))
    rot = np.mean(rot_errors)
    
    return {
        "ate": ate,  # 绝对轨迹误差
        "rte": rte,  # 相对轨迹误差
        "rot": rot   # 旋转误差(度)
    }


def align_trajectories(pred, gt):
    """Sim(3) 对齐预测轨迹到真值轨迹"""
    # 中心化
    pred_centered = pred - pred.mean(axis=0)
    gt_centered = gt - gt.mean(axis=0)
    
    # 最小二乘对齐
    H = pred_centered.T @ gt_centered
    U, S, Vt = np.linalg.svd(H)
    R = Vt.T @ U.T
    
    # 尺度
    scale = np.sum(S) / np.sum(pred_centered ** 2)
    
    aligned = (scale * R @ pred_centered.T).T + gt.mean(axis=0)
    return aligned


def evaluate_endoslam(predictions, ground_truths):
    """
    EndoSLAM 官方评估
    predictions: dict {seq_id: {"depth": ..., "pose": ...}}
    ground_truths: dict {seq_id: {"depth": ..., "pose": ..., "point_cloud": ...}}
    """
    all_depth_metrics = []
    all_pose_metrics = []
    
    for seq_id in predictions:
        pred = predictions[seq_id]
        gt = ground_truths[seq_id]
        
        # 深度评估(仅合成数据有深度真值)
        if "depth" in gt and "depth" in pred:
            dm = depth_metrics(pred["depth"], gt["depth"])
            all_depth_metrics.append(dm)
        
        # 位姿评估
        if "pose" in gt and "pose" in pred:
            pm = pose_metrics(pred["pose"], gt["pose"])
            all_pose_metrics.append(pm)
    
    # 汇总
    if all_depth_metrics:
        print("=== Depth Metrics ===")
        for key in all_depth_metrics[0]:
            vals = [m[key] for m in all_depth_metrics]
            print(f"  {key}: {np.mean(vals):.4f} ± {np.std(vals):.4f}")
    
    if all_pose_metrics:
        print("=== Pose Metrics ===")
        for key in all_pose_metrics[0]:
            vals = [m[key] for m in all_pose_metrics]
            print(f"  {key}: {np.mean(vals):.4f} ± {np.std(vals):.4f}")

§6.5 数据增强安全表

增强方法 安全性 适用任务 注意事项
随机水平翻转 ⚠️ 谨慎 深度+位姿 位姿也须翻转(x → -x)
随机垂直翻转 ⚠️ 谨慎 深度+位姿 位姿也须翻转(y → -y)
随机裁剪 ✅ 安全 深度 须调整内参
随机 gamma ✅ 安全 深度+位姿 模拟照明变化
随机亮度偏移 ✅ 安全 深度+位姿 模拟照明不均
随机颜色抖动 ✅ 安全 深度 模拟不同相机
高斯噪声 ✅ 安全 深度+位姿 模拟传感器噪声
高斯模糊 ⚠️ 谨慎 深度 可能模糊关键纹理
CLAHE ✅ 安全 深度+位姿 增强局部对比度
Mixup ❌ 不推荐 序列数据 Mixup 无意义
CutMix ❌ 不推荐 破坏时序一致性
随机旋转(大角度) ❌ 不推荐 位姿 破坏相机-世界关系

§6.6 推荐模型配置

模型 参数量 推荐场景 EndoSLAM 预期 RMSE 备注
Endo-SfMLearner ~15M 基线首选 0.297 (Unity) 自监督,亮度感知
AF-SfMLearner ~15M 进阶 ~0.27 (Unity) 外观流注意力
Monodepth2 ~15M 通用对比 0.332 (Unity) 通用场景基线
SC-SfMLearner ~15M 尺度一致 0.369 (Unity) 尺度一致性约束
Surgical-DINO ~90M SOTA Abs Rel 0.053 (SCARED) DINOv2 适配器
EndoSfM3D ~90M SOTA 2025 Depth Anything V2 + DoRA
Generative Latent ~30M SOTA 2024 StyleGAN + VAE 位姿
Trimming-Aug ~15M 鲁棒性 掩码+特征增强

§6.7 硬件配置建议

任务场景 GPU 显存 预计训练时间 备注
Endo-SfMLearner 训练 1× RTX 3090 24 GB ~12 小时 单相机序列
多相机联合训练 1× A100 40 GB ~24 小时 6 相机数据
Surgical-DINO 适配器 1× A100 40 GB ~8 小时 DINOv2 微调
SimCol3D Task 1 训练 1× RTX 3090 24 GB ~6 小时 合成深度
推理(单帧深度) 1× RTX 3060 12 GB ~30 ms 实时推理

§7 质量评估与局限性(Quality & Limitations)

§7.1 DAIMS 24 项评估

# 评估项 状态 说明
1 数据集是否公开可用? Mendeley Data + GitHub
2 是否提供明确的数据集文档? 论文 + GitHub README + YouTube 视频
3 是否包含原始影像? 完整内窥镜视频帧 (PNG)
4 是否提供真值标注? 6D 位姿 + 3D 点云 + 深度图(合成)
5 是否报告标注者间一致性? 3D 真值由机械臂/扫描仪获取,无 IAA
6 是否提供标注协议描述? 论文 Section 2 详细描述采集流程
7 是否包含临床元数据? ⚠️ 息肉/无息肉标注,无其他临床信息
8 是否提供训练/测试划分? ⚠️ EndoSLAM 无官方划分;SimCol3D 有
9 是否提供评估脚本? GitHub 提供 Endo-SfMLearner 代码
10 是否提供基线结果? 4 种方法基准测试
11 是否有标准化采集协议? 机械臂控制,标准化流程
12 是否公开患者人口统计? 离体猪器官,无人口统计
13 是否有 IRB/伦理审批? 动物组织,无人体实验
14 是否提供去标识化说明? 离体动物组织,无需去标识
15 是否有数据版本控制? Mendeley Data v1 + GitHub 版本
16 是否提供数据预览? GitHub README 示例图片
17 是否有开源基线代码? Endo-SfMLearner 完整代码
18 是否有持续维护? 2020-2024 持续更新
19 是否提供多模态数据? 视频 + 位姿 + 点云 + 深度 + CT
20 是否评估标注质量? ⚠️ 真值精度由设备保证,无 IAA 评估
21 是否有公平性评估? 无人体数据,无法评估
22 是否提供外部验证? SimCol3D 在 SCARED 上也有评估
23 是否有长期跟踪数据? 离体数据,无跟踪
24 是否支持商业使用? CC-BY 4.0 允许商业使用

DAIMS 评分:17/24(⭐⭐⭐⭐ 4/5)

扣分项:

  • #5 标注者间一致性 ❌(真值由设备获取,无人工标注 IAA)
  • #12 患者人口统计 ❌(离体猪器官)
  • #21 公平性评估 ❌(无人体数据)
  • #23 长期跟踪 ❌(离体数据)
  • #7 临床元数据不完整 ⚠️
  • #8 无官方划分 ⚠️(EndoSLAM)
  • #20 真值质量评估不完整 ⚠️

§7.2 已知局限性

局限性 1:离体猪组织与在体人体差异

EndoSLAM 使用离体猪消化道器官,与在体人体消化道存在显著差异:

  • 无组织变形:离体组织无蠕动、无充气变形
  • 无液体和出血:实际内窥镜检查中常见的黏液、血液、气泡不存在
  • 无照明动态变化:机械臂运动平稳,无术者手抖导致的照明变化
  • 物种差异:猪消化道与人体解剖结构不同
局限性 2:合成-真实域差距

SimCol3D 的合成数据与真实结肠镜存在视觉差异:

  • 无镜面反射:合成图像缺乏真实内窥镜的高光反射
  • 无液体和气泡:合成场景无真实结肠镜中的液体覆盖
  • 无结肠变形:合成结肠是刚性网格,无充气变形
  • 相机行为差异:合成相机的运动轨迹与真实结肠镜不同
局限性 3:SimCol3D 真实数据无真值

SimCol3D 的真实结肠镜数据使用 COLMAP 生成的伪真值:

  • COLMAP 本身在纹理缺乏的结肠黏膜上容易失败
  • 伪真值由 2 位组织者和 1 位胃肠病学家验证,但非精确真值
  • 位姿估计方法在真实数据上的评估受限于伪真值质量
局限性 4:相机分辨率和帧率差异大

6 种相机的分辨率从 256×256(Pillcam)到 1350×1080(OlympusCam),帧率从 3 fps(MiroCam)到 30 fps(UnityCam/OlympusCam)。这种巨大差异使得:

  • 跨相机泛化困难
  • 低帧率胶囊相机的时序信息稀疏
  • 低分辨率胶囊相机的纹理信息不足
局限性 5:小数据集过拟合

EndoSLAM 的离体数据量有限(~42,700 帧),自监督方法容易在少量序列上过拟合。特别是小肠仅有 5 个子数据集,难以训练泛化性好的模型。

局限性 6:位姿估计仍是开放问题

SimCol3D 挑战赛的关键发现:所有方法在真实结肠镜位姿估计上显示极端漂移(ATE 3.59-7.16 dm),表明位姿估计远未解决。合成数据上的深度预测已可稳健解决(L1 < 0.03 cm),但合成到真实的迁移仍然困难。

§7.3 6 大坑点详解

坑点 1:自监督深度估计的尺度模糊

单目自监督深度估计存在固有的尺度模糊问题——预测的深度图与真实深度之间差一个未知尺度因子。Endo-SfMLearner 和 Monodepth2 使用中位数缩放进行评估,但这意味着预测的绝对深度值是无意义的。

解决方案:在评估时使用中位数缩放(scale = median(GT) / median(pred));在实际应用中需要额外的尺度参考(如已知尺寸的器械或 CT 先验)。

坑点 2:镜面反射区域深度估计失效

内窥镜图像中的镜面反射区域(高光)违反光度一致性假设,导致这些区域的深度预测完全不可靠。这是自监督方法在内窥镜场景中的核心困难。

解决方案:使用 EndoSLAMPreprocessor 中的镜面反射检测掩码;在损失函数中排除高光区域(自动掩码策略);使用 Trimming-then-Augmentation 框架的"掩码后恢复"策略。

坑点 3:跨相机域差距

不同相机的分辨率、帧率、视场角和照明条件差异巨大。在 HighCam 上训练的模型直接用于 Pillcam 时性能急剧下降,因为分辨率从 1280×720 降至 256×256,纹理信息严重丢失。

解决方案:使用多相机联合训练;对不同分辨率的相机使用不同的输入尺寸和对应的内参缩放;考虑域适应技术。

坑点 4:SimCol3D SynCol III 的泛化陷阱

SimCol3D 的 Synthetic Colon III 没有训练数据——它来自一个未见过的患者 CT。在 SynCol I+II 上训练的模型在 SynCol III 上的性能下降显著(如 CVML 的 L1 从 0.030 降至 0.099,MMLAB 从 0.109 升至 0.171),表明模型可能过拟合于特定的结肠解剖结构。

解决方案:不要在 SynCol I+II+III 上做交叉验证后声称"泛化良好";必须在完全未见过的 SynCol III 上独立报告结果。

坑点 5:COLMAP 伪真值评估偏差

SimCol3D 真实数据的"真值"由 COLMAP 生成。COLMAP 在纹理缺乏的结肠黏膜上经常失败,生成的伪真值本身就有较大误差。用有误差的伪真值评估位姿估计方法,会引入系统性偏差——方法可能在 COLMAP 表现好的区域看起来好,但在 COLMAP 失败的区域无法评估。

解决方案:理解伪真值的局限性;关注相对趋势而非绝对数值;结合可视化定性评估。

坑点 6:EndoSLAM 位姿评估的坐标系混淆

EndoSLAM 的 6D 位姿来自 Panda 机械臂的关节编码器,使用机械臂基坐标系。不同研究团队可能使用不同的坐标系约定(世界系 vs 相机系 vs 机械臂系),导致位姿评估结果的数值不可直接比较。

解决方案:仔细阅读论文中的坐标系定义;确认评估代码使用与论文一致的坐标系转换;使用官方评估脚本。

§8 基准性能与生态(Benchmarks & Ecosystem)

§8.1 EndoSLAM 深度估计排行榜(Unity 合成数据,RMSE↓)

排名 方法 RMSE (mean) RMSE (stdev) 备注
1 Endo-SfMLearner 0.2966 0.0622 亮度感知 + 空间注意力
2 Endo-SfM w/o brightness 0.3288 0.0608 消融:无亮度损失
3 Endo-SfM w/o attention 0.3273 0.1086 消融:无注意力模块
4 Monodepth2 0.3322 0.0815 通用场景基线
5 Monodepth2 pretrained 0.4531 0.1011 ImageNet 预训练
6 SC-SfMLearner 0.3692 0.0779 尺度一致性
7 SfMLearner 0.3888 0.0711 原始 SfM
8 SfMLearner pretrained 0.4911 0.0831 ImageNet 预训练

§8.2 EndoSLAM 3D 重建排行榜(RMSE cm↓)

排名 方法 RMSE (cm) 备注
1 Endo-SfMLearner 0.51 混合重建管线
2 Shape from Shading 0.65 传统方法
3 SC-SfMLearner 0.86 自监督基线

§8.3 EndoSLAM/SCARED 深度估计跨数据集排行榜(Abs Rel↓)

排名 方法 Abs Rel↓ Sq Rel↓ RMSE↓ RMSE log↓ δ↑ 数据集
1 Surgical-DINO 0.053 0.377 4.296 0.074 0.975 SCARED
2 AF-SfMLearner 0.059 0.435 4.925 0.082 0.974 SCARED
3 Surgical-DINO SSL 0.059 0.427 4.904 0.081 0.974 SCARED
4 Endo-SfM 0.062 0.606 5.726 0.093 0.957 SCARED
5 SC-SfMLearner 0.068 0.645 5.988 0.097 0.957 SCARED
6 Monodepth2 0.071 0.590 5.606 0.094 0.953 SCARED
7 Defeat-Net 0.077 0.792 6.688 0.108 0.941 SCARED
8 Fang et al. 0.078 0.794 6.794 0.109 0.946 SCARED
9 SfMLearner 0.079 0.879 6.896 0.110 0.947 SCARED

§8.4 SimCol3D Task 1 排行榜(合成深度,L1 cm↓)

排名 团队 方法 SynCol I SynCol II SynCol III ∑1
1 CVML FCBFormer 0.030 0.030 0.099 54
2 MIVA DenseDepth 0.038 0.038 0.107 44
3 EndoAI GLPDepth+Segformer 0.040 0.039 0.111 37
4 IntuitiveIL NeWCRFs 0.050 0.059 0.167 26
5 MMLAB Swin-UNet 0.109 0.201 0.171 16
6 KLIV SUMNet 0.155 0.166 0.187 12

§8.5 SimCol3D Task 2 排行榜(合成位姿)

排名 团队 ATE 均值 RTE 均值 ROT 均值 ∑2
1 EndoAI 0.329 0.137 0.220 0.165
2 MIVA 0.536 0.169 0.199 0.183
3 MMLAB 0.866 0.226 2.177 0.284

§8.6 SimCol3D Task 3 排行榜(真实位姿)

排名 团队 ATE (dm) RTE (cm) ROT (°) 备注
1 MIVA 3.59 0.22 0.54 SC-SfMLearner + CycleGAN
2 EndoAI 7.16 0.23 0.87 MonoDepth2 + CycleGAN

§8.7 SOTA 方法谱系

内窥镜 SLAM 方法演进 (2020-2025)
│
├── 自监督单目系列
│   ├── SfMLearner (2017) ──── 通用场景基线
│   ├── Monodepth2 (2019) ──── 自动掩码 + 多尺度
│   ├── SC-SfMLearner (2019) ──── 尺度一致性约束
│   ├── Endo-SfMLearner (2021) ──── EndoSLAM 基线
│   │   ├── 亮度感知光度损失 ──── 应对照明变化
│   │   └── 空间注意力位姿网络 ──── 胶囊内窥镜优化
│   ├── AF-SfMLearner (2022) ──── 外观流注意力
│   └── Trimming-Aug (2025) ──── 掩码+特征增强
│
├── 基础模型适配系列
│   ├── Surgical-DINO (2024) ──── DINOv2 适配器
│   ├── EndoSfM3D (2025) ──── Depth Anything V2 + DoRA
│   └── DINOv2 zero-shot (2024) ──── 零样本迁移
│
├── 生成模型辅助系列
│   ├── Generative Latent (2024) ──── StyleGAN 深度先验 + VAE 位姿
│   └── CycleGAN 域适应 (2022) ──── 合成→真实风格迁移
│
├── 传统几何方法
│   ├── SIFT 特征匹配 ──── 纹理丰富时可用
│   ├── Shape from Shading ──── 单帧深度
│   └── ORB-SLAM ──── 实时 SLAM
│
└── SimCol3D 挑战赛方法
    ├── FCBFormer (CVML) ──── Transformer+CNN 混合
    ├── DenseDepth (MIVA) ──── DenseNet 编码器
    ├── GLPDepth (EndoAI) ──── Transformer 深度
    ├── NeWCRFs (IntuitiveIL) ──── 神经 CRFs
    ├── Swin-UNet (MMLAB) ──── Swin Transformer
    └── SUMNet (KLIV) ──── VGG 编码器

§8.8 外部验证矩阵

外部数据集 验证目的 预期性能 备注
SCARED (EndoVis 2019) 跨数据集深度泛化 Abs Rel 0.05-0.08 da Vinci 手术场景
C3VD (Colonoscopy 3D) 真实结肠镜深度 2024 新数据集
SERV-CT 跨模态验证 CT 辅助内窥镜
EndoMapper 真实结肠镜位姿 ATE 3-7 dm SimCol3D 已用
Cholec80 跨任务验证 手术视频理解

§8.9 生态快照

资源 链接 类型
EndoSLAM GitHub https://github.com/CapsuleEndoscope/EndoSLAM 代码+数据
EndoSLAM Mendeley https://data.mendeley.com/datasets/cd2rtzm23r/1 数据下载
EndoSLAM 论文 https://doi.org/10.1016/j.media.2021.102058 原始论文
SimCol3D 数据 https://www.ucl.ac.uk/interventional-surgical-sciences/simcol3d-data 合成数据
SimCol3D 真实数据 https://www.synapse.org/Synapse:syn26707219 EndoMapper
SimCol3D 论文 https://doi.org/10.1016/j.media.2024.103195 挑战赛报告
Endo-SfMLearner 预训练 GitHub releases 模型权重

§8.10 关键论文

# 论文 年份 重要性
1 Ozyoruk et al., “EndoSLAM dataset and an unsupervised monocular visual odometry and depth estimation approach for endoscopic videos”, Medical Image Analysis 2021 ⭐⭐⭐⭐⭐ EndoSLAM 数据集+Endo-SfMLearner
2 Rau et al., “SimCol3D — 3D reconstruction during colonoscopy challenge”, Medical Image Analysis 2024 ⭐⭐⭐⭐⭐ SimCol3D 挑战赛报告
3 Shao et al., “AF-SfMLearner: Self-supervised Monocular Depth Estimation with Appearance Flow”, MICCAI 2022 ⭐⭐⭐⭐ 外观流注意力
4 Zeinoddin et al., “Surgical-DINO: Adapter Learning of Foundation Models for Depth Estimation in Endoscopic Surgery”, MICCAI 2024 ⭐⭐⭐⭐⭐ SOTA DINOv2 适配
5 Xu et al., “Self-supervised Monocular Depth and Pose Estimation for Endoscopy with Generative Latent Priors”, arXiv:2411.17790 2024 ⭐⭐⭐⭐ 生成模型辅助
6 Zhang et al., “EndoSfM3D: Learning to 3D Reconstruct Any Endoscopic Surgery Scene using Self-supervised Foundation Model”, MICCAI Workshop 2025 ⭐⭐⭐⭐ Depth Anything V2
7 Huang et al., “Occlusion-Aware Self-Supervised Monocular Depth Estimation for Weak-Texture Endoscopic Images”, arXiv:2504.17582 2025 ⭐⭐⭐ 遮挡感知
8 “Trimming-then-augmentation: Towards robust depth and odometry estimation for endoscopic images”, Medical Image Analysis 2025 ⭐⭐⭐⭐ 掩码+增强框架
9 Godard et al., “Monodepth2: Digging into Self-Supervised Monocular Depth Estimation”, CVPR 2019 ⭐⭐⭐ 通用基线
10 Bian et al., “SC-SfMLearner: Unsupervised Monocular Depth and Ego-Motion Learning with Scale Consistency”, ICCV 2019 ⭐⭐⭐ 尺度一致

§9 相关资源与引用(Resources & Citation)

§9.1 引用格式

@article{ozyoruk2021endoslam,
  title={EndoSLAM dataset and an unsupervised monocular visual odometry and depth estimation approach for endoscopic videos},
  author={Ozyoruk, Kutsev Bengisu and Gokceler, Guliz Irem and Bobrow, Taylor L. and Coskun, Gulfize and Incetan, Kagan and Almalioglu, Yasin and Mahmood, Faisal and Curto, Eva and Perdigoto, Luis and Oliveira, Marina and Sahin, Hasan and Araujo, Helder and Alexandrino, Henrique and Durr, Nicholas J. and Gilbert, Hunter B. and Turan, Mehmet},
  journal={Medical Image Analysis},
  volume={71},
  pages={102058},
  year={2021},
  publisher={Elsevier},
  doi={10.1016/j.media.2021.102058}
}

@article{rau2024simcol3d,
  title={SimCol3D — 3D reconstruction during colonoscopy challenge},
  author={Rau, Anita and Bano, Sophia and Jin, Yueming and Azagra, Pablo and Morlana, Javier and Kader, Rawen and Sanderson, Edward and Matuszewski, Bogdan J. and Lee, Jae Young and Lee, Dong-Jae and Posner, Erez and Frank, Netanel and Elangovan, Varshini and Raviteja, Sista and Li, Zhengwen and Liu, Jiquan and Lalithkumar, Seenivasan and Islam, Mobarakol and Ren, Hongliang and Lovat, Laurence B. and Montiel, Jos{\''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''e} M. M. and Stoyanov, Danail},
  journal={Medical Image Analysis},
  volume={96},
  pages={103195},
  year={2024},
  publisher={Elsevier},
  doi={10.1016/j.media.2024.103195}
}

§9.2 下载链接

§9.3 社区工具

§9.4 教程与博文

§9.5 许可证详情

EndoSLAM:CC-BY 4.0(署名 4.0 国际)

  • ✅ 允许:商业和非商业使用、修改、分发
  • 📋 要求:须标注原始来源
  • 🔓 最宽松的医学数据集许可证之一

EndoSLAM 代码:MIT 许可证

  • ✅ 允许:商业和非商业使用、修改、分发
  • 📋 要求:保留版权声明

SimCol3D:无明确许可证标注

  • ⚠️ 公开下载但许可证不明,使用前建议联系组织方确认

§9.6 常见问题

Q: EndoSLAM 和 SimCol3D 应该选择哪个?
A: 推荐决策路径:① 胶囊内窥镜 SLAM 研究 → EndoSLAM(唯一含胶囊 6D 位姿真值的数据集)。② 结肠镜 3D 重建 → SimCol3D(合成+真实结肠镜)。③ 跨相机泛化研究 → EndoSLAM(6 种相机)。④ Sim-to-Real 迁移 → EndoSLAM(UnityCam 合成 + HighCam 真实配对)。⑤ 商业用途 → EndoSLAM(CC-BY 4.0 允许商业使用)。如果不确定,从 EndoSLAM 的 HighCam 序列开始。

Q: 为什么位姿估计在真实结肠镜上性能这么差?
A: 有三个核心原因:① 结肠黏膜缺乏稳定特征点,传统特征匹配方法(SIFT/ORB)大量失败;② 真实结肠镜存在镜面反射、液体覆盖、气泡和运动模糊等干扰;③ SimCol3D 真实数据的"真值"是 COLMAP 生成的伪真值,本身就有误差。所有方法在真实数据上的 ATE(3.59-7.16 dm)远大于合成数据上的 ATE(0.329-0.866 dm),表明合成到真实的域差距巨大。

Q: EndoSLAM 的猪器官数据能用于临床应用吗?
A: 不能直接用于临床。离体猪组织与在体人体消化道存在显著差异(无蠕动、无液体、无出血、解剖结构不同)。EndoSLAM 的价值在于提供精确的 6D 位姿和 3D 地图真值用于算法开发和评估,而非直接训练临床部署模型。临床应用需要额外的在体验证。

Q: 为什么 Endo-SfMLearner 在 EndoSLAM 上表现好但在 SCARED 上不如 Surgical-DINO?
A: Endo-SfMLearner 是针对 EndoSLAM 数据特性设计的(亮度感知损失应对照明变化,空间注意力应对纹理缺乏),但在 SCARED 的 da Vinci 手术场景(不同相机、不同组织类型、不同照明条件)上泛化不足。Surgical-DINO 利用 DINOv2 基础模型的强大特征提取能力,泛化性更好。

Q: 可以用 EndoSLAM 数据训练的模型做商业产品吗?
A: 可以。EndoSLAM 采用 CC-BY 4.0 许可证,允许商业使用,仅需标注来源。这是 EndoSLAM 相比许多其他医学数据集(如 KiTS 的 CC-BY-NC-SA)的优势。但须注意:SimCol3D 的真实数据来自 EndoMapper 数据集,其许可证不明确,使用前须确认。

Q: 6 种相机的数据如何选择?
A: ① 高分辨率离体研究 → HighCam(1280×720, 20fps)。② 低分辨率对比 → LowCam(640×480, 20fps)。③ 胶囊内窥镜 → Pillcam(256×256, 4-35fps)或 MiroCam(320×320, 3fps)。④ 合成数据/Sim-to-Real → UnityCam(320×320, 30fps)。⑤ 临床结肠镜模拟 → OlympusCam(1350×1080, 30fps, 硅胶模型)。推荐从 HighCam 开始,它提供最高的图像质量和最丰富的时序信息。

§10 AI 使用声明卡(AI Usage Card)

§10.1 撰写页面时使用的 AI 模型

模型 版本 用途
Claude Sonnet 4 全文撰写、代码生成、数据分析、JSON-LD 构建
WebSearch 文献检索、SOTA 数据收集、挑战赛信息核查、事实交叉验证

§10.2 AI 参与范围

全文撰写(代码 + 文本 + 表格 + 评估 + JSON-LD @graph)

§10.3 AI 参考的输入文档

  1. Ozyoruk et al. (2021), “EndoSLAM dataset and an unsupervised monocular visual odometry and depth estimation approach for endoscopic videos”, Medical Image Analysis, Vol. 71, 102058, DOI:10.1016/j.media.2021.102058
  2. Rau et al. (2024), “SimCol3D — 3D reconstruction during colonoscopy challenge”, Medical Image Analysis, Vol. 96, 103195, DOI:10.1016/j.media.2024.103195
  3. Zeinoddin et al. (2024), “Surgical-DINO: Adapter Learning of Foundation Models for Depth Estimation in Endoscopic Surgery”, arXiv:2401.06013
  4. Xu et al. (2024), “Self-supervised Monocular Depth and Pose Estimation for Endoscopy with Generative Latent Priors”, arXiv:2411.17790
  5. Zhang et al. (2025), “EndoSfM3D: Learning to 3D Reconstruct Any Endoscopic Surgery Scene using Self-supervised Foundation Model”, MICCAI Workshop, DOI:10.1007/978-3-032-13961-0_30
  6. Huang et al. (2025), “Occlusion-Aware Self-Supervised Monocular Depth Estimation for Weak-Texture Endoscopic Images”, arXiv:2504.17582
  7. EndoSLAM GitHub:https://github.com/CapsuleEndoscope/EndoSLAM
  8. EndoSLAM Mendeley Data:https://data.mendeley.com/datasets/cd2rtzm23r/1
  9. SimCol3D arXiv:https://arxiv.org/abs/2307.11261
  10. Awesome-Medical-Dataset - EndoSLAM:https://github.com/openmedlab/Awesome-Medical-Dataset
  11. 《Global Medical AI Datasets》PDF — SLAM 3D Endoscopic 基础介绍
  12. 多篇 SOTA 论文(Monodepth2、SC-SfMLearner、AF-SfMLearner、Trimming-Aug)

§10.4 人工校验表

内容模块 审核者 审核方式 审核状态
§2 医学背景 千方病案医学编辑部 交叉审核 ✅ 已通过
§3 数据规格 千方病案医学编辑部 与原始论文及 GitHub 交叉比对 ✅ 已验证
§6 代码示例 千方病案医学编辑部 逻辑审查 ✅ 已通过
§7 DAIMS 评估 千方病案医学编辑部 逐项核对 ✅ 已验证
§8 排行榜 千方病案医学编辑部 与原始论文及官方结果交叉比对 ✅ 已验证

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

返回 AI Ready 数据集