endoreg-db 0.8.1__py3-none-any.whl → 0.8.2__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.
- endoreg_db/helpers/download_segmentation_model.py +31 -0
- endoreg_db/models/media/video/pipe_1.py +13 -1
- endoreg_db/serializers/anonymization.py +3 -0
- endoreg_db/services/pdf_import.py +0 -30
- endoreg_db/services/video_import.py +301 -98
- endoreg_db/urls/__init__.py +0 -2
- endoreg_db/urls/media.py +201 -4
- endoreg_db/urls/report.py +0 -30
- endoreg_db/urls/video.py +30 -88
- endoreg_db/views/anonymization/validate.py +5 -2
- endoreg_db/views/media/__init__.py +38 -2
- endoreg_db/views/media/pdf_media.py +1 -1
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_segments.py +596 -0
- endoreg_db/views/pdf/reimport.py +18 -8
- endoreg_db/views/video/__init__.py +0 -8
- endoreg_db/views/video/correction.py +26 -26
- endoreg_db/views/video/reimport.py +15 -12
- endoreg_db/views/video/video_stream.py +168 -50
- {endoreg_db-0.8.1.dist-info → endoreg_db-0.8.2.dist-info}/METADATA +2 -2
- {endoreg_db-0.8.1.dist-info → endoreg_db-0.8.2.dist-info}/RECORD +34 -33
- endoreg_db/urls/pdf.py +0 -0
- endoreg_db/urls/sensitive_meta.py +0 -36
- endoreg_db/views/video/media/__init__.py +0 -23
- /endoreg_db/views/video/{media/task_status.py → task_status.py} +0 -0
- /endoreg_db/views/video/{media/video_analyze.py → video_analyze.py} +0 -0
- /endoreg_db/views/video/{media/video_apply_mask.py → video_apply_mask.py} +0 -0
- /endoreg_db/views/video/{media/video_correction.py → video_correction.py} +0 -0
- /endoreg_db/views/video/{media/video_download_processed.py → video_download_processed.py} +0 -0
- /endoreg_db/views/video/{media/video_media.py → video_media.py} +0 -0
- /endoreg_db/views/video/{media/video_meta.py → video_meta.py} +0 -0
- /endoreg_db/views/video/{media/video_processing_history.py → video_processing_history.py} +0 -0
- /endoreg_db/views/video/{media/video_remove_frames.py → video_remove_frames.py} +0 -0
- /endoreg_db/views/video/{media/video_reprocess.py → video_reprocess.py} +0 -0
- {endoreg_db-0.8.1.dist-info → endoreg_db-0.8.2.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.1.dist-info → endoreg_db-0.8.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import huggingface_hub
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
def download_segmentation_model(
|
|
5
|
+
repo_id: str = "wg-lux/colo_segmentation_RegNetX800MF_base",
|
|
6
|
+
filename: str = "model.safetensors",
|
|
7
|
+
cache_dir: Optional[str] = None
|
|
8
|
+
) -> str:
|
|
9
|
+
"""
|
|
10
|
+
Downloads a segmentation model from Hugging Face and caches it locally.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
repo_id (str): The Hugging Face repository ID (default: wg-lux model).
|
|
14
|
+
filename (str): The specific file to download from the repo (default: model.safetensors).
|
|
15
|
+
cache_dir (str): The directory to cache the downloaded model. If None, uses HF default cache.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
str: The local path to the downloaded model.
|
|
19
|
+
|
|
20
|
+
Example:
|
|
21
|
+
>>> model_path = download_segmentation_model()
|
|
22
|
+
>>> # Downloads from wg-lux/colo_segmentation_RegNetX800MF_base
|
|
23
|
+
"""
|
|
24
|
+
local_path = huggingface_hub.hf_hub_download(
|
|
25
|
+
repo_id=repo_id,
|
|
26
|
+
filename=filename,
|
|
27
|
+
cache_dir=cache_dir,
|
|
28
|
+
force_download=False,
|
|
29
|
+
resume_download=True,
|
|
30
|
+
)
|
|
31
|
+
return local_path
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from typing import TYPE_CHECKING, Optional, Dict, List, Tuple
|
|
3
3
|
from django.db import transaction
|
|
4
|
+
from endoreg_db.helpers.download_segmentation_model import download_segmentation_model
|
|
4
5
|
|
|
5
6
|
# Added imports
|
|
6
7
|
|
|
@@ -50,6 +51,8 @@ def _pipe_1(
|
|
|
50
51
|
if not state.frames_extracted:
|
|
51
52
|
logger.error("Pipe 1 failed: Frame extraction did not complete successfully.")
|
|
52
53
|
return False
|
|
54
|
+
|
|
55
|
+
|
|
53
56
|
|
|
54
57
|
# 3. Perform Initial Prediction
|
|
55
58
|
logger.info(f"Pipe 1: Performing prediction with model '{model_name}'...")
|
|
@@ -61,7 +64,16 @@ def _pipe_1(
|
|
|
61
64
|
model_meta = ai_model_obj.get_latest_version()
|
|
62
65
|
except AiModel.DoesNotExist:
|
|
63
66
|
logger.error(f"Pipe 1 failed: Model '{model_name}' not found.")
|
|
64
|
-
|
|
67
|
+
try:
|
|
68
|
+
model_name = download_segmentation_model()
|
|
69
|
+
ai_model_obj = AiModel.objects.get(name=model_name)
|
|
70
|
+
if model_meta_version is not None:
|
|
71
|
+
model_meta = ai_model_obj.metadata_versions.get(version=model_meta_version)
|
|
72
|
+
else:
|
|
73
|
+
model_meta = ai_model_obj.get_latest_version()
|
|
74
|
+
except AiModel.DoesNotExist:
|
|
75
|
+
logger.error(f"Pipe 1 failed: Model '{model_name}' not found.")
|
|
76
|
+
return False
|
|
65
77
|
except ModelMeta.DoesNotExist:
|
|
66
78
|
logger.error(
|
|
67
79
|
f"Pipe 1 failed: ModelMeta version {model_meta_version} for model '{model_name}' not found."
|
|
@@ -28,6 +28,9 @@ class SensitiveMetaValidateSerializer(serializers.Serializer):
|
|
|
28
28
|
patient_gender = serializers.CharField(required=False, allow_blank=True)
|
|
29
29
|
center_name = serializers.CharField(required=False, allow_blank=True)
|
|
30
30
|
is_verified = serializers.BooleanField(required=False, default=True)
|
|
31
|
+
file_type = serializers.ChoiceField(
|
|
32
|
+
choices=['video', 'pdf'], required=False
|
|
33
|
+
) # Optional: "video" oder "pdf"
|
|
31
34
|
|
|
32
35
|
def validate_patient_dob(self, value):
|
|
33
36
|
"""
|
|
@@ -637,36 +637,6 @@ class PdfImportService:
|
|
|
637
637
|
|
|
638
638
|
except Exception as e:
|
|
639
639
|
logger.warning("Could not set anonymized file reference: %s", e)
|
|
640
|
-
|
|
641
|
-
'''def _apply_anonymized_pdf(self):
|
|
642
|
-
"""Apply anonymized PDF results."""
|
|
643
|
-
if not self.current_pdf:
|
|
644
|
-
logger.warning("Cannot apply anonymized PDF - no PDF instance available")
|
|
645
|
-
return
|
|
646
|
-
|
|
647
|
-
anonymized_pdf_path = self.processing_context.get('anonymized_pdf_path')
|
|
648
|
-
|
|
649
|
-
if not anonymized_pdf_path:
|
|
650
|
-
return
|
|
651
|
-
|
|
652
|
-
anonymized_path = Path(anonymized_pdf_path)
|
|
653
|
-
if anonymized_path.exists():
|
|
654
|
-
logger.info(f"Anonymized PDF created by ReportReader at: {anonymized_path}")
|
|
655
|
-
try:
|
|
656
|
-
from django.core.files.base import File
|
|
657
|
-
with open(anonymized_path, 'rb') as f:
|
|
658
|
-
django_file = File(f)
|
|
659
|
-
self.current_pdf.anonymized_file.save(
|
|
660
|
-
anonymized_path.name,
|
|
661
|
-
django_file,
|
|
662
|
-
save=False
|
|
663
|
-
)
|
|
664
|
-
except Exception as e:
|
|
665
|
-
logger.warning(f"Could not set anonymized file reference: {e}")
|
|
666
|
-
else:
|
|
667
|
-
logger.warning(f"Anonymized PDF path returned but file does not exist: {anonymized_path}")'''
|
|
668
|
-
|
|
669
|
-
|
|
670
640
|
|
|
671
641
|
|
|
672
642
|
def _finalize_processing(self):
|