endoreg-db 0.8.9.32__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/__init__.py +0 -0
- endoreg_db/_version.py +34 -0
- endoreg_db/admin.py +97 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +17 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/authz/auth.py +78 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +20 -0
- endoreg_db/authz/middleware.py +84 -0
- endoreg_db/authz/permissions.py +138 -0
- endoreg_db/authz/policy.py +224 -0
- endoreg_db/authz/settings.py +64 -0
- endoreg_db/authz/views_auth.py +70 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +99 -0
- endoreg_db/config/__init__.py +0 -0
- endoreg_db/config/env.py +106 -0
- endoreg_db/config/settings/__init__.py +6 -0
- endoreg_db/config/settings/base.py +148 -0
- endoreg_db/config/settings/case_gen.py +32 -0
- endoreg_db/config/settings/dev.py +108 -0
- endoreg_db/config/settings/keycloak.py +177 -0
- endoreg_db/config/settings/prod.py +66 -0
- endoreg_db/config/settings/test.py +72 -0
- endoreg_db/data/__init__.py +135 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- 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_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -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/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +99 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -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/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/examination/examinations/data.yaml +172 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +5 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +359 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +90 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +97 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/00_generic.yaml +35 -0
- endoreg_db/data/finding/00_generic_complication.yaml +9 -0
- endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
- endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
- endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
- endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
- endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
- endoreg_db/data/finding_classification/00_generic.yaml +44 -0
- endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
- endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
- endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/00_generic.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_baseline.yaml +23 -0
- endoreg_db/data/finding_classification_choice/00_generic_complication.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_histology.yaml +21 -0
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_bowel_preparation.yaml +49 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_generic.yaml +19 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_histology.yaml +20 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_location.yaml +248 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_morphology.yaml +75 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/00_generic.yaml +53 -0
- endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
- endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
- endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
- endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_type/data.yaml +39 -0
- endoreg_db/data/gender/data.yaml +42 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +6 -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 +37 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- endoreg_db/data/log_type/data.yaml +57 -0
- 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/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- 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 +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- 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/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
- endoreg_db/data/requirement/01_patient_data.yaml +93 -0
- endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/old/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement/old/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/old/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/old/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/old/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/old/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/old/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/old/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/old/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/old/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/old/gender.yaml +0 -0
- endoreg_db/data/requirement/old/lab_value.yaml +441 -0
- endoreg_db/data/requirement/old/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/_old/age.yaml +13 -0
- endoreg_db/data/requirement_operator/_old/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/_old/model_operators.yaml +96 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +65 -0
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/02_endoscopy_bleeding_risk.yaml +46 -0
- endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set_type/data.yaml +41 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -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/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +32 -0
- endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +24 -0
- endoreg_db/export/frames/export.py +6 -0
- endoreg_db/export/frames/export_frames_with_labels.py +616 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +4 -0
- endoreg_db/forms/examination_form.py +12 -0
- endoreg_db/forms/patient_finding_intervention_form.py +40 -0
- endoreg_db/forms/patient_form.py +23 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +11 -0
- endoreg_db/forms/unit.py +7 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +48 -0
- endoreg_db/helpers/data_loader.py +280 -0
- endoreg_db/helpers/default_objects.py +414 -0
- endoreg_db/helpers/download_segmentation_model.py +32 -0
- endoreg_db/helpers/interact.py +1 -0
- endoreg_db/helpers/test_video_helper.py +127 -0
- endoreg_db/import_files/__init__.py +27 -0
- endoreg_db/import_files/context/__init__.py +7 -0
- endoreg_db/import_files/context/default_sensitive_meta.py +83 -0
- endoreg_db/import_files/context/ensure_center.py +17 -0
- endoreg_db/import_files/context/file_lock.py +66 -0
- endoreg_db/import_files/context/import_context.py +42 -0
- endoreg_db/import_files/context/validate_directories.py +57 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +99 -0
- endoreg_db/import_files/file_storage/create_video_file.py +104 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +42 -0
- endoreg_db/import_files/file_storage/state_management.py +463 -0
- endoreg_db/import_files/file_storage/storage.py +42 -0
- endoreg_db/import_files/import_service.md +26 -0
- endoreg_db/import_files/processing/__init__.py +11 -0
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +99 -0
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
- endoreg_db/import_files/pseudonymization/__init__.py +0 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +181 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +139 -0
- endoreg_db/import_files/pseudonymization/pseudonymize.py +0 -0
- endoreg_db/import_files/report_import_service.py +147 -0
- endoreg_db/import_files/video_import_service.py +154 -0
- endoreg_db/logger_conf.py +156 -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 +132 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +177 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +419 -0
- endoreg_db/management/commands/export_frame_annot.py +196 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +206 -0
- endoreg_db/management/commands/fix_video_paths.py +186 -0
- endoreg_db/management/commands/import_report.py +361 -0
- endoreg_db/management/commands/list_routes.py +20 -0
- endoreg_db/management/commands/load_ai_model_data.py +83 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +60 -0
- endoreg_db/management/commands/load_base_db_data.py +63 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +39 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +38 -0
- endoreg_db/management/commands/load_disease_classification_data.py +38 -0
- endoreg_db/management/commands/load_disease_data.py +59 -0
- endoreg_db/management/commands/load_distribution_data.py +63 -0
- endoreg_db/management/commands/load_endoscope_data.py +58 -0
- endoreg_db/management/commands/load_event_data.py +39 -0
- endoreg_db/management/commands/load_examination_data.py +78 -0
- endoreg_db/management/commands/load_examination_indication_data.py +85 -0
- endoreg_db/management/commands/load_finding_data.py +115 -0
- endoreg_db/management/commands/load_gender_data.py +37 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +142 -0
- endoreg_db/management/commands/load_information_source.py +46 -0
- endoreg_db/management/commands/load_lab_value_data.py +52 -0
- endoreg_db/management/commands/load_legacy_data.py +303 -0
- endoreg_db/management/commands/load_medication_data.py +104 -0
- endoreg_db/management/commands/load_name_data.py +36 -0
- endoreg_db/management/commands/load_organ_data.py +39 -0
- endoreg_db/management/commands/load_pdf_type_data.py +58 -0
- endoreg_db/management/commands/load_profession_data.py +40 -0
- endoreg_db/management/commands/load_qualification_data.py +56 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +40 -0
- endoreg_db/management/commands/load_requirement_data.py +207 -0
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/load_risk_data.py +57 -0
- endoreg_db/management/commands/load_shift_data.py +57 -0
- endoreg_db/management/commands/load_tag_data.py +54 -0
- endoreg_db/management/commands/load_unit_data.py +40 -0
- endoreg_db/management/commands/load_user_groups.py +26 -0
- endoreg_db/management/commands/model_input.py +169 -0
- endoreg_db/management/commands/register_ai_model.py +70 -0
- endoreg_db/management/commands/setup_endoreg_db.py +459 -0
- endoreg_db/management/commands/start_filewatcher.py +115 -0
- endoreg_db/management/commands/storage_management.py +622 -0
- endoreg_db/management/commands/summarize_db_content.py +280 -0
- endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
- endoreg_db/management/commands/validate_video_files.py +189 -0
- endoreg_db/management/commands/video_validation.py +20 -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 +1953 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +322 -0
- endoreg_db/models/administration/__init__.py +95 -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 +180 -0
- endoreg_db/models/administration/ai/model_type.py +42 -0
- endoreg_db/models/administration/case/__init__.py +5 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +3 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +85 -0
- endoreg_db/models/administration/center/center_product.py +67 -0
- endoreg_db/models/administration/center/center_resource.py +69 -0
- endoreg_db/models/administration/center/center_shift.py +94 -0
- endoreg_db/models/administration/center/center_waste.py +42 -0
- endoreg_db/models/administration/person/__init__.py +26 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +40 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +44 -0
- endoreg_db/models/administration/person/employee/employee_type.py +50 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +64 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +20 -0
- endoreg_db/models/administration/person/names/last_name.py +20 -0
- endoreg_db/models/administration/person/patient/__init__.py +7 -0
- endoreg_db/models/administration/person/patient/patient.py +488 -0
- endoreg_db/models/administration/person/patient/patient_external_id.py +36 -0
- endoreg_db/models/administration/person/person.py +35 -0
- endoreg_db/models/administration/person/profession/__init__.py +28 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +41 -0
- endoreg_db/models/administration/product/__init__.py +15 -0
- endoreg_db/models/administration/product/product.py +106 -0
- endoreg_db/models/administration/product/product_group.py +41 -0
- endoreg_db/models/administration/product/product_material.py +60 -0
- endoreg_db/models/administration/product/product_weight.py +51 -0
- endoreg_db/models/administration/product/reference_product.py +147 -0
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +43 -0
- endoreg_db/models/administration/qualification/qualification_type.py +39 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +72 -0
- endoreg_db/models/administration/shift/shift.py +57 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/aidataset/__init__.py +5 -0
- endoreg_db/models/aidataset/aidataset.py +193 -0
- endoreg_db/models/label/__init__.py +23 -0
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +85 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +61 -0
- endoreg_db/models/label/label.py +91 -0
- endoreg_db/models/label/label_set.py +68 -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 +42 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +611 -0
- endoreg_db/models/label/video_segmentation_label.py +35 -0
- endoreg_db/models/label/video_segmentation_labelset.py +28 -0
- endoreg_db/models/media/__init__.py +23 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +137 -0
- endoreg_db/models/media/pdf/__init__.py +12 -0
- endoreg_db/models/media/pdf/raw_pdf.py +764 -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 +85 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +46 -0
- endoreg_db/models/media/video/__init__.py +9 -0
- endoreg_db/models/media/video/create_from_file.py +402 -0
- endoreg_db/models/media/video/pipe_1.py +258 -0
- endoreg_db/models/media/video/pipe_2.py +129 -0
- endoreg_db/models/media/video/video_file.py +907 -0
- endoreg_db/models/media/video/video_file_ai.py +828 -0
- endoreg_db/models/media/video/video_file_anonymize.py +524 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +49 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +25 -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 +126 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +233 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +36 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +13 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +24 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +40 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +44 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +30 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +205 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +228 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +107 -0
- endoreg_db/models/media/video/video_file_io.py +272 -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 +58 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +62 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +183 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +198 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +178 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +105 -0
- endoreg_db/models/media/video/video_file_segments.py +317 -0
- endoreg_db/models/media/video/video_metadata.py +67 -0
- endoreg_db/models/media/video/video_processing.py +192 -0
- endoreg_db/models/medical/__init__.py +136 -0
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +29 -0
- endoreg_db/models/medical/disease.py +174 -0
- endoreg_db/models/medical/event.py +154 -0
- endoreg_db/models/medical/examination/__init__.py +20 -0
- endoreg_db/models/medical/examination/examination.py +183 -0
- endoreg_db/models/medical/examination/examination_indication.py +229 -0
- endoreg_db/models/medical/examination/examination_time.py +68 -0
- endoreg_db/models/medical/examination/examination_time_type.py +44 -0
- endoreg_db/models/medical/examination/examination_type.py +47 -0
- endoreg_db/models/medical/finding/__init__.py +20 -0
- endoreg_db/models/medical/finding/finding.py +113 -0
- endoreg_db/models/medical/finding/finding_classification.py +131 -0
- endoreg_db/models/medical/finding/finding_intervention.py +68 -0
- endoreg_db/models/medical/finding/finding_type.py +38 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +77 -0
- endoreg_db/models/medical/hardware/endoscopy_processor.py +182 -0
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +490 -0
- endoreg_db/models/medical/medication/__init__.py +23 -0
- endoreg_db/models/medical/medication/medication.py +45 -0
- endoreg_db/models/medical/medication/medication_indication.py +78 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +58 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +58 -0
- endoreg_db/models/medical/medication/medication_schedule.py +58 -0
- endoreg_db/models/medical/organ/__init__.py +38 -0
- endoreg_db/models/medical/patient/__init__.py +48 -0
- endoreg_db/models/medical/patient/medication_examples.py +56 -0
- endoreg_db/models/medical/patient/patient_disease.py +72 -0
- endoreg_db/models/medical/patient/patient_event.py +80 -0
- endoreg_db/models/medical/patient/patient_examination.py +280 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +57 -0
- endoreg_db/models/medical/patient/patient_finding.py +416 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +231 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +37 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +157 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +247 -0
- endoreg_db/models/medical/patient/patient_medication.py +111 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +152 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +73 -0
- endoreg_db/models/medical/risk/risk_type.py +54 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/model_meta.py +266 -0
- endoreg_db/models/metadata/model_meta_logic.py +485 -0
- endoreg_db/models/metadata/pdf_meta.py +96 -0
- endoreg_db/models/metadata/sensitive_meta.py +345 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1161 -0
- endoreg_db/models/metadata/video_meta.py +459 -0
- endoreg_db/models/metadata/video_prediction_logic.py +232 -0
- endoreg_db/models/metadata/video_prediction_meta.py +319 -0
- endoreg_db/models/operation_log.py +63 -0
- endoreg_db/models/other/__init__.py +40 -0
- endoreg_db/models/other/distribution/__init__.py +46 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +22 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +163 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +50 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +211 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +23 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +110 -0
- endoreg_db/models/other/gender.py +32 -0
- endoreg_db/models/other/information_source.py +190 -0
- endoreg_db/models/other/material.py +34 -0
- endoreg_db/models/other/resource.py +24 -0
- endoreg_db/models/other/tag.py +32 -0
- endoreg_db/models/other/transport_route.py +40 -0
- endoreg_db/models/other/unit.py +40 -0
- endoreg_db/models/other/waste.py +28 -0
- endoreg_db/models/report/__init__.py +0 -0
- endoreg_db/models/report/images.py +0 -0
- endoreg_db/models/report/report.py +5 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +792 -0
- endoreg_db/models/requirement/requirement_error.py +84 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +137 -0
- endoreg_db/models/requirement/requirement_operator.py +187 -0
- endoreg_db/models/requirement/requirement_set.py +327 -0
- endoreg_db/models/state/__init__.py +13 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/anonymization.py +30 -0
- endoreg_db/models/state/audit_ledger.py +155 -0
- endoreg_db/models/state/label_video_segment.py +31 -0
- endoreg_db/models/state/processing_history/__init__.py +3 -0
- endoreg_db/models/state/processing_history/processing_history.py +136 -0
- endoreg_db/models/state/raw_pdf.py +219 -0
- endoreg_db/models/state/sensitive_meta.py +50 -0
- endoreg_db/models/state/video.py +251 -0
- endoreg_db/models/upload_job.py +100 -0
- endoreg_db/models/utils.py +138 -0
- endoreg_db/queries/__init__.py +3 -0
- endoreg_db/queries/annotations/__init__.py +1 -0
- endoreg_db/queries/annotations/legacy.py +169 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/root_urls.py +27 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +30 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +861 -0
- endoreg_db/serializers/__init__.py +104 -0
- endoreg_db/serializers/administration/__init__.py +13 -0
- endoreg_db/serializers/administration/ai/__init__.py +9 -0
- endoreg_db/serializers/administration/ai/active_model.py +12 -0
- endoreg_db/serializers/administration/ai/ai_model.py +20 -0
- endoreg_db/serializers/administration/ai/model_type.py +12 -0
- endoreg_db/serializers/administration/center.py +14 -0
- endoreg_db/serializers/administration/gender.py +11 -0
- endoreg_db/serializers/anonymization.py +77 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +0 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +45 -0
- endoreg_db/serializers/examination/dropdown.py +20 -0
- endoreg_db/serializers/examination_serializer.py +9 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +61 -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 +11 -0
- endoreg_db/serializers/label_video_segment/__init__.py +9 -0
- endoreg_db/serializers/label_video_segment/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
- endoreg_db/serializers/label_video_segment/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +427 -0
- endoreg_db/serializers/meta/__init__.py +13 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +122 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +153 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +62 -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 +72 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +144 -0
- endoreg_db/serializers/misc/stats.py +35 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +74 -0
- endoreg_db/serializers/patient/__init__.py +12 -0
- endoreg_db/serializers/patient/patient.py +103 -0
- endoreg_db/serializers/patient/patient_dropdown.py +35 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +168 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +32 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +47 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +62 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +28 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +40 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +135 -0
- endoreg_db/serializers/pdf/__init__.py +3 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +101 -0
- endoreg_db/serializers/requirements/requirement_schema.py +20 -0
- endoreg_db/serializers/requirements/requirement_sets.py +99 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +301 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/video_file.py +283 -0
- endoreg_db/serializers/video/video_file_brief.py +14 -0
- endoreg_db/serializers/video/video_file_detail.py +96 -0
- endoreg_db/serializers/video/video_file_list.py +100 -0
- endoreg_db/serializers/video/video_processing_history.py +172 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +274 -0
- endoreg_db/services/examination_evaluation.py +172 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +424 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/model_meta_from_hf.py +76 -0
- endoreg_db/services/pdf_import.py +0 -0
- endoreg_db/services/polling_coordinator.py +319 -0
- endoreg_db/services/pseudonym_service.py +94 -0
- endoreg_db/services/report_import.py +13 -0
- endoreg_db/services/segment_sync.py +171 -0
- endoreg_db/services/video_import.py +9 -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 +56 -0
- endoreg_db/urls/ai.py +14 -0
- endoreg_db/urls/anonymization.py +78 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +34 -0
- endoreg_db/urls/examination.py +63 -0
- endoreg_db/urls/media.py +251 -0
- endoreg_db/urls/patient.py +23 -0
- endoreg_db/urls/requirements.py +15 -0
- endoreg_db/urls/root_urls.py +28 -0
- endoreg_db/urls/stats.py +54 -0
- endoreg_db/urls/upload.py +12 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +97 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
- endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
- endoreg_db/utils/ai/get.py +6 -0
- endoreg_db/utils/ai/inference_dataset.py +51 -0
- endoreg_db/utils/ai/model_training/config.py +117 -0
- endoreg_db/utils/ai/model_training/dataset.py +74 -0
- endoreg_db/utils/ai/model_training/losses.py +68 -0
- endoreg_db/utils/ai/model_training/metrics.py +78 -0
- endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
- endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
- endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +270 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +293 -0
- endoreg_db/utils/ai/preprocess.py +76 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +32 -0
- endoreg_db/utils/check_video_files.py +175 -0
- endoreg_db/utils/cropping.py +30 -0
- endoreg_db/utils/dataloader.py +285 -0
- endoreg_db/utils/dates.py +59 -0
- endoreg_db/utils/defaults/set_default_center.py +33 -0
- endoreg_db/utils/env.py +37 -0
- endoreg_db/utils/extract_specific_frames.py +87 -0
- endoreg_db/utils/file_operations.py +70 -0
- endoreg_db/utils/fix_video_path_direct.py +157 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +138 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +237 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +82 -0
- endoreg_db/utils/ocr.py +195 -0
- endoreg_db/utils/operation_log.py +87 -0
- endoreg_db/utils/parse_and_generate_yaml.py +45 -0
- endoreg_db/utils/paths.py +159 -0
- endoreg_db/utils/permissions.py +160 -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 +144 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +22 -0
- endoreg_db/utils/product/sum_weights.py +20 -0
- endoreg_db/utils/pydantic_models/__init__.py +5 -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/_old/lab_value_operators.py +678 -0
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +842 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +114 -0
- endoreg_db/utils/setup_config.py +196 -0
- endoreg_db/utils/storage.py +117 -0
- endoreg_db/utils/translation.py +31 -0
- endoreg_db/utils/uuid.py +5 -0
- endoreg_db/utils/validate_endo_roi.py +33 -0
- endoreg_db/utils/validate_subcategory_dict.py +93 -0
- endoreg_db/utils/validate_video_detailed.py +415 -0
- endoreg_db/utils/video/__init__.py +30 -0
- endoreg_db/utils/video/extract_frames.py +100 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +996 -0
- endoreg_db/utils/video/names.py +47 -0
- endoreg_db/utils/video/streaming_processor.py +386 -0
- endoreg_db/utils/video/video_splitter.py +105 -0
- endoreg_db/versioning.md +79 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +247 -0
- endoreg_db/views/__init__.py +157 -0
- endoreg_db/views/anonymization/__init__.py +31 -0
- endoreg_db/views/anonymization/media_management.py +486 -0
- endoreg_db/views/anonymization/overview.py +307 -0
- endoreg_db/views/anonymization/validate.py +310 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +146 -0
- endoreg_db/views/examination/__init__.py +30 -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 +62 -0
- endoreg_db/views/examination/get_finding_classifications.py +38 -0
- endoreg_db/views/examination/get_findings.py +39 -0
- endoreg_db/views/examination/get_instruments.py +19 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +116 -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 +41 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +54 -0
- endoreg_db/views/media/__init__.py +32 -0
- endoreg_db/views/media/pdf_media.py +411 -0
- endoreg_db/views/media/sensitive_metadata.py +372 -0
- endoreg_db/views/media/video_media.py +275 -0
- endoreg_db/views/meta/__init__.py +7 -0
- endoreg_db/views/meta/sensitive_meta_list.py +102 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +74 -0
- endoreg_db/views/misc/__init__.py +29 -0
- endoreg_db/views/misc/center.py +14 -0
- endoreg_db/views/misc/csrf.py +8 -0
- endoreg_db/views/misc/gender.py +15 -0
- endoreg_db/views/misc/stats.py +255 -0
- endoreg_db/views/misc/upload_views.py +241 -0
- endoreg_db/views/patient/__init__.py +3 -0
- endoreg_db/views/patient/patient.py +253 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +141 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +58 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +72 -0
- endoreg_db/views/patient_examination/video.py +228 -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 +71 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +291 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +75 -0
- endoreg_db/views/report/__init__.py +7 -0
- endoreg_db/views/report/reimport.py +177 -0
- endoreg_db/views/report/report_stream.py +191 -0
- endoreg_db/views/requirement/__init__.py +11 -0
- endoreg_db/views/requirement/evaluate.py +278 -0
- endoreg_db/views/requirement/lookup.py +380 -0
- endoreg_db/views/requirement/lookup_store.py +183 -0
- endoreg_db/views/requirement/requirement_utils.py +87 -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 +266 -0
- endoreg_db/views/video/__init__.py +49 -0
- endoreg_db/views/video/ai/__init__.py +8 -0
- endoreg_db/views/video/ai/label.py +159 -0
- endoreg_db/views/video/correction.py +529 -0
- endoreg_db/views/video/reimport.py +230 -0
- endoreg_db/views/video/segments_crud.py +709 -0
- endoreg_db/views/video/video_apply_mask.py +49 -0
- endoreg_db/views/video/video_correction.py +22 -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_metadata.py +101 -0
- endoreg_db/views/video/video_processing_history.py +25 -0
- endoreg_db/views/video/video_remove_frames.py +49 -0
- endoreg_db/views/video/video_stream.py +334 -0
- endoreg_db-0.8.9.32.dist-info/METADATA +404 -0
- endoreg_db-0.8.9.32.dist-info/RECORD +787 -0
- endoreg_db-0.8.9.32.dist-info/WHEEL +4 -0
- endoreg_db-0.8.9.32.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
import shutil
|
|
2
|
+
from logging import getLogger
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Iterable, Optional, Type
|
|
5
|
+
|
|
6
|
+
from django.db import transaction
|
|
7
|
+
from huggingface_hub import hf_hub_download
|
|
8
|
+
|
|
9
|
+
# Assuming ModelMeta, AiModel, LabelSet are importable from the correct locations
|
|
10
|
+
# Adjust imports based on your project structure if necessary
|
|
11
|
+
from ..administration.ai.ai_model import AiModel
|
|
12
|
+
from ..label.label_set import LabelSet
|
|
13
|
+
from ..utils import STORAGE_DIR, WEIGHTS_DIR
|
|
14
|
+
|
|
15
|
+
logger = getLogger("ai_model")
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from .model_meta import ModelMeta # Import ModelMeta for type hinting
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _get_model_meta_class():
|
|
22
|
+
"""Lazy import to avoid circular imports"""
|
|
23
|
+
from .model_meta import ModelMeta
|
|
24
|
+
|
|
25
|
+
return ModelMeta
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_latest_version_number_logic(
|
|
29
|
+
cls: Type["ModelMeta"], meta_name: str, model_name: str
|
|
30
|
+
) -> int:
|
|
31
|
+
"""
|
|
32
|
+
Finds the highest numerical version for a given meta_name and model_name.
|
|
33
|
+
Iterates through all versions, attempts to parse them as integers,
|
|
34
|
+
and returns the maximum integer found. If no numeric versions are found,
|
|
35
|
+
returns 0.
|
|
36
|
+
"""
|
|
37
|
+
versions_qs = cls.objects.filter(
|
|
38
|
+
name=meta_name, model__name=model_name
|
|
39
|
+
).values_list("version", flat=True)
|
|
40
|
+
|
|
41
|
+
max_v = 0
|
|
42
|
+
found_numeric_version = False
|
|
43
|
+
|
|
44
|
+
for v_str in versions_qs:
|
|
45
|
+
if v_str is None: # Skip None versions
|
|
46
|
+
continue
|
|
47
|
+
try:
|
|
48
|
+
v_int = int(v_str)
|
|
49
|
+
if not found_numeric_version or v_int > max_v:
|
|
50
|
+
max_v = v_int
|
|
51
|
+
found_numeric_version = True
|
|
52
|
+
except ValueError:
|
|
53
|
+
logger.warning(
|
|
54
|
+
f"Warning: Could not parse version string '{v_str}' as an integer for "
|
|
55
|
+
f"meta_name='{meta_name}', model_name='{model_name}' while determining the max version."
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
return max_v if found_numeric_version else 0
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@transaction.atomic
|
|
62
|
+
def create_from_file_logic(
|
|
63
|
+
cls: Type["ModelMeta"], # cls is ModelMeta
|
|
64
|
+
meta_name: str,
|
|
65
|
+
model_name: str,
|
|
66
|
+
labelset_name: str,
|
|
67
|
+
weights_file: str,
|
|
68
|
+
labelset_version: Optional[int | str] = None,
|
|
69
|
+
requested_version: Optional[str] = None,
|
|
70
|
+
bump_if_exists: bool = False,
|
|
71
|
+
**kwargs: Any,
|
|
72
|
+
) -> "ModelMeta":
|
|
73
|
+
"""
|
|
74
|
+
Logic to create or update a ModelMeta instance from a weights file.
|
|
75
|
+
|
|
76
|
+
Handles finding related objects, versioning, file copying, and saving.
|
|
77
|
+
"""
|
|
78
|
+
# --- Find Related Objects ---
|
|
79
|
+
try:
|
|
80
|
+
ai_model = AiModel.objects.get(name=model_name)
|
|
81
|
+
except AiModel.DoesNotExist as exc:
|
|
82
|
+
raise ValueError(f"AiModel with name '{model_name}' not found.") from exc
|
|
83
|
+
|
|
84
|
+
labelset_qs = LabelSet.objects.filter(name=labelset_name)
|
|
85
|
+
if labelset_version not in (None, "", -1):
|
|
86
|
+
try:
|
|
87
|
+
version_value = int(labelset_version)
|
|
88
|
+
except (TypeError, ValueError):
|
|
89
|
+
version_value = labelset_version
|
|
90
|
+
labelset_qs = labelset_qs.filter(version=version_value)
|
|
91
|
+
|
|
92
|
+
try:
|
|
93
|
+
label_set = labelset_qs.get()
|
|
94
|
+
except LabelSet.DoesNotExist as exc:
|
|
95
|
+
raise ValueError(
|
|
96
|
+
f"LabelSet '{labelset_name}' with version '{labelset_version}' not found."
|
|
97
|
+
) from exc
|
|
98
|
+
except LabelSet.MultipleObjectsReturned:
|
|
99
|
+
# Prefer the highest version when duplicates remain and no explicit version requested
|
|
100
|
+
label_set = labelset_qs.order_by("-version").first()
|
|
101
|
+
if not label_set:
|
|
102
|
+
raise ValueError(f"LabelSet '{labelset_name}' could not be resolved.")
|
|
103
|
+
|
|
104
|
+
# --- Determine Version ---
|
|
105
|
+
target_version: str
|
|
106
|
+
latest_version_num = get_latest_version_number_logic(cls, meta_name, model_name)
|
|
107
|
+
|
|
108
|
+
if requested_version:
|
|
109
|
+
target_version = str(requested_version)
|
|
110
|
+
existing = cls.objects.filter(
|
|
111
|
+
name=meta_name, model=ai_model, version=target_version
|
|
112
|
+
).first()
|
|
113
|
+
if existing and not bump_if_exists:
|
|
114
|
+
raise ValueError(
|
|
115
|
+
f"ModelMeta '{meta_name}' version '{target_version}' for model '{model_name}' already exists. Use bump_if_exists=True to increment."
|
|
116
|
+
)
|
|
117
|
+
elif existing and bump_if_exists:
|
|
118
|
+
target_version = str(latest_version_num + 1)
|
|
119
|
+
logger.info(
|
|
120
|
+
f"Bumping version for {meta_name}/{model_name} to {target_version}"
|
|
121
|
+
)
|
|
122
|
+
else:
|
|
123
|
+
target_version = str(latest_version_num + 1)
|
|
124
|
+
logger.info(
|
|
125
|
+
f"Setting next version for {meta_name}/{model_name} to {target_version}"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# --- Prepare Weights File ---
|
|
129
|
+
source_weights_path = Path(weights_file).resolve()
|
|
130
|
+
if not source_weights_path.exists():
|
|
131
|
+
raise FileNotFoundError(f"Weights file not found: {source_weights_path}")
|
|
132
|
+
|
|
133
|
+
# Construct destination path within MEDIA_ROOT/WEIGHTS_DIR
|
|
134
|
+
weights_filename = source_weights_path.name
|
|
135
|
+
# Relative path for the FileField upload_to
|
|
136
|
+
relative_dest_path = (
|
|
137
|
+
Path(WEIGHTS_DIR.relative_to(STORAGE_DIR))
|
|
138
|
+
/ f"{meta_name}_v{target_version}_{weights_filename}"
|
|
139
|
+
)
|
|
140
|
+
# Full path for shutil.copy
|
|
141
|
+
full_dest_path = STORAGE_DIR / relative_dest_path
|
|
142
|
+
|
|
143
|
+
# Ensure the destination directory exists
|
|
144
|
+
full_dest_path.parent.mkdir(parents=True, exist_ok=True)
|
|
145
|
+
|
|
146
|
+
# Copy the file
|
|
147
|
+
try:
|
|
148
|
+
shutil.copy(source_weights_path, full_dest_path)
|
|
149
|
+
logger.info(f"Copied weights from {source_weights_path} to {full_dest_path}")
|
|
150
|
+
except Exception as e:
|
|
151
|
+
raise IOError(f"Failed to copy weights file: {e}") from e
|
|
152
|
+
|
|
153
|
+
# --- Create/Update ModelMeta Instance ---
|
|
154
|
+
defaults = {
|
|
155
|
+
"labelset": label_set,
|
|
156
|
+
"weights": relative_dest_path.as_posix(), # Store relative path for FileField
|
|
157
|
+
**kwargs, # Pass through other fields like activation, mean, std, etc.
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
# Remove None values from defaults to avoid overriding model defaults unnecessarily
|
|
161
|
+
defaults = {k: v for k, v in defaults.items() if v is not None}
|
|
162
|
+
|
|
163
|
+
model_meta, created = cls.objects.update_or_create(
|
|
164
|
+
name=meta_name,
|
|
165
|
+
model=ai_model,
|
|
166
|
+
version=target_version,
|
|
167
|
+
defaults=defaults,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
if created:
|
|
171
|
+
logger.info(f"Created new ModelMeta: {model_meta}")
|
|
172
|
+
else:
|
|
173
|
+
logger.info(f"Updated existing ModelMeta: {model_meta}")
|
|
174
|
+
|
|
175
|
+
# --- Optionally update AiModel's active_meta ---
|
|
176
|
+
# You might want to add logic here to automatically set the newly created/updated
|
|
177
|
+
# meta as the active one for the AiModel, e.g.:
|
|
178
|
+
ai_model.active_meta = model_meta
|
|
179
|
+
ai_model.save()
|
|
180
|
+
|
|
181
|
+
return model_meta
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
# --- Add other logic functions referenced by ModelMeta here ---
|
|
185
|
+
# (get_latest_version_number_logic, get_activation_function_logic, etc.)
|
|
186
|
+
# Placeholder for get_activation_function_logic
|
|
187
|
+
def get_activation_function_logic(activation_name: str):
|
|
188
|
+
import torch.nn as nn # Import locally as it's specific to this function
|
|
189
|
+
|
|
190
|
+
if activation_name.lower() == "sigmoid":
|
|
191
|
+
return nn.Sigmoid()
|
|
192
|
+
elif activation_name.lower() == "softmax":
|
|
193
|
+
# Note: Softmax usually requires specifying the dimension
|
|
194
|
+
return nn.Softmax(dim=1) # Assuming dim=1 (channels) is common
|
|
195
|
+
elif activation_name.lower() == "none":
|
|
196
|
+
return nn.Identity()
|
|
197
|
+
else:
|
|
198
|
+
# Consider adding more activations or raising an error
|
|
199
|
+
raise ValueError(f"Unsupported activation function: {activation_name}")
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
# Placeholder for get_inference_dataset_config_logic
|
|
203
|
+
def _normalise_scalar_sequence(value: Any) -> str | None:
|
|
204
|
+
"""Serialise sequence-like values into the canonical comma-separated form."""
|
|
205
|
+
|
|
206
|
+
if value in (None, ""):
|
|
207
|
+
return None
|
|
208
|
+
if isinstance(value, str):
|
|
209
|
+
return value
|
|
210
|
+
if isinstance(value, (list, tuple)):
|
|
211
|
+
return ",".join(str(item) for item in value)
|
|
212
|
+
return str(value)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def _parse_float_sequence(value: Any, *, fallback: Iterable[float]) -> list[float]:
|
|
216
|
+
"""Coerce stored normalisation strings/iterables to float lists."""
|
|
217
|
+
|
|
218
|
+
if value in (None, ""):
|
|
219
|
+
return list(fallback)
|
|
220
|
+
|
|
221
|
+
tokens: Iterable[Any]
|
|
222
|
+
if isinstance(value, str):
|
|
223
|
+
tokens = [tok.strip() for tok in value.split(",") if tok.strip()]
|
|
224
|
+
elif isinstance(value, (list, tuple)):
|
|
225
|
+
tokens = value
|
|
226
|
+
else:
|
|
227
|
+
tokens = [value]
|
|
228
|
+
|
|
229
|
+
parsed: list[float] = []
|
|
230
|
+
for token in tokens:
|
|
231
|
+
try:
|
|
232
|
+
parsed.append(float(token))
|
|
233
|
+
except (TypeError, ValueError):
|
|
234
|
+
logger.warning(
|
|
235
|
+
"Failed to parse normalisation value %r; using fallback", token
|
|
236
|
+
)
|
|
237
|
+
return list(fallback)
|
|
238
|
+
|
|
239
|
+
return parsed or list(fallback)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def _parse_axes(axes_value: str | Iterable[Any]) -> list[int]:
|
|
243
|
+
"""Normalise stored axis notation to integer indices.
|
|
244
|
+
|
|
245
|
+
Historic metadata mixes numeric strings ("2,0,1") with symbolic tokens
|
|
246
|
+
("CHW", "HWC"). The inference code ultimately expects a list of integers,
|
|
247
|
+
so we coerce common symbolic forms to their numeric equivalents and fall
|
|
248
|
+
back to sequential indices when the format is unknown.
|
|
249
|
+
"""
|
|
250
|
+
|
|
251
|
+
if not axes_value:
|
|
252
|
+
return [0, 1, 2]
|
|
253
|
+
|
|
254
|
+
if isinstance(axes_value, str):
|
|
255
|
+
token_source = axes_value.strip()
|
|
256
|
+
if "," in token_source:
|
|
257
|
+
tokens = [
|
|
258
|
+
token.strip() for token in token_source.split(",") if token.strip()
|
|
259
|
+
]
|
|
260
|
+
else:
|
|
261
|
+
tokens = [char for char in token_source if char.strip()]
|
|
262
|
+
else:
|
|
263
|
+
tokens = [str(token).strip() for token in axes_value if str(token).strip()]
|
|
264
|
+
|
|
265
|
+
symbol_map = {"C": 0, "H": 1, "W": 2}
|
|
266
|
+
parsed_axes: list[int] = []
|
|
267
|
+
|
|
268
|
+
for idx, token in enumerate(tokens):
|
|
269
|
+
normalised = token.upper()
|
|
270
|
+
if normalised.lstrip("+-").isdigit():
|
|
271
|
+
parsed_axes.append(int(normalised))
|
|
272
|
+
elif normalised in symbol_map:
|
|
273
|
+
parsed_axes.append(symbol_map[normalised])
|
|
274
|
+
else:
|
|
275
|
+
logger.warning("Unknown axes token '%s'; defaulting to index order", token)
|
|
276
|
+
parsed_axes.append(idx)
|
|
277
|
+
|
|
278
|
+
return parsed_axes or [0, 1, 2]
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def get_inference_dataset_config_logic(model_meta: "ModelMeta") -> dict:
|
|
282
|
+
# This would typically extract relevant fields from model_meta
|
|
283
|
+
# for configuring a dataset during inference
|
|
284
|
+
DEFAULT_MEAN = (0.45211223, 0.27139644, 0.19264949)
|
|
285
|
+
DEFAULT_STD = (0.31418097, 0.21088019, 0.16059452)
|
|
286
|
+
|
|
287
|
+
return {
|
|
288
|
+
"mean": _parse_float_sequence(model_meta.mean, fallback=DEFAULT_MEAN),
|
|
289
|
+
"std": _parse_float_sequence(model_meta.std, fallback=DEFAULT_STD),
|
|
290
|
+
"size_y": int(model_meta.size_y) if model_meta.size_y else 716,
|
|
291
|
+
"size_x": int(model_meta.size_x) if model_meta.size_x else 716,
|
|
292
|
+
"axes": _parse_axes(model_meta.axes),
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
# Placeholder for get_config_dict_logic
|
|
297
|
+
def get_config_dict_logic(model_meta: "ModelMeta") -> dict:
|
|
298
|
+
# Returns a dictionary representation of the model's configuration
|
|
299
|
+
return {
|
|
300
|
+
"name": model_meta.name,
|
|
301
|
+
"version": model_meta.version,
|
|
302
|
+
"model_name": model_meta.model.name,
|
|
303
|
+
"labelset_name": model_meta.labelset.name,
|
|
304
|
+
"activation": model_meta.activation,
|
|
305
|
+
"weights_path": model_meta.weights.path if model_meta.weights else None,
|
|
306
|
+
"mean": model_meta.mean,
|
|
307
|
+
"std": model_meta.std,
|
|
308
|
+
"size_x": model_meta.size_x,
|
|
309
|
+
"size_y": model_meta.size_y,
|
|
310
|
+
"axes": model_meta.axes,
|
|
311
|
+
"batchsize": model_meta.batchsize,
|
|
312
|
+
"num_workers": model_meta.num_workers,
|
|
313
|
+
"description": model_meta.description,
|
|
314
|
+
# Add any other relevant fields
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
# Placeholder for get_model_meta_by_name_version_logic
|
|
319
|
+
def get_model_meta_by_name_version_logic(
|
|
320
|
+
cls: Type["ModelMeta"],
|
|
321
|
+
meta_name: str,
|
|
322
|
+
model_name: str,
|
|
323
|
+
version: Optional[str] = None,
|
|
324
|
+
) -> "ModelMeta":
|
|
325
|
+
"""
|
|
326
|
+
Retrieves a ModelMeta instance by name, model name, and optionally version.
|
|
327
|
+
If version is None, retrieves the latest version based on date_created.
|
|
328
|
+
"""
|
|
329
|
+
try:
|
|
330
|
+
ai_model = AiModel.objects.get(name=model_name)
|
|
331
|
+
except AiModel.DoesNotExist as exc:
|
|
332
|
+
raise cls.DoesNotExist(f"AiModel with name '{model_name}' not found.") from exc
|
|
333
|
+
|
|
334
|
+
if version:
|
|
335
|
+
try:
|
|
336
|
+
return cls.objects.get(name=meta_name, model=ai_model, version=version)
|
|
337
|
+
except Exception as exc:
|
|
338
|
+
raise cls.DoesNotExist(
|
|
339
|
+
f"ModelMeta '{meta_name}' version '{version}' for model '{model_name}' not found."
|
|
340
|
+
) from exc
|
|
341
|
+
else:
|
|
342
|
+
# Get latest version
|
|
343
|
+
latest = (
|
|
344
|
+
cls.objects.filter(name=meta_name, model=ai_model)
|
|
345
|
+
.order_by("-date_created")
|
|
346
|
+
.first()
|
|
347
|
+
)
|
|
348
|
+
if latest:
|
|
349
|
+
return latest
|
|
350
|
+
else:
|
|
351
|
+
raise cls.DoesNotExist(
|
|
352
|
+
f"No ModelMeta found for '{meta_name}' and model '{model_name}'."
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
import re
|
|
357
|
+
|
|
358
|
+
from huggingface_hub import model_info
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
def infer_default_model_meta_from_hf(model_id: str) -> dict[str, Any]:
|
|
362
|
+
"""
|
|
363
|
+
Infers default model metadata (activation, normalization, input size)
|
|
364
|
+
from a Hugging Face model_id using its tags and architecture.
|
|
365
|
+
|
|
366
|
+
Returns:
|
|
367
|
+
A dict with fields: name, activation, mean, std, size_x, size_y
|
|
368
|
+
"""
|
|
369
|
+
|
|
370
|
+
if not (info := model_info(model_id)):
|
|
371
|
+
logger.info(
|
|
372
|
+
f"Could not retrieve model info for {model_id}, using ColoReg segmentation defaults."
|
|
373
|
+
)
|
|
374
|
+
return {
|
|
375
|
+
"name": "wg-lux/colo_segmentation_RegNetX800MF_base",
|
|
376
|
+
"activation": "sigmoid",
|
|
377
|
+
"mean": (0.45211223, 0.27139644, 0.19264949),
|
|
378
|
+
"std": (0.31418097, 0.21088019, 0.16059452),
|
|
379
|
+
"size_x": 716,
|
|
380
|
+
"size_y": 716,
|
|
381
|
+
"description": f"Defaults for unknown model {model_id}",
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
# Extract architecture from tags or model_id ---
|
|
385
|
+
tags = info.tags or []
|
|
386
|
+
model_name = model_id.split("/")[-1].lower()
|
|
387
|
+
|
|
388
|
+
# Heuristics for architecture and task
|
|
389
|
+
architecture = next((t for t in tags if t.startswith("architecture:")), None)
|
|
390
|
+
task = next((t for t in tags if t.startswith("task:")), None)
|
|
391
|
+
|
|
392
|
+
# Default values
|
|
393
|
+
activation = "sigmoid"
|
|
394
|
+
size_x = size_y = 716
|
|
395
|
+
mean = (0.45211223, 0.27139644, 0.19264949)
|
|
396
|
+
std = (0.31418097, 0.21088019, 0.16059452)
|
|
397
|
+
|
|
398
|
+
# --- 2. Task-based inference ---
|
|
399
|
+
if task:
|
|
400
|
+
if "segmentation" in task or "detection" in task:
|
|
401
|
+
activation = "sigmoid"
|
|
402
|
+
elif any(k in task for k in ["classification"]):
|
|
403
|
+
activation = "softmax"
|
|
404
|
+
|
|
405
|
+
# --- 3. Architecture-based inference ---
|
|
406
|
+
if architecture:
|
|
407
|
+
arch = architecture.replace("architecture:", "")
|
|
408
|
+
else:
|
|
409
|
+
arch = re.sub(r"[^a-z0-9]+", "_", model_name)
|
|
410
|
+
|
|
411
|
+
return {
|
|
412
|
+
"name": arch,
|
|
413
|
+
"activation": activation,
|
|
414
|
+
"mean": mean,
|
|
415
|
+
"std": std,
|
|
416
|
+
"size_x": size_x,
|
|
417
|
+
"size_y": size_y,
|
|
418
|
+
"description": f"Inferred defaults for {model_id}",
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
def setup_default_from_huggingface_logic(
|
|
423
|
+
cls,
|
|
424
|
+
model_id: str,
|
|
425
|
+
labelset_name: str | None = None,
|
|
426
|
+
labelset_version: Optional[int | str] = None,
|
|
427
|
+
):
|
|
428
|
+
"""
|
|
429
|
+
Downloads model weights from Hugging Face and auto-fills ModelMeta fields.
|
|
430
|
+
"""
|
|
431
|
+
meta = infer_default_model_meta_from_hf(model_id)
|
|
432
|
+
|
|
433
|
+
# Download safetensor weights; raise a clear error if unavailable
|
|
434
|
+
try:
|
|
435
|
+
weights_path = hf_hub_download(
|
|
436
|
+
repo_id=model_id,
|
|
437
|
+
filename="colo_segmentation_RegNetX800MF_base.safetensors",
|
|
438
|
+
local_dir=WEIGHTS_DIR,
|
|
439
|
+
)
|
|
440
|
+
except Exception as exc: # pragma: no cover - network errors
|
|
441
|
+
raise RuntimeError(
|
|
442
|
+
"Failed to download safetensor weights from Hugging Face; ensure the repository provides a .safetensors artifact."
|
|
443
|
+
) from exc
|
|
444
|
+
|
|
445
|
+
ai_model, _ = AiModel.objects.get_or_create(name=meta["name"])
|
|
446
|
+
if not labelset_name:
|
|
447
|
+
labelset = LabelSet.objects.first()
|
|
448
|
+
if not labelset:
|
|
449
|
+
raise ValueError("No labelset found and no labelset_name provided")
|
|
450
|
+
else:
|
|
451
|
+
labelset_qs = LabelSet.objects.filter(name=labelset_name)
|
|
452
|
+
if labelset_version not in (None, "", -1):
|
|
453
|
+
try:
|
|
454
|
+
version_value = int(labelset_version)
|
|
455
|
+
except (TypeError, ValueError):
|
|
456
|
+
version_value = labelset_version
|
|
457
|
+
labelset_qs = labelset_qs.filter(version=version_value)
|
|
458
|
+
labelset = labelset_qs.order_by("-version").first()
|
|
459
|
+
if not labelset:
|
|
460
|
+
raise ValueError(
|
|
461
|
+
f"LabelSet '{labelset_name}' with version '{labelset_version}' not found."
|
|
462
|
+
)
|
|
463
|
+
|
|
464
|
+
ModelMeta = _get_model_meta_class()
|
|
465
|
+
model_meta = ModelMeta.objects.filter(name=meta["name"], model=ai_model).first()
|
|
466
|
+
if model_meta:
|
|
467
|
+
logger.info(
|
|
468
|
+
f"ModelMeta {meta['name']} for model {ai_model.name} already exists. Skipping creation."
|
|
469
|
+
)
|
|
470
|
+
return model_meta
|
|
471
|
+
|
|
472
|
+
return create_from_file_logic(
|
|
473
|
+
cls,
|
|
474
|
+
meta_name=meta["name"],
|
|
475
|
+
model_name=ai_model.name,
|
|
476
|
+
labelset_name=labelset.name,
|
|
477
|
+
labelset_version=labelset.version,
|
|
478
|
+
weights_file=weights_path,
|
|
479
|
+
activation=meta["activation"],
|
|
480
|
+
mean=meta["mean"],
|
|
481
|
+
std=meta["std"],
|
|
482
|
+
size_x=meta["size_x"],
|
|
483
|
+
size_y=meta["size_y"],
|
|
484
|
+
description=meta["description"],
|
|
485
|
+
)
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, cast
|
|
2
|
+
|
|
3
|
+
from django.core.files import File
|
|
4
|
+
from django.db import models
|
|
5
|
+
|
|
6
|
+
if TYPE_CHECKING:
|
|
7
|
+
from ..media.pdf.report_reader.report_reader_flag import ReportReaderFlag
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PdfType(models.Model):
|
|
11
|
+
"""
|
|
12
|
+
Defines a specific type or format of report report, linking to flags used for parsing.
|
|
13
|
+
|
|
14
|
+
Used to configure how different report report layouts are processed.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
name = models.CharField(max_length=255)
|
|
18
|
+
|
|
19
|
+
patient_info_line = models.ForeignKey(
|
|
20
|
+
"ReportReaderFlag",
|
|
21
|
+
related_name="pdf_type_patient_info_line",
|
|
22
|
+
on_delete=models.CASCADE,
|
|
23
|
+
)
|
|
24
|
+
endoscope_info_line = models.ForeignKey(
|
|
25
|
+
"ReportReaderFlag",
|
|
26
|
+
related_name="pdf_type_endoscopy_info_line",
|
|
27
|
+
on_delete=models.CASCADE,
|
|
28
|
+
)
|
|
29
|
+
examiner_info_line = models.ForeignKey(
|
|
30
|
+
"ReportReaderFlag",
|
|
31
|
+
related_name="pdf_type_examiner_info_line",
|
|
32
|
+
on_delete=models.CASCADE,
|
|
33
|
+
)
|
|
34
|
+
cut_off_above_lines = models.ManyToManyField(
|
|
35
|
+
"ReportReaderFlag",
|
|
36
|
+
related_name="pdf_type_cut_off_above_lines",
|
|
37
|
+
)
|
|
38
|
+
cut_off_below_lines = models.ManyToManyField(
|
|
39
|
+
"ReportReaderFlag",
|
|
40
|
+
related_name="pdf_type_cut_off_below_lines",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
if TYPE_CHECKING:
|
|
44
|
+
patient_info_line: models.ForeignKey["ReportReaderFlag"]
|
|
45
|
+
endoscope_info_line: models.ForeignKey["ReportReaderFlag"]
|
|
46
|
+
examiner_info_line: models.ForeignKey["ReportReaderFlag"]
|
|
47
|
+
|
|
48
|
+
cut_off_above_lines = cast(
|
|
49
|
+
models.manager.RelatedManager["ReportReaderFlag"], cut_off_above_lines
|
|
50
|
+
)
|
|
51
|
+
cut_off_below_lines = cast(
|
|
52
|
+
models.manager.RelatedManager["ReportReaderFlag"], cut_off_below_lines
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
def __str__(self):
|
|
56
|
+
"""Returns a string summary of the report type and its associated flags."""
|
|
57
|
+
summary = f"{self.name}"
|
|
58
|
+
# add lines to summary
|
|
59
|
+
summary += f"\nPatient Info Line: {self.patient_info_line.value}"
|
|
60
|
+
summary += f"\nEndoscope Info Line: {self.endoscope_info_line.value}"
|
|
61
|
+
summary += f"\nExaminer Info Line: {self.examiner_info_line.value}"
|
|
62
|
+
summary += f"\nCut Off Above Lines: {[_.value for _ in self.cut_off_above_lines.all()]}"
|
|
63
|
+
summary += f"\nCut Off Below Lines: {[_.value for _ in self.cut_off_below_lines.all()]}"
|
|
64
|
+
|
|
65
|
+
return summary
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def default_pdf_type(cls):
|
|
69
|
+
"""Returns a default PdfType instance, typically used as a fallback."""
|
|
70
|
+
return PdfType.objects.get(name="ukw-endoscopy-examination-report-generic")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class PdfMeta(models.Model):
|
|
74
|
+
"""
|
|
75
|
+
Stores metadata associated with a specific report document file.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
pdf_type = models.ForeignKey(PdfType, on_delete=models.CASCADE)
|
|
79
|
+
date = models.DateField()
|
|
80
|
+
time = models.TimeField()
|
|
81
|
+
pdf_hash = models.CharField(max_length=255, unique=True)
|
|
82
|
+
|
|
83
|
+
def __str__(self):
|
|
84
|
+
"""Returns the report hash as its string representation."""
|
|
85
|
+
return str(self.pdf_hash)
|
|
86
|
+
|
|
87
|
+
@classmethod
|
|
88
|
+
def create_from_file(cls, pdf_file):
|
|
89
|
+
"""
|
|
90
|
+
Creates a PdfMeta instance from a report file object.
|
|
91
|
+
Note: This implementation seems incomplete; it doesn't extract hash, date, time, or type.
|
|
92
|
+
"""
|
|
93
|
+
pdf_file = File(pdf_file)
|
|
94
|
+
pdf_meta = cls(file=pdf_file)
|
|
95
|
+
pdf_meta.save()
|
|
96
|
+
return pdf_meta
|