endoreg-db 0.8.4.2__py3-none-any.whl → 0.8.4.3__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 endoreg-db might be problematic. Click here for more details.

@@ -0,0 +1,177 @@
1
+ """
2
+ Configuration loader for EndoReg DB setup.
3
+ Handles loading and parsing of setup configuration from YAML files.
4
+ """
5
+
6
+ import glob
7
+ import logging
8
+ import os
9
+ from pathlib import Path
10
+ from typing import Any, Dict, List, Optional
11
+
12
+ import yaml
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class SetupConfig:
18
+ """
19
+ Handles loading and accessing setup configuration from YAML files.
20
+ Provides methods to get model names, search patterns, and fallback configurations.
21
+ """
22
+
23
+ def __init__(self, config_file: Optional[Path] = None):
24
+ """
25
+ Initialize the setup configuration.
26
+
27
+ Args:
28
+ config_file: Path to the setup configuration YAML file.
29
+ If None, uses default location.
30
+ """
31
+ if config_file is None:
32
+ # Default to setup_config.yaml in data directory
33
+ config_file = Path(__file__).parent.parent / "data" / "setup_config.yaml"
34
+
35
+ self.config_file = config_file
36
+ self._config = self._load_config()
37
+
38
+ def _load_config(self) -> Dict[str, Any]:
39
+ """Load configuration from YAML file."""
40
+ try:
41
+ if self.config_file.exists():
42
+ with open(self.config_file, "r") as f:
43
+ config = yaml.safe_load(f)
44
+ logger.info(f"Loaded setup configuration from {self.config_file}")
45
+ return config or {}
46
+ else:
47
+ logger.warning(f"Setup config file not found: {self.config_file}")
48
+ return self._get_default_config()
49
+ except Exception as e:
50
+ logger.error(f"Error loading setup config: {e}")
51
+ return self._get_default_config()
52
+
53
+ def _get_default_config(self) -> Dict[str, Any]:
54
+ """Return default configuration if file is not available."""
55
+ return {
56
+ "default_models": {
57
+ "primary_classification_model": "image_multilabel_classification_colonoscopy_default",
58
+ "primary_labelset": "multilabel_classification_colonoscopy_default",
59
+ },
60
+ "huggingface_fallback": {
61
+ "enabled": True,
62
+ "repo_id": "wg-lux/colo_segmentation_RegNetX800MF_base",
63
+ "filename": "colo_segmentation_RegNetX800MF_base.ckpt",
64
+ "labelset_name": "multilabel_classification_colonoscopy_default",
65
+ },
66
+ "weights_search_patterns": [
67
+ "colo_segmentation_RegNetX800MF_*.ckpt",
68
+ "image_multilabel_classification_colonoscopy_default_*.ckpt",
69
+ "*_colonoscopy_*.ckpt",
70
+ ],
71
+ "weights_search_dirs": ["tests/assets", "assets", "data/storage/model_weights", "${STORAGE_DIR}/model_weights"],
72
+ "auto_generation_defaults": {
73
+ "activation": "sigmoid",
74
+ "mean": "0.485,0.456,0.406",
75
+ "std": "0.229,0.224,0.225",
76
+ "size_x": 224,
77
+ "size_y": 224,
78
+ "axes": "CHW",
79
+ "batchsize": 32,
80
+ "num_workers": 4,
81
+ },
82
+ }
83
+
84
+ def get_primary_model_name(self) -> str:
85
+ """Get the primary classification model name."""
86
+ return self._config.get("default_models", {}).get("primary_classification_model", "image_multilabel_classification_colonoscopy_default")
87
+
88
+ def get_primary_labelset_name(self) -> str:
89
+ """Get the primary labelset name."""
90
+ return self._config.get("default_models", {}).get("primary_labelset", "multilabel_classification_colonoscopy_default")
91
+
92
+ def get_huggingface_config(self) -> Dict[str, Any]:
93
+ """Get HuggingFace fallback configuration."""
94
+ return self._config.get("huggingface_fallback", {})
95
+
96
+ def get_weights_search_patterns(self) -> List[str]:
97
+ """Get weight file search patterns."""
98
+ return self._config.get("weights_search_patterns", ["colo_segmentation_RegNetX800MF_*.ckpt", "*_colonoscopy_*.ckpt"])
99
+
100
+ def get_weights_search_dirs(self) -> List[Path]:
101
+ """
102
+ Get weight file search directories with environment variable substitution.
103
+ """
104
+ dirs = self._config.get("weights_search_dirs", [])
105
+ resolved_dirs = []
106
+
107
+ for dir_str in dirs:
108
+ # Handle environment variable substitution
109
+ if "${" in dir_str:
110
+ dir_str = os.path.expandvars(dir_str)
111
+
112
+ resolved_dirs.append(Path(dir_str))
113
+
114
+ return resolved_dirs
115
+
116
+ def get_auto_generation_defaults(self) -> Dict[str, Any]:
117
+ """Get default values for auto-generated metadata."""
118
+ return self._config.get("auto_generation_defaults", {})
119
+
120
+ def find_model_weights_files(self) -> List[Path]:
121
+ """
122
+ Find model weight files using configured search patterns and directories.
123
+
124
+ Returns:
125
+ List of paths to found weight files
126
+ """
127
+ found_files = []
128
+ search_dirs = self.get_weights_search_dirs()
129
+ search_patterns = self.get_weights_search_patterns()
130
+
131
+ for search_dir in search_dirs:
132
+ if not search_dir.exists():
133
+ continue
134
+
135
+ for pattern in search_patterns:
136
+ # Use glob to find files matching pattern
137
+ pattern_path = search_dir / pattern
138
+ matches = glob.glob(str(pattern_path))
139
+ for match in matches:
140
+ path = Path(match)
141
+ if path.exists() and path not in found_files:
142
+ found_files.append(path)
143
+ logger.info(f"Found weight file: {path}")
144
+
145
+ return found_files
146
+
147
+ def get_model_specific_config(self, model_name: str) -> Optional[Dict[str, Any]]:
148
+ """
149
+ Get model-specific configuration from YAML metadata files.
150
+
151
+ Args:
152
+ model_name: Name of the model to get config for
153
+
154
+ Returns:
155
+ Model-specific setup configuration if found
156
+ """
157
+ # This would need to parse the ai_model_meta YAML files
158
+ # and extract setup_config sections for the specified model
159
+ try:
160
+ from endoreg_db.data import AI_MODEL_META_DATA_DIR
161
+
162
+ for yaml_file in AI_MODEL_META_DATA_DIR.glob("*.yaml"):
163
+ with open(yaml_file, "r") as f:
164
+ data = yaml.safe_load(f)
165
+
166
+ if isinstance(data, list):
167
+ for item in data:
168
+ if item.get("fields", {}).get("name") == model_name or item.get("fields", {}).get("model") == model_name:
169
+ return item.get("setup_config", {})
170
+ except Exception as e:
171
+ logger.warning(f"Error loading model-specific config for {model_name}: {e}")
172
+
173
+ return None
174
+
175
+
176
+ # Global instance for easy access
177
+ setup_config = SetupConfig()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: endoreg-db
3
- Version: 0.8.4.2
3
+ Version: 0.8.4.3
4
4
  Summary: EndoReg Db Django App
5
5
  Project-URL: Homepage, https://info.coloreg.de
6
6
  Project-URL: Repository, https://github.com/wg-lux/endoreg-db
@@ -18,13 +18,14 @@ endoreg_db/config/env.py,sha256=S244AQRkDP0PpP0MPaShgqeBJgI1BQknfER1_vUFMD4,2673
18
18
  endoreg_db/data/__init__.py,sha256=Wqu24f5-FVKE5pis0wGDYsMHOTkieN40b10S5zU5240,5932
19
19
  endoreg_db/data/db_summary.csv,sha256=K4PcufVHQ64H1i2MbCShMxReEa96I8cL6IfwCVpqF2M,1225
20
20
  endoreg_db/data/db_summary.xlsx,sha256=pwsc_IcxNETNrYjDXjpSW83b8f-WsSunRDiJLZXENZ0,5829
21
+ endoreg_db/data/setup_config.yaml,sha256=ZlL_DwHNqdulPzfZzNDlsMEHC9hSrZZ3Ri9OUDJKXn8,1301
21
22
  endoreg_db/data/ai_model/data.yaml,sha256=9XIRMS_meioGu-vYY6zUvz4RUXhRLdalaHhCTdaq4nA,306
22
23
  endoreg_db/data/ai_model_label/label/data.yaml,sha256=qkt0FfrLvPrcW_N0GUzu3q9TpiXrvZU047xAIOk_33A,1737
23
24
  endoreg_db/data/ai_model_label/label/polyp_classification.yaml,sha256=lHx2VwwVgKzOM_3PcuHuSIStgvMK6rHVi3WP67Qjv70,936
24
25
  endoreg_db/data/ai_model_label/label-set/data.yaml,sha256=ocaxnkqiZgwi4sY561TbP_DEQWkPG1hBZ3olwPOqiXQ,789
25
26
  endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml,sha256=GVmctJCgnr2lPUMttgPThNXoLcUl4XpliiuSjvE6h_Q,443
26
27
  endoreg_db/data/ai_model_label/label-type/data.yaml,sha256=vffKYpTae_gu63_wza6LONs5ys4pna1EbrUUO6CafQs,136
27
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml,sha256=JhrFP6WXSFRa4kKujKAtgNVmnFYMiz8-J_oN-JQsSi0,182
28
+ endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml,sha256=VelCJXavWT4HYbPko1S8O1gv7wBZBsvz6r5FvjXTm2o,1196
28
29
  endoreg_db/data/ai_model_type/data.yaml,sha256=vCMMo8wiI5uL2zrQROmgsHq1GrC8IdagGIgNdQunUeQ,149
29
30
  endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml,sha256=EZ83vq02Cf2KfflWQ4HEe1NHmuzSCsmKtWW5Bv8jet0,4060
30
31
  endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml,sha256=07uB1ousJVNpp8B9enJ_YIdZf3y4sBPlME4bZwDv6ho,404
@@ -257,7 +258,7 @@ endoreg_db/management/commands/import_report.py,sha256=vFst-NeQdL-w62yoH4kDamq-2
257
258
  endoreg_db/management/commands/import_video.py,sha256=AMvgi1eN0F_hjhgnNNYIFkJtHfjalBfh2lfDxw6VTzE,17980
258
259
  endoreg_db/management/commands/import_video_with_classification.py,sha256=ulZH5jvAWu_pJ1kI9B3hbIO1-p_BReY0zbIQDS_d9OI,14726
259
260
  endoreg_db/management/commands/init_default_ai_model.py,sha256=98yBigGZ5gkA-b1LPcvzS5x2jAms3pX58fU-TEAcjKw,4669
260
- endoreg_db/management/commands/load_ai_model_data.py,sha256=QDyWPjIC1ga13Ou67_mnE8HUGTAK0uF2LLQ12sE-95E,2747
261
+ endoreg_db/management/commands/load_ai_model_data.py,sha256=O_mzGGcpnVacC4EZmEGbTp4EADNXJRsvaZoNFgh2wFU,2867
261
262
  endoreg_db/management/commands/load_ai_model_label_data.py,sha256=jnm2720TsnRTBKF6guwnjLo7sropW_YoRjgyjo1TUr8,2143
262
263
  endoreg_db/management/commands/load_base_db_data.py,sha256=0Go2cYbqfx6MBSeQaHPAq22yeJxOyX25xpmcBcE9Auw,9374
263
264
  endoreg_db/management/commands/load_center_data.py,sha256=GQpbe7dxgbTgd66oBqrBXax-os3ibnPmCeSEFDVauPU,2570
@@ -290,10 +291,11 @@ endoreg_db/management/commands/load_unit_data.py,sha256=tcux-iL-ByT2ApgmHEkLllZS
290
291
  endoreg_db/management/commands/load_user_groups.py,sha256=D7SK2FvZEHoE4TIXNGCjDw5_12MH9bpGZvoS7eEv0Os,1031
291
292
  endoreg_db/management/commands/register_ai_model.py,sha256=KixTfuQR6TUfRmzB5GOos16BFOz7NL4TzLzBkgtPPgE,2510
292
293
  endoreg_db/management/commands/reset_celery_schedule.py,sha256=U-m_FNRTw6LAwJoT9RUE4qrhmQXm7AyFToPcHYyJpIE,386
293
- endoreg_db/management/commands/setup_endoreg_db.py,sha256=efOXE6IQs4ey84tIncf6zXI2VVVRd7CYXbeuACFgkgI,9095
294
+ endoreg_db/management/commands/setup_endoreg_db.py,sha256=C0ooVVmrzX-_ksoma3s3rZtJUcUsxvO4ddm1VhlYiiU,17640
294
295
  endoreg_db/management/commands/start_filewatcher.py,sha256=3jESBqRiYPa9f35--zd70qQaYnyT0tzRO_b_HJuyteQ,4093
295
296
  endoreg_db/management/commands/storage_management.py,sha256=NpToX59ndwTFNmnSoeppmiPdMvpjSHH7mAdIe4SvUoI,22396
296
297
  endoreg_db/management/commands/summarize_db_content.py,sha256=pOIz3qbY4Ktmh0zV_DKFx971VD0pPx027gCD7a47EL0,10766
298
+ endoreg_db/management/commands/validate_ai_models.py,sha256=Z7Ga-PndTFVG8GnkYbS58h8ofiyhnxZDcyP5Qqpl1c8,4684
297
299
  endoreg_db/management/commands/validate_video.py,sha256=cns_kNgztyp6XTeXuDeLEet8vAATkpxZwJuSWuQ5Olk,11302
298
300
  endoreg_db/management/commands/validate_video_files.py,sha256=0lvA0Z8BKiibjyqc4ueI646IIc5bKI3sIOxiiF5_bTk,6509
299
301
  endoreg_db/management/commands/video_validation.py,sha256=xnAoCPB44dmnRbn6FqUjqRXQ-ZhDPNX1T5kCpAU8sgc,771
@@ -435,7 +437,7 @@ endoreg_db/models/medical/finding/finding_intervention.py,sha256=FBwjI15yitMpTXk
435
437
  endoreg_db/models/medical/finding/finding_type.py,sha256=ohDEmLcgEpYjG5q0uhCaq2xQS8jH_rj4qyKQ2DUumqQ,1117
436
438
  endoreg_db/models/medical/hardware/__init__.py,sha256=uX2-UpBzX2chpZEeCyqbv2BSrv3OZNG9PrB8sHEWpHQ,178
437
439
  endoreg_db/models/medical/hardware/endoscope.py,sha256=8T8R2Bo2T29psQ3C_HTrhBogN8hiysuZkJOxUefqGoI,1657
438
- endoreg_db/models/medical/hardware/endoscopy_processor.py,sha256=DLKMXPWValfJCf4rZ1u6PdpeBa2ST0WTjkcuruFlzG0,6201
440
+ endoreg_db/models/medical/hardware/endoscopy_processor.py,sha256=9HMTgODfJo36gDg4N3QtcH3_NOriOanwYMtIPTlULVk,6626
439
441
  endoreg_db/models/medical/laboratory/__init__.py,sha256=595XF1ikkwzQWbUsyasU23v1kDRugrgTp3eUfrMd0UQ,62
440
442
  endoreg_db/models/medical/laboratory/lab_value.py,sha256=uw4mjguVrqvsxQ-NzGO0DoNlSCaydI8KaJgUhuM16wo,20258
441
443
  endoreg_db/models/medical/medication/__init__.py,sha256=BHh6ARvm2uVNswN12EQAEMFPnoGBiVwl7RCjKrW6C2I,761
@@ -464,7 +466,7 @@ endoreg_db/models/medical/risk/risk_type.py,sha256=kEugcaWSTEWH_Vxq4dcF80Iv1L4_K
464
466
  endoreg_db/models/metadata/__init__.py,sha256=8I6oLj3YTmeaPGJpL0AWG5gLwp38QzrEggxSkTisv7c,474
465
467
  endoreg_db/models/metadata/frame_ocr_result.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
466
468
  endoreg_db/models/metadata/model_meta.py,sha256=F_r-PTLeNi4J-4EaGCQkGIguhdl7Bwba7_i56ZAjc-4,7589
467
- endoreg_db/models/metadata/model_meta_logic.py,sha256=pcpKf9J5DUiEG-D-VhOPcnFjBznkx5jK7EGv0zDMQm8,12440
469
+ endoreg_db/models/metadata/model_meta_logic.py,sha256=wESdSRvnA0SthaZD2W29nbMGrichRCwaKQGnE5uCAao,16046
468
470
  endoreg_db/models/metadata/pdf_meta.py,sha256=BTmpSgqxmPKi0apcNjyrZAS4AFKCPXVdBd6VBeyyv6E,3174
469
471
  endoreg_db/models/metadata/sensitive_meta.py,sha256=ekLHrW-b5uYcjfkRd0EW5ncx5ef8Bu-K6msDkpWCAbk,13034
470
472
  endoreg_db/models/metadata/sensitive_meta_logic.py,sha256=by3eCW8CgglK1SHiDOepHhTOGaugswxJhkH0BZp7-gs,33909
@@ -602,7 +604,7 @@ endoreg_db/services/pseudonym_service.py,sha256=CJhbtRa6K6SPbphgCZgEMi8AFQtB18CU
602
604
  endoreg_db/services/requirements_object.py,sha256=290zf8AEbVtCoHhW4Jr7_ud-RvrqYmb1Nz9UBHtTnc0,6164
603
605
  endoreg_db/services/segment_sync.py,sha256=YgHvIHkbW4mqCu0ACf3zjRSZnNfxWwt4gh5syUVXuE0,6400
604
606
  endoreg_db/services/storage_aware_video_processor.py,sha256=kKFK64vXLeBSVkp1YJonU3gFDTeXZ8C4qb9QZZB99SE,13420
605
- endoreg_db/services/video_import.py,sha256=0eeY5etJ4rg6uxC-uUis_yoa6cvGgwY2VaiD3mVFosg,46369
607
+ endoreg_db/services/video_import.py,sha256=FTFXb4A7cGp6uphDds5hyjdOcXnWAV-3LbjSIfaswvg,46241
606
608
  endoreg_db/tasks/upload_tasks.py,sha256=OJq7DhNwcbWdXzHY8jz5c51BCVkPN5gSWOz-6Fx6W5M,7799
607
609
  endoreg_db/tasks/video_ingest.py,sha256=kxFuYkHijINV0VabQKCFVpJRv6eCAw07tviONurDgg8,5265
608
610
  endoreg_db/tasks/video_processing_tasks.py,sha256=rZ7Kr49bAR4Q-vALO2SURebrhcJ5hSFGwjF4aULrOao,14089
@@ -644,6 +646,7 @@ endoreg_db/utils/parse_and_generate_yaml.py,sha256=k7y0fl9Jbb_LNryeJYd6tebklRlu1
644
646
  endoreg_db/utils/paths.py,sha256=ncXtB_l6FBVXXdk59U7v4FhSvLO7Yb0DQ-GQMcOqiTw,3398
645
647
  endoreg_db/utils/permissions.py,sha256=IqxG9IqJBSZuxvT1ItVgGS8fMzkA2OLdDV6y8mKHSuo,5096
646
648
  endoreg_db/utils/requirement_helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
649
+ endoreg_db/utils/setup_config.py,sha256=yeDPStTEJm8Xy6ah5AJTpXMoPUyouxuPIsRUpqdiXf4,6775
647
650
  endoreg_db/utils/translation.py,sha256=77Xel12pAGo0rQ0NxB7nfejvMb0GBjEmhC3I7mcU91I,1256
648
651
  endoreg_db/utils/uuid.py,sha256=T4HXqYtKwXFqE5kPyvlgWHyllBBF6LL6N48nl9TpwBk,53
649
652
  endoreg_db/utils/validate_endo_roi.py,sha256=Ct2H0JJW9gxYZc7099NYee4kxdKL90a3LGYahqibwms,925
@@ -786,7 +789,7 @@ endoreg_db/views/video/video_meta.py,sha256=C1wBMTtQb_yzEUrhFGAy2UHEWMk_CbU75WXX
786
789
  endoreg_db/views/video/video_processing_history.py,sha256=mhFuS8RG5GV8E-lTtuD0qrq-bIpnUFp8vy9aERfC-J8,770
787
790
  endoreg_db/views/video/video_remove_frames.py,sha256=2FmvNrSPM0fUXiBxINN6vBUUDCqDlBkNcGR3WsLDgKo,1696
788
791
  endoreg_db/views/video/video_stream.py,sha256=kLyuf0ORTmsLeYUQkTQ6iRYqlIQozWhMMR3Lhfe_trk,12148
789
- endoreg_db-0.8.4.2.dist-info/METADATA,sha256=xSaPMvzzc7HovOmkl2Gn0lYVoRNTPk4yqIBFcz0kc70,14758
790
- endoreg_db-0.8.4.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
791
- endoreg_db-0.8.4.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
792
- endoreg_db-0.8.4.2.dist-info/RECORD,,
792
+ endoreg_db-0.8.4.3.dist-info/METADATA,sha256=KnYipnhERrjdiE4CzHQjRa9sPk9NYl62tJ3UY3cIgZk,14758
793
+ endoreg_db-0.8.4.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
794
+ endoreg_db-0.8.4.3.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
795
+ endoreg_db-0.8.4.3.dist-info/RECORD,,