Add neck-based CT prealignment before VoxelMorph
This commit is contained in:
30
README.md
30
README.md
@@ -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` 特征配置。
|
||||
|
||||
Reference in New Issue
Block a user