cyd0806's picture
Document batched waterz evaluation
1a2ecca verified
|
Raw
History Blame Contribute Delete
5.54 kB
# dbMiM 神经元分割
[English](README.md) | [Hugging Face 权重](https://huggingface.co/cyd0806/dbmim-neuron-segmentation)
这是 dbMiM 预训练和 CREMI 神经元分割的官方实现仓库。当前维护流程是:
1. 准备未标注 EM 体数据;
2. 运行 dbMiM / MAE 风格 masked-image 预训练;
3. 在 CREMI 上微调各向异性 3D UNETR affinity 网络;
4. 在 CREMI A/B/C 全体积上计算 VOI 和 adapted Rand error (ARAND);
5. 使用 waterz 作为参考实例分割后处理。
可学习 / 可微后处理作为独立方法维护在:
https://github.com/ydchen0806/nnEM-Seg-diff-postprocess。
## 方法
分割模型为 `UNETRAnisotropicAffinityNet`
- 输入 crop:`32 x 160 x 160`
- Patch size:`(4, 16, 16)`
- 输出:z/y/x 最近邻 affinity logits
- Backbone:由 dbMiM 预训练初始化的 ViT encoder
- Decoder:UNETR 分阶段上采样,并加入各向异性 z transition
- 微调损失:MSE + membrane-aware spatial weighting (MAWS)
- 评测:CREMI A/B/C 全体积推理,`ignore_label=0`,boundary ignore 为 `xy=1, z=0`
dbMiM 预训练对 3D ViT patch 做 mask,并重建 EM voxel;训练中使用
membrane-aware weighting 和轻量 structure-consistency term。plain MAE 控制组使用
相同数据、模型大小、crop、mask ratio 和 schedule,只关闭 dbMiM-specific term。
## 结果
VOI 和 ARAND 都是越低越好。
| Run | 权重 | VOI | ARAND | 说明 |
|---|---|---:|---:|---|
| R48 | `weights/publicem_dbmim_r48_seed309_long20k/finetuned_latest.pt` | **0.962154** | 0.178252 | VOI 最好 |
| R57 | `weights/publicem_dbmim_r57_seed777_long20k/finetuned_latest.pt` | 0.964617 | **0.178248** | repeat sweep 中 ARAND 最好 |
| R33 | `weights/fullem_mixedmask_dbmim_r33/finetuned_latest.pt` | 1.039372 | 0.205380 | fullEM 最好 recipe |
这里的验证集是公开 CREMI A/B/C training volumes,不使用 hidden challenge label。
## 权重
权重托管在 Hugging Face:
https://huggingface.co/cyd0806/dbmim-neuron-segmentation
| 文件 | 用途 |
|---|---|
| `weights/publicem_dbmim_r48_seed309_long20k/finetuned_latest.pt` | 推荐分割权重 |
| `weights/publicem_dbmim_r57_seed777_long20k/finetuned_latest.pt` | ARAND 最好 repeat 权重 |
| `weights/publicem_dbmim_r17/pretrained_latest.pt` | PublicEM dbMiM encoder 预训练权重 |
| `weights/publicem_dbmim_r17/finetuned_latest.pt` | 早期 publicEM 微调权重 |
| `weights/fullem_mixedmask_dbmim_r33/pretrained_latest.pt` | FullEM mixed-mask 预训练权重 |
| `weights/fullem_mixedmask_dbmim_r33/finetuned_latest.pt` | FullEM mixed-mask 微调权重 |
下载示例:
```python
from huggingface_hub import snapshot_download
snapshot_download(
repo_id="cyd0806/dbmim-neuron-segmentation",
local_dir="weights/dbmim-neuron-segmentation",
)
```
## 环境
```bash
git clone https://github.com/ydchen0806/dbMiM.git
cd dbMiM
python -m pip install -r requirements-dbMIM.txt
```
waterz 对训练不是必需的,但复现实例分割指标需要安装 waterz。
## 数据
CREMI 微调和评测默认读取:
```text
data/CREMI/sample_A_20160501.hdf
data/CREMI/sample_B_20160501.hdf
data/CREMI/sample_C_20160501.hdf
```
准备 publicEM 预训练数据:
```bash
python scripts/prepare_public_em_pretrain_data.py \
--target-dir data/EM_pretrain_data
```
准备 fullEM 预训练数据:
```bash
HF_TOKEN=<your_token> python scripts/prepare_em_pretrain_data.py \
--target-dir data/EM_pretrain_data
```
## 预训练
PublicEM dbMiM:
```bash
python train_pretrain.py \
--config configs/pretrain_public_em_membrane_r16.yaml
```
FullEM mixed-mask:
```bash
python train_pretrain.py \
--config configs/pretrain_em_full_mixedmask_dbmim_r33.yaml
```
## 微调
推荐 R48 微调:
```bash
python train_finetune.py \
--config configs/finetune_cremi_real_unetr_aniso_em_mse_maws_publicem_r16_seed309_long20k_r48q.yaml
```
如果权重不在 `outputs/` 下,需要同步修改 config 中的预训练权重路径。
## 评测
CREMI A/B/C 全体积 waterz 评测:
```bash
python scripts/evaluate_cremi_segmentation.py \
--config configs/finetune_cremi_real_unetr_aniso_em_mse_maws_publicem_r16_seed309_long20k_r48q.yaml \
--checkpoint outputs/finetune_cremi_real_unetr_aniso_em_mse_maws_publicem_r16_seed309_long20k_r48q/finetuned_latest.pt \
--data-dir data/CREMI \
--output-dir outputs/eval_r48_cremi_abc \
--crop-size 0 0 0 \
--stride 16 80 80 \
--backends waterz \
--thresholds 0.16 0.18 0.20 0.22 0.24 \
--calibration-biases -0.25 -0.50 -0.50 \
--seed-method maxima_distance \
--seed-distance 10 \
--boundary-threshold 0.5 \
--waterz-scoring hist_quantile \
--batched-waterz \
--metric-backend skimage \
--ignore-label 0 \
--cremi-boundary-ignore-distance-xy 1 \
--cremi-boundary-ignore-distance-z 0 \
--device cuda
```
`--batched-waterz` 会在同一次 waterz hierarchy 中评测多个 threshold。它保持
R48 的 VOI 不变(`0.962154`),并把 CREMI A/B/C threshold sweep 的后处理时间
从约 `75s` 降到约 `17s`
结果写入:
```text
outputs/eval_r48_cremi_abc/cremi_segmentation_summary.json
```
## 目录
```text
dbmim/ 模型、数据、指标和工具
configs/ 预训练和微调配置
scripts/prepare_*_data.py 数据准备
scripts/evaluate_*.py CREMI 评测
train_pretrain.py dbMiM / MAE 预训练
train_finetune.py CREMI affinity 微调
```
大数据、权重和生成结果不进入 Git。