samihs-ich-segmentation / README_local.md
MooreMuaMu's picture
Add SAMIHS ICH segmentation package
29aaa12 verified
|
Raw
History Blame Contribute Delete
3.66 kB
# SAMIHS ICH Segmentation Package
本目录封装当前项目中正在使用的 SAMIHS 出血分割模型,提供一个稳定的单例接口:输入 3D brain CT NIfTI,输出二值化出血 label NIfTI。
## Contents
| Path | Description |
|---|---|
| `segment_ich.py` | 单个 3D CT NIfTI 到 binary mask NIfTI 的 CLI/API wrapper。 |
| `weights/SAMIHS_09170527_2_0.483.pth` | 当前使用的 SAMIHS 权重软链接。 |
| `scripts/run_segment_example.sh` | 命令行调用示例。 |
| `INPUT_SPEC.md` | 输入格式、灰度值分布、方向和 slice axis 要求。 |
依赖的原始 SAMIHS 工程默认路径:
```text
/data/wxh/Medical/to_cfff/metrics/brain_bleed/SAMIHS
```
当前默认权重源路径:
```text
/data/wxh/Medical/to_cfff/metrics/brain_bleed/SAMIHS/ckpts/Extended_add_neg_210/SAMIHS_09170527_2_0.483.pth
```
## CLI Usage
```bash
/data/wxh/miniconda3/envs/flowmatching/bin/python \
/data/wxh/Medical/samihs_ich_segmentation_package/segment_ich.py \
--input /path/to/brain_ct.nii.gz \
--output /path/to/brain_ct_ich_mask.nii.gz \
--device cuda:0 \
--batch-size 8 \
--threshold 0.5
```
输出是与输入 shape/affine 一致的 `uint8` NIfTI,取值为 `0/1`
## Input Requirements
详细要求见 [INPUT_SPEC.md](INPUT_SPEC.md)。重点如下:
- 输入必须是单个 3D CT NIfTI,`.nii``.nii.gz`
- 不支持 DICOM 文件夹、4D NIfTI、多通道图像。
- 像素值应是有限数值,不能含 NaN/Inf。
- 推荐输入是与项目数据一致的轴位脑 CT,例如 `/data2/gzk/256_standardized_brain_rescale/**/*.nii`
- wrapper 会逐 slice 做 `0.5%-99.5%` percentile clipping 和 min-max normalization,因此模型不直接使用绝对 HU 阈值。
- 默认 `--slice-axis auto` 会把最小维度作为 depth/slice 轴;如果输入不是这种排列,需要显式指定 `--slice-axis 0/1/2`
- wrapper 不会根据 NIfTI affine 自动重排方向;模型使用的是数组切片顺序。输入方向应与项目标准 CT 一致。
## Python API
```python
from pathlib import Path
from segment_ich import segment_nii
metadata = segment_nii(
input_nii=Path("/path/to/brain_ct.nii.gz"),
output_nii=Path("/path/to/brain_ct_ich_mask.nii.gz"),
device="cuda:0",
batch_size=8,
threshold=0.5,
)
print(metadata)
```
## Method
1. 读取 3D NIfTI。
2. 自动选择 slice axis:默认选择最小维度作为 depth/slice 维度;也可用 `--slice-axis 0/1/2` 显式指定。
3. 对每个 2D slice 做 percentile clipping,默认 `0.5%``99.5%`,再 min-max normalize 到 `[0,1]`
4. resize 到 `1024x1024`,按原 SAMIHS 推理约定做 `rot90` 方向校正。
5. SAMIHS 输出 logits,`sigmoid` 得概率图。
6. 概率图旋回并 resize 回原始 slice 尺寸。
7. `prob >= 0.5` 得 binary mask,堆回原始 3D shape。
## Important Parameters
| Parameter | Default | Meaning |
|---|---:|---|
| `--threshold` | `0.5` | 概率二值化阈值。 |
| `--encoder-input-size` | `1024` | SAMIHS 2D encoder 输入尺寸。 |
| `--batch-size` | `8` | slice-level batch size;1024 输入下该值在当前 44GB GPU 上稳定。 |
| `--slice-axis` | `auto` | slice/depth 轴;默认取最小维度。 |
| `--no-rotate` | off | 关闭原 SAMIHS 推理中的 rot90 方向校正,一般不建议。 |
## Notes
- 该模型是 2D slice segmentation,不是 3D UNet;3D mask 是逐 slice 推理后堆叠得到。
- 权重文件在本包中是软链接,避免重复占用 359MB。如需迁移到其他机器,需要同时复制原始 SAMIHS 工程和权重文件。
- 如果出现 CUDA OOM,优先减小 `--batch-size`,例如 `4``2`