Dataset Viewer
Auto-converted to Parquet Duplicate
Search is not available for this dataset
image
image
End of preview. Expand in Data Studio

YAML Metadata Warning:empty or missing yaml metadata in repo card

Check out the documentation for more information.

ESD_stereo —— 自采 ESD 手术双目 + 侧视数据集

内镜黏膜下剥离(ESD)离体采集。每个 clip 同时录双目主视角(刀头视角,用于深度) 与一路侧视(近似垂直于内镜轴,用于观测主视角看不到的刀尖–组织间隙)。 派生标签生成于 2026-09-04,本文件用于传输后核对

  • 13 个可用 clip / 7750 帧 / 9 个采集日,其中 12 个双目、1 个单目
  • hover 5194 · contact 2384 · unknown 131(其中 122 是 occluded-contact)
  • 体积:45 GB(13 个 clip 44.7 GB + calib_side/ 11 MB)
  • 已清理:早期无侧视的目录(2026012220260129202602132026030520260310) 与 contact_gt_pre_gate/ 备份都已删除。这里就是当前完整的数据集, 没有多余目录、也不需要下载后再清理。

1. clip 清单(传完请逐行核对)

clip hover contact unk 类型 体积
20260630/clip_1 645 516 115 0 stereo 3.2 GB
20260702/clip_1 306 172 121 6 stereo 2.3 GB
20260708/clip_1 177 27 146 0 stereo 1.2 GB
20260714/clip_1 572 361 205 0 stereo 3.7 GB
20260714/clip_2 718 577 130 4 stereo 3.8 GB
20260714/clip_3 186 96 87 0 stereo 1.1 GB
20260722/clip_2 399 188 117 94 stereo 2.5 GB
20260724/clip_1 709 419 290 0 stereo 4.5 GB
20260728/clip_2 598 479 114 5 stereo 3.9 GB
20260731/clip_1 885 677 208 0 stereo 4.9 GB
20260731/clip_3 712 302 388 22 MONO 2.6 GB
20260828/clip_1 781 569 212 0 stereo 4.7 GB
20260828/clip_2 1062 811 251 0 stereo 6.4 GB
合计 7750 5194 2384 131 44.7 GB
  • 20260731/clip_3 是单目(992×992,无 right/),因此没有 depth/pseudo_depth/ —— 这是正常的,不是传输丢失。它只能做接触任务的评测。
  • 20260722/clip_2 的 94 个 unknown 是 occluded-contact(刀尖被组织遮挡), 标为 255 而非猜测,训练与评测都会跳过。

2. 单个 clip 的目录结构

<日期>/clip_N/
├── left/                  ✅必需  主视角左目 PNG(模型的输入图像)
├── depth/                 ✅必需  FoundationStereo 立体深度  uint16/65535*100 → mm
├── pseudo_depth/          ✅必需  FS + DAv3 融合深度(默认训练用的就是这个)
├── class_labels/          ✅必需  器械/组织语义标签 PNG
├── contact_gt/            ✅必需  逐帧 JSON:接触状态、刀尖 uv、组织点 uv、d_side
│
├── contact_dperp/         △部分     三角约束 hover 目标 d_perp 的边车(**只有 8 个旧 clip 有**)
│
├── class_json/            ⭐不可再生  labelme 人工标注(主视角)
├── side_json/             ⭐不可再生  侧视人工标注 —— **接触状态的权威来源**
├── contact_touch/         ⭐不可再生  LCR 触觉传感器逐帧阻值(仅 20260828 两个 clip)
│
├── side/                  ○可选  侧视原图(只在**重新生成** contact_gt 时需要)
├── right/                 ○可选  主视角右目(只在**重跑 FoundationStereo** 时需要)
├── side_pseudo_depth/     ○可选  侧视 DAv3 深度 —— **任何训练/评测代码都不读取**
├── camera_{1,2,3}.avi     ○可选  抽帧前的源视频
└── *.csv, *_preview.png   ○可选  时间戳、模糊/去重评分与预览图

⭐ 那三项一共只有 0.3 GB,但丢了无法再生(人工标注 / 硬件测量)。 反过来,占地方的 depth/ pseudo_depth/ 是可以从 left/+right/+side/ 重跑出来的。 如果必须取舍,先丢大的、别丢小的。

根目录另有两项,都必需

  • calib_side/ —— 侧视相机标定(30 张棋盘图,10 MB)。丢了 contact GT 无法复现。
  • class_map_ESD_stereo.json —— 语义标签的类别映射表。

3. 传输后核对(跑这一条就够)

Linux / WSL / Git Bash:在数据集根目录执行

bash -c '
CLIPS="20260630/clip_1 20260702/clip_1 20260708/clip_1 20260714/clip_1 20260714/clip_2
20260714/clip_3 20260722/clip_2 20260724/clip_1 20260728/clip_2 20260731/clip_1
20260731/clip_3 20260828/clip_1 20260828/clip_2"
declare -A EXP=( [left]=7750 [class_labels]=7750 [contact_gt]=7750 [class_json]=7750
                 [side_json]=7750 [side]=7750 [depth]=7038 [pseudo_depth]=7038
                 [right]=7038 [side_pseudo_depth]=7744 [contact_touch]=1843 [contact_dperp]=3601 )
fail=0
for d in "${!EXP[@]}"; do
  n=0; for c in $CLIPS; do
    [ -d "$c/$d" ] && n=$((n+$(ls "$c/$d" 2>/dev/null | grep -c "[0-9]\{6\}")))
  done
  if [ "$n" -eq "${EXP[$d]}" ]; then printf "  OK   %-20s %5d\n" "$d" "$n"
  else printf "  FAIL %-20s %5d  (应为 %d)\n" "$d" "$n" "${EXP[$d]}"; fail=1; fi
done
[ -d calib_side ] && [ "$(ls calib_side | wc -l)" -eq 30 ] \
  && echo "  OK   calib_side          30" || { echo "  FAIL calib_side"; fail=1; }
[ -f class_map_ESD_stereo.json ] && echo "  OK   class_map json" \
  || { echo "  FAIL class_map json"; fail=1; }
[ $fail -eq 0 ] && echo "=> 全部通过" || echo "=> 有缺失,看上面 FAIL 的行"
'

只传了「训练最小集」的话side / right / side_pseudo_depth 三行会 FAIL, 这是预期的;其余 8 行必须全 OK。

Windows PowerShell

$clips = @("20260630\clip_1","20260702\clip_1","20260708\clip_1","20260714\clip_1",
"20260714\clip_2","20260714\clip_3","20260722\clip_2","20260724\clip_1",
"20260728\clip_2","20260731\clip_1","20260731\clip_3","20260828\clip_1","20260828\clip_2")
$exp = @{left=7750; class_labels=7750; contact_gt=7750; class_json=7750; side_json=7750;
         side=7750; depth=7038; pseudo_depth=7038; right=7038;
         side_pseudo_depth=7744; contact_touch=1843; contact_dperp=3601}
foreach ($d in $exp.Keys | Sort-Object) {
  $n = ($clips | ForEach-Object {
    $p = Join-Path $_ $d
    if (Test-Path $p) { (Get-ChildItem $p -File | Where-Object Name -match '\d{6}').Count } else { 0 }
  } | Measure-Object -Sum).Sum
  "{0,-6} {1,-20} {2,5} / {3}" -f $(if($n -eq $exp[$d]){"OK"}else{"FAIL"}), $d, $n, $exp[$d]
}

4. 已知的正常现象(不是传输错误)

  1. side_pseudo_depth 总数是 7744,不是 7750 —— 20260728/clip_2 少 5 帧、 20260828/clip_1 少 1 帧,侧视 DAv3 推理时单帧掉的。该目录任何代码都不读取,无影响。
  2. 20260731/clip_3 没有 depth/pseudo_depth/right/ —— 它是单目,设计如此。
  3. 根目录下只有 9 个日期目录 + calib_side/ + class_map_ESD_stereo.json + 本文件。 早期那批无侧视的录制已经删干净了,看不到它们是正常的。
  4. 每个目录里可能有 desktop.ini —— Windows/Google Drive 产物,无害; 上面的核对脚本按 6 位帧号过滤,不会把它算进去。
  5. contact_touch/ 只有 20260828 的两个 clip 有(共 1843 帧),别的 clip 没装传感器。
  6. contact_dperp/ 只有 8 个旧 clip 有(630c1、702c1、708c1、714c1、714c2、714c3、 722c2、728c2,共 3601 帧 / 15 MB)。2026-09-04 新增的 4 个双目 clip 没有。 默认的 hover_target='d_side' 不读它,训练与评测都不受影响;但 hover_target='d_perp' / 'd_side_sub'(wave-2 消融)会断言失败。 补齐办法见仓库 Endo3D/.claude/_precompute_dperp.py(纯 CPU,只写新目录)。 单目 20260731/clip_3 没有 FS 深度,原理上无法生成,但它是 eval-only、 不在断言范围内。

5. 关键约定(改动数据前必读)

  • 深度单位是毫米,两个深度目录共用同一编码:mm = uint16 / 65535 * 100
  • 接触状态以 side_json 为准(人工逐帧核验过),contact_gt/ 里的 state_raw 就是从它抄来的原始字符串。contact_touch/ 的传感器读数是旁证,不是标签来源: 它的原始通道会因黏液残留在刀尖离开后继续读到低阻值,从而单向误报 contact。
  • contact_gt/ 每帧的组织关键点向量长度 K_TISSUE = 24,全语料一致。
  • 训练/评测的 train-val 划分不在本数据集里,由代码仓库 Endo3D/Pi3_train/run_*_arm.shHELD 决定(2026-09-04 起:val = 20260702/clip_1 + 20260714/clip_3 + 20260828/clip_1 + 单目 20260731/clip_3)。
Downloads last month
70