Add neck-based CT prealignment before VoxelMorph

This commit is contained in:
admin
2026-06-03 10:58:12 +08:00
parent 0a6a0ece00
commit 3d96bdb706
8 changed files with 665 additions and 266 deletions

View File

@@ -25,7 +25,8 @@ Voxelmorph_Head_CT/
├── infer.py # 独立推理,输出 warped image 与 DDF
├── metrics.py # NCC/MSE/MAE/DDF 等量化指标
├── model_and_train.py # 官方 VoxelMorph 训练适配器
├── preprocess.py # 重采样、窗宽窗位、裁剪/填充
├── prealign.py # 颈部基准 CT 预配准
├── preprocess.py # 单体 CT 重采样、窗宽窗位、裁剪/填充
├── requirements.txt
└── outputs/
├── nifti/ # DICOM 转换结果
@@ -69,23 +70,20 @@ python data_loader.py \
`data_loader.py` 会优先按 `InstanceNumber` 排序,其次按 `SliceLocation` 排序,并保存 spacing、层厚、排序依据等元数据 JSON。
## 2. 预处理
## 2. 颈部预配准
```bash
python preprocess.py \
--input "outputs/nifti/patient1_fixed.nii.gz" \
--output "outputs/preprocessed/patient1_fixed_preprocessed.nii.gz" \
python prealign.py \
--fixed "outputs/nifti/patient1_fixed.nii.gz" \
--moving "outputs/nifti/patient1_moving.nii.gz" \
--fixed-output "outputs/preprocessed/patient1_fixed_preprocessed.nii.gz" \
--moving-output "outputs/preprocessed/patient1_moving_preprocessed.nii.gz" \
--target-spacing 1 1 1 \
--target-shape 256 256 352
python preprocess.py \
--input "outputs/nifti/patient1_moving.nii.gz" \
--output "outputs/preprocessed/patient1_moving_preprocessed.nii.gz" \
--target-spacing 1 1 1 \
--target-shape 256 256 352
--target-shape 320 320 352 \
--metadata-json "outputs/preprocessed/patient1_neck_alignment.json"
```
默认窗口为 `W=400, L=40`,适合观察颈部软组织和气道。
该步骤会先把 Fixed/Moving 重采样到 1mm再基于颈部 foreground mask 估计中心,并将 Moving 平移到 Fixed 的颈部中心,最后在共同颈部空间中裁剪/填充和归一化。默认窗口为 `W=400, L=40`,适合观察颈部软组织和气道。
## 3. 训练
@@ -121,7 +119,7 @@ python infer.py \
- `outputs/inference/ddf_mm.nii.gz`
- `outputs/inference/metrics.json`
`moving_model_input.nii.gz``fixed_model_input.nii.gz` 是进入 VoxelMorph 前的统一网格图像。即使两套 CT 原始层数不同,推理前也会按 checkpoint 的输入尺寸和目标 spacing 完成重采样、归一化、中心裁剪/填充
`moving_model_input.nii.gz``fixed_model_input.nii.gz` 是进入 VoxelMorph 前的统一网格图像。患者1默认先由 `prealign.py` 按颈部中心完成预配准,再进入训练/推理
## 5. Web 结果展示
@@ -132,7 +130,7 @@ streamlit run app.py
网页提供:
- 患者1专用固定路径Fixed 为 `患者1-平扫CT`Moving 为 `患者1-仰头CT`
- “重新训练模型”和“开始推理”按钮。
-颈部预配准+重新训练”和“开始推理”按钮;推理前也会刷新颈部预配准输入
- Axial、Coronal、Sagittal 正交三视图;每个平面按行同时展示 Fixed、Moving、Warped。
- Fixed 与 Warped 的 Alpha 融合或棋盘格对比。
- DDF 位移强度热力图。
@@ -142,4 +140,4 @@ streamlit run app.py
- DICOM 转换和重采样都有 `--max-memory-mb` 防护。
- Web 界面对超大 NIfTI 会通过 nibabel proxy 按 stride 切片读取并下采样,只影响浏览器展示,不改变磁盘结果;侧栏可调整显示体素上限。
- 训练阶段的主要瓶颈是 3D U-Net 显存;`256x256x352` 是较重的 3D 输入,建议优先使用 CUDA GPU。当前患者1默认使用较轻的 `8 8 8 8 8` 特征配置。
- 训练阶段的主要瓶颈是 3D U-Net 显存;`320x320x352` 是较重的 3D 输入,建议优先使用 CUDA GPU。当前患者1默认使用较轻的 `8 8 8 8 8` 特征配置。