endoreg-db 0.4.5__py3-none-any.whl → 0.8.6.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.
- endoreg_db/admin.py +90 -1
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +12 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +92 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +76 -4
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/{label → ai_model_label}/label/data.yaml +27 -1
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/center/data.yaml +40 -9
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/misc.yaml +1 -2
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +2 -2
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +6 -6
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscopy_processor/data.yaml +3 -0
- endoreg_db/data/event/cardiology.yaml +0 -13
- endoreg_db/data/examination/examinations/data.yaml +34 -28
- endoreg_db/data/examination/type/data.yaml +12 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/finding/complication.yaml +16 -0
- endoreg_db/data/finding/data.yaml +105 -0
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
- endoreg_db/data/finding_type/data.yaml +43 -0
- endoreg_db/data/gender/data.yaml +24 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +7 -1
- endoreg_db/data/lab_value/coagulation.yaml +6 -1
- endoreg_db/data/lab_value/electrolytes.yaml +39 -1
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +12 -0
- endoreg_db/data/lab_value/hematology.yaml +17 -2
- endoreg_db/data/lab_value/hormones.yaml +6 -0
- endoreg_db/data/lab_value/lipids.yaml +12 -3
- endoreg_db/data/lab_value/misc.yaml +48 -2
- endoreg_db/data/lab_value/renal_function.yaml +2 -1
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/medication/anticoagulation.yaml +5 -5
- endoreg_db/data/medication/tah.yaml +5 -5
- endoreg_db/data/medication_indication/anticoagulation.yaml +48 -53
- endoreg_db/data/medication_intake_time/base.yaml +4 -4
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +30 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/pdf_type/data.yaml +27 -9
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +4 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
- endoreg_db/data/requirement/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/gender.yaml +25 -0
- endoreg_db/data/requirement/lab_value.yaml +441 -0
- endoreg_db/data/requirement/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/age.yaml +13 -0
- endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
- endoreg_db/data/requirement_set_type/data.yaml +20 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/unit/concentration.yaml +23 -0
- endoreg_db/data/unit/time.yaml +36 -1
- endoreg_db/exceptions.py +19 -0
- endoreg_db/forms/__init__.py +3 -1
- endoreg_db/forms/examination_form.py +11 -0
- endoreg_db/forms/patient_finding_intervention_form.py +18 -0
- endoreg_db/forms/patient_form.py +27 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -1
- endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
- endoreg_db/helpers/count_db.py +45 -0
- endoreg_db/helpers/data_loader.py +208 -0
- endoreg_db/helpers/default_objects.py +378 -0
- endoreg_db/helpers/download_segmentation_model.py +31 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +115 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
- endoreg_db/management/commands/fix_video_paths.py +165 -0
- endoreg_db/management/commands/import_fallback_video.py +203 -0
- endoreg_db/management/commands/import_report.py +298 -0
- endoreg_db/management/commands/import_video.py +423 -0
- endoreg_db/management/commands/import_video_with_classification.py +367 -0
- endoreg_db/management/commands/init_default_ai_model.py +112 -0
- endoreg_db/management/commands/load_ai_model_data.py +58 -26
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +174 -118
- endoreg_db/management/commands/load_center_data.py +46 -21
- endoreg_db/management/commands/{load_logging_data.py → load_contraindication_data.py} +4 -2
- endoreg_db/management/commands/load_disease_data.py +29 -7
- endoreg_db/management/commands/{load_endoscope_type_data.py → load_endoscope_data.py} +30 -7
- endoreg_db/management/commands/load_examination_indication_data.py +86 -0
- endoreg_db/management/commands/load_finding_data.py +128 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -1
- endoreg_db/management/commands/load_information_source.py +13 -7
- endoreg_db/management/commands/load_lab_value_data.py +3 -3
- endoreg_db/management/commands/load_medication_data.py +83 -21
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/{load_medication_intake_time_data.py → load_organ_data.py} +7 -5
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_requirement_data.py +180 -0
- endoreg_db/management/commands/load_risk_data.py +56 -0
- endoreg_db/management/commands/load_shift_data.py +60 -0
- endoreg_db/management/commands/load_tag_data.py +57 -0
- endoreg_db/management/commands/register_ai_model.py +1 -1
- endoreg_db/management/commands/setup_endoreg_db.py +381 -0
- endoreg_db/management/commands/start_filewatcher.py +106 -0
- endoreg_db/management/commands/storage_management.py +548 -0
- endoreg_db/management/commands/summarize_db_content.py +189 -0
- endoreg_db/management/commands/validate_video.py +204 -0
- endoreg_db/management/commands/validate_video_files.py +161 -0
- endoreg_db/management/commands/video_validation.py +22 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1234 -944
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/models/__init__.py +339 -53
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/{ai_model → administration/ai}/model_type.py +19 -4
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +10 -1
- endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +60 -16
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +6 -13
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +21 -8
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
- endoreg_db/models/{center → administration/center}/__init__.py +9 -0
- endoreg_db/models/administration/center/center.py +67 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/administration/center/center_resource.py +49 -0
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/{persons → administration/person/names}/first_name.py +1 -1
- endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/__init__.py +14 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/{product → administration/product}/product_weight.py +21 -0
- endoreg_db/models/{product → administration/product}/reference_product.py +44 -13
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +37 -0
- endoreg_db/models/administration/qualification/qualification_type.py +35 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +69 -0
- endoreg_db/models/administration/shift/shift.py +51 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/label/__init__.py +24 -1
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +84 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
- endoreg_db/models/label/label.py +53 -54
- endoreg_db/models/label/label_set.py +53 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
- endoreg_db/models/label/video_segmentation_label.py +31 -0
- endoreg_db/models/label/video_segmentation_labelset.py +27 -0
- endoreg_db/models/media/__init__.py +16 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +111 -0
- endoreg_db/models/media/pdf/__init__.py +11 -0
- endoreg_db/models/media/pdf/raw_pdf.py +757 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/video/__init__.py +8 -0
- endoreg_db/models/media/video/create_from_file.py +358 -0
- endoreg_db/models/media/video/pipe_1.py +213 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +825 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +349 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +168 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/media/video/video_metadata.py +65 -0
- endoreg_db/models/media/video/video_processing.py +152 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/medical/contraindication/__init__.py +17 -0
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/medical/examination/__init__.py +9 -0
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/medical/examination/examination_time.py +49 -0
- endoreg_db/models/medical/examination/examination_time_type.py +41 -0
- endoreg_db/models/medical/examination/examination_type.py +48 -0
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/medical/finding/finding_intervention.py +52 -0
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +65 -0
- endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +68 -29
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/medical/medication/__init__.py +19 -0
- endoreg_db/models/medical/medication/medication.py +31 -0
- endoreg_db/models/medical/medication/medication_indication.py +50 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
- endoreg_db/models/medical/medication/medication_schedule.py +45 -0
- endoreg_db/models/medical/organ/__init__.py +35 -0
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +68 -22
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +72 -0
- endoreg_db/models/medical/risk/risk_type.py +51 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +206 -0
- endoreg_db/models/metadata/model_meta_logic.py +343 -0
- endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +32 -13
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -0
- endoreg_db/models/metadata/video_meta.py +332 -0
- endoreg_db/models/metadata/video_prediction_logic.py +190 -0
- endoreg_db/models/metadata/video_prediction_meta.py +270 -0
- endoreg_db/models/other/__init__.py +36 -1
- endoreg_db/models/other/distribution/__init__.py +44 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +94 -0
- endoreg_db/models/{persons → other}/gender.py +8 -3
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +14 -2
- endoreg_db/models/other/resource.py +6 -2
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +15 -3
- endoreg_db/models/{unit.py → other/unit.py} +16 -6
- endoreg_db/models/other/waste.py +10 -3
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +767 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
- endoreg_db/models/requirement/requirement_operator.py +176 -0
- endoreg_db/models/requirement/requirement_set.py +287 -0
- endoreg_db/models/rule/__init__.py +13 -0
- endoreg_db/models/{rules → rule}/rule.py +6 -3
- endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
- endoreg_db/models/{rules → rule}/rule_type.py +0 -2
- endoreg_db/models/{rules → rule}/ruleset.py +0 -2
- endoreg_db/models/state/__init__.py +12 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/audit_ledger.py +150 -0
- endoreg_db/models/state/label_video_segment.py +22 -0
- endoreg_db/models/state/raw_pdf.py +187 -0
- endoreg_db/models/state/sensitive_meta.py +46 -0
- endoreg_db/models/state/video.py +232 -0
- endoreg_db/models/upload_job.py +99 -0
- endoreg_db/models/utils.py +135 -0
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +118 -10
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
- endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +69 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +182 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +120 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +411 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/pdf_import.py +1382 -0
- endoreg_db/services/polling_coordinator.py +288 -0
- endoreg_db/services/pseudonym_service.py +89 -0
- endoreg_db/services/requirements_object.py +147 -0
- endoreg_db/services/segment_sync.py +155 -0
- endoreg_db/services/storage_aware_video_processor.py +344 -0
- endoreg_db/services/video_import.py +1259 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +83 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +46 -0
- endoreg_db/urls/media.py +227 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/report.py +48 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +0 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +61 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +88 -1
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
- endoreg_db/utils/ai/inference_dataset.py +52 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/utils/ai/preprocess.py +68 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/case_generator/case_generator.py +159 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
- endoreg_db/utils/case_generator/utils.py +30 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/dataloader.py +118 -35
- endoreg_db/utils/dates.py +60 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +29 -1
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +123 -4
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +193 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +76 -0
- endoreg_db/utils/parse_and_generate_yaml.py +46 -0
- endoreg_db/utils/paths.py +95 -0
- endoreg_db/utils/permissions.py +143 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +120 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +20 -0
- endoreg_db/utils/product/sum_weights.py +18 -0
- endoreg_db/utils/pydantic_models/__init__.py +6 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/setup_config.py +177 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/validate_endo_roi.py +19 -0
- endoreg_db/utils/validate_subcategory_dict.py +91 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +26 -0
- endoreg_db/utils/video/extract_frames.py +88 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +274 -0
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +107 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +113 -0
- endoreg_db/views/examination/__init__.py +33 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
- endoreg_db/views/examination/get_finding_classifications.py +36 -0
- endoreg_db/views/examination/get_findings.py +41 -0
- endoreg_db/views/examination/get_instruments.py +18 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +112 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +42 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
- endoreg_db/views/label/__init__.py +5 -0
- endoreg_db/views/label/label.py +15 -0
- endoreg_db/views/label_video_segment/__init__.py +16 -0
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
- endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
- endoreg_db/views/label_video_segment/validate.py +226 -0
- endoreg_db/views/media/__init__.py +45 -0
- endoreg_db/views/media/pdf_media.py +388 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +524 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/csrf.py +7 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +8 -0
- endoreg_db/views/pdf/pdf_stream.py +187 -0
- endoreg_db/views/pdf/reimport.py +177 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +367 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +59 -0
- endoreg_db/views/video/correction.py +530 -0
- endoreg_db/views/video/reimport.py +195 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/video/task_status.py +49 -0
- endoreg_db/views/video/timeline.py +46 -0
- endoreg_db/views/video/video_analyze.py +52 -0
- endoreg_db/views/video/video_apply_mask.py +48 -0
- endoreg_db/views/video/video_correction.py +21 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db/views.py +0 -3
- endoreg_db-0.8.6.3.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.3.dist-info/RECORD +793 -0
- {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info}/WHEEL +1 -1
- endoreg_db/data/active_model/data.yaml +0 -3
- endoreg_db/data/agl_service/data.yaml +0 -19
- endoreg_db/data/label/label-set/data.yaml +0 -18
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.py +0 -18
- endoreg_db/management/commands/delete_legacy_images.py +0 -19
- endoreg_db/management/commands/delete_legacy_videos.py +0 -17
- endoreg_db/management/commands/extract_legacy_video_frames.py +0 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
- endoreg_db/management/commands/fix_auth_permission.py +0 -20
- endoreg_db/management/commands/import_legacy_images.py +0 -94
- endoreg_db/management/commands/import_legacy_videos.py +0 -76
- endoreg_db/management/commands/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_endoscopy_processor_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_label_data.py +0 -67
- endoreg_db/management/commands/load_medication_indication_data.py +0 -63
- endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
- endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
- endoreg_db/management/commands/load_network_data.py +0 -57
- endoreg_db/migrations/0002_anonymizedimagelabel_anonymousimageannotation_and_more.py +0 -55
- endoreg_db/migrations/0003_anonymousimageannotation_original_image_url_and_more.py +0 -39
- endoreg_db/migrations/0004_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0005_uploadedfile_alter_rawpdffile_file_anonymizedfile.py +0 -40
- endoreg_db/migrations/0006_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0007_networkdevicelogentry_datetime_and_more.py +0 -43
- endoreg_db/models/ai_model/__init__.py +0 -3
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/model_meta.py +0 -24
- endoreg_db/models/annotation/__init__.py +0 -3
- endoreg_db/models/annotation/anonymized_image_annotation.py +0 -60
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -80
- endoreg_db/models/annotation/image_classification.py +0 -27
- endoreg_db/models/center/center.py +0 -25
- endoreg_db/models/center/center_product.py +0 -34
- endoreg_db/models/center/center_resource.py +0 -19
- endoreg_db/models/center/center_waste.py +0 -11
- endoreg_db/models/data_file/__init__.py +0 -6
- endoreg_db/models/data_file/base_classes/__init__.py +0 -2
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -51
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -201
- endoreg_db/models/data_file/frame.py +0 -45
- endoreg_db/models/data_file/import_classes/__init__.py +0 -32
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -188
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -343
- endoreg_db/models/data_file/metadata/__init__.py +0 -3
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -31
- endoreg_db/models/data_file/metadata/video_meta.py +0 -133
- endoreg_db/models/data_file/report_file.py +0 -89
- endoreg_db/models/data_file/video/__init__.py +0 -7
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -25
- endoreg_db/models/data_file/video_segment.py +0 -107
- endoreg_db/models/disease.py +0 -56
- endoreg_db/models/emission/__init__.py +0 -1
- endoreg_db/models/emission/emission_factor.py +0 -20
- endoreg_db/models/event.py +0 -22
- endoreg_db/models/examination/__init__.py +0 -4
- endoreg_db/models/examination/examination.py +0 -26
- endoreg_db/models/examination/examination_time.py +0 -27
- endoreg_db/models/examination/examination_time_type.py +0 -24
- endoreg_db/models/examination/examination_type.py +0 -18
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/hardware/endoscope.py +0 -44
- endoreg_db/models/information_source.py +0 -29
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -102
- endoreg_db/models/legacy_data/__init__.py +0 -3
- endoreg_db/models/legacy_data/image.py +0 -34
- endoreg_db/models/logging/__init__.py +0 -4
- endoreg_db/models/logging/agl_service.py +0 -19
- endoreg_db/models/logging/base.py +0 -22
- endoreg_db/models/logging/log_type.py +0 -23
- endoreg_db/models/logging/network_device.py +0 -24
- endoreg_db/models/medication/__init__.py +0 -1
- endoreg_db/models/medication/medication.py +0 -148
- endoreg_db/models/network/__init__.py +0 -3
- endoreg_db/models/network/agl_service.py +0 -38
- endoreg_db/models/network/network_device.py +0 -53
- endoreg_db/models/network/network_device_type.py +0 -23
- endoreg_db/models/other/distribution.py +0 -215
- endoreg_db/models/patient_examination/__init__.py +0 -35
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -7
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -16
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/case/case.py +0 -30
- endoreg_db/models/persons/patient/patient.py +0 -216
- endoreg_db/models/persons/patient/patient_disease.py +0 -16
- endoreg_db/models/persons/patient/patient_event.py +0 -22
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -106
- endoreg_db/models/persons/patient/patient_medication.py +0 -44
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -28
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -2
- endoreg_db/models/prediction/image_classification.py +0 -37
- endoreg_db/models/prediction/video_prediction_meta.py +0 -244
- endoreg_db/models/product/__init__.py +0 -5
- endoreg_db/models/product/product.py +0 -97
- endoreg_db/models/product/product_group.py +0 -19
- endoreg_db/models/product/product_material.py +0 -24
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -2
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- endoreg_db/models/report_reader/__init__.py +0 -2
- endoreg_db/models/report_reader/report_reader_config.py +0 -53
- endoreg_db/models/rules/__init__.py +0 -5
- endoreg_db/queries/get/__init__.py +0 -6
- endoreg_db/queries/get/center.py +0 -42
- endoreg_db/queries/get/model.py +0 -13
- endoreg_db/queries/get/patient.py +0 -14
- endoreg_db/queries/get/patient_examination.py +0 -20
- endoreg_db/queries/get/report_file.py +0 -33
- endoreg_db/queries/get/video.py +0 -31
- endoreg_db/serializers/ai_model.py +0 -19
- endoreg_db/serializers/annotation.py +0 -17
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -13
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -10
- endoreg_db/serializers/prediction.py +0 -15
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -27
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video_metadata.py +0 -87
- endoreg_db-0.4.5.dist-info/METADATA +0 -34
- endoreg_db-0.4.5.dist-info/RECORD +0 -316
- /endoreg_db/{data/distribution/numeric/.init → api/serializers/finding_descriptions.py} +0 -0
- /endoreg_db/{models/persons/patient/case/__init__.py → api/views/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/annotation.py → config/__init__.py} +0 -0
- /endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +0 -0
- /endoreg_db/data/{model_type → ai_model_type}/data.yaml +0 -0
- /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
- /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
- /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
- /endoreg_db/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +0 -0
- /endoreg_db/models/{persons → administration/person}/person.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
- /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
- {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info/licenses}/LICENSE +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Models for storing metadata associated with other data entities."""
|
|
2
|
+
|
|
3
|
+
from .sensitive_meta import SensitiveMeta
|
|
4
|
+
from .pdf_meta import PdfMeta, PdfType
|
|
5
|
+
from .video_meta import VideoMeta, FFMpegMeta, VideoImportMeta
|
|
6
|
+
from .model_meta import ModelMeta
|
|
7
|
+
from .video_prediction_meta import VideoPredictionMeta
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"SensitiveMeta",
|
|
12
|
+
"PdfMeta",
|
|
13
|
+
"PdfType",
|
|
14
|
+
"VideoMeta",
|
|
15
|
+
"FFMpegMeta",
|
|
16
|
+
"VideoImportMeta",
|
|
17
|
+
"ModelMeta",
|
|
18
|
+
"VideoPredictionMeta",
|
|
19
|
+
]
|
|
File without changes
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Defines the ModelMeta model and its manager for storing metadata related to AI models,
|
|
3
|
+
including versioning, configuration, and associated weights files.
|
|
4
|
+
Logic is primarily handled in model_meta_logic.py.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Optional, TYPE_CHECKING, Tuple, Dict, Any, Type
|
|
8
|
+
# Removed shutil import, now in logic
|
|
9
|
+
|
|
10
|
+
from django.db import models
|
|
11
|
+
from django.core.validators import FileExtensionValidator
|
|
12
|
+
# Removed torch import, now in logic
|
|
13
|
+
# from torch import nn
|
|
14
|
+
|
|
15
|
+
from ..utils import WEIGHTS_DIR, STORAGE_DIR
|
|
16
|
+
# Import logic functions
|
|
17
|
+
from . import model_meta_logic as logic
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from endoreg_db.models import LabelSet, AiModel # pylint: disable=import-outside-toplevel
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ModelMetaManager(models.Manager):
|
|
24
|
+
"""
|
|
25
|
+
Custom manager for the ModelMeta model.
|
|
26
|
+
|
|
27
|
+
Provides methods for retrieving ModelMeta instances using natural keys.
|
|
28
|
+
"""
|
|
29
|
+
# ... existing code ...
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ModelMeta(models.Model):
|
|
33
|
+
"""
|
|
34
|
+
Represents the metadata for a specific version of an AI model.
|
|
35
|
+
Logic for creation, querying, and configuration is in model_meta_logic.py.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
# ... (fields remain the same: name, version, model, labelset, activation, weights, mean, std, etc.) ...
|
|
39
|
+
# --- Model Identification ---
|
|
40
|
+
name = models.CharField(
|
|
41
|
+
max_length=255,
|
|
42
|
+
help_text="User-defined name for this specific model metadata set (e.g., 'segmentation_base').",
|
|
43
|
+
)
|
|
44
|
+
version = models.CharField(
|
|
45
|
+
max_length=255,
|
|
46
|
+
help_text="Version identifier for this metadata set (e.g., '1', '2a').",
|
|
47
|
+
)
|
|
48
|
+
model = models.ForeignKey(
|
|
49
|
+
"AiModel",
|
|
50
|
+
on_delete=models.CASCADE,
|
|
51
|
+
related_name="metadata_versions",
|
|
52
|
+
help_text="The base AI model architecture this metadata belongs to.",
|
|
53
|
+
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# --- Model Configuration ---
|
|
57
|
+
labelset = models.ForeignKey(
|
|
58
|
+
"LabelSet",
|
|
59
|
+
on_delete=models.CASCADE,
|
|
60
|
+
related_name="model_metadata",
|
|
61
|
+
help_text="The set of labels this model version predicts.",
|
|
62
|
+
)
|
|
63
|
+
activation = models.CharField(
|
|
64
|
+
max_length=50, default="sigmoid", help_text="Output activation function (e.g., 'sigmoid', 'softmax', 'none')."
|
|
65
|
+
)
|
|
66
|
+
weights = models.FileField(
|
|
67
|
+
upload_to=WEIGHTS_DIR.name, # Use .name for relative path
|
|
68
|
+
validators=[FileExtensionValidator(allowed_extensions=["ckpt"])],
|
|
69
|
+
null=True,
|
|
70
|
+
blank=True,
|
|
71
|
+
help_text="Path to the model weights file (.ckpt), relative to MEDIA_ROOT.",
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# --- Normalization and Input Shape ---
|
|
75
|
+
mean = models.CharField(
|
|
76
|
+
max_length=255,
|
|
77
|
+
default="0.45211223,0.27139644,0.19264949",
|
|
78
|
+
help_text="Comma-separated mean values for input normalization.",
|
|
79
|
+
)
|
|
80
|
+
std = models.CharField(
|
|
81
|
+
max_length=255,
|
|
82
|
+
default="0.31418097,0.21088019,0.16059452",
|
|
83
|
+
help_text="Comma-separated standard deviation values for input normalization.",
|
|
84
|
+
)
|
|
85
|
+
size_x = models.IntegerField(default=716, help_text="Expected input image width.")
|
|
86
|
+
size_y = models.IntegerField(default=716, help_text="Expected input image height.")
|
|
87
|
+
axes = models.CharField(
|
|
88
|
+
max_length=10, default="2,0,1", help_text="Comma-separated target axis order (e.g., '2,0,1' for CHW)."
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# --- Inference Parameters ---
|
|
92
|
+
batchsize = models.IntegerField(default=16, help_text="Default batch size for inference.")
|
|
93
|
+
num_workers = models.IntegerField(default=0, help_text="Default number of workers for data loading.")
|
|
94
|
+
|
|
95
|
+
# --- Metadata ---
|
|
96
|
+
description = models.TextField(blank=True, null=True, help_text="Optional description.")
|
|
97
|
+
date_created = models.DateTimeField(auto_now_add=True)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
objects = ModelMetaManager()
|
|
101
|
+
|
|
102
|
+
# --- Type Hinting for Related Fields ---
|
|
103
|
+
if TYPE_CHECKING:
|
|
104
|
+
labelset: "LabelSet"
|
|
105
|
+
model: "AiModel" # Corrected from ai_model to match field name
|
|
106
|
+
|
|
107
|
+
class Meta:
|
|
108
|
+
"""Metadata options for the ModelMeta model."""
|
|
109
|
+
# ... existing code ...
|
|
110
|
+
|
|
111
|
+
@classmethod
|
|
112
|
+
def create_from_file(
|
|
113
|
+
cls: Type["ModelMeta"],
|
|
114
|
+
meta_name: str,
|
|
115
|
+
model_name: str,
|
|
116
|
+
labelset_name: str,
|
|
117
|
+
weights_file: str,
|
|
118
|
+
requested_version: Optional[str] = None,
|
|
119
|
+
bump_if_exists: bool = False,
|
|
120
|
+
**kwargs: Any,
|
|
121
|
+
) -> "ModelMeta":
|
|
122
|
+
"""
|
|
123
|
+
Creates or updates a ModelMeta instance using external logic.
|
|
124
|
+
"""
|
|
125
|
+
# Delegate to logic function, passing the class (cls)
|
|
126
|
+
return logic.create_from_file_logic(
|
|
127
|
+
cls, meta_name, model_name, labelset_name, weights_file,
|
|
128
|
+
requested_version, bump_if_exists, **kwargs
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
@classmethod
|
|
132
|
+
def setup_default_from_huggingface(
|
|
133
|
+
cls: Type["ModelMeta"],
|
|
134
|
+
model_id: str = "wg-lux/colo_segmentation_RegNetX800MF_base",
|
|
135
|
+
labelset_name: Optional[str] = None,
|
|
136
|
+
) -> "ModelMeta":
|
|
137
|
+
"""
|
|
138
|
+
Downloads a pretrained model from Hugging Face and initializes ModelMeta automatically.
|
|
139
|
+
"""
|
|
140
|
+
# If labelset_name is not provided, handle default logic here if needed
|
|
141
|
+
return logic.setup_default_from_huggingface_logic(cls, model_id, labelset_name)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@classmethod
|
|
146
|
+
def get_latest_version_number(cls: Type["ModelMeta"], meta_name: str, model_name: str) -> int:
|
|
147
|
+
"""
|
|
148
|
+
Gets the latest version *number* using external logic.
|
|
149
|
+
"""
|
|
150
|
+
# Delegate to logic function
|
|
151
|
+
return logic.get_latest_version_number_logic(cls, meta_name, model_name)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
@staticmethod
|
|
155
|
+
def get_activation_function(activation_name: str) -> "TorchModule":
|
|
156
|
+
"""
|
|
157
|
+
Retrieves a PyTorch activation function using external logic.
|
|
158
|
+
"""
|
|
159
|
+
# Delegate to logic function
|
|
160
|
+
return logic.get_activation_function_logic(activation_name)
|
|
161
|
+
|
|
162
|
+
def get_inference_dataset_config(self) -> Dict[str, Any]:
|
|
163
|
+
"""
|
|
164
|
+
Generates an inference dataset configuration using external logic.
|
|
165
|
+
"""
|
|
166
|
+
# Delegate to logic function
|
|
167
|
+
return logic.get_inference_dataset_config_logic(self)
|
|
168
|
+
|
|
169
|
+
def natural_key(self) -> Tuple[str, str]:
|
|
170
|
+
"""
|
|
171
|
+
Returns the natural key for serialization.
|
|
172
|
+
"""
|
|
173
|
+
# Assuming natural key is based on name and version, linked to model name
|
|
174
|
+
return (self.name, self.version, self.model.natural_key())
|
|
175
|
+
|
|
176
|
+
def __str__(self) -> str:
|
|
177
|
+
"""String representation of the ModelMeta instance."""
|
|
178
|
+
# Ensure a string is always returned
|
|
179
|
+
model_name = self.model.name if self.model else "UnknownModel"
|
|
180
|
+
return f"ModelMeta: {self.name} (v{self.version}) for {model_name}"
|
|
181
|
+
|
|
182
|
+
def get_config_dict(self) -> Dict[str, Any]:
|
|
183
|
+
"""
|
|
184
|
+
Returns the model's configuration parameters using external logic.
|
|
185
|
+
"""
|
|
186
|
+
# Delegate to logic function
|
|
187
|
+
return logic.get_config_dict_logic(self)
|
|
188
|
+
|
|
189
|
+
@classmethod
|
|
190
|
+
def get_by_name_version(
|
|
191
|
+
cls: Type["ModelMeta"],
|
|
192
|
+
meta_name: str,
|
|
193
|
+
model_name: str,
|
|
194
|
+
version: Optional[str] = None,
|
|
195
|
+
) -> "ModelMeta":
|
|
196
|
+
"""
|
|
197
|
+
Retrieves a ModelMeta instance by name, model name, and optionally version using external logic.
|
|
198
|
+
"""
|
|
199
|
+
# Delegate to logic function
|
|
200
|
+
return logic.get_model_meta_by_name_version_logic(cls, meta_name, model_name, version)
|
|
201
|
+
|
|
202
|
+
@classmethod
|
|
203
|
+
def get_latest(cls: Type["ModelMeta"], meta_name: str, model_name: str) -> "ModelMeta":
|
|
204
|
+
"""Alias for get_by_name_version(meta_name, model_name, version=None) using external logic."""
|
|
205
|
+
# Delegate directly to the specific logic function
|
|
206
|
+
return logic.get_model_meta_by_name_version_logic(cls, meta_name, model_name, version=None)
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import shutil
|
|
2
|
+
from logging import getLogger
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Optional, Type
|
|
5
|
+
|
|
6
|
+
from django.core.files import File
|
|
7
|
+
from django.db import transaction
|
|
8
|
+
from huggingface_hub import hf_hub_download
|
|
9
|
+
|
|
10
|
+
# Assuming ModelMeta, AiModel, LabelSet are importable from the correct locations
|
|
11
|
+
# Adjust imports based on your project structure if necessary
|
|
12
|
+
from ..administration.ai.ai_model import AiModel
|
|
13
|
+
from ..label.label_set import LabelSet
|
|
14
|
+
from ..utils import STORAGE_DIR, WEIGHTS_DIR
|
|
15
|
+
|
|
16
|
+
logger = getLogger("ai_model")
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from .model_meta import ModelMeta # Import ModelMeta for type hinting
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _get_model_meta_class():
|
|
23
|
+
"""Lazy import to avoid circular imports"""
|
|
24
|
+
from .model_meta import ModelMeta
|
|
25
|
+
|
|
26
|
+
return ModelMeta
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def get_latest_version_number_logic(cls: Type["ModelMeta"], meta_name: str, model_name: str) -> int:
|
|
30
|
+
"""
|
|
31
|
+
Finds the highest numerical version for a given meta_name and model_name.
|
|
32
|
+
Iterates through all versions, attempts to parse them as integers,
|
|
33
|
+
and returns the maximum integer found. If no numeric versions are found,
|
|
34
|
+
returns 0.
|
|
35
|
+
"""
|
|
36
|
+
versions_qs = cls.objects.filter(name=meta_name, model__name=model_name).values_list("version", flat=True)
|
|
37
|
+
|
|
38
|
+
max_v = 0
|
|
39
|
+
found_numeric_version = False
|
|
40
|
+
|
|
41
|
+
for v_str in versions_qs:
|
|
42
|
+
if v_str is None: # Skip None versions
|
|
43
|
+
continue
|
|
44
|
+
try:
|
|
45
|
+
v_int = int(v_str)
|
|
46
|
+
if not found_numeric_version or v_int > max_v:
|
|
47
|
+
max_v = v_int
|
|
48
|
+
found_numeric_version = True
|
|
49
|
+
except ValueError:
|
|
50
|
+
logger.warning(
|
|
51
|
+
f"Warning: Could not parse version string '{v_str}' as an integer for "
|
|
52
|
+
f"meta_name='{meta_name}', model_name='{model_name}' while determining the max version."
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
return max_v if found_numeric_version else 0
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@transaction.atomic
|
|
59
|
+
def create_from_file_logic(
|
|
60
|
+
cls: Type["ModelMeta"], # cls is ModelMeta
|
|
61
|
+
meta_name: str,
|
|
62
|
+
model_name: str,
|
|
63
|
+
labelset_name: str,
|
|
64
|
+
weights_file: str,
|
|
65
|
+
requested_version: Optional[str] = None,
|
|
66
|
+
bump_if_exists: bool = False,
|
|
67
|
+
**kwargs: Any,
|
|
68
|
+
) -> "ModelMeta":
|
|
69
|
+
"""
|
|
70
|
+
Logic to create or update a ModelMeta instance from a weights file.
|
|
71
|
+
|
|
72
|
+
Handles finding related objects, versioning, file copying, and saving.
|
|
73
|
+
"""
|
|
74
|
+
# --- Find Related Objects ---
|
|
75
|
+
try:
|
|
76
|
+
ai_model = AiModel.objects.get(name=model_name)
|
|
77
|
+
except AiModel.DoesNotExist as exc:
|
|
78
|
+
raise ValueError(f"AiModel with name '{model_name}' not found.") from exc
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
label_set = LabelSet.objects.get(name=labelset_name)
|
|
82
|
+
except LabelSet.DoesNotExist as exc:
|
|
83
|
+
raise ValueError(f"LabelSet with name '{labelset_name}' not found.") from exc
|
|
84
|
+
|
|
85
|
+
# --- Determine Version ---
|
|
86
|
+
target_version: str
|
|
87
|
+
latest_version_num = get_latest_version_number_logic(cls, meta_name, model_name)
|
|
88
|
+
|
|
89
|
+
if requested_version:
|
|
90
|
+
target_version = str(requested_version)
|
|
91
|
+
existing = cls.objects.filter(name=meta_name, model=ai_model, version=target_version).first()
|
|
92
|
+
if existing and not bump_if_exists:
|
|
93
|
+
raise ValueError(
|
|
94
|
+
f"ModelMeta '{meta_name}' version '{target_version}' for model '{model_name}' already exists. Use bump_if_exists=True to increment."
|
|
95
|
+
)
|
|
96
|
+
elif existing and bump_if_exists:
|
|
97
|
+
target_version = str(latest_version_num + 1)
|
|
98
|
+
logger.info(f"Bumping version for {meta_name}/{model_name} to {target_version}")
|
|
99
|
+
else:
|
|
100
|
+
target_version = str(latest_version_num + 1)
|
|
101
|
+
logger.info(f"Setting next version for {meta_name}/{model_name} to {target_version}")
|
|
102
|
+
|
|
103
|
+
# --- Prepare Weights File ---
|
|
104
|
+
source_weights_path = Path(weights_file).resolve()
|
|
105
|
+
if not source_weights_path.exists():
|
|
106
|
+
raise FileNotFoundError(f"Weights file not found: {source_weights_path}")
|
|
107
|
+
|
|
108
|
+
# Construct destination path within MEDIA_ROOT/WEIGHTS_DIR
|
|
109
|
+
weights_filename = source_weights_path.name
|
|
110
|
+
# Relative path for the FileField upload_to
|
|
111
|
+
relative_dest_path = Path(WEIGHTS_DIR.relative_to(STORAGE_DIR)) / f"{meta_name}_v{target_version}_{weights_filename}"
|
|
112
|
+
# Full path for shutil.copy
|
|
113
|
+
full_dest_path = STORAGE_DIR / relative_dest_path
|
|
114
|
+
|
|
115
|
+
# Ensure the destination directory exists
|
|
116
|
+
full_dest_path.parent.mkdir(parents=True, exist_ok=True)
|
|
117
|
+
|
|
118
|
+
# Copy the file
|
|
119
|
+
try:
|
|
120
|
+
shutil.copy(source_weights_path, full_dest_path)
|
|
121
|
+
logger.info(f"Copied weights from {source_weights_path} to {full_dest_path}")
|
|
122
|
+
except Exception as e:
|
|
123
|
+
raise IOError(f"Failed to copy weights file: {e}") from e
|
|
124
|
+
|
|
125
|
+
# --- Create/Update ModelMeta Instance ---
|
|
126
|
+
defaults = {
|
|
127
|
+
"labelset": label_set,
|
|
128
|
+
"weights": relative_dest_path.as_posix(), # Store relative path for FileField
|
|
129
|
+
**kwargs, # Pass through other fields like activation, mean, std, etc.
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
# Remove None values from defaults to avoid overriding model defaults unnecessarily
|
|
133
|
+
defaults = {k: v for k, v in defaults.items() if v is not None}
|
|
134
|
+
|
|
135
|
+
model_meta, created = cls.objects.update_or_create(
|
|
136
|
+
name=meta_name,
|
|
137
|
+
model=ai_model,
|
|
138
|
+
version=target_version,
|
|
139
|
+
defaults=defaults,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
if created:
|
|
143
|
+
logger.info(f"Created new ModelMeta: {model_meta}")
|
|
144
|
+
else:
|
|
145
|
+
logger.info(f"Updated existing ModelMeta: {model_meta}")
|
|
146
|
+
|
|
147
|
+
# --- Optionally update AiModel's active_meta ---
|
|
148
|
+
# You might want to add logic here to automatically set the newly created/updated
|
|
149
|
+
# meta as the active one for the AiModel, e.g.:
|
|
150
|
+
ai_model.active_meta = model_meta
|
|
151
|
+
ai_model.save()
|
|
152
|
+
|
|
153
|
+
return model_meta
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
# --- Add other logic functions referenced by ModelMeta here ---
|
|
157
|
+
# (get_latest_version_number_logic, get_activation_function_logic, etc.)
|
|
158
|
+
# Placeholder for get_activation_function_logic
|
|
159
|
+
def get_activation_function_logic(activation_name: str):
|
|
160
|
+
import torch.nn as nn # Import locally as it's specific to this function
|
|
161
|
+
|
|
162
|
+
if activation_name.lower() == "sigmoid":
|
|
163
|
+
return nn.Sigmoid()
|
|
164
|
+
elif activation_name.lower() == "softmax":
|
|
165
|
+
# Note: Softmax usually requires specifying the dimension
|
|
166
|
+
return nn.Softmax(dim=1) # Assuming dim=1 (channels) is common
|
|
167
|
+
elif activation_name.lower() == "none":
|
|
168
|
+
return nn.Identity()
|
|
169
|
+
else:
|
|
170
|
+
# Consider adding more activations or raising an error
|
|
171
|
+
raise ValueError(f"Unsupported activation function: {activation_name}")
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
# Placeholder for get_inference_dataset_config_logic
|
|
175
|
+
def get_inference_dataset_config_logic(model_meta: "ModelMeta") -> dict:
|
|
176
|
+
# This would typically extract relevant fields from model_meta
|
|
177
|
+
# for configuring a dataset during inference
|
|
178
|
+
return {
|
|
179
|
+
"mean": [float(x) for x in model_meta.mean.split(",")],
|
|
180
|
+
"std": [float(x) for x in model_meta.std.split(",")],
|
|
181
|
+
"size_y": model_meta.size_y, # Add size_y key
|
|
182
|
+
"size_x": model_meta.size_x, # Add size_x key
|
|
183
|
+
"axes": [int(x) for x in model_meta.axes.split(",")],
|
|
184
|
+
# Add other relevant config like normalization type, etc.
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
# Placeholder for get_config_dict_logic
|
|
189
|
+
def get_config_dict_logic(model_meta: "ModelMeta") -> dict:
|
|
190
|
+
# Returns a dictionary representation of the model's configuration
|
|
191
|
+
return {
|
|
192
|
+
"name": model_meta.name,
|
|
193
|
+
"version": model_meta.version,
|
|
194
|
+
"model_name": model_meta.model.name,
|
|
195
|
+
"labelset_name": model_meta.labelset.name,
|
|
196
|
+
"activation": model_meta.activation,
|
|
197
|
+
"weights_path": model_meta.weights.path if model_meta.weights else None,
|
|
198
|
+
"mean": model_meta.mean,
|
|
199
|
+
"std": model_meta.std,
|
|
200
|
+
"size_x": model_meta.size_x,
|
|
201
|
+
"size_y": model_meta.size_y,
|
|
202
|
+
"axes": model_meta.axes,
|
|
203
|
+
"batchsize": model_meta.batchsize,
|
|
204
|
+
"num_workers": model_meta.num_workers,
|
|
205
|
+
"description": model_meta.description,
|
|
206
|
+
# Add any other relevant fields
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
# Placeholder for get_model_meta_by_name_version_logic
|
|
211
|
+
def get_model_meta_by_name_version_logic(
|
|
212
|
+
cls: Type["ModelMeta"],
|
|
213
|
+
meta_name: str,
|
|
214
|
+
model_name: str,
|
|
215
|
+
version: Optional[str] = None,
|
|
216
|
+
) -> "ModelMeta":
|
|
217
|
+
"""
|
|
218
|
+
Retrieves a ModelMeta instance by name, model name, and optionally version.
|
|
219
|
+
If version is None, retrieves the latest version based on date_created.
|
|
220
|
+
"""
|
|
221
|
+
try:
|
|
222
|
+
ai_model = AiModel.objects.get(name=model_name)
|
|
223
|
+
except AiModel.DoesNotExist as exc:
|
|
224
|
+
raise cls.DoesNotExist(f"AiModel with name '{model_name}' not found.") from exc
|
|
225
|
+
|
|
226
|
+
if version:
|
|
227
|
+
try:
|
|
228
|
+
return cls.objects.get(name=meta_name, model=ai_model, version=version)
|
|
229
|
+
except Exception as exc:
|
|
230
|
+
raise cls.DoesNotExist(f"ModelMeta '{meta_name}' version '{version}' for model '{model_name}' not found.") from exc
|
|
231
|
+
else:
|
|
232
|
+
# Get latest version
|
|
233
|
+
latest = cls.objects.filter(name=meta_name, model=ai_model).order_by("-date_created").first()
|
|
234
|
+
if latest:
|
|
235
|
+
return latest
|
|
236
|
+
else:
|
|
237
|
+
raise cls.DoesNotExist(f"No ModelMeta found for '{meta_name}' and model '{model_name}'.")
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
import re
|
|
241
|
+
|
|
242
|
+
from huggingface_hub import model_info
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def infer_default_model_meta_from_hf(model_id: str) -> dict[str, Any]:
|
|
246
|
+
"""
|
|
247
|
+
Infers default model metadata (activation, normalization, input size)
|
|
248
|
+
from a Hugging Face model_id using its tags and architecture.
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
A dict with fields: name, activation, mean, std, size_x, size_y
|
|
252
|
+
"""
|
|
253
|
+
|
|
254
|
+
if not (info := model_info(model_id)):
|
|
255
|
+
logger.info(f"Could not retrieve model info for {model_id}, using ColoReg segmentation defaults.")
|
|
256
|
+
return {
|
|
257
|
+
"name": "wg-lux/colo_segmentation_RegNetX800MF_base",
|
|
258
|
+
"activation": "sigmoid",
|
|
259
|
+
"mean": (0.45211223, 0.27139644, 0.19264949),
|
|
260
|
+
"std": (0.31418097, 0.21088019, 0.16059452),
|
|
261
|
+
"size_x": 716,
|
|
262
|
+
"size_y": 716,
|
|
263
|
+
"description": f"Defaults for unknown model {model_id}",
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
# Extract architecture from tags or model_id ---
|
|
267
|
+
tags = info.tags or []
|
|
268
|
+
model_name = model_id.split("/")[-1].lower()
|
|
269
|
+
|
|
270
|
+
# Heuristics for architecture and task
|
|
271
|
+
architecture = next((t for t in tags if t.startswith("architecture:")), None)
|
|
272
|
+
task = next((t for t in tags if t.startswith("task:")), None)
|
|
273
|
+
|
|
274
|
+
# Default values
|
|
275
|
+
activation = "sigmoid"
|
|
276
|
+
size_x = size_y = 716
|
|
277
|
+
mean = (0.45211223, 0.27139644, 0.19264949)
|
|
278
|
+
std = (0.31418097, 0.21088019, 0.16059452)
|
|
279
|
+
|
|
280
|
+
# --- 2. Task-based inference ---
|
|
281
|
+
if task:
|
|
282
|
+
if "segmentation" in task or "detection" in task:
|
|
283
|
+
activation = "sigmoid"
|
|
284
|
+
elif any(k in task for k in ["classification"]):
|
|
285
|
+
activation = "softmax"
|
|
286
|
+
|
|
287
|
+
# --- 3. Architecture-based inference ---
|
|
288
|
+
if architecture:
|
|
289
|
+
arch = architecture.replace("architecture:", "")
|
|
290
|
+
else:
|
|
291
|
+
arch = re.sub(r"[^a-z0-9]+", "_", model_name)
|
|
292
|
+
|
|
293
|
+
return {
|
|
294
|
+
"name": arch,
|
|
295
|
+
"activation": activation,
|
|
296
|
+
"mean": mean,
|
|
297
|
+
"std": std,
|
|
298
|
+
"size_x": size_x,
|
|
299
|
+
"size_y": size_y,
|
|
300
|
+
"description": f"Inferred defaults for {model_id}",
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def setup_default_from_huggingface_logic(cls, model_id: str, labelset_name: str | None = None):
|
|
305
|
+
"""
|
|
306
|
+
Downloads model weights from Hugging Face and auto-fills ModelMeta fields.
|
|
307
|
+
"""
|
|
308
|
+
meta = infer_default_model_meta_from_hf(model_id)
|
|
309
|
+
|
|
310
|
+
# Download weights
|
|
311
|
+
weights_path = hf_hub_download(
|
|
312
|
+
repo_id=model_id,
|
|
313
|
+
filename="colo_segmentation_RegNetX800MF_base.ckpt",
|
|
314
|
+
local_dir=WEIGHTS_DIR,
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
ai_model, _ = AiModel.objects.get_or_create(name=meta["name"])
|
|
318
|
+
if not labelset_name:
|
|
319
|
+
labelset = LabelSet.objects.first()
|
|
320
|
+
if not labelset:
|
|
321
|
+
raise ValueError("No labelset found and no labelset_name provided")
|
|
322
|
+
else:
|
|
323
|
+
labelset = LabelSet.objects.get(name=labelset_name)
|
|
324
|
+
|
|
325
|
+
ModelMeta = _get_model_meta_class()
|
|
326
|
+
model_meta = ModelMeta.objects.filter(name=meta["name"], model=ai_model).first()
|
|
327
|
+
if model_meta:
|
|
328
|
+
logger.info(f"ModelMeta {meta['name']} for model {ai_model.name} already exists. Skipping creation.")
|
|
329
|
+
return model_meta
|
|
330
|
+
|
|
331
|
+
return create_from_file_logic(
|
|
332
|
+
cls,
|
|
333
|
+
meta_name=meta["name"],
|
|
334
|
+
model_name=ai_model.name,
|
|
335
|
+
labelset_name=labelset.name,
|
|
336
|
+
weights_file=weights_path,
|
|
337
|
+
activation=meta["activation"],
|
|
338
|
+
mean=meta["mean"],
|
|
339
|
+
std=meta["std"],
|
|
340
|
+
size_x=meta["size_x"],
|
|
341
|
+
size_y=meta["size_y"],
|
|
342
|
+
description=meta["description"],
|
|
343
|
+
)
|
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
-
|
|
3
|
-
# import endoreg_center_id from django settings
|
|
4
|
-
from django.conf import settings
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
# import File class
|
|
8
2
|
from django.core.files import File
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
9
4
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
# ENDOREG_CENTER_ID = 9999
|
|
13
|
-
# else:
|
|
14
|
-
# ENDOREG_CENTER_ID = settings.ENDOREG_CENTER_ID
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ..media.pdf.report_reader.report_reader_flag import ReportReaderFlag
|
|
15
7
|
|
|
16
8
|
class PdfType(models.Model):
|
|
9
|
+
"""
|
|
10
|
+
Defines a specific type or format of PDF report, linking to flags used for parsing.
|
|
11
|
+
|
|
12
|
+
Used to configure how different PDF report layouts are processed.
|
|
13
|
+
"""
|
|
17
14
|
name = models.CharField(max_length=255)
|
|
18
15
|
|
|
19
16
|
patient_info_line = models.ForeignKey(
|
|
@@ -40,8 +37,15 @@ class PdfType(models.Model):
|
|
|
40
37
|
related_name="pdf_type_cut_off_below_lines",
|
|
41
38
|
)
|
|
42
39
|
|
|
40
|
+
if TYPE_CHECKING:
|
|
41
|
+
patient_info_line: "ReportReaderFlag"
|
|
42
|
+
endoscope_info_line: "ReportReaderFlag"
|
|
43
|
+
examiner_info_line: "ReportReaderFlag"
|
|
44
|
+
cut_off_above_lines: models.QuerySet["ReportReaderFlag"]
|
|
45
|
+
cut_off_below_lines: models.QuerySet["ReportReaderFlag"]
|
|
43
46
|
|
|
44
47
|
def __str__(self):
|
|
48
|
+
"""Returns a string summary of the PDF type and its associated flags."""
|
|
45
49
|
summary = f"{self.name}"
|
|
46
50
|
# add lines to summary
|
|
47
51
|
summary += f"\nPatient Info Line: {self.patient_info_line.value}"
|
|
@@ -52,19 +56,34 @@ class PdfType(models.Model):
|
|
|
52
56
|
|
|
53
57
|
return summary
|
|
54
58
|
|
|
59
|
+
@classmethod
|
|
60
|
+
def default_pdf_type(cls):
|
|
61
|
+
"""Returns a default PdfType instance, typically used as a fallback."""
|
|
62
|
+
return PdfType.objects.get(name="ukw-endoscopy-examination-report-generic")
|
|
63
|
+
|
|
55
64
|
class PdfMeta(models.Model):
|
|
65
|
+
"""
|
|
66
|
+
Stores metadata associated with a specific PDF document file.
|
|
67
|
+
"""
|
|
56
68
|
pdf_type = models.ForeignKey(PdfType, on_delete=models.CASCADE)
|
|
57
69
|
date = models.DateField()
|
|
58
70
|
time = models.TimeField()
|
|
59
71
|
pdf_hash = models.CharField(max_length=255, unique=True)
|
|
60
72
|
|
|
73
|
+
if TYPE_CHECKING:
|
|
74
|
+
pdf_type: "PdfType"
|
|
75
|
+
|
|
61
76
|
def __str__(self):
|
|
62
|
-
|
|
77
|
+
"""Returns the PDF hash as its string representation."""
|
|
78
|
+
return str(self.pdf_hash)
|
|
63
79
|
|
|
64
80
|
@classmethod
|
|
65
81
|
def create_from_file(cls, pdf_file):
|
|
82
|
+
"""
|
|
83
|
+
Creates a PdfMeta instance from a PDF file object.
|
|
84
|
+
Note: This implementation seems incomplete; it doesn't extract hash, date, time, or type.
|
|
85
|
+
"""
|
|
66
86
|
pdf_file = File(pdf_file)
|
|
67
87
|
pdf_meta = cls(file=pdf_file)
|
|
68
88
|
pdf_meta.save()
|
|
69
89
|
return pdf_meta
|
|
70
|
-
|