kaiko-eva 0.0.1__py3-none-any.whl → 0.1.0__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.

Files changed (168) hide show
  1. eva/core/callbacks/__init__.py +3 -2
  2. eva/core/callbacks/config.py +143 -0
  3. eva/core/callbacks/writers/__init__.py +6 -3
  4. eva/core/callbacks/writers/embeddings/__init__.py +6 -0
  5. eva/core/callbacks/writers/embeddings/_manifest.py +71 -0
  6. eva/core/callbacks/writers/embeddings/base.py +192 -0
  7. eva/core/callbacks/writers/embeddings/classification.py +117 -0
  8. eva/core/callbacks/writers/embeddings/segmentation.py +78 -0
  9. eva/core/callbacks/writers/embeddings/typings.py +38 -0
  10. eva/core/data/datasets/__init__.py +10 -2
  11. eva/core/data/datasets/classification/__init__.py +5 -2
  12. eva/core/data/datasets/classification/embeddings.py +15 -135
  13. eva/core/data/datasets/classification/multi_embeddings.py +110 -0
  14. eva/core/data/datasets/embeddings.py +167 -0
  15. eva/core/data/splitting/__init__.py +6 -0
  16. eva/core/data/splitting/random.py +41 -0
  17. eva/core/data/splitting/stratified.py +56 -0
  18. eva/core/data/transforms/__init__.py +3 -1
  19. eva/core/data/transforms/padding/__init__.py +5 -0
  20. eva/core/data/transforms/padding/pad_2d_tensor.py +38 -0
  21. eva/core/data/transforms/sampling/__init__.py +5 -0
  22. eva/core/data/transforms/sampling/sample_from_axis.py +40 -0
  23. eva/core/loggers/__init__.py +7 -0
  24. eva/core/loggers/dummy.py +38 -0
  25. eva/core/loggers/experimental_loggers.py +8 -0
  26. eva/core/loggers/log/__init__.py +6 -0
  27. eva/core/loggers/log/image.py +71 -0
  28. eva/core/loggers/log/parameters.py +74 -0
  29. eva/core/loggers/log/utils.py +13 -0
  30. eva/core/loggers/loggers.py +6 -0
  31. eva/core/metrics/__init__.py +6 -2
  32. eva/core/metrics/defaults/__init__.py +10 -3
  33. eva/core/metrics/defaults/classification/__init__.py +1 -1
  34. eva/core/metrics/defaults/classification/binary.py +0 -9
  35. eva/core/metrics/defaults/classification/multiclass.py +0 -8
  36. eva/core/metrics/defaults/segmentation/__init__.py +5 -0
  37. eva/core/metrics/defaults/segmentation/multiclass.py +43 -0
  38. eva/core/metrics/generalized_dice.py +59 -0
  39. eva/core/metrics/mean_iou.py +120 -0
  40. eva/core/metrics/structs/schemas.py +3 -1
  41. eva/core/models/__init__.py +3 -1
  42. eva/core/models/modules/head.py +16 -15
  43. eva/core/models/modules/module.py +25 -1
  44. eva/core/models/modules/typings.py +14 -1
  45. eva/core/models/modules/utils/batch_postprocess.py +37 -5
  46. eva/core/models/networks/__init__.py +1 -2
  47. eva/core/models/networks/mlp.py +2 -2
  48. eva/core/models/transforms/__init__.py +6 -0
  49. eva/core/models/{networks/transforms → transforms}/extract_cls_features.py +10 -2
  50. eva/core/models/transforms/extract_patch_features.py +47 -0
  51. eva/core/models/wrappers/__init__.py +13 -0
  52. eva/core/models/{networks/wrappers → wrappers}/base.py +3 -2
  53. eva/core/models/{networks/wrappers → wrappers}/from_function.py +5 -12
  54. eva/core/models/{networks/wrappers → wrappers}/huggingface.py +15 -11
  55. eva/core/models/{networks/wrappers → wrappers}/onnx.py +6 -3
  56. eva/core/trainers/_recorder.py +69 -7
  57. eva/core/trainers/functional.py +23 -5
  58. eva/core/trainers/trainer.py +20 -6
  59. eva/core/utils/__init__.py +6 -0
  60. eva/core/utils/clone.py +27 -0
  61. eva/core/utils/memory.py +28 -0
  62. eva/core/utils/operations.py +26 -0
  63. eva/core/utils/parser.py +20 -0
  64. eva/vision/__init__.py +2 -2
  65. eva/vision/callbacks/__init__.py +5 -0
  66. eva/vision/callbacks/loggers/__init__.py +5 -0
  67. eva/vision/callbacks/loggers/batch/__init__.py +5 -0
  68. eva/vision/callbacks/loggers/batch/base.py +130 -0
  69. eva/vision/callbacks/loggers/batch/segmentation.py +188 -0
  70. eva/vision/data/datasets/__init__.py +24 -4
  71. eva/vision/data/datasets/_utils.py +3 -3
  72. eva/vision/data/datasets/_validators.py +15 -2
  73. eva/vision/data/datasets/classification/__init__.py +6 -2
  74. eva/vision/data/datasets/classification/bach.py +10 -15
  75. eva/vision/data/datasets/classification/base.py +17 -24
  76. eva/vision/data/datasets/classification/camelyon16.py +244 -0
  77. eva/vision/data/datasets/classification/crc.py +10 -15
  78. eva/vision/data/datasets/classification/mhist.py +10 -15
  79. eva/vision/data/datasets/classification/panda.py +184 -0
  80. eva/vision/data/datasets/classification/patch_camelyon.py +13 -16
  81. eva/vision/data/datasets/classification/wsi.py +105 -0
  82. eva/vision/data/datasets/segmentation/__init__.py +15 -2
  83. eva/vision/data/datasets/segmentation/_utils.py +38 -0
  84. eva/vision/data/datasets/segmentation/base.py +31 -47
  85. eva/vision/data/datasets/segmentation/bcss.py +236 -0
  86. eva/vision/data/datasets/segmentation/consep.py +156 -0
  87. eva/vision/data/datasets/segmentation/embeddings.py +34 -0
  88. eva/vision/data/datasets/segmentation/lits.py +178 -0
  89. eva/vision/data/datasets/segmentation/monusac.py +236 -0
  90. eva/vision/data/datasets/segmentation/total_segmentator_2d.py +325 -0
  91. eva/vision/data/datasets/wsi.py +187 -0
  92. eva/vision/data/transforms/__init__.py +3 -2
  93. eva/vision/data/transforms/common/__init__.py +2 -1
  94. eva/vision/data/transforms/common/resize_and_clamp.py +51 -0
  95. eva/vision/data/transforms/common/resize_and_crop.py +6 -7
  96. eva/vision/data/transforms/normalization/__init__.py +6 -0
  97. eva/vision/data/transforms/normalization/clamp.py +43 -0
  98. eva/vision/data/transforms/normalization/functional/__init__.py +5 -0
  99. eva/vision/data/transforms/normalization/functional/rescale_intensity.py +28 -0
  100. eva/vision/data/transforms/normalization/rescale_intensity.py +53 -0
  101. eva/vision/data/wsi/__init__.py +16 -0
  102. eva/vision/data/wsi/backends/__init__.py +69 -0
  103. eva/vision/data/wsi/backends/base.py +115 -0
  104. eva/vision/data/wsi/backends/openslide.py +73 -0
  105. eva/vision/data/wsi/backends/pil.py +52 -0
  106. eva/vision/data/wsi/backends/tiffslide.py +42 -0
  107. eva/vision/data/wsi/patching/__init__.py +6 -0
  108. eva/vision/data/wsi/patching/coordinates.py +98 -0
  109. eva/vision/data/wsi/patching/mask.py +123 -0
  110. eva/vision/data/wsi/patching/samplers/__init__.py +14 -0
  111. eva/vision/data/wsi/patching/samplers/_utils.py +50 -0
  112. eva/vision/data/wsi/patching/samplers/base.py +48 -0
  113. eva/vision/data/wsi/patching/samplers/foreground_grid.py +99 -0
  114. eva/vision/data/wsi/patching/samplers/grid.py +47 -0
  115. eva/vision/data/wsi/patching/samplers/random.py +41 -0
  116. eva/vision/losses/__init__.py +5 -0
  117. eva/vision/losses/dice.py +40 -0
  118. eva/vision/models/__init__.py +4 -2
  119. eva/vision/models/modules/__init__.py +5 -0
  120. eva/vision/models/modules/semantic_segmentation.py +161 -0
  121. eva/vision/models/networks/__init__.py +1 -2
  122. eva/vision/models/networks/backbones/__init__.py +6 -0
  123. eva/vision/models/networks/backbones/_utils.py +39 -0
  124. eva/vision/models/networks/backbones/pathology/__init__.py +31 -0
  125. eva/vision/models/networks/backbones/pathology/bioptimus.py +34 -0
  126. eva/vision/models/networks/backbones/pathology/gigapath.py +33 -0
  127. eva/vision/models/networks/backbones/pathology/histai.py +46 -0
  128. eva/vision/models/networks/backbones/pathology/kaiko.py +123 -0
  129. eva/vision/models/networks/backbones/pathology/lunit.py +68 -0
  130. eva/vision/models/networks/backbones/pathology/mahmood.py +62 -0
  131. eva/vision/models/networks/backbones/pathology/owkin.py +22 -0
  132. eva/vision/models/networks/backbones/registry.py +47 -0
  133. eva/vision/models/networks/backbones/timm/__init__.py +5 -0
  134. eva/vision/models/networks/backbones/timm/backbones.py +54 -0
  135. eva/vision/models/networks/backbones/universal/__init__.py +8 -0
  136. eva/vision/models/networks/backbones/universal/vit.py +54 -0
  137. eva/vision/models/networks/decoders/__init__.py +6 -0
  138. eva/vision/models/networks/decoders/decoder.py +7 -0
  139. eva/vision/models/networks/decoders/segmentation/__init__.py +11 -0
  140. eva/vision/models/networks/decoders/segmentation/common.py +74 -0
  141. eva/vision/models/networks/decoders/segmentation/conv2d.py +114 -0
  142. eva/vision/models/networks/decoders/segmentation/linear.py +125 -0
  143. eva/vision/models/wrappers/__init__.py +6 -0
  144. eva/vision/models/wrappers/from_registry.py +48 -0
  145. eva/vision/models/wrappers/from_timm.py +68 -0
  146. eva/vision/utils/colormap.py +77 -0
  147. eva/vision/utils/convert.py +67 -0
  148. eva/vision/utils/io/__init__.py +10 -4
  149. eva/vision/utils/io/image.py +21 -2
  150. eva/vision/utils/io/mat.py +36 -0
  151. eva/vision/utils/io/nifti.py +40 -15
  152. eva/vision/utils/io/text.py +10 -3
  153. kaiko_eva-0.1.0.dist-info/METADATA +553 -0
  154. kaiko_eva-0.1.0.dist-info/RECORD +205 -0
  155. {kaiko_eva-0.0.1.dist-info → kaiko_eva-0.1.0.dist-info}/WHEEL +1 -1
  156. {kaiko_eva-0.0.1.dist-info → kaiko_eva-0.1.0.dist-info}/entry_points.txt +2 -0
  157. eva/core/callbacks/writers/embeddings.py +0 -169
  158. eva/core/callbacks/writers/typings.py +0 -23
  159. eva/core/models/networks/transforms/__init__.py +0 -5
  160. eva/core/models/networks/wrappers/__init__.py +0 -8
  161. eva/vision/data/datasets/classification/total_segmentator.py +0 -213
  162. eva/vision/data/datasets/segmentation/total_segmentator.py +0 -212
  163. eva/vision/models/networks/postprocesses/__init__.py +0 -5
  164. eva/vision/models/networks/postprocesses/cls.py +0 -25
  165. kaiko_eva-0.0.1.dist-info/METADATA +0 -405
  166. kaiko_eva-0.0.1.dist-info/RECORD +0 -110
  167. /eva/core/models/{networks → wrappers}/_utils.py +0 -0
  168. {kaiko_eva-0.0.1.dist-info → kaiko_eva-0.1.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,205 @@
1
+ eva/__init__.py,sha256=bYBwklT7diG8NBIBDbpwjN4RUsvGv0ShWBXPxWgz404,518
2
+ eva/__main__.py,sha256=kM5tQ0egTuBWixNLLx9QU-PpS2Bbs3zE3nYE6b2vWa0,282
3
+ eva/__version__.py,sha256=YFR4oOlvPg0sS4Ni7GJ_vU42VTs5WiWp6odK7yH4TBY,611
4
+ eva/core/__init__.py,sha256=AYlMZcH76B7I1lOa-E67u2o9DxsCwI4JMLCYXLk9oDQ,451
5
+ eva/core/callbacks/__init__.py,sha256=_XsS4QGf4r9frzFwEx-krmzJm3kbLmXQFtwYCfRyjrM,281
6
+ eva/core/callbacks/config.py,sha256=-DRt20a2aF9Z9-7nZvbGBcOZ30qNf3ESf25EPRgRL1w,4267
7
+ eva/core/callbacks/writers/__init__.py,sha256=z8cNVJOanj-yYyIiX-mOkhur1NExuCOKzPjp4mmm3AE,232
8
+ eva/core/callbacks/writers/embeddings/__init__.py,sha256=zMxP4POf1yFFUVSjGcsQgyPYNY6JsZO_F66ngKJZaG8,301
9
+ eva/core/callbacks/writers/embeddings/_manifest.py,sha256=pB9nGv9ofVbnI4HHPrHY4p7jeFiFQTRc09zszto_DTk,2424
10
+ eva/core/callbacks/writers/embeddings/base.py,sha256=rdoCtMuegiO6Gb0vM8a-KGI33Eq0hS0Qnlh-1Y6_96s,7593
11
+ eva/core/callbacks/writers/embeddings/classification.py,sha256=pYU0dD08IXH4_pK-P43LqCMD17X-AP5Ayo9gbovwv6U,4522
12
+ eva/core/callbacks/writers/embeddings/segmentation.py,sha256=6AMGfD9Ur35TyH8ztjPx4ayB1Kbywymmu9LriMGLDoY,3135
13
+ eva/core/callbacks/writers/embeddings/typings.py,sha256=qXZSlasaSKHad6HyJeRTeUv-ZeJVM-R3oIaasD8ZPc8,997
14
+ eva/core/cli/__init__.py,sha256=1lGiomn4JINI0DKy41_D4cEyyH-hN6cfTZfMPxLxTCA,68
15
+ eva/core/cli/cli.py,sha256=AZ4B4OP3D2af9H2RYBd5nxoy5I9DlaClZaadSWpPEPI,422
16
+ eva/core/cli/logo.py,sha256=x6-vGWI0s9gza-xxQrBDi2wneb2wFU_mQGHgpAiq2MQ,786
17
+ eva/core/cli/setup.py,sha256=kR-7l4X5Hu8kSLoQZGYGIeLXtn9S_EU52dauDy6fm0w,2663
18
+ eva/core/data/__init__.py,sha256=yG3BeOWhp1EjVYMFqx8M_TBWFDyfIwwksQGQmMdSPaI,340
19
+ eva/core/data/dataloaders/__init__.py,sha256=fbNClVZ8J3QoGi4qiPq635ig1j9GdI7six3RhfwDbjY,110
20
+ eva/core/data/dataloaders/dataloader.py,sha256=-mWFFLtem1Ijbi8XGveFSv5XzUU7SyKwiT5Ahikzghw,2368
21
+ eva/core/data/datamodules/__init__.py,sha256=qZchYbgxo9lxYnGoqdk0C6MfS2IbF0WItO0kCdP9Mqc,229
22
+ eva/core/data/datamodules/call.py,sha256=jjj9w3UXYuQB-qyCcw1EZpRJW10OC1I3dvgvsuQWLck,940
23
+ eva/core/data/datamodules/datamodule.py,sha256=dclC2YJAXUGEUpV9ZRWQS43-ksFIPgVeFudsyrj9kdc,3878
24
+ eva/core/data/datamodules/schemas.py,sha256=EXnUPNd9Pj3RjnxJIzAcC2qp6TtBSvPDx28fV_ovWAA,1869
25
+ eva/core/data/datasets/__init__.py,sha256=YfbHEVy9AXdvPAobZ8btV-mVEaWAVDr7feK8xydLW2w,391
26
+ eva/core/data/datasets/base.py,sha256=NLZlxznB4SCYNf070OhfNJztaOpqwQWemwpGkFv_CA0,2005
27
+ eva/core/data/datasets/classification/__init__.py,sha256=wJ2jD9YODftt-dMcMf0TbCjJt47qXYBKkD4-XXajvRQ,340
28
+ eva/core/data/datasets/classification/embeddings.py,sha256=bgBVQyGxlxVCvGjmwNB52E360QwzrhGZQ44rPNFR4k8,1110
29
+ eva/core/data/datasets/classification/multi_embeddings.py,sha256=j_o0MH2gwn_y3rNFXEUzNg6WErlG3Rq_vn5Og1Yk7J0,4603
30
+ eva/core/data/datasets/dataset.py,sha256=tA6Wd_7vqOE9GsukSWrgN9zaZKtKCHaE58SqIfWxWdg,124
31
+ eva/core/data/datasets/embeddings.py,sha256=zNEO8KxqiOopcN_lTjwtEAm9xbnYDSjOE8X2-iZQIhU,5545
32
+ eva/core/data/samplers/__init__.py,sha256=WikBo1DemCx6o2vFfNwSwODlmCT2zWUXtCNwiWCVAFE,100
33
+ eva/core/data/samplers/sampler.py,sha256=vrrXERWC67fjmTk_uwD7s9-8-rdhvnx7OlSipHE6sdY,119
34
+ eva/core/data/splitting/__init__.py,sha256=VQJ8lfakbv6y2kAk3VDtITAvh7kcZo3H1JwJBc5jT08,198
35
+ eva/core/data/splitting/random.py,sha256=gmweyGtL4rbWoUaH1q63LjKpT-TCwk2mdB4Vw_jLTQo,1353
36
+ eva/core/data/splitting/stratified.py,sha256=_1Eh6QuupxLexrABpwNXiDxDisoTiK8axsV3nvQXCx0,1915
37
+ eva/core/data/transforms/__init__.py,sha256=n0TczmJSc9EjR6JezAZqlZIN4Gz_X3UBePbyDSC7JkE,308
38
+ eva/core/data/transforms/dtype/__init__.py,sha256=r_LM_hdh_gTsrgh3shDTdMpu-lgQNHJ1yD6wY3omPyg,174
39
+ eva/core/data/transforms/dtype/array.py,sha256=RDSkXlnSHSYyU_gv7vw33OZ7vhEy62PQGoE3htGGaqc,725
40
+ eva/core/data/transforms/padding/__init__.py,sha256=AKSXa2dOhj45dTw81piPoCfDmIL0FPJUIxZ3HlG7KVM,138
41
+ eva/core/data/transforms/padding/pad_2d_tensor.py,sha256=J4maGFmeQf9IHRxt5kU-6eI-Bvk12F_HVk8kR_omrnY,1185
42
+ eva/core/data/transforms/sampling/__init__.py,sha256=BFKbvRjlZrwS0GcNrM54ZSWt6PrQARfFlXM1jJ-wpvo,149
43
+ eva/core/data/transforms/sampling/sample_from_axis.py,sha256=Zbhp94lVa70WQKmSOKMTsOMe2c7wLqNZto7JqWhSdtI,1229
44
+ eva/core/interface/__init__.py,sha256=chdpKXipxe1NP-Fgr_d9r6X1gMna0XiEa38waJ6FzTM,98
45
+ eva/core/interface/interface.py,sha256=GzjneNHhTIEuLbydUG9cSmpHjJ4_IENGM-glN8RaRxY,2741
46
+ eva/core/loggers/__init__.py,sha256=4YMLNlN9LnuKqhBI1R1keh69dmMD-2lcH3HKwwyn380,266
47
+ eva/core/loggers/dummy.py,sha256=Y7ypH0ecSAIkkZ5LzTmNNEzlKkqeaHfUNMCDKVOg6D4,1204
48
+ eva/core/loggers/experimental_loggers.py,sha256=p5uCK_9QCYufRhE-LZQUJWbhGElyobX_zRM78yX4p2o,230
49
+ eva/core/loggers/log/__init__.py,sha256=2nXYmR5_0XW0N8BcC918uvdvNyNgQLN_x1-papMprBk,189
50
+ eva/core/loggers/log/image.py,sha256=iUwntQCdRNLtkSdqu8CvV34l06zPYVo4NAW2gUeiJIM,1490
51
+ eva/core/loggers/log/parameters.py,sha256=7Xi-I5gQvEVv71d58bwdZ-Hb4287NXxaUyMfriq_KDU,1634
52
+ eva/core/loggers/log/utils.py,sha256=k4Q7uKpAQctfDv0EEYPnPv6wt9LnckEeqGvbYSLfKO0,415
53
+ eva/core/loggers/loggers.py,sha256=igHxdxJSotWSg6nEOKnfFuBszzblHgi8T7sBrE00FEs,166
54
+ eva/core/metrics/__init__.py,sha256=CtmUcB2bh-JlI0wOvSwwPFB1OzaqsSM3dPHVQh7hMXY,714
55
+ eva/core/metrics/average_loss.py,sha256=AyFOnCXBD5T62eSYf6eGAAJsqt8x-KaHgc8OLkCHjzE,1267
56
+ eva/core/metrics/binary_balanced_accuracy.py,sha256=MabsXAtVfLqSaSIIpE0HIM6bo8uRszl6obueHI6vJi0,806
57
+ eva/core/metrics/defaults/__init__.py,sha256=uPQzkna6Lb0VnCtC4IEPSB9d5jI1_0SohjUOMSo3o1Q,373
58
+ eva/core/metrics/defaults/classification/__init__.py,sha256=xMzE4yV8NoUdcmk2FCKohEUav1GJcxYn60S1KNgXbJY,316
59
+ eva/core/metrics/defaults/classification/binary.py,sha256=9ll6ZOcNGQdsg7ln9DAQ0u-OzsXSzEbueXe-dVJkJZ8,2322
60
+ eva/core/metrics/defaults/classification/multiclass.py,sha256=8Aesy_rKtp4KxfXJtDCmk6FsGxIFS4Ywu2CH1VIRL7M,2518
61
+ eva/core/metrics/defaults/segmentation/__init__.py,sha256=n6gDc603uRWOByAAPFkmZiPH2rEoZ3lSV9MC4nRMBuc,189
62
+ eva/core/metrics/defaults/segmentation/multiclass.py,sha256=_M7NtvwIrfzLLXtAYflFjIle6UeHYU9TwWo3IHl0wlw,1715
63
+ eva/core/metrics/generalized_dice.py,sha256=28vTdmh6QyLfSGtT5oARXp2Hd58EBNg5G0dSBfctvcY,2271
64
+ eva/core/metrics/mean_iou.py,sha256=eAvAe1BiYEXjOtWHUZD_5hBGuRmNhHVYuyGls8YC-1g,4619
65
+ eva/core/metrics/structs/__init__.py,sha256=cvn7E4k5vJmpwJj_zezmtZa_Nl_RddDM1G-MO8TP0po,422
66
+ eva/core/metrics/structs/collection.py,sha256=bNfCekHN8pzD49-YTqVxrmxFtiQfNxnv-RwkxCL6rbc,149
67
+ eva/core/metrics/structs/metric.py,sha256=zdnE0ZVTSYAMl7rW_OL6e1XiZDvLTirYqV0lgJCleXY,109
68
+ eva/core/metrics/structs/module.py,sha256=qAyk9uSGTFdvSg6ukl2c-OC-FdaCCsUf3Lh8UbUD-r8,3619
69
+ eva/core/metrics/structs/schemas.py,sha256=ZaSrx0j_NfIwT7joMUD1LyrKdAXTLaeSzWYTHDsc6h0,1641
70
+ eva/core/metrics/structs/typings.py,sha256=qJd-FiD2IhJgBeo8FyP0vpVUIH4RKb1k6zYvHtjUA04,388
71
+ eva/core/models/__init__.py,sha256=bQSpfQJKuDMWosjcMhP7t5jdOSV6OyxdxTOIW9w1woE,369
72
+ eva/core/models/modules/__init__.py,sha256=QJWJ42BceXZBzDGgk5FHBcCaRrB9egTFKVF6gDsBYfM,255
73
+ eva/core/models/modules/head.py,sha256=iHrEOjYfshFI6OdXxJJTZyfCoUs2fimitINNcB6ENsc,4321
74
+ eva/core/models/modules/inference.py,sha256=ih-0Rr2oNf2N6maiXPOW7XH5KVwUT1_MOxnJKOhJ1uQ,978
75
+ eva/core/models/modules/module.py,sha256=7mCzyvBNOWhvN8sNa91yB79iSBlJlYh9sypL37Nwdes,6836
76
+ eva/core/models/modules/typings.py,sha256=yFMJCE4Nrfd8VEXU1zk8p6Sz5M7UslwitYPVC2OPLSY,776
77
+ eva/core/models/modules/utils/__init__.py,sha256=pnbxlEhT87JimWNr-NSNCv7VNR-IyDi_A9qRWmvlzwQ,227
78
+ eva/core/models/modules/utils/batch_postprocess.py,sha256=RwnDcjJy3uvVirpgx_80Q2CUYKfJKipVwjyX7AF2CKw,3088
79
+ eva/core/models/modules/utils/grad.py,sha256=bl8qb8g4Nhg1KAGfbEV_9HTKkoT0azRwfs9KGX9swGs,706
80
+ eva/core/models/networks/__init__.py,sha256=yqx6UmG1Eg3vb1O_tnK_axnJWabEl9ULkDWiPN440Xc,85
81
+ eva/core/models/networks/mlp.py,sha256=thk-x4pviE3fCaMW9k3I2Oe5_DxfC-CqUrtolvVdXug,2418
82
+ eva/core/models/transforms/__init__.py,sha256=oYL3gNUUKZFViTu6GT1jVE2Kv1xFYPuyiYp-sErtVVg,257
83
+ eva/core/models/transforms/extract_cls_features.py,sha256=odtqawFoDZZCvCg0bp8G8PlUY8KrPAQBZsNOcTZv02E,1081
84
+ eva/core/models/transforms/extract_patch_features.py,sha256=41zCkX-ls-rvqB4B4kE5_lWMNhec65yatdDNa0yjRf0,1751
85
+ eva/core/models/wrappers/__init__.py,sha256=P-ipr4NtKqPU6ubAjKLGxFf1Qt2yDSNtgS2Xz5sBahQ,364
86
+ eva/core/models/wrappers/_utils.py,sha256=HXUyGcILaa8GK31ViIHCKRU4f9kbjAPYQmhvN2N7jSc,957
87
+ eva/core/models/wrappers/base.py,sha256=xKMUSXk93wI67p_wmh7jujK-bxvIefO1noYaAJN_5Ak,1359
88
+ eva/core/models/wrappers/from_function.py,sha256=_vKBwtfilCNCnOaJTofE6l5bM2K3qJ8GyBT-0CM5FXY,1831
89
+ eva/core/models/wrappers/huggingface.py,sha256=5CoNieivdjwvoawo7dZtWfYZkW-Mey1j0EjazuxDaqU,1302
90
+ eva/core/models/wrappers/onnx.py,sha256=-iV-IlczTvTTEQuJycZeSVWdSl2kVJXc1eeRLgQQZ7Q,1834
91
+ eva/core/trainers/__init__.py,sha256=jhsKJF7HAae7EOiG3gKIAHH_h3dZlTE2JRcCHJmOzJc,208
92
+ eva/core/trainers/_logging.py,sha256=gi4FqPy2GuVmh0WZY6mYwF7zMPvnoFA050B0XdCP6PU,2571
93
+ eva/core/trainers/_recorder.py,sha256=y6i5hfXftWjeV3eQHmMjUOkWumnZ2QNv_u275LLmvPA,7702
94
+ eva/core/trainers/_utils.py,sha256=M3h8lVhUmkeSiEXpX9hRdMvThGFCnTP15gv-hd1CZkc,321
95
+ eva/core/trainers/functional.py,sha256=NPxFCtU5KgquVowjeXAf_xj4-Thj7ZxN9F3sHRDrDUA,4388
96
+ eva/core/trainers/trainer.py,sha256=Vw_KhTyh-3YV5qo_XHxz9oy-v2PxrgoOWMeYi8-41R0,3949
97
+ eva/core/utils/__init__.py,sha256=cndVBvtYxEW7hykH39GCNVI86zkXNn8Lw2A0sUJHS04,237
98
+ eva/core/utils/clone.py,sha256=qcThZOuAs1cs0uV3BL5eKeM2VIBjuRPBe1t-NiUFM5Y,569
99
+ eva/core/utils/io/__init__.py,sha256=SAME0kuSvDE1DKFJwMBmnCkpDAy4ujXuRTSJsHNhwUI,112
100
+ eva/core/utils/io/dataframe.py,sha256=CIHFowljH17waDkJ9YJVEVXAIcxMwoLjUgoBttiNk8w,509
101
+ eva/core/utils/memory.py,sha256=ZvcbS1eUPXdHIoL8ctFU56_-cyUniObBmIctUbvso48,636
102
+ eva/core/utils/multiprocessing.py,sha256=PxUxMyvI62lghyWF46O5RNL-J7DUR2IrXSwdkbhC0ic,1383
103
+ eva/core/utils/operations.py,sha256=eoC_ScuHUMDCuk08j1bosiQZdPrgiIODqqheR9MtJHQ,641
104
+ eva/core/utils/parser.py,sha256=2czmwEGJJ6PtmaD86s9I14P-_sek4DmDCkEatRGT5sI,725
105
+ eva/core/utils/workers.py,sha256=hfx63M82qNg0Dwhre2tl53MnhtRsV7APaDONM9nhVB8,634
106
+ eva/vision/__init__.py,sha256=oUZXFYjwtkWzi8An0uS5Xc84pLKintlXe2iti8zW6BQ,480
107
+ eva/vision/callbacks/__init__.py,sha256=su1V73L0dDVYWSyvV_lnWbszDi2KikRraF7OsgeaKl4,139
108
+ eva/vision/callbacks/loggers/__init__.py,sha256=td1JRJbE08nsGIZdO64_yLC3FUuMDp0kma0HjpUdXT4,161
109
+ eva/vision/callbacks/loggers/batch/__init__.py,sha256=DVYP7Aonbi4wg_ERHRj_8kb87Ee_75wRZzdduJ_icQk,173
110
+ eva/vision/callbacks/loggers/batch/base.py,sha256=hcAd5iiHvjZ0DIf4Qt4ENT54D6ky_1OO4rKQZqeo-1k,3628
111
+ eva/vision/callbacks/loggers/batch/segmentation.py,sha256=PbgBVp6TGgko7Um8gN0fHyCs2sE42Uqe3M4grxSBykE,6749
112
+ eva/vision/data/__init__.py,sha256=aoKPmX8P2Q2k2W3nlq8vFU41FV6Sze-0SDuWtU-ETh4,111
113
+ eva/vision/data/datasets/__init__.py,sha256=t0pZhs3z-QFHERY5N8FVMQex8TDVG5kfcpGODdUxk8Y,836
114
+ eva/vision/data/datasets/_utils.py,sha256=epPcaYE4w2_LtUKLLQJh6qQxUNVBe22JA06k4WUerYQ,1430
115
+ eva/vision/data/datasets/_validators.py,sha256=77WZj8ewsuxUjW5WegJ-7zDuR6WdF5JbaOYdywhKIK4,2594
116
+ eva/vision/data/datasets/classification/__init__.py,sha256=ht5UPPgP736dt_L1Hb5rJtQnzKJHIhpBnqm3b4BMCZE,663
117
+ eva/vision/data/datasets/classification/bach.py,sha256=kZba1dQlJWZAmA03akJ4fVUU-y9W8ezOwlgs2zL-QrE,5432
118
+ eva/vision/data/datasets/classification/base.py,sha256=Ci0HoOhOuHwICTi1TUGA1PwZe642RywolTVfMhKrFHk,2772
119
+ eva/vision/data/datasets/classification/camelyon16.py,sha256=sToajukdw-_V_YO6lbcZToMSLKEjeKxJfjZ8iSdzn-M,8136
120
+ eva/vision/data/datasets/classification/crc.py,sha256=8qjz9OklLg1gAr46RKZdlClmlO9awwfp0dkTs8v5jTE,5670
121
+ eva/vision/data/datasets/classification/mhist.py,sha256=xzShPncSfAV6Q5ojfimeq748MfA0n77fGWa9EpdRzYU,3055
122
+ eva/vision/data/datasets/classification/panda.py,sha256=6VpCsotdksAZSfdD9zcM96Ihr6FshnIgZPZkkt0oSLI,6853
123
+ eva/vision/data/datasets/classification/patch_camelyon.py,sha256=fElKteZKx4M6AjylnhhgNH1jewHegWc1K8h4FFKp0gE,7171
124
+ eva/vision/data/datasets/classification/wsi.py,sha256=Y8yaPM5qVi13YyRKIcYrRaxmV_yRW8Dl9rj_1kRJ33I,3948
125
+ eva/vision/data/datasets/segmentation/__init__.py,sha256=_E1K8Ld829jVlZ0VcjUy0HP-8aHu4v9rEbTFt3R8O9M,694
126
+ eva/vision/data/datasets/segmentation/_utils.py,sha256=ps1qpuEkPgvwUw6H-KKaLaYqDBGmN7dNGk3bnS1l6sI,1261
127
+ eva/vision/data/datasets/segmentation/base.py,sha256=11IMODMB7KJ8Bs5p7MyOsBXCyPFJXfYcDLAIMitUwEk,3023
128
+ eva/vision/data/datasets/segmentation/bcss.py,sha256=NHjHd1tgIfIw6TxsZTGb63iMEwXFbWX_JAwRT5WVsj4,8274
129
+ eva/vision/data/datasets/segmentation/consep.py,sha256=mUUGqS1HkUkL1u45LY0rEjcAK0Dawc8abUmFgYEZ_ag,5871
130
+ eva/vision/data/datasets/segmentation/embeddings.py,sha256=0KaadzPxN6OrKNnFu3YsGBFkG6XqqvkOZYUhERPwL4A,1220
131
+ eva/vision/data/datasets/segmentation/lits.py,sha256=_9qdjKnYe5YsJ6_UAIrPwMeqoKHyHYmB7q-6uvXqdLQ,6246
132
+ eva/vision/data/datasets/segmentation/monusac.py,sha256=vbXo-T3Rdu_zGja81ZbOimjZMlx2CnRZsC5nH-Dqkyg,8368
133
+ eva/vision/data/datasets/segmentation/total_segmentator_2d.py,sha256=h2daCbFZPm48GjuOAOy0-Cd-WKFkFvus1ZWuoJZY9D4,13070
134
+ eva/vision/data/datasets/structs.py,sha256=RaTDW-B36PumcR5gymhCiX-r8GiKqIFcjqoEEjjFyUE,389
135
+ eva/vision/data/datasets/vision.py,sha256=hKKFMb65UJQzOyYm8FTGkOGBOinMRu7R8sOFMbCmQX4,1100
136
+ eva/vision/data/datasets/wsi.py,sha256=JauEeQEC3niyivLa4FcI4X5GKvDRVpwY6BknzN-vKAQ,6611
137
+ eva/vision/data/transforms/__init__.py,sha256=WeFii6JwB0CiOOGLR3tkgAoKgRdmOf2lm0Dadixn8OI,260
138
+ eva/vision/data/transforms/common/__init__.py,sha256=6tvxUgb8wfhgvqejMVulwqssHTJLF7f4_vpf44kxgxY,234
139
+ eva/vision/data/transforms/common/resize_and_clamp.py,sha256=f9-YIX0S9GMAXHP7TWlyRlGfZIVvHgoBHqQ8PzaKbKs,1736
140
+ eva/vision/data/transforms/common/resize_and_crop.py,sha256=GI1HTkbJ9qg4p8c6vk_XkXO0Qi6mBeUeiZIA0jVtmAw,1360
141
+ eva/vision/data/transforms/normalization/__init__.py,sha256=0MZ1KphOr6LxBCOBn7LZ8H8M6-0CuFqvynTON5pedxg,240
142
+ eva/vision/data/transforms/normalization/clamp.py,sha256=B-QyMCFEJPiJagpPr7JhrzOJMVuUB-D_qrmjvthJTyE,1412
143
+ eva/vision/data/transforms/normalization/functional/__init__.py,sha256=ICg611_heHCiNxTNoteFX2MTav59fv7vLkTM8c4eS3w,194
144
+ eva/vision/data/transforms/normalization/functional/rescale_intensity.py,sha256=ihJdDRogrJbvFpb8LcPdRzCFWdlMcBTpWD5RY2MOPbE,844
145
+ eva/vision/data/transforms/normalization/rescale_intensity.py,sha256=BNzDeyzT0GG_FBtlZauCL-K4E_KVWH9SzTSN1SsFNJw,1756
146
+ eva/vision/data/wsi/__init__.py,sha256=vfSfyogsj4OS1sGKfsYWyj2O5ZMT9iqkc1lvcuZJVGI,422
147
+ eva/vision/data/wsi/backends/__init__.py,sha256=wX7cjeT7ktX8sH6lRDEEU5cgRKLH6RhPyey16aJthJ4,2251
148
+ eva/vision/data/wsi/backends/base.py,sha256=0oFzMc3zklLyqyD_kzDKekydeFyDReqjBBj1qJLdM9Y,4094
149
+ eva/vision/data/wsi/backends/openslide.py,sha256=VPVJDb6iAe0ZIdYbyFfPLDzHvku8PZXBWcGhNBV5BbI,2437
150
+ eva/vision/data/wsi/backends/pil.py,sha256=CqCWP1ViwpQyVKGLUoEtc4tCHXSAdQpMn6ZX2lNBMns,1403
151
+ eva/vision/data/wsi/backends/tiffslide.py,sha256=f1xOiD4kpL0oRe3xFNT7BM2zYTWBduqL99skk-ZFRwE,1217
152
+ eva/vision/data/wsi/patching/__init__.py,sha256=vSGyui2TkaJpw_wQJldP0Llnym5X9XgK17nuz7S5Hh8,189
153
+ eva/vision/data/wsi/patching/coordinates.py,sha256=IzuF4i63bJYqdJH7eWQYR2q5QHw-80iV6QLibac6CWg,3475
154
+ eva/vision/data/wsi/patching/mask.py,sha256=o_S4YRdbfaxKCG1_T2skswDirmlzHzVC5exaDJucvD0,4986
155
+ eva/vision/data/wsi/patching/samplers/__init__.py,sha256=QkBbjnZf7IcEPm-ON9SeZP0I3DXUA3pY87dKXXdelz4,458
156
+ eva/vision/data/wsi/patching/samplers/_utils.py,sha256=aJI3mSJjfsMm4eNCAqIwMuXX0mGHl0WUa1vbC0DbbmY,1431
157
+ eva/vision/data/wsi/patching/samplers/base.py,sha256=KWLJMfaPk7-IZ-P2isYBvFAa5SuJPUhtD63hkKRFrgg,1287
158
+ eva/vision/data/wsi/patching/samplers/foreground_grid.py,sha256=EhXkr5EFz2-RXEisWtjDa4CUTnrW4fiamQjEgALB2aI,3093
159
+ eva/vision/data/wsi/patching/samplers/grid.py,sha256=dImrMSyCL3E_j5KRqpVJUWTe-mrJpfttg1Z9rbm3j0k,1363
160
+ eva/vision/data/wsi/patching/samplers/random.py,sha256=qx5vExkmLgMFZgEwaXMmYFxoS-ewBhX-1Bpb1GGYkuI,1151
161
+ eva/vision/losses/__init__.py,sha256=ZfUHa7siD3bBjiG4f39Eh4A0auaz0ctIKK0M9qfI-gY,95
162
+ eva/vision/losses/dice.py,sha256=_D8Cj_m9AbOUhJS-GfsBbhfC-R9J58ao8UmuV_6OMhI,1424
163
+ eva/vision/models/__init__.py,sha256=a-P6JL73A3miHQnqgqUz07XtVmQB_o4DqPImk5rEATo,275
164
+ eva/vision/models/modules/__init__.py,sha256=vaM_V6OF2s0lYjralP8dzv8mAtv_xIMZItfXgz0NZg8,156
165
+ eva/vision/models/modules/semantic_segmentation.py,sha256=poBss37CM-bGLrtAl08WTcJtQgzwEP1MJgjeEbxexk0,6255
166
+ eva/vision/models/networks/__init__.py,sha256=j43IurizNlAyKPH2jwDHaeq49L2QvwbHWqUaptA1mG4,100
167
+ eva/vision/models/networks/abmil.py,sha256=N1eH4fn1nXmgXurSQyQIxxonv7nsqeeuPWaQSHeltfs,6796
168
+ eva/vision/models/networks/backbones/__init__.py,sha256=LsMx92eEoCQ5aNVFp7mHjrD-9ZeNawMiK6zZSYzl_PU,296
169
+ eva/vision/models/networks/backbones/_utils.py,sha256=I8YrBsIVtCsp13xs1ln_OrhKBRu2gOmJdopL9hx_MBk,1277
170
+ eva/vision/models/networks/backbones/pathology/__init__.py,sha256=-kn7JCC7fs8-VvjGQURQsdQejKYOwhPJch37Cf1crDM,1005
171
+ eva/vision/models/networks/backbones/pathology/bioptimus.py,sha256=wUSKjYgxcRV3FRHGaPwF1uRAQcGO0rHNHGmK1QDJXk4,991
172
+ eva/vision/models/networks/backbones/pathology/gigapath.py,sha256=mfGXtKhY7XLpKQQAFNVZYsM-aeHCEbOVUrxpAEOr-l8,955
173
+ eva/vision/models/networks/backbones/pathology/histai.py,sha256=C05W_75bINtTnet25M0axiVt00TMmcCx2U5Fcr7n-_I,1570
174
+ eva/vision/models/networks/backbones/pathology/kaiko.py,sha256=GSdBG4WXrs1PWB2hr-sy_dFe2riwpPKwHx71esDoVfE,3952
175
+ eva/vision/models/networks/backbones/pathology/lunit.py,sha256=ku4lr9pWeeHatHN4x4OVgwlve9sVqiRqIbgI0PXLiqg,2160
176
+ eva/vision/models/networks/backbones/pathology/mahmood.py,sha256=3iIGKD7AvPDTritNkT2NGd6Nb5iJQxBKPmymI5YpOzo,2042
177
+ eva/vision/models/networks/backbones/pathology/owkin.py,sha256=EdP4d1ndIR4URZHuSVfn01AdSe5n77KB5Sq4XEFmYwo,713
178
+ eva/vision/models/networks/backbones/registry.py,sha256=anjILtEHHB6Ltwiw22h1bsgWtIjh_l5_fkPh87K7-d0,1631
179
+ eva/vision/models/networks/backbones/timm/__init__.py,sha256=cZH3av9gIZcvEVD0rwKsI-MEq7zPqaW4dQ0E05CksvQ,128
180
+ eva/vision/models/networks/backbones/timm/backbones.py,sha256=fCTiwqU6NhQ-ccAMzmpPDddXkFzRAB3mw4lcQ9um_PU,1646
181
+ eva/vision/models/networks/backbones/universal/__init__.py,sha256=MAlkALSJ2_w6spSbB7NmKlL0Jsk1YKEycatdI0xO0_I,252
182
+ eva/vision/models/networks/backbones/universal/vit.py,sha256=kpUCoXpefR34hRNlQDFK9lGr4oqS8Mn5vTLKWZ-gaOs,1820
183
+ eva/vision/models/networks/decoders/__init__.py,sha256=kW79anaDHRm0Tkxt7ZIpYpaMggx8RGK2mogs77n-c6k,190
184
+ eva/vision/models/networks/decoders/decoder.py,sha256=0tEx-eWEbNA53oafUbJkTb3j0watPpdntXMrQ66azsU,150
185
+ eva/vision/models/networks/decoders/segmentation/__init__.py,sha256=bdGL_R44cyutqNXEMYMwA_RtqbdTL5xt2TVdS5BjGps,439
186
+ eva/vision/models/networks/decoders/segmentation/common.py,sha256=4gxTimvc-JRzbIlD4yfGWXIjcEJSP_iY79h-mheDryc,2525
187
+ eva/vision/models/networks/decoders/segmentation/conv2d.py,sha256=fv-0tF7_Ey4EH5iW08enPoaRrziiqbCfjrl1i50ZgfI,4092
188
+ eva/vision/models/networks/decoders/segmentation/linear.py,sha256=89kDvs-e7Y3Bs3TQvmt2K7_cQYkv0T65A_nBh_anqFQ,4736
189
+ eva/vision/models/wrappers/__init__.py,sha256=8MT8qFM4nUXGpK1_i3rp70ODkOjn2KhhRo2I17qZCPM,210
190
+ eva/vision/models/wrappers/from_registry.py,sha256=gdnxyg9drqlxfTNuS3aLbWGbZIwX1VNl0uudfjzVsXM,1614
191
+ eva/vision/models/wrappers/from_timm.py,sha256=Z38Nb1i6OPKkgvFZOvGx-O3AZQuscf1zRVyrEBXQdJg,2320
192
+ eva/vision/utils/__init__.py,sha256=vaUovprE743SmyFH8l6uk4pYSWpI4zxn7lN0EwePTJI,96
193
+ eva/vision/utils/colormap.py,sha256=P904auPzaxGESTjFcbv550fc49DeXklSHkuhXWFXCEo,2384
194
+ eva/vision/utils/convert.py,sha256=fqGmKrg5-JJLrTkTXB4YDcWTudXPrO1gGjsckVRUesU,1881
195
+ eva/vision/utils/io/__init__.py,sha256=B9z6YiPUTI2aNDvN7t90_WugPE-L1d_1017aNeOkuZo,517
196
+ eva/vision/utils/io/_utils.py,sha256=JzOt7Frj6ScF_aNjFtfHBn4ROnl6NhUZucmQhLc4Cww,768
197
+ eva/vision/utils/io/image.py,sha256=IdOkr5MYqhYHz8U9drZ7wULTM3YHwCWSjZlu_Qdl4GQ,2053
198
+ eva/vision/utils/io/mat.py,sha256=qpGifyjmpE0Xhv567Si7-zxKrgkgE0sywP70cHiLFGU,808
199
+ eva/vision/utils/io/nifti.py,sha256=O_5x3A7RySfZYkF8KG5nmLQf1FcbhnJBVNVf71m3Lo4,2189
200
+ eva/vision/utils/io/text.py,sha256=qYgfo_ZaDZWfG02NkVVYzo5QFySqdCCz5uLA9d-zXtI,701
201
+ kaiko_eva-0.1.0.dist-info/METADATA,sha256=abBwr5ckrDbZSvgkD0l4SPO1ZqIQjFuiuKrbY2C72ZA,26806
202
+ kaiko_eva-0.1.0.dist-info/WHEEL,sha256=Vza3XR51HW1KmFP0iIMUVYIvz0uQuKJpIXKYOBGQyFQ,90
203
+ kaiko_eva-0.1.0.dist-info/entry_points.txt,sha256=6CSLu9bmQYJSXEg8gbOzRhxH0AGs75BB-vPm3VvfcNE,88
204
+ kaiko_eva-0.1.0.dist-info/licenses/LICENSE,sha256=e6AEzr7j_R-PYr2qLO-JwLn8y70jbVD3U2mxbRmwcI4,11338
205
+ kaiko_eva-0.1.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: pdm-backend (2.1.8)
2
+ Generator: pdm-backend (2.4.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -2,3 +2,5 @@
2
2
  eva = eva.__main__:main
3
3
  kaiko-eva = eva.__main__:main
4
4
 
5
+ [gui_scripts]
6
+
@@ -1,169 +0,0 @@
1
- """Embeddings writer."""
2
-
3
- import csv
4
- import io
5
- import os
6
- from typing import Any, Dict, Sequence
7
-
8
- import lightning.pytorch as pl
9
- import torch
10
- from lightning.pytorch import callbacks
11
- from loguru import logger
12
- from torch import multiprocessing, nn
13
- from typing_extensions import override
14
-
15
- from eva.core.callbacks.writers.typings import QUEUE_ITEM
16
- from eva.core.models.modules.typings import INPUT_BATCH
17
- from eva.core.utils import multiprocessing as eva_multiprocessing
18
-
19
-
20
- class EmbeddingsWriter(callbacks.BasePredictionWriter):
21
- """Callback for writing generated embeddings to disk."""
22
-
23
- def __init__(
24
- self,
25
- output_dir: str,
26
- backbone: nn.Module | None = None,
27
- dataloader_idx_map: Dict[int, str] | None = None,
28
- group_key: str | None = None,
29
- overwrite: bool = True,
30
- ) -> None:
31
- """Initializes a new EmbeddingsWriter instance.
32
-
33
- This callback writes the embedding files in a separate process to avoid blocking the
34
- main process where the model forward pass is executed.
35
-
36
- Args:
37
- output_dir: The directory where the embeddings will be saved.
38
- backbone: A model to be used as feature extractor. If `None`,
39
- it will be expected that the input batch returns the features directly.
40
- dataloader_idx_map: A dictionary mapping dataloader indices to their respective
41
- names (e.g. train, val, test).
42
- group_key: The metadata key to group the embeddings by. If specified, the
43
- embedding files will be saved in subdirectories named after the group_key.
44
- If specified, the key must be present in the metadata of the input batch.
45
- overwrite: Whether to overwrite the output directory. Defaults to True.
46
- """
47
- super().__init__(write_interval="batch")
48
-
49
- self._output_dir = output_dir
50
- self._backbone = backbone
51
- self._dataloader_idx_map = dataloader_idx_map or {}
52
- self._group_key = group_key
53
- self._overwrite = overwrite
54
-
55
- self._write_queue: multiprocessing.Queue
56
- self._write_process: eva_multiprocessing.Process
57
-
58
- @override
59
- def on_predict_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
60
- os.makedirs(self._output_dir, exist_ok=self._overwrite)
61
- self._initialize_write_process()
62
- self._write_process.start()
63
-
64
- if self._backbone is not None:
65
- self._backbone = self._backbone.to(pl_module.device)
66
- self._backbone.eval()
67
-
68
- @override
69
- def write_on_batch_end(
70
- self,
71
- trainer: pl.Trainer,
72
- pl_module: pl.LightningModule,
73
- prediction: Any,
74
- batch_indices: Sequence[int],
75
- batch: INPUT_BATCH,
76
- batch_idx: int,
77
- dataloader_idx: int,
78
- ) -> None:
79
- dataset = trainer.predict_dataloaders[dataloader_idx].dataset # type: ignore
80
- _, targets, metadata = INPUT_BATCH(*batch)
81
- split = self._dataloader_idx_map.get(dataloader_idx)
82
-
83
- embeddings = self._get_embeddings(prediction)
84
- for local_idx, global_idx in enumerate(batch_indices[: len(embeddings)]):
85
- input_name, save_name = self._construct_save_name(
86
- dataset.filename(global_idx), metadata, local_idx
87
- )
88
- embeddings_buffer, target_buffer = io.BytesIO(), io.BytesIO()
89
- torch.save(embeddings[local_idx].clone(), embeddings_buffer)
90
- torch.save(targets[local_idx], target_buffer) # type: ignore
91
- item = QUEUE_ITEM(embeddings_buffer, target_buffer, input_name, save_name, split)
92
- self._write_queue.put(item)
93
-
94
- self._write_process.check_exceptions()
95
-
96
- @override
97
- def on_predict_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
98
- self._write_queue.put(None)
99
- self._write_process.join()
100
- logger.info(f"Predictions and manifest saved to {self._output_dir}")
101
-
102
- def _initialize_write_process(self) -> None:
103
- self._write_queue = multiprocessing.Queue()
104
- self._write_process = eva_multiprocessing.Process(
105
- target=_process_write_queue, args=(self._write_queue, self._output_dir, self._overwrite)
106
- )
107
-
108
- def _get_embeddings(self, prediction: torch.Tensor) -> torch.Tensor:
109
- """Returns the embeddings from predictions."""
110
- if self._backbone is None:
111
- return prediction
112
-
113
- with torch.no_grad():
114
- return self._backbone(prediction)
115
-
116
- def _construct_save_name(self, input_name, metadata, local_idx):
117
- group_name = metadata[self._group_key][local_idx] if self._group_key else None
118
- save_name = os.path.splitext(input_name)[0] + ".pt"
119
- if group_name:
120
- save_name = os.path.join(group_name, save_name)
121
- return input_name, save_name
122
-
123
-
124
- def _process_write_queue(
125
- write_queue: multiprocessing.Queue, output_dir: str, overwrite: bool = False
126
- ) -> None:
127
- manifest_file, manifest_writer = _init_manifest(output_dir, overwrite)
128
- while True:
129
- item = write_queue.get()
130
- if item is None:
131
- break
132
-
133
- prediction_buffer, target_buffer, input_name, save_name, split = QUEUE_ITEM(*item)
134
- _save_prediction(prediction_buffer, save_name, output_dir)
135
- _update_manifest(target_buffer, input_name, save_name, split, manifest_writer)
136
-
137
- manifest_file.close()
138
-
139
-
140
- def _save_prediction(prediction_buffer: io.BytesIO, save_name: str, output_dir: str) -> None:
141
- save_path = os.path.join(output_dir, save_name)
142
- prediction = torch.load(io.BytesIO(prediction_buffer.getbuffer()), map_location="cpu")
143
- os.makedirs(os.path.dirname(save_path), exist_ok=True)
144
- torch.save(prediction, save_path)
145
-
146
-
147
- def _init_manifest(output_dir: str, overwrite: bool = False) -> tuple[io.TextIOWrapper, Any]:
148
- manifest_path = os.path.join(output_dir, "manifest.csv")
149
- if os.path.exists(manifest_path) and not overwrite:
150
- raise FileExistsError(
151
- f"Manifest file already exists at {manifest_path}. This likely means that the "
152
- "embeddings have been computed before. Consider using `eva fit` instead "
153
- "of `eva predict_fit` or `eva predict`."
154
- )
155
- manifest_file = open(manifest_path, "w", newline="")
156
- manifest_writer = csv.writer(manifest_file)
157
- manifest_writer.writerow(["origin", "embeddings", "target", "split"])
158
- return manifest_file, manifest_writer
159
-
160
-
161
- def _update_manifest(
162
- target_buffer: io.BytesIO,
163
- input_name: str,
164
- save_name: str,
165
- split: str | None,
166
- manifest_writer,
167
- ) -> None:
168
- target = torch.load(io.BytesIO(target_buffer.getbuffer()), map_location="cpu")
169
- manifest_writer.writerow([input_name, save_name, target.item(), split])
@@ -1,23 +0,0 @@
1
- """Typing definitions for the writer callback functions."""
2
-
3
- import io
4
- from typing import NamedTuple
5
-
6
-
7
- class QUEUE_ITEM(NamedTuple):
8
- """The default input batch data scheme."""
9
-
10
- prediction_buffer: io.BytesIO
11
- """IO buffer containing the prediction tensor"""
12
-
13
- target_buffer: io.BytesIO
14
- """IO buffer containing the target tensor"""
15
-
16
- input_name: str
17
- """Name of the original input file that was used to generate the embedding."""
18
-
19
- save_name: str
20
- """Name to store the generated embedding"""
21
-
22
- split: str | None
23
- """The dataset split the item belongs to (e.g. train, val, test)."""
@@ -1,5 +0,0 @@
1
- """Model outputs transforms API."""
2
-
3
- from eva.core.models.networks.transforms.extract_cls_features import ExtractCLSFeatures
4
-
5
- __all__ = ["ExtractCLSFeatures"]
@@ -1,8 +0,0 @@
1
- """Model Wrappers API."""
2
-
3
- from eva.core.models.networks.wrappers.base import BaseModel
4
- from eva.core.models.networks.wrappers.from_function import ModelFromFunction
5
- from eva.core.models.networks.wrappers.huggingface import HuggingFaceModel
6
- from eva.core.models.networks.wrappers.onnx import ONNXModel
7
-
8
- __all__ = ["BaseModel", "ModelFromFunction", "HuggingFaceModel", "ONNXModel"]
@@ -1,213 +0,0 @@
1
- """TotalSegmentator 2D segmentation dataset class."""
2
-
3
- import functools
4
- import os
5
- from glob import glob
6
- from typing import Callable, Dict, List, Literal, Tuple
7
-
8
- import numpy as np
9
- from torchvision.datasets import utils
10
- from typing_extensions import override
11
-
12
- from eva.vision.data.datasets import _utils, _validators, structs
13
- from eva.vision.data.datasets.classification import base
14
- from eva.vision.utils import io
15
-
16
-
17
- class TotalSegmentatorClassification(base.ImageClassification):
18
- """TotalSegmentator multi-label classification dataset."""
19
-
20
- _train_index_ranges: List[Tuple[int, int]] = [(0, 83)]
21
- """Train range indices."""
22
-
23
- _val_index_ranges: List[Tuple[int, int]] = [(83, 103)]
24
- """Validation range indices."""
25
-
26
- _n_slices_per_image: int = 20
27
- """The amount of slices to sample per 3D CT scan image."""
28
-
29
- _resources_full: List[structs.DownloadResource] = [
30
- structs.DownloadResource(
31
- filename="Totalsegmentator_dataset_v201.zip",
32
- url="https://zenodo.org/records/10047292/files/Totalsegmentator_dataset_v201.zip",
33
- md5="fe250e5718e0a3b5df4c4ea9d58a62fe",
34
- ),
35
- ]
36
- """Resources for the full dataset version."""
37
-
38
- _resources_small: List[structs.DownloadResource] = [
39
- structs.DownloadResource(
40
- filename="Totalsegmentator_dataset_small_v201.zip",
41
- url="https://zenodo.org/records/10047263/files/Totalsegmentator_dataset_small_v201.zip",
42
- md5="6b5524af4b15e6ba06ef2d700c0c73e0",
43
- ),
44
- ]
45
- """Resources for the small dataset version."""
46
-
47
- def __init__(
48
- self,
49
- root: str,
50
- split: Literal["train", "val"] | None,
51
- version: Literal["small", "full"] = "small",
52
- download: bool = False,
53
- image_transforms: Callable | None = None,
54
- target_transforms: Callable | None = None,
55
- ) -> None:
56
- """Initialize dataset.
57
-
58
- Args:
59
- root: Path to the root directory of the dataset. The dataset will
60
- be downloaded and extracted here, if it does not already exist.
61
- split: Dataset split to use. If None, the entire dataset is used.
62
- version: The version of the dataset to initialize.
63
- download: Whether to download the data for the specified split.
64
- Note that the download will be executed only by additionally
65
- calling the :meth:`prepare_data` method and if the data does not
66
- exist yet on disk.
67
- image_transforms: A function/transform that takes in an image
68
- and returns a transformed version.
69
- target_transforms: A function/transform that takes in the target
70
- and transforms it.
71
- """
72
- super().__init__(
73
- image_transforms=image_transforms,
74
- target_transforms=target_transforms,
75
- )
76
-
77
- self._root = root
78
- self._split = split
79
- self._version = version
80
- self._download = download
81
-
82
- self._samples_dirs: List[str] = []
83
- self._indices: List[int] = []
84
-
85
- @functools.cached_property
86
- @override
87
- def classes(self) -> List[str]:
88
- def get_filename(path: str) -> str:
89
- """Returns the filename from the full path."""
90
- return os.path.basename(path).split(".")[0]
91
-
92
- first_sample_labels = os.path.join(
93
- self._root, self._samples_dirs[0], "segmentations", "*.nii.gz"
94
- )
95
- return sorted(map(get_filename, glob(first_sample_labels)))
96
-
97
- @property
98
- @override
99
- def class_to_idx(self) -> Dict[str, int]:
100
- return {label: index for index, label in enumerate(self.classes)}
101
-
102
- @override
103
- def filename(self, index: int) -> str:
104
- sample_dir = self._samples_dirs[self._indices[index]]
105
- return os.path.join(sample_dir, "ct.nii.gz")
106
-
107
- @override
108
- def prepare_data(self) -> None:
109
- if self._download:
110
- self._download_dataset()
111
- _validators.check_dataset_exists(self._root, True)
112
-
113
- @override
114
- def configure(self) -> None:
115
- self._samples_dirs = self._fetch_samples_dirs()
116
- self._indices = self._create_indices()
117
-
118
- @override
119
- def validate(self) -> None:
120
- _validators.check_dataset_integrity(
121
- self,
122
- length=1660 if self._split == "train" else 400,
123
- n_classes=117,
124
- first_and_last_labels=("adrenal_gland_left", "vertebrae_T9"),
125
- )
126
-
127
- @override
128
- def __len__(self) -> int:
129
- return len(self._indices) * self._n_slices_per_image
130
-
131
- @override
132
- def load_image(self, index: int) -> np.ndarray:
133
- image_path = self._get_image_path(index)
134
- slice_index = self._get_sample_slice_index(index)
135
- image_array = io.read_nifti_slice(image_path, slice_index)
136
- return image_array.repeat(3, axis=2)
137
-
138
- @override
139
- def load_target(self, index: int) -> np.ndarray:
140
- masks = self._load_masks(index)
141
- targets = [1 in masks[..., mask_index] for mask_index in range(masks.shape[-1])]
142
- return np.asarray(targets, dtype=np.int64)
143
-
144
- def _load_masks(self, index: int) -> np.ndarray:
145
- """Returns the `index`'th target mask sample."""
146
- masks_dir = self._get_masks_dir(index)
147
- slice_index = self._get_sample_slice_index(index)
148
- mask_paths = (os.path.join(masks_dir, label + ".nii.gz") for label in self.classes)
149
- masks = [io.read_nifti_slice(path, slice_index) for path in mask_paths]
150
- return np.concatenate(masks, axis=-1)
151
-
152
- def _get_masks_dir(self, index: int) -> str:
153
- """Returns the directory of the corresponding masks."""
154
- sample_dir = self._get_sample_dir(index)
155
- return os.path.join(self._root, sample_dir, "segmentations")
156
-
157
- def _get_image_path(self, index: int) -> str:
158
- """Returns the corresponding image path."""
159
- sample_dir = self._get_sample_dir(index)
160
- return os.path.join(self._root, sample_dir, "ct.nii.gz")
161
-
162
- def _get_sample_dir(self, index: int) -> str:
163
- """Returns the corresponding sample directory."""
164
- sample_index = self._indices[index // self._n_slices_per_image]
165
- return self._samples_dirs[sample_index]
166
-
167
- def _get_sample_slice_index(self, index: int) -> int:
168
- """Returns the corresponding slice index."""
169
- image_path = self._get_image_path(index)
170
- total_slices = io.fetch_total_nifti_slices(image_path)
171
- slice_indices = np.linspace(0, total_slices - 1, num=self._n_slices_per_image, dtype=int)
172
- return slice_indices[index % self._n_slices_per_image]
173
-
174
- def _fetch_samples_dirs(self) -> List[str]:
175
- """Returns the name of all the samples of all the splits of the dataset."""
176
- sample_filenames = [
177
- filename
178
- for filename in os.listdir(self._root)
179
- if os.path.isdir(os.path.join(self._root, filename))
180
- ]
181
- return sorted(sample_filenames)
182
-
183
- def _create_indices(self) -> List[int]:
184
- """Builds the dataset indices for the specified split."""
185
- split_index_ranges = {
186
- "train": self._train_index_ranges,
187
- "val": self._val_index_ranges,
188
- None: [(0, 103)],
189
- }
190
- index_ranges = split_index_ranges.get(self._split)
191
- if index_ranges is None:
192
- raise ValueError("Invalid data split. Use 'train', 'val' or `None`.")
193
-
194
- return _utils.ranges_to_indices(index_ranges)
195
-
196
- def _download_dataset(self) -> None:
197
- """Downloads the dataset."""
198
- dataset_resources = {
199
- "small": self._resources_small,
200
- "full": self._resources_full,
201
- None: (0, 103),
202
- }
203
- resources = dataset_resources.get(self._version)
204
- if resources is None:
205
- raise ValueError("Invalid data version. Use 'small' or 'full'.")
206
-
207
- for resource in resources:
208
- utils.download_and_extract_archive(
209
- resource.url,
210
- download_root=self._root,
211
- filename=resource.filename,
212
- remove_finished=True,
213
- )