kaiko-eva 0.4.0__py3-none-any.whl → 0.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kaiko-eva might be problematic. Click here for more details.
- eva/core/callbacks/config.py +11 -6
- eva/core/callbacks/writers/embeddings/base.py +44 -10
- eva/core/data/samplers/classification/balanced.py +24 -12
- eva/core/loggers/utils/wandb.py +4 -1
- eva/core/trainers/trainer.py +11 -1
- eva/core/utils/__init__.py +2 -1
- eva/core/utils/distributed.py +12 -0
- eva/core/utils/paths.py +14 -0
- eva/core/utils/requirements.py +52 -6
- eva/language/callbacks/writers/prediction.py +44 -19
- eva/language/data/datasets/classification/pubmedqa.py +1 -1
- eva/language/models/modules/language.py +7 -6
- eva/language/models/typings.py +19 -2
- eva/language/models/wrappers/base.py +4 -4
- eva/language/models/wrappers/huggingface.py +14 -4
- eva/language/models/wrappers/litellm.py +14 -4
- eva/multimodal/models/modules/vision_language.py +6 -5
- eva/multimodal/models/networks/alibaba.py +1 -0
- eva/multimodal/models/networks/others.py +2 -1
- eva/multimodal/models/wrappers/base.py +4 -3
- eva/multimodal/models/wrappers/huggingface.py +26 -13
- eva/multimodal/models/wrappers/litellm.py +4 -2
- eva/multimodal/utils/batch/__init__.py +5 -0
- eva/multimodal/utils/batch/unpack.py +11 -0
- eva/vision/data/datasets/classification/breakhis.py +5 -8
- eva/vision/data/datasets/classification/panda.py +12 -5
- eva/vision/data/datasets/segmentation/btcv.py +1 -1
- eva/vision/data/datasets/segmentation/consep.py +1 -1
- eva/vision/data/datasets/segmentation/lits17.py +1 -1
- eva/vision/data/datasets/segmentation/monusac.py +15 -6
- eva/vision/data/datasets/segmentation/msd_task7_pancreas.py +1 -1
- eva/vision/data/transforms/base/__init__.py +2 -1
- eva/vision/data/transforms/base/monai.py +2 -2
- eva/vision/data/transforms/base/torchvision.py +33 -0
- eva/vision/data/transforms/common/squeeze.py +6 -3
- eva/vision/data/transforms/croppad/crop_foreground.py +8 -7
- eva/vision/data/transforms/croppad/rand_crop_by_label_classes.py +6 -5
- eva/vision/data/transforms/croppad/rand_crop_by_pos_neg_label.py +6 -5
- eva/vision/data/transforms/croppad/rand_spatial_crop.py +8 -7
- eva/vision/data/transforms/croppad/spatial_pad.py +6 -6
- eva/vision/data/transforms/intensity/rand_scale_intensity.py +3 -3
- eva/vision/data/transforms/intensity/rand_shift_intensity.py +3 -3
- eva/vision/data/transforms/intensity/scale_intensity_ranged.py +5 -5
- eva/vision/data/transforms/spatial/flip.py +8 -7
- eva/vision/data/transforms/spatial/resize.py +5 -4
- eva/vision/data/transforms/spatial/rotate.py +8 -7
- eva/vision/data/transforms/spatial/spacing.py +7 -6
- eva/vision/data/transforms/utility/ensure_channel_first.py +6 -6
- eva/vision/models/networks/backbones/universal/vit.py +24 -0
- {kaiko_eva-0.4.0.dist-info → kaiko_eva-0.4.1.dist-info}/METADATA +8 -2
- {kaiko_eva-0.4.0.dist-info → kaiko_eva-0.4.1.dist-info}/RECORD +54 -49
- {kaiko_eva-0.4.0.dist-info → kaiko_eva-0.4.1.dist-info}/WHEEL +0 -0
- {kaiko_eva-0.4.0.dist-info → kaiko_eva-0.4.1.dist-info}/entry_points.txt +0 -0
- {kaiko_eva-0.4.0.dist-info → kaiko_eva-0.4.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -56,19 +56,20 @@ class RandCropByLabelClasses(base.RandomMonaiTransform):
|
|
|
56
56
|
def set_random_state(self, seed: int) -> None:
|
|
57
57
|
self._rand_crop.set_random_state(seed)
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
@override
|
|
60
|
+
def make_params(self, flat_inputs: List[Any]) -> Dict[str, Any]:
|
|
60
61
|
mask = next(inpt for inpt in flat_inputs if isinstance(inpt, tv_tensors.Mask))
|
|
61
62
|
self._rand_crop.randomize(label=mask)
|
|
62
63
|
return {}
|
|
63
64
|
|
|
64
65
|
@functools.singledispatchmethod
|
|
65
66
|
@override
|
|
66
|
-
def
|
|
67
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
67
68
|
return inpt
|
|
68
69
|
|
|
69
|
-
@
|
|
70
|
-
@
|
|
71
|
-
@
|
|
70
|
+
@transform.register(tv_tensors.Image)
|
|
71
|
+
@transform.register(eva_tv_tensors.Volume)
|
|
72
|
+
@transform.register(tv_tensors.Mask)
|
|
72
73
|
def _(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
73
74
|
inpt_foreground_crops = self._rand_crop(img=inpt, randomize=False)
|
|
74
75
|
return [tv_tensors.wrap(crop, like=inpt) for crop in inpt_foreground_crops]
|
|
@@ -95,19 +95,20 @@ class RandCropByPosNegLabel(base.RandomMonaiTransform):
|
|
|
95
95
|
def set_random_state(self, seed: int) -> None:
|
|
96
96
|
self._rand_crop.set_random_state(seed)
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
@override
|
|
99
|
+
def make_params(self, flat_inputs: List[Any]) -> Dict[str, Any]:
|
|
99
100
|
mask = next(inpt for inpt in flat_inputs if isinstance(inpt, tv_tensors.Mask))
|
|
100
101
|
self._rand_crop.randomize(label=mask)
|
|
101
102
|
return {}
|
|
102
103
|
|
|
103
104
|
@functools.singledispatchmethod
|
|
104
105
|
@override
|
|
105
|
-
def
|
|
106
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
106
107
|
return inpt
|
|
107
108
|
|
|
108
|
-
@
|
|
109
|
-
@
|
|
110
|
-
@
|
|
109
|
+
@transform.register(tv_tensors.Image)
|
|
110
|
+
@transform.register(eva_tv_tensors.Volume)
|
|
111
|
+
@transform.register(tv_tensors.Mask)
|
|
111
112
|
def _(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
112
113
|
inpt_foreground_crops = self._rand_crop(img=inpt, randomize=False)
|
|
113
114
|
return [tv_tensors.wrap(crop, like=inpt) for crop in inpt_foreground_crops]
|
|
@@ -5,14 +5,14 @@ from typing import Any, Dict, List, Sequence, Tuple
|
|
|
5
5
|
|
|
6
6
|
from monai.transforms.croppad import array as monai_croppad_transforms
|
|
7
7
|
from torchvision import tv_tensors
|
|
8
|
-
from torchvision.transforms import v2
|
|
9
8
|
from torchvision.transforms.v2 import _utils as tv_utils
|
|
10
9
|
from typing_extensions import override
|
|
11
10
|
|
|
12
11
|
from eva.vision.data import tv_tensors as eva_tv_tensors
|
|
12
|
+
from eva.vision.data.transforms import base
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
class RandSpatialCrop(
|
|
15
|
+
class RandSpatialCrop(base.TorchvisionTransformV2):
|
|
16
16
|
"""Crop image with random size or specific size ROI.
|
|
17
17
|
|
|
18
18
|
It can crop at a random position as center or at the image center.
|
|
@@ -62,19 +62,20 @@ class RandSpatialCrop(v2.Transform):
|
|
|
62
62
|
"""Set the random state for the transform."""
|
|
63
63
|
self._rand_spatial_crop.set_random_state(seed)
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
@override
|
|
66
|
+
def make_params(self, flat_inputs: List[Any]) -> Dict[str, Any]:
|
|
66
67
|
t, h, w = tv_utils.query_chw(flat_inputs)
|
|
67
68
|
self._rand_spatial_crop.randomize((t, h, w))
|
|
68
69
|
return {}
|
|
69
70
|
|
|
70
71
|
@functools.singledispatchmethod
|
|
71
72
|
@override
|
|
72
|
-
def
|
|
73
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
73
74
|
return inpt
|
|
74
75
|
|
|
75
|
-
@
|
|
76
|
-
@
|
|
77
|
-
@
|
|
76
|
+
@transform.register(tv_tensors.Image)
|
|
77
|
+
@transform.register(eva_tv_tensors.Volume)
|
|
78
|
+
@transform.register(tv_tensors.Mask)
|
|
78
79
|
def _(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
79
80
|
slices = self._get_crop_slices()
|
|
80
81
|
inpt_rand_crop = self._cropper(inpt, slices=slices)
|
|
@@ -6,13 +6,13 @@ from typing import Any, Dict, Sequence
|
|
|
6
6
|
from monai.transforms.croppad import array as monai_croppad_transforms
|
|
7
7
|
from monai.utils.enums import Method, PytorchPadMode
|
|
8
8
|
from torchvision import tv_tensors
|
|
9
|
-
from torchvision.transforms import v2
|
|
10
9
|
from typing_extensions import override
|
|
11
10
|
|
|
12
11
|
from eva.vision.data import tv_tensors as eva_tv_tensors
|
|
12
|
+
from eva.vision.data.transforms import base
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
class SpatialPad(
|
|
15
|
+
class SpatialPad(base.TorchvisionTransformV2):
|
|
16
16
|
"""Performs padding to the data.
|
|
17
17
|
|
|
18
18
|
Padding is applied symmetric for all sides or all on one side for each dimension.
|
|
@@ -56,12 +56,12 @@ class SpatialPad(v2.Transform):
|
|
|
56
56
|
|
|
57
57
|
@functools.singledispatchmethod
|
|
58
58
|
@override
|
|
59
|
-
def
|
|
59
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
60
60
|
return inpt
|
|
61
61
|
|
|
62
|
-
@
|
|
63
|
-
@
|
|
64
|
-
@
|
|
62
|
+
@transform.register(tv_tensors.Image)
|
|
63
|
+
@transform.register(eva_tv_tensors.Volume)
|
|
64
|
+
@transform.register(tv_tensors.Mask)
|
|
65
65
|
def _(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
66
66
|
inpt_padded = self._spatial_pad(inpt)
|
|
67
67
|
return tv_tensors.wrap(inpt_padded, like=inpt)
|
|
@@ -53,11 +53,11 @@ class RandScaleIntensity(base.RandomMonaiTransform):
|
|
|
53
53
|
|
|
54
54
|
@functools.singledispatchmethod
|
|
55
55
|
@override
|
|
56
|
-
def
|
|
56
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
57
57
|
return inpt
|
|
58
58
|
|
|
59
|
-
@
|
|
60
|
-
@
|
|
59
|
+
@transform.register(tv_tensors.Image)
|
|
60
|
+
@transform.register(eva_tv_tensors.Volume)
|
|
61
61
|
def _(self, inpt: tv_tensors.Image, params: Dict[str, Any]) -> Any:
|
|
62
62
|
inpt_scaled = self._rand_scale_intensity(inpt)
|
|
63
63
|
return tv_tensors.wrap(inpt_scaled, like=inpt)
|
|
@@ -49,11 +49,11 @@ class RandShiftIntensity(base.RandomMonaiTransform):
|
|
|
49
49
|
|
|
50
50
|
@functools.singledispatchmethod
|
|
51
51
|
@override
|
|
52
|
-
def
|
|
52
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
53
53
|
return inpt
|
|
54
54
|
|
|
55
|
-
@
|
|
56
|
-
@
|
|
55
|
+
@transform.register(tv_tensors.Image)
|
|
56
|
+
@transform.register(eva_tv_tensors.Volume)
|
|
57
57
|
def _(self, inpt: tv_tensors.Image, params: Dict[str, Any]) -> Any:
|
|
58
58
|
inpt_scaled = self._rand_shift_intensity(inpt)
|
|
59
59
|
return tv_tensors.wrap(inpt_scaled, like=inpt)
|
|
@@ -5,13 +5,13 @@ from typing import Any, Dict, Tuple
|
|
|
5
5
|
|
|
6
6
|
from monai.transforms.intensity import array as monai_intensity_transforms
|
|
7
7
|
from torchvision import tv_tensors
|
|
8
|
-
from torchvision.transforms import v2
|
|
9
8
|
from typing_extensions import override
|
|
10
9
|
|
|
11
10
|
from eva.vision.data import tv_tensors as eva_tv_tensors
|
|
11
|
+
from eva.vision.data.transforms import base
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
class ScaleIntensityRange(
|
|
14
|
+
class ScaleIntensityRange(base.TorchvisionTransformV2):
|
|
15
15
|
"""Intensity scaling transform.
|
|
16
16
|
|
|
17
17
|
Scaling from [a_min, a_max] to [b_min, b_max] with clip option.
|
|
@@ -46,11 +46,11 @@ class ScaleIntensityRange(v2.Transform):
|
|
|
46
46
|
|
|
47
47
|
@functools.singledispatchmethod
|
|
48
48
|
@override
|
|
49
|
-
def
|
|
49
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
50
50
|
return inpt
|
|
51
51
|
|
|
52
|
-
@
|
|
53
|
-
@
|
|
52
|
+
@transform.register(tv_tensors.Image)
|
|
53
|
+
@transform.register(eva_tv_tensors.Volume)
|
|
54
54
|
def _(self, inpt: tv_tensors.Image, params: Dict[str, Any]) -> Any:
|
|
55
55
|
inpt_scaled = self._scale_intensity_range(inpt)
|
|
56
56
|
return tv_tensors.wrap(inpt_scaled, like=inpt)
|
|
@@ -6,13 +6,13 @@ from typing import Any, Dict, List, Sequence
|
|
|
6
6
|
import torch
|
|
7
7
|
from monai.transforms.spatial import array as monai_spatial_transforms
|
|
8
8
|
from torchvision import tv_tensors
|
|
9
|
-
from torchvision.transforms import v2
|
|
10
9
|
from typing_extensions import override
|
|
11
10
|
|
|
12
11
|
from eva.vision.data import tv_tensors as eva_tv_tensors
|
|
12
|
+
from eva.vision.data.transforms import base
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
class RandFlip(
|
|
15
|
+
class RandFlip(base.TorchvisionTransformV2):
|
|
16
16
|
"""Randomly flips the image along axes."""
|
|
17
17
|
|
|
18
18
|
def __init__(
|
|
@@ -45,23 +45,24 @@ class RandFlip(v2.Transform):
|
|
|
45
45
|
else:
|
|
46
46
|
self._flips = [monai_spatial_transforms.RandFlip(prob=prob, spatial_axis=spatial_axes)]
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
@override
|
|
49
|
+
def make_params(self, flat_inputs: List[Any]) -> Dict[str, Any]:
|
|
49
50
|
for flip in self._flips:
|
|
50
51
|
flip.randomize(None)
|
|
51
52
|
return {}
|
|
52
53
|
|
|
53
54
|
@functools.singledispatchmethod
|
|
54
55
|
@override
|
|
55
|
-
def
|
|
56
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
56
57
|
return inpt
|
|
57
58
|
|
|
58
|
-
@
|
|
59
|
-
@
|
|
59
|
+
@transform.register(tv_tensors.Image)
|
|
60
|
+
@transform.register(eva_tv_tensors.Volume)
|
|
60
61
|
def _(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
61
62
|
inpt_flipped = self._apply_flips(inpt)
|
|
62
63
|
return tv_tensors.wrap(inpt_flipped, like=inpt)
|
|
63
64
|
|
|
64
|
-
@
|
|
65
|
+
@transform.register(tv_tensors.Mask)
|
|
65
66
|
def _(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
66
67
|
inpt_flipped = torch.tensor(self._apply_flips(inpt), dtype=torch.long)
|
|
67
68
|
return tv_tensors.wrap(inpt_flipped, like=inpt)
|
|
@@ -7,10 +7,11 @@ from torchvision import tv_tensors
|
|
|
7
7
|
from torchvision.transforms import v2
|
|
8
8
|
from typing_extensions import override
|
|
9
9
|
|
|
10
|
+
from eva.vision.data.transforms import base
|
|
10
11
|
from eva.vision.data.transforms.spatial import functional
|
|
11
12
|
|
|
12
13
|
|
|
13
|
-
class Resize(
|
|
14
|
+
class Resize(base.TorchvisionTransformV2):
|
|
14
15
|
"""Resize transform for images with spatial or byte-based constraints.
|
|
15
16
|
|
|
16
17
|
This transform provides two mutually exclusive modes of resizing:
|
|
@@ -52,11 +53,11 @@ class Resize(v2.Transform):
|
|
|
52
53
|
|
|
53
54
|
@functools.singledispatchmethod
|
|
54
55
|
@override
|
|
55
|
-
def
|
|
56
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
56
57
|
return inpt
|
|
57
58
|
|
|
58
|
-
@
|
|
59
|
-
@
|
|
59
|
+
@transform.register(tv_tensors.Image)
|
|
60
|
+
@transform.register(tv_tensors.Mask)
|
|
60
61
|
def _(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
61
62
|
inpt_resized = self.resize_fn(inpt) if self.resize_fn is not None else inpt
|
|
62
63
|
return tv_tensors.wrap(inpt_resized, like=inpt)
|
|
@@ -5,13 +5,13 @@ from typing import Any, Dict, List
|
|
|
5
5
|
|
|
6
6
|
from monai.transforms.spatial import array as monai_spatial_transforms
|
|
7
7
|
from torchvision import tv_tensors
|
|
8
|
-
from torchvision.transforms import v2
|
|
9
8
|
from typing_extensions import override
|
|
10
9
|
|
|
11
10
|
from eva.vision.data import tv_tensors as eva_tv_tensors
|
|
11
|
+
from eva.vision.data.transforms import base
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
class RandRotate90(
|
|
14
|
+
class RandRotate90(base.TorchvisionTransformV2):
|
|
15
15
|
"""Rotate input tensors by 90 degrees."""
|
|
16
16
|
|
|
17
17
|
def __init__(
|
|
@@ -36,18 +36,19 @@ class RandRotate90(v2.Transform):
|
|
|
36
36
|
prob=prob, max_k=max_k, spatial_axes=spatial_axes
|
|
37
37
|
)
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
@override
|
|
40
|
+
def make_params(self, flat_inputs: List[Any]) -> Dict[str, Any]:
|
|
40
41
|
self._rotate.randomize()
|
|
41
42
|
return {}
|
|
42
43
|
|
|
43
44
|
@functools.singledispatchmethod
|
|
44
45
|
@override
|
|
45
|
-
def
|
|
46
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
46
47
|
return inpt
|
|
47
48
|
|
|
48
|
-
@
|
|
49
|
-
@
|
|
50
|
-
@
|
|
49
|
+
@transform.register(tv_tensors.Image)
|
|
50
|
+
@transform.register(eva_tv_tensors.Volume)
|
|
51
|
+
@transform.register(tv_tensors.Mask)
|
|
51
52
|
def _(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
52
53
|
inpt_rotated = self._rotate(img=inpt, randomize=False)
|
|
53
54
|
return tv_tensors.wrap(inpt_rotated, like=inpt)
|
|
@@ -8,13 +8,13 @@ import torch
|
|
|
8
8
|
from monai.data import meta_tensor
|
|
9
9
|
from monai.transforms.spatial import array as monai_spatial_transforms
|
|
10
10
|
from torchvision import tv_tensors
|
|
11
|
-
from torchvision.transforms import v2
|
|
12
11
|
from typing_extensions import override
|
|
13
12
|
|
|
14
13
|
from eva.vision.data import tv_tensors as eva_tv_tensors
|
|
14
|
+
from eva.vision.data.transforms import base
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
class Spacing(
|
|
17
|
+
class Spacing(base.TorchvisionTransformV2):
|
|
18
18
|
"""Resample input image into the specified `pixdim`.
|
|
19
19
|
|
|
20
20
|
- Expects tensors of shape `[C, T, H, W]`.
|
|
@@ -43,7 +43,8 @@ class Spacing(v2.Transform):
|
|
|
43
43
|
self._spacing = monai_spatial_transforms.Spacing(pixdim=pixdim, recompute_affine=True)
|
|
44
44
|
self._affine = None
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
@override
|
|
47
|
+
def make_params(self, flat_inputs: List[Any]) -> Dict[str, Any]:
|
|
47
48
|
self._affine = next(
|
|
48
49
|
inpt.affine for inpt in flat_inputs if isinstance(inpt, eva_tv_tensors.Volume)
|
|
49
50
|
)
|
|
@@ -51,17 +52,17 @@ class Spacing(v2.Transform):
|
|
|
51
52
|
|
|
52
53
|
@functools.singledispatchmethod
|
|
53
54
|
@override
|
|
54
|
-
def
|
|
55
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
55
56
|
return inpt
|
|
56
57
|
|
|
57
|
-
@
|
|
58
|
+
@transform.register(eva_tv_tensors.Volume)
|
|
58
59
|
def _(self, inpt: eva_tv_tensors.Volume, params: Dict[str, Any]) -> Any:
|
|
59
60
|
inpt_spacing = self._spacing(inpt.to_meta_tensor(), mode="bilinear")
|
|
60
61
|
if not isinstance(inpt_spacing, meta_tensor.MetaTensor):
|
|
61
62
|
raise ValueError(f"Expected MetaTensor, got {type(inpt_spacing)}")
|
|
62
63
|
return eva_tv_tensors.Volume.from_meta_tensor(inpt_spacing)
|
|
63
64
|
|
|
64
|
-
@
|
|
65
|
+
@transform.register(tv_tensors.Mask)
|
|
65
66
|
def _(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
66
67
|
inpt_spacing = self._spacing(
|
|
67
68
|
meta_tensor.MetaTensor(inpt, affine=self._affine), mode="nearest"
|
|
@@ -5,13 +5,13 @@ from typing import Any, Dict
|
|
|
5
5
|
|
|
6
6
|
from monai.transforms.utility import array as monai_utility_transforms
|
|
7
7
|
from torchvision import tv_tensors
|
|
8
|
-
from torchvision.transforms import v2
|
|
9
8
|
from typing_extensions import override
|
|
10
9
|
|
|
11
10
|
from eva.vision.data import tv_tensors as eva_tv_tensors
|
|
11
|
+
from eva.vision.data.transforms import base
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
class EnsureChannelFirst(
|
|
14
|
+
class EnsureChannelFirst(base.TorchvisionTransformV2):
|
|
15
15
|
"""Adjust or add the channel dimension of input data to ensure `channel_first` shape."""
|
|
16
16
|
|
|
17
17
|
def __init__(
|
|
@@ -40,12 +40,12 @@ class EnsureChannelFirst(v2.Transform):
|
|
|
40
40
|
|
|
41
41
|
@functools.singledispatchmethod
|
|
42
42
|
@override
|
|
43
|
-
def
|
|
43
|
+
def transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
44
44
|
return inpt
|
|
45
45
|
|
|
46
|
-
@
|
|
47
|
-
@
|
|
48
|
-
@
|
|
46
|
+
@transform.register(tv_tensors.Image)
|
|
47
|
+
@transform.register(eva_tv_tensors.Volume)
|
|
48
|
+
@transform.register(tv_tensors.Mask)
|
|
49
49
|
def _(self, inpt: Any, params: Dict[str, Any]) -> Any:
|
|
50
50
|
inpt_channel_first = self._ensure_channel_first(inpt)
|
|
51
51
|
return tv_tensors.wrap(inpt_channel_first, like=inpt)
|
|
@@ -54,6 +54,30 @@ def vit_small_patch16_224_dino(
|
|
|
54
54
|
)
|
|
55
55
|
|
|
56
56
|
|
|
57
|
+
@backbone_registry.register("universal/vit_tiny_patch16_224_random")
|
|
58
|
+
def vit_tiny_patch16_224_random(
|
|
59
|
+
dynamic_img_size: bool = True, out_indices: int | Tuple[int, ...] | None = None
|
|
60
|
+
) -> nn.Module:
|
|
61
|
+
"""Initializes a ViT-Tiny16 baseline model with random weights.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
dynamic_img_size: Support different input image sizes by allowing to change
|
|
65
|
+
the grid size (interpolate abs and/or ROPE pos) in the forward pass.
|
|
66
|
+
out_indices: Whether and which multi-level patch embeddings to return.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
The torch ViTS-16 based foundation model.
|
|
70
|
+
"""
|
|
71
|
+
return timm.create_model(
|
|
72
|
+
model_name="vit_tiny_patch16_224",
|
|
73
|
+
pretrained=False,
|
|
74
|
+
num_classes=0,
|
|
75
|
+
features_only=out_indices is not None,
|
|
76
|
+
out_indices=out_indices,
|
|
77
|
+
dynamic_img_size=dynamic_img_size,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
57
81
|
@backbone_registry.register("universal/vit_small_patch16_224_dino_1chan")
|
|
58
82
|
def vit_small_patch16_224_dino_1chan(
|
|
59
83
|
dynamic_img_size: bool = True, out_indices: int | Tuple[int, ...] | None = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: kaiko-eva
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: Evaluation Framework for oncology foundation models.
|
|
5
5
|
Keywords: machine-learning,evaluation-framework,oncology,foundation-models
|
|
6
6
|
Author-Email: Ioannis Gatopoulos <ioannis@kaiko.ai>, =?utf-8?q?Nicolas_K=C3=A4nzig?= <nicolas@kaiko.ai>, Roman Moser <roman@kaiko.ai>
|
|
@@ -491,7 +491,13 @@ and [tutorials](https://kaiko-ai.github.io/eva/main/user-guide/advanced/replicat
|
|
|
491
491
|
|
|
492
492
|
The following table shows the FMs we have evaluated with _`eva`_. For more detailed information about the evaluation process, please refer to our [documentation](https://kaiko-ai.github.io/eva/main/leaderboards/).
|
|
493
493
|
|
|
494
|
-
|
|
494
|
+
### Pathology
|
|
495
|
+
|
|
496
|
+
<img src="./docs/images/leaderboards/pathology.svg" alt="Pathology Leaderboard">
|
|
497
|
+
|
|
498
|
+
### Radiology
|
|
499
|
+
|
|
500
|
+
<img src="./docs/images/leaderboards/radiology.svg" alt="Radiology Leaderboard" width="600">
|
|
495
501
|
|
|
496
502
|
|
|
497
503
|
## Contributing
|