endoreg-db 0.8.6.4__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/admin.py +92 -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 +18 -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/__init__.py +0 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +144 -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 +91 -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/examination/examinations/data.yaml +72 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +8 -0
- endoreg_db/data/examination/type/data.yaml +17 -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 +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/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/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 +11 -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 +19 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +5 -0
- 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 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +8 -0
- endoreg_db/forms/unit.py +6 -0
- endoreg_db/helpers/__init__.py +0 -0
- 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 +77 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +192 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_data.py +41 -0
- endoreg_db/management/commands/load_disease_data.py +62 -0
- endoreg_db/management/commands/load_distribution_data.py +66 -0
- endoreg_db/management/commands/load_endoscope_data.py +68 -0
- endoreg_db/management/commands/load_event_data.py +41 -0
- endoreg_db/management/commands/load_examination_data.py +75 -0
- 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_gender_data.py +44 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -0
- endoreg_db/management/commands/load_information_source.py +51 -0
- endoreg_db/management/commands/load_lab_value_data.py +50 -0
- endoreg_db/management/commands/load_medication_data.py +103 -0
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/load_organ_data.py +43 -0
- endoreg_db/management/commands/load_pdf_type_data.py +61 -0
- endoreg_db/management/commands/load_profession_data.py +44 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +46 -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/load_unit_data.py +46 -0
- endoreg_db/management/commands/load_user_groups.py +28 -0
- endoreg_db/management/commands/register_ai_model.py +64 -0
- endoreg_db/management/commands/reset_celery_schedule.py +9 -0
- 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 +1857 -0
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +359 -0
- 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/administration/ai/model_type.py +41 -0
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +15 -0
- endoreg_db/models/administration/case/case_template/case_template.py +125 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +269 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +86 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +26 -0
- endoreg_db/models/administration/center/__init__.py +13 -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/administration/person/names/first_name.py +18 -0
- endoreg_db/models/administration/person/names/last_name.py +19 -0
- 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/person.py +31 -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/administration/product/product_weight.py +47 -0
- endoreg_db/models/administration/product/reference_product.py +130 -0
- 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 -0
- 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 +83 -0
- 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/pdf/report_reader/report_reader_flag.py +20 -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/medical/hardware/endoscopy_processor.py +182 -0
- 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/medical/patient/patient_lab_value.py +222 -0
- 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/metadata/pdf_meta.py +89 -0
- 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 +40 -0
- 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/other/gender.py +27 -0
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +28 -0
- endoreg_db/models/other/resource.py +22 -0
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +33 -0
- endoreg_db/models/other/unit.py +32 -0
- endoreg_db/models/other/waste.py +27 -0
- 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/rule/rule.py +27 -0
- endoreg_db/models/rule/rule_applicator.py +224 -0
- endoreg_db/models/rule/rule_attribute_dtype.py +17 -0
- endoreg_db/models/rule/rule_type.py +20 -0
- endoreg_db/models/rule/ruleset.py +17 -0
- 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/queries/__init__.py +5 -0
- endoreg_db/queries/annotations/__init__.py +3 -0
- endoreg_db/queries/annotations/legacy.py +158 -0
- endoreg_db/queries/sanity/__init_.py +0 -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 -0
- 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 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/get.py +5 -0
- 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/cropping.py +29 -0
- endoreg_db/utils/dataloader.py +175 -0
- 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 +58 -0
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +153 -0
- 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/ocr.py +190 -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/uuid.py +4 -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 +186 -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 -0
- endoreg_db-0.8.6.4.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.4.dist-info/RECORD +793 -0
- endoreg_db-0.8.6.4.dist-info/WHEEL +4 -0
- endoreg_db-0.8.6.4.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from torch.utils.data import Dataset
|
|
2
|
+
import numpy as np
|
|
3
|
+
from PIL import Image
|
|
4
|
+
from torchvision import transforms
|
|
5
|
+
from .preprocess import Cropper
|
|
6
|
+
|
|
7
|
+
class InferenceDataset(Dataset):
|
|
8
|
+
def __init__(self, paths, crops, config):
|
|
9
|
+
self.paths = paths
|
|
10
|
+
self.crops = crops
|
|
11
|
+
self.cropper = Cropper() # Assuming Cropper can work with NumPy arrays
|
|
12
|
+
self.config = config
|
|
13
|
+
|
|
14
|
+
# Initialize the image transformations using torchvision
|
|
15
|
+
self.transforms = transforms.Compose([
|
|
16
|
+
# Convert PIL image to PyTorch tensor
|
|
17
|
+
transforms.ToTensor(),
|
|
18
|
+
# Normalize the image using the provided mean and std
|
|
19
|
+
transforms.Normalize(mean=self.config["mean"], std=self.config["std"])
|
|
20
|
+
])
|
|
21
|
+
|
|
22
|
+
def __len__(self):
|
|
23
|
+
# Returns the total number of samples
|
|
24
|
+
return len(self.paths)
|
|
25
|
+
|
|
26
|
+
def __getitem__(self, idx):
|
|
27
|
+
# Open the image with Pillow
|
|
28
|
+
with Image.open(self.paths[idx]) as pil_image:
|
|
29
|
+
# Convert the image to RGB to ensure 3 channels
|
|
30
|
+
pil_image = pil_image.convert('RGB')
|
|
31
|
+
|
|
32
|
+
# Get the corresponding crop for the current image
|
|
33
|
+
crop = self.crops[idx]
|
|
34
|
+
|
|
35
|
+
# Crop the image based on the provided crop parameters and convert to numpy for cropping
|
|
36
|
+
cropped = self.cropper(
|
|
37
|
+
np.array(pil_image), # Convert PIL image to numpy array for cropping
|
|
38
|
+
crop,
|
|
39
|
+
scale=[
|
|
40
|
+
self.config["size_x"],
|
|
41
|
+
self.config["size_y"]
|
|
42
|
+
]
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
# Convert cropped numpy array back to PIL image for torchvision transforms
|
|
46
|
+
cropped_pil = Image.fromarray(cropped.astype('uint8'), 'RGB')
|
|
47
|
+
|
|
48
|
+
# Apply the transformations
|
|
49
|
+
img = self.transforms(cropped_pil)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
return img
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import torch
|
|
2
|
+
from torchvision import models
|
|
3
|
+
import torch.nn as nn
|
|
4
|
+
from pytorch_lightning import LightningModule
|
|
5
|
+
import numpy as np
|
|
6
|
+
from sklearn.metrics import precision_score, recall_score, f1_score
|
|
7
|
+
|
|
8
|
+
METRICS_ON_STEP = False
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def calculate_metrics(pred, target, threshold=0.5):
|
|
12
|
+
pred = np.array(pred > threshold, dtype=float)
|
|
13
|
+
return {
|
|
14
|
+
"micro/precision": precision_score(
|
|
15
|
+
y_true=target, y_pred=pred, average="micro", zero_division=0
|
|
16
|
+
),
|
|
17
|
+
"micro/recall": recall_score(
|
|
18
|
+
y_true=target, y_pred=pred, average="micro", zero_division=0
|
|
19
|
+
),
|
|
20
|
+
"micro/f1": f1_score(
|
|
21
|
+
y_true=target, y_pred=pred, average="micro", zero_division=0
|
|
22
|
+
),
|
|
23
|
+
"macro/precision": precision_score(
|
|
24
|
+
y_true=target, y_pred=pred, average="macro", zero_division=0
|
|
25
|
+
),
|
|
26
|
+
"macro/recall": recall_score(
|
|
27
|
+
y_true=target, y_pred=pred, average="macro", zero_division=0
|
|
28
|
+
),
|
|
29
|
+
"macro/f1": f1_score(
|
|
30
|
+
y_true=target, y_pred=pred, average="macro", zero_division=0
|
|
31
|
+
),
|
|
32
|
+
"samples/precision": precision_score(
|
|
33
|
+
y_true=target, y_pred=pred, average=None, zero_division=0
|
|
34
|
+
),
|
|
35
|
+
"samples/recall": recall_score(
|
|
36
|
+
y_true=target, y_pred=pred, average=None, zero_division=0
|
|
37
|
+
),
|
|
38
|
+
"samples/f1": f1_score(
|
|
39
|
+
y_true=target, y_pred=pred, average=None, zero_division=0
|
|
40
|
+
),
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class MultiLabelClassificationNet(LightningModule):
|
|
45
|
+
def __init__(
|
|
46
|
+
self,
|
|
47
|
+
labels=None,
|
|
48
|
+
lr=6e-3,
|
|
49
|
+
weight_decay=0.001,
|
|
50
|
+
pos_weight=2,
|
|
51
|
+
model_type="EfficientNetB4",
|
|
52
|
+
):
|
|
53
|
+
super().__init__()
|
|
54
|
+
self.save_hyperparameters()
|
|
55
|
+
self.model_type = "RegNetX800MF" # model_type
|
|
56
|
+
self.labels = labels
|
|
57
|
+
self.n_classes = len(labels)
|
|
58
|
+
self.val_preds = []
|
|
59
|
+
self.val_targets = []
|
|
60
|
+
self.pos_weight = pos_weight
|
|
61
|
+
self.weight_decay = weight_decay
|
|
62
|
+
self.lr = lr
|
|
63
|
+
self.sigm = nn.Sigmoid()
|
|
64
|
+
|
|
65
|
+
if model_type == "EfficientNetB4":
|
|
66
|
+
self.model = models.efficientnet_b4(pretrained=True)
|
|
67
|
+
num_ftrs = self.model.classifier[1].in_features
|
|
68
|
+
self.model.classifier[1] = nn.Linear(num_ftrs, len(labels))
|
|
69
|
+
|
|
70
|
+
elif model_type == "RegNetX800MF":
|
|
71
|
+
self.model = models.regnet_x_800mf(pretrained=True)
|
|
72
|
+
num_ftrs = self.model.fc.in_features
|
|
73
|
+
self.model.fc = nn.Linear(num_ftrs, len(labels))
|
|
74
|
+
|
|
75
|
+
self.criterion = nn.BCEWithLogitsLoss(
|
|
76
|
+
pos_weight=torch.Tensor([self.pos_weight] * len(self.labels))
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
@classmethod
|
|
80
|
+
def load_from_checkpoint(cls, checkpoint_path, *args, **kwargs):
|
|
81
|
+
instance = super(MultiLabelClassificationNet, cls).load_from_checkpoint(
|
|
82
|
+
checkpoint_path, *args, **kwargs
|
|
83
|
+
)
|
|
84
|
+
return instance
|
|
85
|
+
|
|
86
|
+
def forward(self, x): # pylint: disable=arguments-differ
|
|
87
|
+
x = self.model(x)
|
|
88
|
+
return x
|
|
89
|
+
|
|
90
|
+
def training_step(self, batch, _batch_idx): # pylint: disable=arguments-differ
|
|
91
|
+
x, y = batch
|
|
92
|
+
y_pred = self(x)
|
|
93
|
+
loss = self.criterion(y_pred, y)
|
|
94
|
+
self.log(
|
|
95
|
+
"train/loss", loss, on_step=METRICS_ON_STEP, on_epoch=True, prog_bar=True
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
preds = np.array(self.sigm(y_pred).cpu() > 0.5, dtype=float)
|
|
99
|
+
|
|
100
|
+
return {"loss": loss, "preds": preds, "targets": y}
|
|
101
|
+
|
|
102
|
+
def validation_step(self, batch, _batch_idx): # pylint: disable=arguments-differ
|
|
103
|
+
x, y = batch
|
|
104
|
+
y_pred = self(x)
|
|
105
|
+
loss = self.criterion(y_pred, y)
|
|
106
|
+
self.log("val/loss", loss, on_epoch=True, prog_bar=True)
|
|
107
|
+
|
|
108
|
+
preds = np.array(self.sigm(y_pred).cpu() > 0.5, dtype=float)
|
|
109
|
+
self.val_preds.append(preds)
|
|
110
|
+
self.val_targets.append(y.cpu().numpy())
|
|
111
|
+
|
|
112
|
+
return {"loss": loss, "preds": preds, "targets": y}
|
|
113
|
+
|
|
114
|
+
def validation_epoch_end(self, _outputs):
|
|
115
|
+
"""Called at the end of validation to aggregate outputs"""
|
|
116
|
+
self.val_preds = np.concatenate([_ for _ in self.val_preds])
|
|
117
|
+
self.val_targets = np.concatenate([_ for _ in self.val_targets])
|
|
118
|
+
|
|
119
|
+
metrics = calculate_metrics(self.val_preds, self.val_targets, threshold=0.5)
|
|
120
|
+
for key, value in metrics.items():
|
|
121
|
+
value = value.tolist()
|
|
122
|
+
if isinstance(value, list):
|
|
123
|
+
for i, _value in enumerate(value):
|
|
124
|
+
name = "val/" + f"{key}/{self.labels[i]}"
|
|
125
|
+
self.log(
|
|
126
|
+
name,
|
|
127
|
+
_value,
|
|
128
|
+
on_epoch=True,
|
|
129
|
+
on_step=METRICS_ON_STEP,
|
|
130
|
+
prog_bar=False,
|
|
131
|
+
)
|
|
132
|
+
else:
|
|
133
|
+
name = "val/" + f"{key}"
|
|
134
|
+
self.log(
|
|
135
|
+
name, value, on_epoch=True, on_step=METRICS_ON_STEP, prog_bar=True
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
self.val_preds = []
|
|
139
|
+
self.val_targets = []
|
|
140
|
+
|
|
141
|
+
def configure_optimizers(self):
|
|
142
|
+
"""Choose what optimizers and learning-rate schedulers to use in your optimization.
|
|
143
|
+
Normally you'd need one. But in the case of GANs or similar you might have multiple.
|
|
144
|
+
|
|
145
|
+
See examples here:
|
|
146
|
+
https://pytorch-lightning.readthedocs.io/en/latest/common/lightning_module.html#configure-optimizers
|
|
147
|
+
"""
|
|
148
|
+
optimizer = torch.optim.SGD(
|
|
149
|
+
self.parameters(), self.lr, momentum=0.5, weight_decay=self.weight_decay
|
|
150
|
+
)
|
|
151
|
+
lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(
|
|
152
|
+
optimizer, T_0=20,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
"optimizer": optimizer,
|
|
157
|
+
"lr_scheduler": lr_scheduler,
|
|
158
|
+
"monitor": "val/loss",
|
|
159
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def concat_pred_dicts(pred_dicts):
|
|
5
|
+
"""Shoulkd be a list of dictionaries with the same keys"""
|
|
6
|
+
assert len(pred_dicts) > 0
|
|
7
|
+
keys = pred_dicts[0].keys()
|
|
8
|
+
|
|
9
|
+
merged_predictions = {key: [] for key in keys}
|
|
10
|
+
for p in pred_dicts:
|
|
11
|
+
for key in p.keys():
|
|
12
|
+
merged_predictions[key].append(p[key])
|
|
13
|
+
|
|
14
|
+
for key in merged_predictions.keys():
|
|
15
|
+
merged_predictions[key] = np.array(merged_predictions[key])
|
|
16
|
+
|
|
17
|
+
return merged_predictions
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def make_smooth_preds(prediction_array, window_size_s=1, fps=50):
|
|
21
|
+
window_size = int(window_size_s * fps)
|
|
22
|
+
smooth_prediction_array = np.convolve(
|
|
23
|
+
prediction_array, np.ones(window_size) / window_size, mode="valid"
|
|
24
|
+
)
|
|
25
|
+
return smooth_prediction_array
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def find_true_pred_sequences(predictions):
|
|
29
|
+
"""
|
|
30
|
+
Efficiently finds sequences of 'outside' predictions in the binary predictions array using NumPy.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
predictions (np.array): An array of boolean values, where True represents an 'outside' image
|
|
34
|
+
and False represents an 'inside' image.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
list of tuples: A list where each tuple represents a sequence of 'outside' predictions,
|
|
38
|
+
with the first element as the start index and the second element as the stop index.
|
|
39
|
+
"""
|
|
40
|
+
# Identify where the value changes in the binary array (from False to True or True to False)
|
|
41
|
+
change_indices = np.where(np.diff(predictions.astype(int)) != 0)[0]
|
|
42
|
+
|
|
43
|
+
# Since diff reduces the length by 1, we adjust indices to align with the original array
|
|
44
|
+
change_indices += 1
|
|
45
|
+
|
|
46
|
+
# If the first element is 'outside', prepend a 0 to indicate the start
|
|
47
|
+
if predictions[0]:
|
|
48
|
+
change_indices = np.insert(change_indices, 0, 0)
|
|
49
|
+
|
|
50
|
+
# If the last element is 'outside', append the length of the array to indicate the end
|
|
51
|
+
if predictions[-1]:
|
|
52
|
+
change_indices = np.append(change_indices, predictions.size)
|
|
53
|
+
|
|
54
|
+
# Extract the 'outside' sequences by slicing the change_indices array in steps of two
|
|
55
|
+
outside_sequences = [
|
|
56
|
+
(change_indices[i], change_indices[i + 1] - 1)
|
|
57
|
+
for i in range(0, len(change_indices), 2)
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
# make sure the result is serializable
|
|
61
|
+
outside_sequences = [(int(start), int(stop)) for start, stop in outside_sequences]
|
|
62
|
+
|
|
63
|
+
return outside_sequences
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module contains the Classifier class for making predictions using a trained model.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import torch
|
|
7
|
+
from torch.utils.data import DataLoader
|
|
8
|
+
from torch import nn
|
|
9
|
+
import numpy as np
|
|
10
|
+
from tqdm import tqdm
|
|
11
|
+
from icecream import ic
|
|
12
|
+
from .inference_dataset import InferenceDataset
|
|
13
|
+
from .postprocess import concat_pred_dicts, make_smooth_preds, find_true_pred_sequences
|
|
14
|
+
|
|
15
|
+
sample_config = {
|
|
16
|
+
# mean and std for normalization
|
|
17
|
+
"mean": (0.45211223, 0.27139644, 0.19264949),
|
|
18
|
+
"std": (0.31418097, 0.21088019, 0.16059452),
|
|
19
|
+
# Image Size
|
|
20
|
+
"size_x": 716,
|
|
21
|
+
"size_y": 716,
|
|
22
|
+
# how to wrangle axes of the image before putting them in the network
|
|
23
|
+
"axes": [2, 0, 1], # 2,1,0 for opencv
|
|
24
|
+
"batchsize": 16,
|
|
25
|
+
"num_workers": 0, # always 1 for Windows systems # FIXME: fix celery crash if multiprocessing
|
|
26
|
+
# maybe add sigmoid after prediction?
|
|
27
|
+
"activation": nn.Sigmoid(),
|
|
28
|
+
"labels": [
|
|
29
|
+
"appendix",
|
|
30
|
+
"blood",
|
|
31
|
+
"diverticule",
|
|
32
|
+
"grasper",
|
|
33
|
+
"ileocaecalvalve",
|
|
34
|
+
"ileum",
|
|
35
|
+
"low_quality",
|
|
36
|
+
"nbi",
|
|
37
|
+
"needle",
|
|
38
|
+
"outside",
|
|
39
|
+
"polyp",
|
|
40
|
+
"snare",
|
|
41
|
+
"water_jet",
|
|
42
|
+
"wound",
|
|
43
|
+
],
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class Classifier:
|
|
48
|
+
def __init__(self, model=None, config=None, verbose=False):
|
|
49
|
+
if config is None:
|
|
50
|
+
config = sample_config.copy()
|
|
51
|
+
self.config = config
|
|
52
|
+
self.model = model
|
|
53
|
+
self.verbose = verbose
|
|
54
|
+
|
|
55
|
+
def pipe(self, paths, crops, verbose=None):
|
|
56
|
+
"""
|
|
57
|
+
Processes input data through the model pipeline and returns predictions.
|
|
58
|
+
Args:
|
|
59
|
+
paths (list): List of file paths to the input data.
|
|
60
|
+
crops (list): List of crop regions for the input data.
|
|
61
|
+
verbose (bool, optional): If True, prints detailed logs. Defaults to None.
|
|
62
|
+
Returns:
|
|
63
|
+
list: Predictions generated by the model.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
if verbose is None:
|
|
67
|
+
verbose = self.verbose
|
|
68
|
+
|
|
69
|
+
dataset = InferenceDataset(paths, crops, self.config)
|
|
70
|
+
if verbose:
|
|
71
|
+
ic("Dataset created")
|
|
72
|
+
|
|
73
|
+
dl = DataLoader(
|
|
74
|
+
dataset=dataset,
|
|
75
|
+
batch_size=self.config["batchsize"],
|
|
76
|
+
num_workers=self.config["num_workers"],
|
|
77
|
+
shuffle=False,
|
|
78
|
+
pin_memory=True,
|
|
79
|
+
)
|
|
80
|
+
if verbose:
|
|
81
|
+
ic("Dataloader created")
|
|
82
|
+
|
|
83
|
+
predictions = []
|
|
84
|
+
|
|
85
|
+
with torch.inference_mode():
|
|
86
|
+
if self.verbose:
|
|
87
|
+
ic("Starting inference")
|
|
88
|
+
|
|
89
|
+
# Ensure model exists
|
|
90
|
+
if self.model is None:
|
|
91
|
+
raise ValueError("Model is not loaded")
|
|
92
|
+
|
|
93
|
+
# Use the device the model is currently on, with fallback to CPU
|
|
94
|
+
try:
|
|
95
|
+
# Check what device the model parameters are on
|
|
96
|
+
model_device = next(self.model.parameters()).device
|
|
97
|
+
device = model_device
|
|
98
|
+
if verbose:
|
|
99
|
+
print(f"Using device: {device}")
|
|
100
|
+
except StopIteration:
|
|
101
|
+
# Model has no parameters, default to CPU
|
|
102
|
+
device = torch.device("cpu")
|
|
103
|
+
if verbose:
|
|
104
|
+
print("Model has no parameters, defaulting to CPU")
|
|
105
|
+
except Exception as e:
|
|
106
|
+
# Any other issue, fall back to CPU
|
|
107
|
+
device = torch.device("cpu")
|
|
108
|
+
if verbose:
|
|
109
|
+
print(f"Device detection failed, using CPU: {e}")
|
|
110
|
+
|
|
111
|
+
# Ensure model is in eval mode
|
|
112
|
+
self.model.eval()
|
|
113
|
+
|
|
114
|
+
for batch in tqdm(dl):
|
|
115
|
+
batch = batch.to(device, non_blocking=True)
|
|
116
|
+
prediction = self.model(batch)
|
|
117
|
+
prediction = (
|
|
118
|
+
self.config["activation"](prediction).cpu().tolist()
|
|
119
|
+
) # .numpy().tolist()
|
|
120
|
+
predictions += prediction
|
|
121
|
+
|
|
122
|
+
return predictions
|
|
123
|
+
|
|
124
|
+
def __call__(self, image, crop=None):
|
|
125
|
+
return self.pipe([image], [crop])
|
|
126
|
+
|
|
127
|
+
def readable(self, predictions):
|
|
128
|
+
"""
|
|
129
|
+
Converts a list of predictions into a readable dictionary format.
|
|
130
|
+
Args:
|
|
131
|
+
predictions (list): A list of prediction values.
|
|
132
|
+
Returns:
|
|
133
|
+
dict: A dictionary where the keys are labels from the configuration
|
|
134
|
+
and the values are the corresponding predictions. If a prediction
|
|
135
|
+
value is of type numpy.int64, it is converted to a standard int.
|
|
136
|
+
"""
|
|
137
|
+
readable_dict = {
|
|
138
|
+
label: prediction
|
|
139
|
+
for label, prediction in zip(self.config["labels"], predictions)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# when dumping to json we need to convert numpy.int64 to int
|
|
143
|
+
readable_dict = {
|
|
144
|
+
key: int(value) if isinstance(value, np.int64) else value
|
|
145
|
+
for key, value in readable_dict.items()
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return readable_dict
|
|
149
|
+
|
|
150
|
+
def get_prediction_dict(self, predictions, paths):
|
|
151
|
+
"""
|
|
152
|
+
Constructs a dictionary containing prediction results.
|
|
153
|
+
Args:
|
|
154
|
+
predictions (list): A list of prediction results.
|
|
155
|
+
paths (list): A list of paths corresponding to the predictions.
|
|
156
|
+
Returns:
|
|
157
|
+
dict: A dictionary with the following keys:
|
|
158
|
+
- "labels": The labels from the configuration.
|
|
159
|
+
- "paths": The provided paths.
|
|
160
|
+
- "predictions": The provided predictions.
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
json_dict = {
|
|
164
|
+
"labels": self.config["labels"],
|
|
165
|
+
"paths": paths,
|
|
166
|
+
"predictions": predictions,
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return json_dict
|
|
170
|
+
|
|
171
|
+
def get_prediction_json(self, predictions, paths, json_target_path: str = None):
|
|
172
|
+
"""
|
|
173
|
+
Saves predictions to a JSON file.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
predictions (list): A list of prediction results.
|
|
177
|
+
paths (list): A list of paths corresponding to the predictions.
|
|
178
|
+
json_target_path (str, optional): The path to save the JSON file. Defaults to None.
|
|
179
|
+
"""
|
|
180
|
+
if not json_target_path:
|
|
181
|
+
json_target_path = "predictions.json"
|
|
182
|
+
|
|
183
|
+
json_dict = self.get_prediction_dict(predictions, paths)
|
|
184
|
+
|
|
185
|
+
with open(json_target_path, "w", encoding="utf-8") as f:
|
|
186
|
+
json.dump(json_dict, f)
|
|
187
|
+
|
|
188
|
+
if self.verbose:
|
|
189
|
+
ic(f"Saved predictions to {json_target_path}")
|
|
190
|
+
|
|
191
|
+
def post_process_predictions(
|
|
192
|
+
self, pred_dicts, window_size_s=1, fps=50, min_seq_len_s=0.5
|
|
193
|
+
):
|
|
194
|
+
"""
|
|
195
|
+
pred_dicts: list of dictionaries with the same keys
|
|
196
|
+
window_size_s: size of the window in seconds for smoothing
|
|
197
|
+
fps: frames per second
|
|
198
|
+
min_seq_len_s: minimum length of a sequence in seconds
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
predictions: concatenated predictions
|
|
202
|
+
smooth_predictions: smoothed predictions
|
|
203
|
+
binary_predictions: binary predictions
|
|
204
|
+
raw_sequences: raw sequences
|
|
205
|
+
filtered_sequences: filtered sequences
|
|
206
|
+
"""
|
|
207
|
+
# Concatenate the predictions
|
|
208
|
+
predictions = concat_pred_dicts(pred_dicts)
|
|
209
|
+
|
|
210
|
+
smooth_predictions = {key: [] for key in predictions.keys()}
|
|
211
|
+
for key in predictions.keys():
|
|
212
|
+
smooth_predictions[key] = make_smooth_preds(
|
|
213
|
+
predictions[key], window_size_s=window_size_s, fps=fps
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
binary_predictions = {}
|
|
217
|
+
for key in smooth_predictions.keys():
|
|
218
|
+
binary_predictions[key] = np.array(
|
|
219
|
+
[p > 0.5 for p in smooth_predictions[key]]
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
raw_sequences = {}
|
|
223
|
+
for key, value in binary_predictions.items():
|
|
224
|
+
raw_sequences[key] = find_true_pred_sequences(value)
|
|
225
|
+
|
|
226
|
+
filtered_sequences = {}
|
|
227
|
+
min_seq_len = int(min_seq_len_s * fps)
|
|
228
|
+
for key, sequences in raw_sequences.items():
|
|
229
|
+
filtered_sequences[key] = [
|
|
230
|
+
s for s in sequences if s[1] - s[0] > min_seq_len
|
|
231
|
+
]
|
|
232
|
+
|
|
233
|
+
return (
|
|
234
|
+
predictions,
|
|
235
|
+
smooth_predictions,
|
|
236
|
+
binary_predictions,
|
|
237
|
+
raw_sequences,
|
|
238
|
+
filtered_sequences,
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
def post_process_predictions_serializable(
|
|
242
|
+
self, pred_dicts, window_size_s=1, fps=50, min_seq_len_s=0.5
|
|
243
|
+
):
|
|
244
|
+
"""
|
|
245
|
+
Post-processes prediction dictionaries to make them serializable.
|
|
246
|
+
This method takes prediction dictionaries, processes them to ensure all
|
|
247
|
+
elements are serializable (e.g., converting numpy arrays to lists), and
|
|
248
|
+
organizes the results into a dictionary of dictionaries.
|
|
249
|
+
Args:
|
|
250
|
+
pred_dicts (list): List of prediction dictionaries.
|
|
251
|
+
window_size_s (int, optional): Window size in seconds. Defaults to 1.
|
|
252
|
+
fps (int, optional): Frames per second. Defaults to 50.
|
|
253
|
+
min_seq_len_s (float, optional): Minimum sequence length in seconds. Defaults to 0.5.
|
|
254
|
+
Returns:
|
|
255
|
+
dict: A dictionary containing processed prediction results with the following keys:
|
|
256
|
+
- "predictions": Processed predictions.
|
|
257
|
+
- "smooth_predictions": Smoothed predictions.
|
|
258
|
+
- "binary_predictions": Binary predictions.
|
|
259
|
+
- "raw_sequences": Raw sequences.
|
|
260
|
+
- "filtered_sequences": Filtered sequences.
|
|
261
|
+
"""
|
|
262
|
+
|
|
263
|
+
result = self.post_process_predictions(
|
|
264
|
+
pred_dicts, window_size_s, fps, min_seq_len_s
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
for i, _dict in enumerate(result):
|
|
268
|
+
_keys = list(_dict.keys())
|
|
269
|
+
for key in _keys:
|
|
270
|
+
# if numpy array
|
|
271
|
+
if hasattr(_dict[key], "tolist"):
|
|
272
|
+
result[i][key] = _dict[key].tolist()
|
|
273
|
+
|
|
274
|
+
# check if list of tuples
|
|
275
|
+
# if so, make sure each tuple has 2 elements and split to two lists (start, stop)
|
|
276
|
+
if all(isinstance(x, tuple) for x in _dict[key]):
|
|
277
|
+
if all(len(x) == 2 for x in _dict[key]):
|
|
278
|
+
result[i][f"{key}_start"] = [int(x[0]) for x in _dict[key]]
|
|
279
|
+
result[i][f"{key}_stop"] = [int(x[1]) for x in _dict[key]]
|
|
280
|
+
del result[i][key]
|
|
281
|
+
|
|
282
|
+
# make dict of dicts
|
|
283
|
+
result_dict = {
|
|
284
|
+
"predictions": result[0],
|
|
285
|
+
"smooth_predictions": result[1],
|
|
286
|
+
"binary_predictions": result[2],
|
|
287
|
+
"raw_sequences": result[3],
|
|
288
|
+
"filtered_sequences": result[4],
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return result_dict
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from PIL import Image, ImageOps # Import the required modules from Pillow
|
|
3
|
+
|
|
4
|
+
def crop_img(img, crop):
|
|
5
|
+
"""
|
|
6
|
+
Crops the image based on the specified dimensions and adds padding to maintain aspect ratio.
|
|
7
|
+
|
|
8
|
+
Parameters:
|
|
9
|
+
img: PIL Image object.
|
|
10
|
+
crop: Tuple of (ymin, ymax, xmin, xmax) specifying the crop area.
|
|
11
|
+
|
|
12
|
+
Returns:
|
|
13
|
+
PIL Image object that has been cropped and padded as necessary.
|
|
14
|
+
"""
|
|
15
|
+
# Convert crop dimensions to Pillow format: left, upper, right, lower
|
|
16
|
+
ymin, ymax, xmin, xmax = crop
|
|
17
|
+
img_cropped = img.crop((xmin, ymin, xmax, ymax))
|
|
18
|
+
|
|
19
|
+
# Calculate the new size and the required padding
|
|
20
|
+
width, height = img_cropped.size
|
|
21
|
+
delta = width - height
|
|
22
|
+
|
|
23
|
+
if delta > 0:
|
|
24
|
+
padding = (0, abs(delta) // 2, 0, abs(delta) - abs(delta) // 2) # (left, top, right, bottom)
|
|
25
|
+
elif delta < 0:
|
|
26
|
+
padding = (abs(delta) // 2, 0, abs(delta) - abs(delta) // 2, 0)
|
|
27
|
+
else:
|
|
28
|
+
padding = (0, 0, 0, 0)
|
|
29
|
+
|
|
30
|
+
# Pad the image to make it square
|
|
31
|
+
img_padded = ImageOps.expand(img_cropped, padding)
|
|
32
|
+
|
|
33
|
+
return img_padded
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class Cropper:
|
|
37
|
+
def __init__(self):
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
def __call__(self, img, crop=None, scale=None, scale_method=Image.Resampling.LANCZOS):
|
|
41
|
+
"""
|
|
42
|
+
Applies cropping and scaling transformations to the input image.
|
|
43
|
+
|
|
44
|
+
Parameters:
|
|
45
|
+
img: PIL Image object or numpy array of the image.
|
|
46
|
+
crop: Optional tuple specifying the cropping area (y_min, y_max, x_min, x_max).
|
|
47
|
+
scale: Optional tuple specifying the new size (width, height).
|
|
48
|
+
scale_method: Resampling method used for scaling (default is Image.Resampling.LANCZOS).
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
Numpy array of the processed image.
|
|
52
|
+
"""
|
|
53
|
+
# Convert numpy array to PIL Image if necessary
|
|
54
|
+
if isinstance(img, np.ndarray):
|
|
55
|
+
img = Image.fromarray(img.astype('uint8'), 'RGB')
|
|
56
|
+
|
|
57
|
+
if crop is not None:
|
|
58
|
+
img = crop_img(img, crop)
|
|
59
|
+
else:
|
|
60
|
+
raise Exception("Automatic crop detection not implemented yet")
|
|
61
|
+
|
|
62
|
+
if scale is not None:
|
|
63
|
+
img = img.resize(scale, resample=scale_method)
|
|
64
|
+
|
|
65
|
+
# Convert PIL Image back to numpy array
|
|
66
|
+
img = np.array(img)
|
|
67
|
+
|
|
68
|
+
return img
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
if TYPE_CHECKING:
|
|
4
|
+
from endoreg_db.models import VideoFile
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def _calc_duration_vf(obj:"VideoFile") -> float:
|
|
8
|
+
"""
|
|
9
|
+
Calculate duration of a VideoFile.
|
|
10
|
+
"""
|
|
11
|
+
if not obj.ffmpeg_meta:
|
|
12
|
+
raise ValueError("ffmpeg_meta is missing, cannot calculate duration.")
|
|
13
|
+
|
|
14
|
+
fps = obj.get_fps()
|
|
15
|
+
frame_count = obj.frame_count #TODO similar implementation as in get_fps
|
|
16
|
+
|
|
17
|
+
duration = frame_count / fps if fps > 0 else -1
|
|
18
|
+
if duration > 0:
|
|
19
|
+
return duration
|
|
20
|
+
else:
|
|
21
|
+
raise ValueError(
|
|
22
|
+
f"Invalid duration calculated for video {obj.uuid}: {duration}. "
|
|
23
|
+
"Ensure the video file is valid and accessible."
|
|
24
|
+
)
|
|
File without changes
|