File size: 5,253 Bytes
62a0e4e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
---
trainer:
  class_path: eva.Trainer
  init_args:
    n_runs: &N_RUNS ${oc.env:N_RUNS, 5}
    default_root_dir: &OUTPUT_ROOT ${oc.env:OUTPUT_ROOT, logs/${oc.env:MODEL_NAME, vit_small_patch16_224_dino}/monusac}
    max_steps: &MAX_STEPS ${oc.env:MAX_STEPS, 2000}
    log_every_n_steps: 6
    checkpoint_type: ${oc.env:CHECKPOINT_TYPE, best}
    devices: ${oc.env:NUM_DEVICES, 1}
    callbacks:
      - class_path: eva.callbacks.ConfigurationLogger
      - class_path: lightning.pytorch.callbacks.TQDMProgressBar
        init_args:
          refresh_rate: ${oc.env:TQDM_REFRESH_RATE, 1}
      - class_path: eva.vision.callbacks.SemanticSegmentationLogger
        init_args:
          log_every_n_epochs: 1
          mean: &NORMALIZE_MEAN ${oc.env:NORMALIZE_MEAN, [0.485, 0.456, 0.406]} 
          std: &NORMALIZE_STD ${oc.env:NORMALIZE_STD, [0.229, 0.224, 0.225]}
      - class_path: lightning.pytorch.callbacks.ModelCheckpoint
        init_args:
          filename: best
          save_last: ${oc.env:SAVE_LAST, false}
          save_top_k: 1
          monitor: &MONITOR_METRIC ${oc.env:MONITOR_METRIC, 'val/MonaiDiceScore'}
          mode: &MONITOR_METRIC_MODE ${oc.env:MONITOR_METRIC_MODE, max}
      - class_path: lightning.pytorch.callbacks.EarlyStopping
        init_args:
          min_delta: 0
          patience: ${oc.env:PATIENCE, 100}
          monitor: *MONITOR_METRIC
          mode: *MONITOR_METRIC_MODE
    logger:
      - class_path: lightning.pytorch.loggers.TensorBoardLogger
        init_args:
          save_dir: *OUTPUT_ROOT
          name: ""
model:
  class_path: eva.vision.models.modules.SemanticSegmentationModule
  init_args:
    encoder:
      class_path: eva.core.models.wrappers.TorchHubModel
      init_args:
        repo_or_dir: facebookresearch/dinov2 
        model_name: dinov2_vitg14_reg 
        pretrained: true
        out_indices: 1
        checkpoint_path: ${oc.env:CHECKPOINT_PATH, ../checkpoints/teacher_epoch250000.pth}

    decoder:
      class_path: eva.vision.models.networks.decoders.segmentation.ConvDecoderWithImage
      init_args:
        in_features: ${oc.env:IN_FEATURES, 1536}
        num_classes: &NUM_CLASSES 5
    criterion:
      class_path: eva.vision.losses.DiceLoss
      init_args:
        softmax: true
        batch: true
        ignore_index: &IGNORE_INDEX 5
    lr_multiplier_encoder: 0.0
    optimizer:
      class_path: torch.optim.AdamW
      init_args:
        lr: ${oc.env:LR_VALUE, 0.002}
    postprocess:
      predictions_transforms:
        - class_path: torch.argmax
          init_args:
            dim: 1
    metrics:
      common:
        - class_path: eva.metrics.AverageLoss
      evaluation:
        - class_path: eva.vision.metrics.defaults.MulticlassSegmentationMetrics
          init_args:
            num_classes: 6
            ignore_index: *IGNORE_INDEX
        - class_path: torchmetrics.ClasswiseWrapper
          init_args:
            metric:
              class_path: eva.vision.metrics.MonaiDiceScore
              init_args:
                include_background: true
                num_classes: 6
                reduction: none
                ignore_index: *IGNORE_INDEX
            labels:
              - background
              - epithelial
              - lymphocyte
              - neutrophil
              - macrophage
              - ambiguous
data:
  class_path: eva.DataModule
  init_args:
    datasets:
      train:
        class_path: eva.vision.datasets.MoNuSAC
        init_args: &DATASET_ARGS
          root: ${oc.env:DATA_ROOT, /block/eva-data/monusac}
          split: train
          download: ${oc.env:DOWNLOAD_DATA, false}
          # Set `download: true` to download the dataset from https://monusac-2020.grand-challenge.org/Data/
          # The MoNuSAC dataset is distributed under the following license: 
          # "Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International"
          # (see: https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode)
          transforms:
            class_path: torchvision.transforms.v2.Compose
            init_args:
              transforms:
                - class_path: torchvision.transforms.v2.RandomResizedCrop
                  init_args:
                    size: ${oc.env:RESIZE_DIM, 224}                    
                - class_path: torchvision.transforms.v2.ToDtype
                  init_args:
                    dtype: torch.float32
                    scale: true
                - class_path: torchvision.transforms.v2.Normalize
                  init_args:
                    mean: *NORMALIZE_MEAN
                    std: *NORMALIZE_STD
      val:
        class_path: eva.vision.datasets.MoNuSAC
        init_args:
          <<: *DATASET_ARGS
          split: test
          transforms:
            class_path: eva.vision.data.transforms.common.ResizeAndCrop
            init_args:
              size: ${oc.env:RESIZE_DIM, 224}
              mean: *NORMALIZE_MEAN
              std: *NORMALIZE_STD
    dataloaders:
      train:
        batch_size: &BATCH_SIZE ${oc.env:BATCH_SIZE, 64}
        num_workers: &N_DATA_WORKERS ${oc.env:N_DATA_WORKERS, 4}
        shuffle: true
      val:
        batch_size: *BATCH_SIZE
        num_workers: *N_DATA_WORKERS