Skip to content

Commit be88d3e

Browse files
authored
Epistemic Scoring for monaibundle app (#1109)
1 parent 20f15af commit be88d3e

File tree

3 files changed

+79
-9
lines changed

3 files changed

+79
-9
lines changed

monailabel/utils/others/generic.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,16 +247,17 @@ def get_bundle_models(app_dir, conf, conf_key="models"):
247247

248248
model_dir = os.path.join(app_dir, "model")
249249

250-
zoo_info = get_all_bundles_list()
251250
zoo_source = conf.get("zoo_source", MONAI_ZOO_SOURCE)
252251
zoo_repo = conf.get("zoo_repo", MONAI_ZOO_REPO)
252+
auth_token = conf.get("auth_token", None)
253+
zoo_info = get_all_bundles_list(auth_token=auth_token)
253254

254255
# filter model zoo bundle with MONAI Label supported bundles according to the maintaining list, return all version bundles list
255256
available = [
256257
i[0] + "_v" + v
257258
for i in zoo_info
258259
if i[0] in MAINTAINED_BUNDLES
259-
for v in get_bundle_versions(i[0])["all_versions"]
260+
for v in get_bundle_versions(i[0], auth_token=auth_token)["all_versions"]
260261
]
261262

262263
models = conf.get(conf_key)

sample-apps/monaibundle/README.md

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ Supported tasks update based on [Model-Zoo](https://github.com/Project-MONAI/mod
5050

5151
Note: MONAI Label support labeling bundle models in the MODEL ZOO, non-labeling tasks are not available for MONAI Label.
5252

53+
Note: the monaibundle app uses monai bundle api to get information of latest Model-Zoo. In order to increase the rate limits of calling GIthub APIs, you can input your personal access token.
54+
Please check the following link for more details about rate limiting:
55+
https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting
56+
57+
Set **--conf auth_token <github personal access token>** to increate rate limits.
58+
5359
### How To Use?
5460

5561
```bash
@@ -72,14 +78,38 @@ monailabel start_server --app workspace/monaibundle --studies workspace/images -
7278
monailabel start_server --app workspace/monaibundle --studies workspace/images --conf models spleen_ct_segmentation_v0.1.0 --conf skip_trainers true
7379
```
7480

81+
### Epistemic Scoring for monaibundle app
82+
83+
The monaibundle app supports epistemic scoring using bundles models. The monaibundle consumes **epistemic_model** as config parameter.
84+
If a valid scoring bundle model is provided with **--conf epistemic_model <bundlename>**, scoring inference will be triggered.
85+
The loaded scoring bundle model can be either model-zoo models or local bundles, the network must support **dropout** argument.
86+
87+
```bash
88+
# Use the UNet in spleen_ct_segmentation_v0.2.0 bundle as epistemic scoring model.
89+
# Manual define epistemic scoring parameters
90+
monailabel start_server \
91+
--app workspace/monaibundle \
92+
--studies workspace/images \
93+
--conf models spleen_ct_segmentation_v0.2.0,swin_unetr_btcv_segmentation_v0.2.0 \
94+
--conf epistemic_model spleen_ct_segmentation_v0.2.0
95+
--conf epistemic_max_samples 0 \
96+
--conf epistemic_simulation_size 5
97+
--conf epistemic_dropout 0.2
98+
99+
```
100+
101+
Users can then select active learning strategies for selecting data to label.
102+
75103
#### Additional Configs
76104

77105
Pass them as **--conf _name_ _value_** while starting MONAILabelServer
78106

79-
| Name | Values | Description |
80-
|---------------|-----------------|---------------------------------------------------------------------------------------------|
81-
| zoo_info | string | _Default value:_ https://github.com/Project-MONAI/model-zoo/blob/dev/models/model_info.json |
82-
| zoo_source | string | _Default value:_ github |
83-
| zoo_repo | string | _Default value:_ Project-MONAI/model-zoo/hosting_storage_v1 |
84-
| preload | true, **false** | Preload model into GPU |
85-
| skip_trainers | true, **false** | Skip adding training tasks (Run in Infer mode only) |
107+
| Name | Values | Description |
108+
|---------------------------|-----------------|---------------------------------------------------------------------------------------------|
109+
| zoo_source | string | _Default value:_ github |
110+
| zoo_repo | string | _Default value:_ Project-MONAI/model-zoo/hosting_storage_v1 |
111+
| preload | true, **false** | Preload model into GPU |
112+
| skip_trainers | true, **false** | Skip adding training tasks (Run in Infer mode only) |
113+
| epistemic_max_samples | int | _Default value:_ 0 ; Epistemic scoring parameters |
114+
| epistemic_simulation_size | int | _Default value:_ 5 ; Epistemic simulation size parameters |
115+
| epistemic_dropout | float | _Default value:_ 0.2 ; Epistemic scoring parameters: Dropout rate for scoring models | |

sample-apps/monaibundle/main.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,18 @@
1313
import os
1414
from typing import Dict
1515

16+
from monai.transforms import Invertd, SaveImaged
17+
1618
import monailabel
1719
from monailabel.interfaces.app import MONAILabelApp
1820
from monailabel.interfaces.tasks.infer_v2 import InferTask
21+
from monailabel.interfaces.tasks.scoring import ScoringMethod
1922
from monailabel.interfaces.tasks.strategy import Strategy
2023
from monailabel.interfaces.tasks.train import TrainTask
2124
from monailabel.tasks.activelearning.first import First
2225
from monailabel.tasks.activelearning.random import Random
2326
from monailabel.tasks.infer.bundle import BundleInferTask
27+
from monailabel.tasks.scoring.epistemic_v2 import EpistemicScoring
2428
from monailabel.tasks.train.bundle import BundleTrainTask
2529
from monailabel.utils.others.generic import get_bundle_models, strtobool
2630

@@ -30,6 +34,15 @@
3034
class MyApp(MONAILabelApp):
3135
def __init__(self, app_dir, studies, conf):
3236
self.models = get_bundle_models(app_dir, conf)
37+
# Add Epistemic model for scoring
38+
self.epistemic_models = (
39+
get_bundle_models(app_dir, conf, conf_key="epistemic_model") if conf.get("epistemic_model") else None
40+
)
41+
if self.epistemic_models:
42+
# Get epistemic parameters
43+
self.epistemic_max_samples = int(conf.get("epistemic_max_samples", "0"))
44+
self.epistemic_simulation_size = int(conf.get("epistemic_simulation_size", "5"))
45+
self.epistemic_dropout = float(conf.get("epistemic_dropout", "0.2"))
3346

3447
super().__init__(
3548
app_dir=app_dir,
@@ -74,6 +87,32 @@ def init_strategies(self) -> Dict[str, Strategy]:
7487
logger.info(f"Active Learning Strategies:: {list(strategies.keys())}")
7588
return strategies
7689

90+
def init_scoring_methods(self) -> Dict[str, ScoringMethod]:
91+
methods: Dict[str, ScoringMethod] = {}
92+
if not self.conf.get("epistemic_model"):
93+
return methods
94+
95+
for n, b in self.epistemic_models.items():
96+
# Create BundleInferTask task with dropout instantiation for scoring inference
97+
i = BundleInferTask(
98+
b,
99+
self.conf,
100+
train_mode=True,
101+
skip_writer=True,
102+
dropout=self.epistemic_dropout,
103+
post_filter=[SaveImaged, Invertd],
104+
)
105+
methods[n] = EpistemicScoring(
106+
i, max_samples=self.epistemic_max_samples, simulation_size=self.epistemic_simulation_size
107+
)
108+
if not methods:
109+
continue
110+
methods = methods if isinstance(methods, dict) else {n: methods[n]}
111+
logger.info(f"+++ Adding Scoring Method:: {n} => {b}")
112+
113+
logger.info(f"Active Learning Scoring Methods:: {list(methods.keys())}")
114+
return methods
115+
77116

78117
"""
79118
Example to run train/infer/scoring task(s) locally without actually running MONAI Label Server

0 commit comments

Comments
 (0)