SynthVasc — 端到端血管介入导丝导航平台:从公开 CT 数据到物理机器人部署的完整闭环
本平台实现了从 CT 扫描到自主导丝导航的完整流水线,核心贡献包括:
- CT → 合成 DSA 自动生成:全自动将任意对比增强 CT 转化为带完整 3D 标注的双平面合成荧光序列(≈200帧/例),无需真实患者 DSA 数据。
- stEVE 仿真环境:基于 SOFA BeamAdapter 有限元引擎的物理精确导丝-血管交互仿真,支持 SAC/PPO/TD3 等强化学习算法训练数据采集。
-
虚实域迁移:带导丝保留损失
$\mathcal{L}_\text{wire}$ 的 CUT 无配对翻译,将合成 DSA 风格迁移至真实 guide3d 荧光图像分布。 - 扩散策略部署:在合成多解剖轨迹上离线训练 Diffusion Policy(ResNet-18 + DDIM-10),实现 <15ms/步 的实时推理,并支持零样本迁移至物理机器人平台。
CT (.nrrd / .nii.gz)
│
├─ pipeline/preprocess.py 重采样至 1.5mm 等向分辨率
├─ pipeline/segment.py TotalSegmentator 血管分割(6类)
├─ pipeline/mesh.py Marching Cubes → OBJ 网格
├─ pipeline/nav.py 提取插入点(股动脉)+ LCCA 目标
├─ pipeline/path.py 体素化 Dijkstra 路径规划
│
├─ simulation/ ★ stEVE 仿真后端(本模块)
│ ├─ eve/ 核心仿真库(SOFA BeamAdapter 封装)
│ └─ examples/ 训练 & 演示脚本
│ ├─ train_demo.py 快速验证训练(10k步)
│ ├─ train_ablation_generalization.py 泛化消融实验(single/multi5/multi10)
│ ├─ demo_exp7.py 可视化演示
│ └─ plot_ablation.py 生成论文图表
│
├─ pipeline/synth_dsa_v2.py Beer-Lambert 双平面 DSA 渲染
├─ pipeline/infer.py 推理接口(调用训练好的策略)
│
├─ api/main.py FastAPI 后端
└─ frontend/ React + Three.js 3D 可视化界面
| 组件 | 版本 | 说明 |
|---|---|---|
| Python | 3.10 | conda 管理 |
| SOFA Framework | v23.06.00 | 有限元仿真引擎 |
| SofaPython3 插件 | 随 SOFA 发布 | SOFA Python 绑定 |
| CUDA(可选) | 11.8+ | GPU 训练加速(CPU 也可运行) |
| Node.js | 18+ | 前端构建 |
- CPU:8 核以上(SOFA 仿真为单线程,多进程并行训练)
- 内存:32 GB+
- 磁盘:50 GB+(SOFA + conda 环境 + 数据)
从 SOFA 官网 下载预编译包并解压:
# 示例:解压至 /opt/sofa/
tar -xzf SOFA_v23.06.00_Linux.tar.gz -C /opt/sofa/
export SOFA_ROOT=/opt/sofa/SOFA_v23.06.00_Linuxgit clone https://github.com/miracle-techlink/vascular-intervention-platform.git
cd vascular-intervention-platformconda create -n sofa python=3.10 -y
conda activate sofa
# 配置 SOFA 路径(每次激活环境后需执行,建议写入 ~/.bashrc)
export SOFA_ROOT=/opt/sofa/SOFA_v23.06.00_Linux
export PYTHONPATH=$SOFA_ROOT/plugins/SofaPython3/lib/python3/site-packages:$PYTHONPATH
export LD_LIBRARY_PATH=$SOFA_ROOT/lib:$SOFA_ROOT/plugins/SofaPython3/lib:$LD_LIBRARY_PATH
# 安装 Python 依赖
pip install stable-baselines3 gymnasium tensorboard \
numpy pillow scipy scikit-image \
pyvista meshio PyOpenGL pygame \
matplotlib opencv-python pyyaml trimesh
# 安装 eve 仿真包(开发模式)
cd simulation
pip install -e .
cd ..conda create -n dsa3d python=3.10 -y
conda activate dsa3d
pip install SimpleITK totalsegmentator trimesh scipy numpycd frontend
npm install # 或 pnpm install
cd ..# 终端1:启动后端
conda activate dsa3d
cd api && python main.py
# 终端2:启动前端
cd frontend && npm run dev浏览器访问 http://localhost:5173,上传 CT 文件,点击运行即可。
conda activate sofa
# 配置 SOFA 环境变量(见上)
cd simulation
python examples/single_jwire.py若无报错并看到仿真输出,说明环境配置成功。
conda activate sofa
cd simulation
python examples/train_demo.py
# 模型保存至 models_demo/对比单血管 vs 多血管训练的跨患者泛化能力:
conda activate sofa
cd simulation
# 三组并行训练(各 200k 步)
python examples/train_ablation_generalization.py --mode single > logs/ablation_single.log 2>&1 &
python examples/train_ablation_generalization.py --mode multi5 > logs/ablation_multi5.log 2>&1 &
python examples/train_ablation_generalization.py --mode multi10 > logs/ablation_multi10.log 2>&1 &
# 等待完成后生成论文图表
python examples/plot_ablation.py
# 输出: models_ablation/figures/{fig_convergence,fig_final_sr,fig_per_seed}.pdfconda activate sofa
cd simulation
python examples/demo_exp7.pyvascular-intervention-platform/
├── api/ FastAPI 后端服务
│ ├── main.py API 路由(上传CT、触发流水线、轮询状态)
│ └── infer.py 策略推理接口
│
├── frontend/ 前端(React + Three.js)
│ ├── src/App.jsx 主界面
│ └── src/Viewer3D.jsx 3D 血管可视化
│
├── pipeline/ CT 处理流水线
│ ├── preprocess.py CT 重采样
│ ├── segment.py TotalSegmentator 分割
│ ├── mesh.py 网格生成
│ ├── nav.py 导航点提取
│ ├── path.py Dijkstra 路径规划
│ ├── sofa_runner.py SOFA 仿真调用器
│ └── synth_dsa_v2.py Beer-Lambert DSA 渲染
│
├── simulation/ ★ stEVE 仿真核心
│ ├── eve/ 仿真库
│ │ ├── env.py Gymnasium 主环境
│ │ ├── intervention/ 干预场景(设备、荧光、仿真、目标、血管树)
│ │ ├── observation/ 观测空间定义
│ │ ├── reward/ 奖励函数
│ │ ├── terminal/ 终止条件
│ │ ├── truncation/ 截断条件
│ │ └── visualisation/ 可视化模块
│ ├── examples/ 示例脚本
│ ├── setup.py 包安装配置
│ └── install_env.sh 一键环境安装脚本
│
├── data/ 示例数据(小文件)
├── .gitignore
├── build.sh 完整构建脚本
├── start.sh 一键启动脚本
└── README.md 本文档
eve 库遵循 Gymnasium 接口,可与 stable-baselines3 直接配合:
import eve
from stable_baselines3 import SAC
# 构建主动脉弓仿真环境
vessel_tree = eve.intervention.vesseltree.AorticArch(seed=42)
device = eve.intervention.device.JShaped()
simulation = eve.intervention.simulation.SofaBeamAdapter(friction=0.01)
fluoroscopy = eve.intervention.fluoroscopy.TrackingOnly(
simulation=simulation, vessel_tree=vessel_tree,
image_frequency=7.5, image_rot_zx=[0, 0])
target = eve.intervention.target.CenterlineRandom(
vessel_tree=vessel_tree, fluoroscopy=fluoroscopy,
threshold=5.0, branches=["lcca"])
intervention = eve.intervention.MonoPlaneStatic(
vessel_tree=vessel_tree, devices=[device],
simulation=simulation, fluoroscopy=fluoroscopy,
target=target, normalize_action=True)
obs = eve.observation.TipState(intervention=intervention)
reward = eve.reward.Combination([
eve.reward.TargetReached(intervention=intervention, factor=100.0),
eve.reward.TipToTargetDistDelta(factor=1.0, intervention=intervention),
eve.reward.FailurePenalty(intervention=intervention, factor=-50.0),
])
terminal = eve.terminal.TargetReached(intervention=intervention)
truncation = eve.truncation.Combination([
eve.truncation.MaxSteps(300),
eve.truncation.VesselEnd(intervention=intervention),
])
env = eve.Env(intervention=intervention, observation=obs,
reward=reward, terminal=terminal, truncation=truncation)
model = SAC("MlpPolicy", env, verbose=1, device="cpu")
model.learn(total_timesteps=50_000)| 指标 | 数值 |
|---|---|
| KiTS 主动脉弓导航成功率(SAC, multi-10) | ~60% |
| 推理延迟(Diffusion Policy, DDIM-10) | <15 ms/步 |
| 合成 DSA 帧数(11例 KiTS AVT) | ~2,200 帧 |
| SOFA 仿真速度 | ~1× 实时 |
| 单次 CT 处理耗时(CPU) | 10–15 分钟 |
如使用本平台,请引用:
@article{synthvasc2026,
title = {SynthVasc: Synthetic DSA Generation, Sim-to-Real Adaptation,
and Diffusion Policy Learning for Endovascular Guidewire Navigation},
author = {Vascular Intervention Robot Group, Tongji University},
journal = {RA-L + ICRA},
year = {2026}
}同时请引用 stEVE 仿真环境基础:
@inproceedings{karstensen2025steve,
title = {stEVE: Open-source simulation for endovascular interventions},
author = {Karstensen, L. and others},
booktitle = {Comput. Biol. Med.},
year = {2025}
}Q: 运行时提示 No module named 'Sofa'
请确认已正确配置 SOFA 环境变量:
export SOFA_ROOT=/path/to/SOFA_v23.06.00_Linux
export PYTHONPATH=$SOFA_ROOT/plugins/SofaPython3/lib/python3/site-packages:$PYTHONPATH
export LD_LIBRARY_PATH=$SOFA_ROOT/lib:$SOFA_ROOT/plugins/SofaPython3/lib:$LD_LIBRARY_PATHQ: CUDA 报错 no kernel image is available for execution on the device(RTX 40/50 系列)
请在创建模型时指定 device="cpu":
model = SAC("MlpPolicy", env, device="cpu")SOFA 仿真本身为 CPU 运算,策略网络使用 CPU 即可满足需求。
Q: 训练速度很慢
stEVE 仿真约为 1× 实时速度(每步约 0.1–0.5秒),这是 SOFA 有限元仿真的固有限制。建议:
- 使用
--mode single先验证流程(约 1–2小时/200k步) - 多进程并行运行不同 mode 的实验
- 使用
learning_starts=2000减少早期无效探索
Q: TotalSegmentator 显存不足
# 使用 fast 模式(精度略低,但仅需 4GB 显存)
TotalSegmentator -i input.nii.gz -o output/ --fast- stEVE:开源血管介入仿真环境基础
- SOFA Framework:有限元物理仿真引擎
- TotalSegmentator:CT 血管分割
- Stable Baselines3:强化学习算法库
- guide3d:真实双平面 DSA 数据集
- Sim4EndoR 团队(姚天亮、齐鹏等,同济大学):物理机器人平台支持
MIT License © 2026 血管介入手术机器人课题组,同济大学