Skip to content

Commit 95ecf15

Browse files
author
Qin Liu
committed
Refactor
1 parent 0bbb207 commit 95ecf15

10 files changed

+53
-46
lines changed

.gitignore

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
*ivs-demo
22

33
# Models
4-
weights/
4+
*weights
5+
*data
56
*saves
67
*results
78
*.pth
@@ -10,7 +11,7 @@ weights/
1011
# Data
1112
*videos
1213
*volumes
13-
workspace/
14+
*workspace
1415
*nii.gz
1516

1617
# Byte-compiled / optimized / DLL files

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ pip3 install -r requirements.txt
4141
```
4242

4343
## Getting Started
44-
First, download model weights and a medical volume for demo purposes. All downloaded data will be saved in a folder named ``saves``.
44+
First, download AbdomenCT-1K and model weights. AbdomenCT-1K will be saved in the ``data`` folder; model weight will be saved in the ``saves`` folder. AbdomenCT-1K can also be downloaded from the official [webset](https://github.com/JunMa11/AbdomenCT-1K).
4545
```
4646
python download.py
4747
```
48-
Then run a demo:
48+
Unzip the AbdomenCT-1K in the ``data`` folder accordingly. Then run a demo:
4949
```
5050
./run_demo.sh
5151
```

download.py

+10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
import gdown
33

4+
# download models
45
save_folder ='saves'
56
os.makedirs(save_folder, exist_ok=True)
67

@@ -36,3 +37,12 @@
3637
weight_fusion_stcn_url = 'https://drive.google.com/uc?id=1hf3yHizbgcOQx6LLFCX_rvHR30p4ioVp'
3738
output = f'{save_folder}/fusion_stcn.pth'
3839
gdown.download(weight_fusion_stcn_url, output, quiet=False)
40+
41+
# download data
42+
data_folder ='data'
43+
os.makedirs(data_folder, exist_ok=True)
44+
45+
# AbdomenCT-1k
46+
data_url = 'https://drive.google.com/uc?id=1RBvKJ5eGRG5BUK4F3NUpLopuP-_cLjKC'
47+
output = f'{data_folder}/AbdomenCT-1K.zip'
48+
gdown.download(data_url, output, quiet=False)

maskprop/Med-STCN/abdomen1k-evaluation/evaluation_method.py

+11-26
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from argparse import ArgumentParser
12
import numpy as np
23
import os
34
from os import path
@@ -6,7 +7,6 @@
67
import pandas as pd
78

89

9-
1010
def evaluate(gt_folder, seg_folder, dataset_file, label):
1111

1212
videos = []
@@ -33,10 +33,9 @@ def evaluate(gt_folder, seg_folder, dataset_file, label):
3333

3434
# calculate J, M, and DSC across frames
3535
gt_frame_label = np.zeros_like(gt_frame)
36-
gt_frame_label[gt_frame == label] = 1
36+
gt_frame_label[gt_frame == int(label)] = 1
3737
if np.count_nonzero(gt_frame_label) > 10:
3838
seg_frame_label = np.zeros_like(seg_frame)
39-
# seg_frame_label[seg_frame == label] = 1
4039
seg_frame_label[seg_frame > 0] = 1
4140
iou_label = db_eval_iou(gt_frame_label, seg_frame_label)
4241
iou_single_video_label.append(iou_label)
@@ -90,27 +89,13 @@ def evaluate(gt_folder, seg_folder, dataset_file, label):
9089

9190
if __name__ == '__main__':
9291

93-
data_root_folder = '/playpen-raid2/qinliu/data/AbdomenCT-1K/Organ-12-Subset_frames/trainval'
94-
# data_root_folder = '/playpen-raid2/qinliu/data/MSD/Task02_Heart_frames/trainval'
95-
96-
gt_folder = f'{data_root_folder}/Annotations/480p'
97-
dataset_file = f'{data_root_folder}/ImageSets/val.txt'
98-
99-
# seg_root_folder = '/playpen-raid2/qinliu/projects/iSegFormer/maskprop/Med-STCN/results'
100-
# seg_root_folder = '/playpen-raid2/qinliu/projects/iSegFormer/maskprop/Med-STCN/results/MSD'
101-
# for label in range(1, 2):
102-
# seg_folder = f'{seg_root_folder}/stcn/label_{label}'
103-
# evaluate(gt_folder, seg_folder, dataset_file, label)
104-
105-
# for label in range(1, 2):
106-
# seg_folder = f'{seg_root_folder}/stcn_med_abdomen1k_Aug01_15.34.08_ft_s012_10k_no_cc/label_{label}'
107-
# evaluate(gt_folder, seg_folder, dataset_file, label)
108-
109-
# for label in range(1, 2):
110-
# seg_folder = f'{seg_root_folder}/stcn_med_abdomen1k_Aug01_22.03.33_ft_s012_10k_cc/label_{label}'
111-
# evaluate(gt_folder, seg_folder, dataset_file, label)
92+
parser = ArgumentParser()
93+
parser.add_argument('--data_folder')
94+
parser.add_argument('--seg_folder')
95+
parser.add_argument('--label')
96+
args = parser.parse_args()
11297

113-
label=12
114-
seg_root_folder = '/playpen-raid2/qinliu/projects/STM/test/ABD_STMval'
115-
seg_folder = f'{seg_root_folder}/label_{label}'
116-
evaluate(gt_folder, seg_folder, dataset_file, label)
98+
gt_folder = f'{args.data_folder}/trainval/Annotations/480p'
99+
dataset_file = f'{args.data_folder}/trainval/ImageSets/val.txt'
100+
seg_folder = f'{args.seg_folder}/label_{args.label}'
101+
evaluate(gt_folder, seg_folder, dataset_file, args.label)

maskprop/Med-STCN/eval_med_stcn.py

+9-12
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,25 @@
1+
from argparse import ArgumentParser
2+
import numpy as np
13
import os
24
from os import path
5+
from PIL import Image
36
import time
4-
from argparse import ArgumentParser
5-
67
import torch
78
import torch.nn.functional as F
89
from torch.utils.data import DataLoader
9-
import numpy as np
10-
from PIL import Image
10+
from tqdm import tqdm
1111

1212
from model.eval_network import STCN
1313
from dataset.med_test_dataset import MedTestDataset
1414
from util.tensor_util import unpad
1515
from inference_core import InferenceCore
1616

17-
from progressbar import progressbar
18-
19-
2017
"""
2118
Arguments loading
2219
"""
2320
parser = ArgumentParser()
24-
parser.add_argument('--model', default='saves/stcn.pth')
25-
parser.add_argument('--med_path', default='/playpen-raid2/qinliu/data/AbdomenCT-1K/Organ-12-Subset_frames')
21+
parser.add_argument('--model')
22+
parser.add_argument('--med_path')
2623
parser.add_argument('--output')
2724
parser.add_argument('--split', help='val', default='val')
2825
parser.add_argument('--top', type=int, default=20)
@@ -36,7 +33,7 @@
3633

3734
# Simple setup
3835
os.makedirs(out_path, exist_ok=True)
39-
palette = Image.open(path.expanduser(f'/playpen-raid2/qinliu/data/AbdomenCT-1K/Organ-12-Subset_frames/trainval/Annotations/480p/Organ12_0001/0000000.png')).getpalette()
36+
palette = Image.open(path.expanduser(f'{args.med_path}/trainval/Annotations/480p/Organ12_0001/0000000.png')).getpalette()
4037

4138
torch.autograd.set_grad_enabled(False)
4239

@@ -67,8 +64,8 @@ def evaluate_single_label(label):
6764
total_frames = 0
6865

6966
# start evaluation. Only 1 round propagation.
70-
for data in progressbar(test_loader, max_value=len(test_loader), redirect_stdout=True):
71-
67+
# for data in progressbar(test_loader, max_value=len(test_loader), redirect_stdout=True):
68+
for data in tqdm(test_loader):
7269
with torch.cuda.amp.autocast(enabled=args.amp):
7370
# example shape
7471
# rgb: [1, T, 3, 480, 480]; msk: [N, T, 1, 480, 480]

maskprop/Med-STCN/util/hyper_para.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,11 @@ def parse(self, unknown_arg_ok=False):
1313
parser.add_argument('--no_amp', action='store_true')
1414

1515
# Data parameters
16-
parser.add_argument('--static_root', help='Static training data root', default='../static')
17-
parser.add_argument('--bl_root', help='Blender training data root', default='../BL30K')
16+
parser.add_argument('--static_root', help='Static training data root', default='/work/data/static')
17+
parser.add_argument('--bl_root', help='Blender training data root', default='/work/data/BL30K')
1818
parser.add_argument('--yv_root', help='YouTubeVOS data root', default='/work/data/YouTube')
1919
parser.add_argument('--davis_root', help='DAVIS data root', default='/work/data/DAVIS')
20-
parser.add_argument('--abd1k_root', help='Abdomen1k data root',
21-
default='/playpen-raid2/qinliu/data/AbdomenCT-1K/Organ-12-Subset_finetune')
20+
parser.add_argument('--abd1k_root', help='Abdomen1k data root', default='/work/data/adb1k')
2221

2322
parser.add_argument('--stage', help='Training stage (0-static images, 1-Blender dataset, 2-DAVIS+YouTubeVOS (300K), 3-DAVIS+YouTubeVOS (150K))', type=int, default=0)
2423
parser.add_argument('--num_workers', help='Number of datalaoder workers per process', type=int, default=8)

requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
progressbar

run_eval_stcn.sh

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
python3 ./maskprop/Med-STCN/eval_med_stcn.py \
3+
--model ./saves/stcn_ft_with_cycle.pth \
4+
--med_path ./data/AbdomenCT-1K/Organ-12-Subset_frames \
5+
--output ./results \
6+
--include_last
7+
8+
# calcualte the segmentation metrics for an assigned label
9+
python ./maskprop/Med-STCN/abdomen1k-evaluation/evaluation_method.py \
10+
--data_folder ./data/AbdomenCT-1K/Organ-12-Subset_frames \
11+
--seg_folder ./results \
12+
--label 1 # Set label from 1 to 12 for 12 organs AbdomenCT-1K

run_train_stcn_with_cycle.sh

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
torchrun ./maskprop/Med-STCN/train.py \
55
--id retrain_s4_ft_from_med \
66
--load_network ./saves/stcn.pth \
7+
--abd1k_root ./data/AbdomenCT-1K/Organ-12-Subset_finetune \
78
--stage 4 \
89
--batch_size 10 \
910
--iterations 10000 \

run_train_stcn_without_cycle.sh

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
torchrun ./maskprop/Med-STCN/train.py \
55
--id retrain_s4_ft_from_med \
66
--load_network ./saves/stcn.pth \
7+
--abd1k_root ./data/AbdomenCT-1K/Organ-12-Subset_finetune \
78
--stage 4 \
89
--batch_size 10 \
910
--iterations 10000 \

0 commit comments

Comments
 (0)