endoreg-db 0.3.4__py3-none-any.whl → 0.3.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- endoreg_db/admin.py +3 -3
- endoreg_db/apps.py +6 -6
- endoreg_db/data/__init__.py +65 -16
- endoreg_db/data/active_model/data.yaml +2 -2
- 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_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 +60 -52
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +6 -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/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope_type/data.yaml +10 -10
- endoreg_db/data/endoscopy_processor/data.yaml +45 -45
- endoreg_db/data/event/cardiology.yaml +28 -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 +65 -16
- endoreg_db/data/examination/time/data.yaml +47 -47
- endoreg_db/data/examination/time-type/data.yaml +7 -7
- endoreg_db/data/examination/type/data.yaml +5 -5
- endoreg_db/data/gender/data.yaml +18 -0
- endoreg_db/data/information_source/data.yaml +30 -30
- endoreg_db/data/information_source/medication.yaml +6 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +31 -0
- endoreg_db/data/lab_value/coagulation.yaml +49 -0
- endoreg_db/data/lab_value/electrolytes.yaml +190 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +121 -0
- endoreg_db/data/lab_value/hematology.yaml +169 -0
- endoreg_db/data/lab_value/hormones.yaml +53 -0
- endoreg_db/data/lab_value/lipids.yaml +44 -0
- endoreg_db/data/lab_value/misc.yaml +30 -0
- endoreg_db/data/lab_value/renal_function.yaml +11 -0
- endoreg_db/data/label/label/data.yaml +62 -62
- endoreg_db/data/label/label-set/data.yaml +17 -17
- endoreg_db/data/label/label-type/data.yaml +6 -6
- 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 +120 -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/model_type/data.yaml +6 -6
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/pdf_type/data.yaml +28 -28
- 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 -70
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +26 -26
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -19
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -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 +92 -0
- endoreg_db/data/unit/data.yaml +17 -17
- endoreg_db/data/unit/length.yaml +30 -30
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +13 -0
- endoreg_db/data/unit/volume.yaml +35 -26
- endoreg_db/data/unit/weight.yaml +37 -30
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/forms/__init__.py +2 -2
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
- endoreg_db/forms/settings/__init__.py +8 -8
- endoreg_db/forms/unit.py +5 -5
- endoreg_db/management/commands/_load_model_template.py +40 -40
- endoreg_db/management/commands/delete_all.py +18 -18
- endoreg_db/management/commands/delete_legacy_images.py +19 -19
- endoreg_db/management/commands/delete_legacy_videos.py +16 -16
- endoreg_db/management/commands/extract_legacy_video_frames.py +18 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -32
- endoreg_db/management/commands/fix_auth_permission.py +20 -20
- endoreg_db/management/commands/import_legacy_images.py +94 -94
- endoreg_db/management/commands/import_legacy_videos.py +76 -76
- endoreg_db/management/commands/load_active_model_data.py +44 -44
- endoreg_db/management/commands/load_ai_model_data.py +44 -44
- endoreg_db/management/commands/load_base_db_data.py +128 -71
- endoreg_db/management/commands/load_center_data.py +42 -42
- 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 +40 -0
- endoreg_db/management/commands/load_distribution_data.py +66 -0
- endoreg_db/management/commands/load_endoscope_type_data.py +44 -44
- endoreg_db/management/commands/load_endoscopy_processor_data.py +44 -44
- endoreg_db/management/commands/load_event_data.py +41 -0
- endoreg_db/management/commands/load_examination_data.py +74 -74
- endoreg_db/management/commands/load_g_play_data.py +113 -0
- endoreg_db/management/commands/load_gender_data.py +44 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +133 -0
- endoreg_db/management/commands/load_information_source.py +44 -44
- endoreg_db/management/commands/load_lab_value_data.py +50 -0
- endoreg_db/management/commands/load_label_data.py +66 -66
- endoreg_db/management/commands/load_medication_data.py +41 -0
- endoreg_db/management/commands/load_medication_indication_data.py +63 -0
- endoreg_db/management/commands/load_medication_indication_type_data.py +41 -0
- endoreg_db/management/commands/load_medication_intake_time_data.py +41 -0
- endoreg_db/management/commands/load_medication_schedule_data.py +55 -0
- endoreg_db/management/commands/load_pdf_type_data.py +60 -60
- endoreg_db/management/commands/load_profession_data.py +43 -43
- endoreg_db/management/commands/load_report_reader_flag.py +45 -45
- endoreg_db/management/commands/load_unit_data.py +45 -45
- endoreg_db/management/commands/load_user_groups.py +28 -28
- endoreg_db/management/commands/register_ai_model.py +65 -65
- endoreg_db/management/commands/reset_celery_schedule.py +9 -9
- endoreg_db/migrations/0001_initial.py +582 -582
- endoreg_db/migrations/0002_rawvideofile.py +26 -26
- endoreg_db/migrations/0003_rawvideofile_frames_required.py +18 -18
- endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +18 -18
- endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +56 -56
- endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +25 -25
- endoreg_db/migrations/0007_rawvideofile_processor.py +19 -19
- endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +18 -18
- endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +31 -31
- endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +18 -18
- endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +18 -18
- endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +109 -109
- endoreg_db/migrations/0013_rawpdffile.py +31 -31
- endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +38 -38
- endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +31 -31
- endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +18 -18
- endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +37 -37
- endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +37 -37
- endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +42 -42
- endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +18 -18
- endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +19 -19
- endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +19 -19
- endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +59 -59
- endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +27 -27
- endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +42 -0
- endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +166 -0
- endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +38 -0
- endoreg_db/migrations/0028_alter_unit_abbreviation.py +18 -0
- endoreg_db/migrations/0029_medicationintaketime_and_more.py +75 -0
- endoreg_db/migrations/0030_medicationindicationtype_and_more.py +101 -0
- endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +38 -0
- endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +18 -0
- endoreg_db/migrations/0033_medicationindication_sources.py +18 -0
- endoreg_db/migrations/0034_alter_rawpdffile_file.py +20 -0
- endoreg_db/migrations/0035_alter_medicationindication_sources.py +18 -0
- endoreg_db/migrations/0036_alter_rawpdffile_file.py +20 -0
- endoreg_db/migrations/0037_alter_medicationindication_sources.py +18 -0
- endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +164 -0
- endoreg_db/migrations/0039_referenceproduct_name.py +19 -0
- endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +50 -0
- endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +40 -0
- endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +74 -0
- endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +23 -0
- endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +23 -0
- endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +19 -0
- endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +18 -0
- endoreg_db/migrations/0047_casetemplaterule_target_model.py +18 -0
- endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +22 -0
- endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +17 -0
- endoreg_db/migrations/0050_casetemplaterule_rule_values.py +18 -0
- endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +27 -0
- endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +18 -0
- endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +38 -0
- endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +69 -0
- endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +59 -0
- endoreg_db/migrations/0056_datevaluedistribution_and_more.py +32 -0
- endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +72 -0
- endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +28 -0
- endoreg_db/migrations/0059_casetemplaterule_rule_values.py +18 -0
- endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +44 -0
- endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +24 -0
- endoreg_db/migrations/0062_labvalue_numeric_precision.py +18 -0
- endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +18 -0
- endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +23 -0
- endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +58 -0
- endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +29 -0
- endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +19 -0
- endoreg_db/models/__init__.py +74 -57
- endoreg_db/models/ai_model/__init__.py +3 -3
- endoreg_db/models/ai_model/active_model.py +9 -9
- endoreg_db/models/ai_model/model_meta.py +24 -24
- endoreg_db/models/ai_model/model_type.py +25 -25
- endoreg_db/models/ai_model/utils.py +8 -8
- endoreg_db/models/annotation/__init__.py +1 -1
- endoreg_db/models/annotation/binary_classification_annotation_task.py +80 -80
- endoreg_db/models/annotation/image_classification.py +26 -26
- endoreg_db/models/case_template/__init__.py +6 -0
- endoreg_db/models/case_template/case_template.py +81 -0
- endoreg_db/models/case_template/case_template_rule.py +276 -0
- endoreg_db/models/case_template/case_template_rule_value.py +73 -0
- endoreg_db/models/case_template/case_template_type.py +28 -0
- endoreg_db/models/center/__init__.py +4 -0
- endoreg_db/models/{center.py → center/center.py} +24 -24
- endoreg_db/models/center/center_product.py +34 -0
- endoreg_db/models/center/center_resource.py +19 -0
- endoreg_db/models/center/center_waste.py +11 -0
- endoreg_db/models/data_file/__init__.py +5 -5
- endoreg_db/models/data_file/base_classes/__init__.py +2 -2
- endoreg_db/models/data_file/base_classes/abstract_frame.py +50 -50
- endoreg_db/models/data_file/base_classes/abstract_video.py +200 -200
- endoreg_db/models/data_file/frame.py +45 -45
- endoreg_db/models/data_file/import_classes/__init__.py +31 -31
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +34 -34
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +188 -185
- endoreg_db/models/data_file/import_classes/raw_video.py +343 -343
- endoreg_db/models/data_file/metadata/__init__.py +3 -3
- endoreg_db/models/data_file/metadata/pdf_meta.py +70 -70
- endoreg_db/models/data_file/metadata/sensitive_meta.py +31 -31
- endoreg_db/models/data_file/metadata/video_meta.py +132 -131
- endoreg_db/models/data_file/report_file.py +89 -89
- endoreg_db/models/data_file/video/__init__.py +6 -6
- endoreg_db/models/data_file/video/import_meta.py +25 -25
- endoreg_db/models/data_file/video/video.py +25 -25
- endoreg_db/models/data_file/video_segment.py +107 -107
- endoreg_db/models/disease.py +56 -0
- endoreg_db/models/emission/__init__.py +1 -0
- endoreg_db/models/emission/emission_factor.py +20 -0
- endoreg_db/models/event.py +22 -0
- endoreg_db/models/examination/__init__.py +3 -3
- endoreg_db/models/examination/examination.py +26 -26
- endoreg_db/models/examination/examination_time.py +27 -27
- endoreg_db/models/examination/examination_time_type.py +24 -24
- endoreg_db/models/examination/examination_type.py +18 -18
- endoreg_db/models/hardware/__init__.py +1 -1
- endoreg_db/models/hardware/endoscope.py +44 -44
- endoreg_db/models/hardware/endoscopy_processor.py +143 -143
- endoreg_db/models/information_source.py +29 -22
- endoreg_db/models/label/label.py +84 -84
- endoreg_db/models/laboratory/__init__.py +1 -0
- endoreg_db/models/laboratory/lab_value.py +102 -0
- endoreg_db/models/legacy_data/__init__.py +3 -3
- endoreg_db/models/legacy_data/image.py +34 -34
- endoreg_db/models/medication/__init__.py +1 -0
- endoreg_db/models/medication/medication.py +148 -0
- endoreg_db/models/other/__init__.py +5 -0
- endoreg_db/models/other/distribution.py +215 -0
- endoreg_db/models/other/material.py +16 -0
- endoreg_db/models/other/resource.py +18 -0
- endoreg_db/models/other/transport_route.py +21 -0
- endoreg_db/models/other/waste.py +20 -0
- endoreg_db/models/patient_examination/__init__.py +35 -35
- endoreg_db/models/permissions/__init__.py +44 -44
- endoreg_db/models/persons/__init__.py +7 -6
- endoreg_db/models/persons/examiner/__init__.py +1 -1
- endoreg_db/models/persons/examiner/examiner.py +15 -15
- endoreg_db/models/persons/examiner/examiner_type.py +1 -1
- endoreg_db/models/persons/first_name.py +17 -17
- endoreg_db/models/persons/gender.py +22 -0
- endoreg_db/models/persons/last_name.py +19 -19
- endoreg_db/models/persons/patient/__init__.py +8 -0
- endoreg_db/models/persons/patient/case/__init__.py +0 -0
- endoreg_db/models/persons/patient/case/case.py +30 -0
- endoreg_db/models/persons/patient/patient.py +216 -0
- endoreg_db/models/persons/patient/patient_disease.py +16 -0
- endoreg_db/models/persons/patient/patient_event.py +22 -0
- endoreg_db/models/persons/patient/patient_lab_sample.py +106 -0
- endoreg_db/models/persons/patient/patient_lab_value.py +176 -0
- endoreg_db/models/persons/patient/patient_medication.py +44 -0
- endoreg_db/models/persons/patient/patient_medication_schedule.py +28 -0
- endoreg_db/models/persons/person.py +31 -34
- endoreg_db/models/persons/portal_user_information.py +27 -29
- endoreg_db/models/prediction/__init__.py +1 -1
- endoreg_db/models/prediction/image_classification.py +37 -37
- endoreg_db/models/prediction/video_prediction_meta.py +244 -244
- endoreg_db/models/product/__init__.py +5 -0
- endoreg_db/models/product/product.py +97 -0
- endoreg_db/models/product/product_group.py +19 -0
- endoreg_db/models/product/product_material.py +24 -0
- endoreg_db/models/product/product_weight.py +26 -0
- endoreg_db/models/product/reference_product.py +99 -0
- endoreg_db/models/questionnaires/__init__.py +114 -114
- endoreg_db/models/quiz/__init__.py +2 -0
- endoreg_db/models/quiz/quiz_answer.py +41 -0
- endoreg_db/models/quiz/quiz_question.py +54 -0
- endoreg_db/models/report_reader/__init__.py +1 -1
- endoreg_db/models/report_reader/report_reader_config.py +53 -53
- endoreg_db/models/report_reader/report_reader_flag.py +19 -19
- endoreg_db/models/rules/__init__.py +5 -0
- endoreg_db/models/rules/rule.py +24 -0
- endoreg_db/models/rules/rule_applicator.py +224 -0
- endoreg_db/models/rules/rule_attribute_dtype.py +19 -0
- endoreg_db/models/rules/rule_type.py +22 -0
- endoreg_db/models/rules/ruleset.py +19 -0
- endoreg_db/models/unit.py +21 -19
- endoreg_db/queries/__init__.py +4 -4
- endoreg_db/queries/annotations/__init__.py +2 -2
- endoreg_db/queries/annotations/legacy.py +159 -159
- endoreg_db/queries/get/__init__.py +5 -5
- endoreg_db/queries/get/center.py +42 -42
- endoreg_db/queries/get/model.py +13 -13
- endoreg_db/queries/get/patient.py +14 -14
- endoreg_db/queries/get/patient_examination.py +20 -20
- endoreg_db/queries/get/report_file.py +33 -33
- endoreg_db/queries/get/video.py +31 -31
- endoreg_db/serializers/__init__.py +9 -9
- endoreg_db/serializers/ai_model.py +18 -18
- endoreg_db/serializers/annotation.py +17 -17
- endoreg_db/serializers/center.py +11 -11
- endoreg_db/serializers/examination.py +32 -32
- endoreg_db/serializers/frame.py +13 -13
- endoreg_db/serializers/hardware.py +20 -20
- endoreg_db/serializers/label.py +22 -22
- endoreg_db/serializers/patient.py +10 -10
- endoreg_db/serializers/prediction.py +15 -15
- endoreg_db/serializers/report_file.py +7 -7
- endoreg_db/serializers/video.py +27 -27
- endoreg_db/tests.py +3 -3
- endoreg_db/utils/cropping.py +28 -28
- endoreg_db/utils/dataloader.py +92 -185
- endoreg_db/utils/file_operations.py +30 -30
- endoreg_db/utils/hashs.py +33 -33
- endoreg_db/utils/legacy_ocr.py +201 -201
- endoreg_db/utils/ocr.py +197 -197
- endoreg_db/utils/uuid.py +4 -4
- endoreg_db/utils/video_metadata.py +87 -87
- endoreg_db/views.py +3 -3
- {endoreg_db-0.3.4.dist-info → endoreg_db-0.3.6.dist-info}/LICENSE +674 -674
- {endoreg_db-0.3.4.dist-info → endoreg_db-0.3.6.dist-info}/METADATA +2 -2
- endoreg_db-0.3.6.dist-info/RECORD +357 -0
- {endoreg_db-0.3.4.dist-info → endoreg_db-0.3.6.dist-info}/WHEEL +1 -1
- endoreg_db/models/persons/patient.py +0 -58
- endoreg_db/models.py +0 -3
- endoreg_db-0.3.4.dist-info/RECORD +0 -185
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Generated by Django 5.0.4 on 2024-06-18 19:07
|
|
2
|
+
|
|
3
|
+
import datetime
|
|
4
|
+
from django.db import migrations, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
('endoreg_db', '0060_labvalue__default_date_value_distribution_and_more'),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.RemoveField(
|
|
15
|
+
model_name='patientlabvalue',
|
|
16
|
+
name='date',
|
|
17
|
+
),
|
|
18
|
+
migrations.AddField(
|
|
19
|
+
model_name='patientlabvalue',
|
|
20
|
+
name='datetime',
|
|
21
|
+
field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2024, 6, 18, 19, 7, 56, 929033, tzinfo=datetime.timezone.utc)),
|
|
22
|
+
preserve_default=False,
|
|
23
|
+
),
|
|
24
|
+
]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Generated by Django 5.0.4 on 2024-06-20 17:37
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
('endoreg_db', '0061_remove_patientlabvalue_date_patientlabvalue_datetime'),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.AddField(
|
|
14
|
+
model_name='labvalue',
|
|
15
|
+
name='numeric_precision',
|
|
16
|
+
field=models.CharField(default='.2f', max_length=5),
|
|
17
|
+
),
|
|
18
|
+
]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Generated by Django 5.0.4 on 2024-06-20 17:44
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
('endoreg_db', '0062_labvalue_numeric_precision'),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.AlterField(
|
|
14
|
+
model_name='labvalue',
|
|
15
|
+
name='numeric_precision',
|
|
16
|
+
field=models.IntegerField(default=3),
|
|
17
|
+
),
|
|
18
|
+
]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Generated by Django 5.0.4 on 2024-06-24 09:10
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
('endoreg_db', '0063_alter_labvalue_numeric_precision'),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.AddField(
|
|
14
|
+
model_name='casetemplaterule',
|
|
15
|
+
name='extra_parameters',
|
|
16
|
+
field=models.JSONField(blank=True, null=True),
|
|
17
|
+
),
|
|
18
|
+
migrations.AddField(
|
|
19
|
+
model_name='casetemplaterule',
|
|
20
|
+
name='parent_field',
|
|
21
|
+
field=models.CharField(blank=True, max_length=255, null=True),
|
|
22
|
+
),
|
|
23
|
+
]
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Generated by Django 5.0.4 on 2024-06-24 10:27
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
('endoreg_db', '0064_casetemplaterule_extra_parameters_and_more'),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.RenameField(
|
|
14
|
+
model_name='casetemplaterule',
|
|
15
|
+
old_name='_date_value_distribution',
|
|
16
|
+
new_name='date_value_distribution',
|
|
17
|
+
),
|
|
18
|
+
migrations.RenameField(
|
|
19
|
+
model_name='casetemplaterule',
|
|
20
|
+
old_name='_multiple_categorical_value_distribution',
|
|
21
|
+
new_name='multiple_categorical_value_distribution',
|
|
22
|
+
),
|
|
23
|
+
migrations.RenameField(
|
|
24
|
+
model_name='casetemplaterule',
|
|
25
|
+
old_name='_numerical_value_distribution',
|
|
26
|
+
new_name='numerical_value_distribution',
|
|
27
|
+
),
|
|
28
|
+
migrations.RenameField(
|
|
29
|
+
model_name='casetemplaterule',
|
|
30
|
+
old_name='_single_categorical_value_distribution',
|
|
31
|
+
new_name='single_categorical_value_distribution',
|
|
32
|
+
),
|
|
33
|
+
migrations.RenameField(
|
|
34
|
+
model_name='labvalue',
|
|
35
|
+
old_name='_default_date_value_distribution',
|
|
36
|
+
new_name='default_date_value_distribution',
|
|
37
|
+
),
|
|
38
|
+
migrations.RenameField(
|
|
39
|
+
model_name='labvalue',
|
|
40
|
+
old_name='_default_multiple_categorical_value_distribution',
|
|
41
|
+
new_name='default_multiple_categorical_value_distribution',
|
|
42
|
+
),
|
|
43
|
+
migrations.RenameField(
|
|
44
|
+
model_name='labvalue',
|
|
45
|
+
old_name='_default_numerical_value_distribution',
|
|
46
|
+
new_name='default_numerical_value_distribution',
|
|
47
|
+
),
|
|
48
|
+
migrations.RenameField(
|
|
49
|
+
model_name='labvalue',
|
|
50
|
+
old_name='_default_single_categorical_value_distribution',
|
|
51
|
+
new_name='default_single_categorical_value_distribution',
|
|
52
|
+
),
|
|
53
|
+
migrations.AlterField(
|
|
54
|
+
model_name='casetemplate',
|
|
55
|
+
name='name',
|
|
56
|
+
field=models.CharField(max_length=255, unique=True),
|
|
57
|
+
),
|
|
58
|
+
]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Generated by Django 5.0.4 on 2024-06-24 15:36
|
|
2
|
+
|
|
3
|
+
import django.db.models.deletion
|
|
4
|
+
from django.db import migrations, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
('endoreg_db', '0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more'),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.AlterField(
|
|
15
|
+
model_name='patientlabvalue',
|
|
16
|
+
name='patient',
|
|
17
|
+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='lab_values', to='endoreg_db.patient'),
|
|
18
|
+
),
|
|
19
|
+
migrations.CreateModel(
|
|
20
|
+
name='PatientMedicationSchedule',
|
|
21
|
+
fields=[
|
|
22
|
+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
23
|
+
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
24
|
+
('updated_at', models.DateTimeField(auto_now=True)),
|
|
25
|
+
('medication', models.ManyToManyField(related_name='patient_medication_schedules', to='endoreg_db.patientmedication')),
|
|
26
|
+
('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patient')),
|
|
27
|
+
],
|
|
28
|
+
),
|
|
29
|
+
]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Generated by Django 5.0.4 on 2024-06-24 15:49
|
|
2
|
+
|
|
3
|
+
import django.db.models.deletion
|
|
4
|
+
from django.db import migrations, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
('endoreg_db', '0066_alter_patientlabvalue_patient_and_more'),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.AlterField(
|
|
15
|
+
model_name='medicationindication',
|
|
16
|
+
name='indication_type',
|
|
17
|
+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='medication_indications', to='endoreg_db.medicationindicationtype'),
|
|
18
|
+
),
|
|
19
|
+
]
|
endoreg_db/models/__init__.py
CHANGED
|
@@ -1,57 +1,74 @@
|
|
|
1
|
-
from .unit import Unit
|
|
2
|
-
from .information_source import InformationSource
|
|
3
|
-
from .center import
|
|
4
|
-
from .report_reader import ReportReaderConfig, ReportReaderFlag
|
|
5
|
-
from .
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
from .
|
|
24
|
-
|
|
25
|
-
from .
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
1
|
+
from .unit import Unit
|
|
2
|
+
from .information_source import InformationSource
|
|
3
|
+
from .center import *
|
|
4
|
+
from .report_reader import ReportReaderConfig, ReportReaderFlag
|
|
5
|
+
from .emission import *
|
|
6
|
+
from .persons import *
|
|
7
|
+
|
|
8
|
+
from .case_template import *
|
|
9
|
+
# from .other.distribution import (
|
|
10
|
+
# SingleCategoricalValueDistribution,
|
|
11
|
+
# NumericValueDistribution,
|
|
12
|
+
# MultipleCategoricalValueDistribution,
|
|
13
|
+
# DateValueDistribution,
|
|
14
|
+
# )
|
|
15
|
+
from .rules import (
|
|
16
|
+
Rule,
|
|
17
|
+
RuleType,
|
|
18
|
+
Ruleset,
|
|
19
|
+
RuleApplicator,
|
|
20
|
+
Rule
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
from .disease import Disease, DiseaseClassification, DiseaseClassificationChoice
|
|
24
|
+
from .event import Event
|
|
25
|
+
from .laboratory import LabValue
|
|
26
|
+
from .medication import *
|
|
27
|
+
|
|
28
|
+
from .examination import (
|
|
29
|
+
Examination,
|
|
30
|
+
ExaminationType,
|
|
31
|
+
ExaminationTime,
|
|
32
|
+
ExaminationTimeType,
|
|
33
|
+
)
|
|
34
|
+
from .data_file import *
|
|
35
|
+
|
|
36
|
+
from .patient_examination import PatientExamination
|
|
37
|
+
|
|
38
|
+
from .label import Label, LabelType, LabelSet
|
|
39
|
+
|
|
40
|
+
from .annotation import (
|
|
41
|
+
ImageClassificationAnnotation,
|
|
42
|
+
LegacyBinaryClassificationAnnotationTask,
|
|
43
|
+
BinaryClassificationAnnotationTask,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
from .legacy_data import (
|
|
47
|
+
LegacyImage,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
from .other import *
|
|
51
|
+
|
|
52
|
+
from .product import *
|
|
53
|
+
|
|
54
|
+
from .ai_model import (
|
|
55
|
+
ModelMeta,
|
|
56
|
+
ModelType,
|
|
57
|
+
ActiveModel,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
from .quiz import *
|
|
61
|
+
|
|
62
|
+
from .prediction import (
|
|
63
|
+
ImageClassificationPrediction,
|
|
64
|
+
LegacyVideoPredictionMeta,
|
|
65
|
+
VideoPredictionMeta,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
from .hardware import (
|
|
69
|
+
EndoscopyProcessor,
|
|
70
|
+
Endoscope,
|
|
71
|
+
EndoscopeType,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
from .questionnaires import TtoQuestionnaire
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
from .model_meta import ModelMeta
|
|
2
|
-
from .model_type import ModelType
|
|
3
|
-
from .active_model import ActiveModel
|
|
1
|
+
from .model_meta import ModelMeta
|
|
2
|
+
from .model_type import ModelType
|
|
3
|
+
from .active_model import ActiveModel
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
|
|
3
|
-
class ActiveModelManager(models.Manager):
|
|
4
|
-
def get_by_natural_key(self, name):
|
|
5
|
-
return self.get(name=name)
|
|
6
|
-
|
|
7
|
-
class ActiveModel(models.Model):
|
|
8
|
-
name = models.CharField(max_length=255, unique=True)
|
|
9
|
-
model_meta = models.OneToOneField('ModelMeta', on_delete=models.SET_NULL, blank=True, null=True)
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class ActiveModelManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class ActiveModel(models.Model):
|
|
8
|
+
name = models.CharField(max_length=255, unique=True)
|
|
9
|
+
model_meta = models.OneToOneField('ModelMeta', on_delete=models.SET_NULL, blank=True, null=True)
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
|
|
3
|
-
class ModelMetaManager(models.Manager):
|
|
4
|
-
# natural key is name and version
|
|
5
|
-
def get_by_natural_key(self, name, version):
|
|
6
|
-
return self.get(name=name, version=version)
|
|
7
|
-
|
|
8
|
-
class ModelMeta(models.Model):
|
|
9
|
-
name = models.CharField(max_length=255)
|
|
10
|
-
version = models.CharField(max_length=255)
|
|
11
|
-
type = models.ForeignKey("ModelType", on_delete=models.CASCADE, related_name="models")
|
|
12
|
-
labelset = models.ForeignKey("LabelSet", on_delete=models.CASCADE, related_name="models")
|
|
13
|
-
weights = models.FileField(upload_to='weights/')
|
|
14
|
-
|
|
15
|
-
description = models.TextField(blank=True, null=True)
|
|
16
|
-
date_created = models.DateTimeField(auto_now_add=True)
|
|
17
|
-
objects = ModelMetaManager()
|
|
18
|
-
|
|
19
|
-
def natural_key(self):
|
|
20
|
-
return (self.name, self.version)
|
|
21
|
-
|
|
22
|
-
def __str__(self):
|
|
23
|
-
return f"{self.name} (v: {self.version})"
|
|
24
|
-
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class ModelMetaManager(models.Manager):
|
|
4
|
+
# natural key is name and version
|
|
5
|
+
def get_by_natural_key(self, name, version):
|
|
6
|
+
return self.get(name=name, version=version)
|
|
7
|
+
|
|
8
|
+
class ModelMeta(models.Model):
|
|
9
|
+
name = models.CharField(max_length=255)
|
|
10
|
+
version = models.CharField(max_length=255)
|
|
11
|
+
type = models.ForeignKey("ModelType", on_delete=models.CASCADE, related_name="models")
|
|
12
|
+
labelset = models.ForeignKey("LabelSet", on_delete=models.CASCADE, related_name="models")
|
|
13
|
+
weights = models.FileField(upload_to='weights/')
|
|
14
|
+
|
|
15
|
+
description = models.TextField(blank=True, null=True)
|
|
16
|
+
date_created = models.DateTimeField(auto_now_add=True)
|
|
17
|
+
objects = ModelMetaManager()
|
|
18
|
+
|
|
19
|
+
def natural_key(self):
|
|
20
|
+
return (self.name, self.version)
|
|
21
|
+
|
|
22
|
+
def __str__(self):
|
|
23
|
+
return f"{self.name} (v: {self.version})"
|
|
24
|
+
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
from django.core import serializers
|
|
3
|
-
|
|
4
|
-
class ModelTypeManager(models.Manager):
|
|
5
|
-
def get_by_natural_key(self, name):
|
|
6
|
-
return self.get(name=name)
|
|
7
|
-
|
|
8
|
-
class ModelType(models.Model):
|
|
9
|
-
"""
|
|
10
|
-
A class representing a model type.
|
|
11
|
-
|
|
12
|
-
Attributes:
|
|
13
|
-
name (str): The name of the model type.
|
|
14
|
-
description (str): A description of the model type.
|
|
15
|
-
|
|
16
|
-
"""
|
|
17
|
-
name = models.CharField(max_length=255)
|
|
18
|
-
description = models.TextField(blank=True, null=True)
|
|
19
|
-
|
|
20
|
-
objects = ModelTypeManager()
|
|
21
|
-
|
|
22
|
-
def natural_key(self):
|
|
23
|
-
return (self.name,)
|
|
24
|
-
|
|
25
|
-
def __str__(self):
|
|
1
|
+
from django.db import models
|
|
2
|
+
from django.core import serializers
|
|
3
|
+
|
|
4
|
+
class ModelTypeManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
class ModelType(models.Model):
|
|
9
|
+
"""
|
|
10
|
+
A class representing a model type.
|
|
11
|
+
|
|
12
|
+
Attributes:
|
|
13
|
+
name (str): The name of the model type.
|
|
14
|
+
description (str): A description of the model type.
|
|
15
|
+
|
|
16
|
+
"""
|
|
17
|
+
name = models.CharField(max_length=255)
|
|
18
|
+
description = models.TextField(blank=True, null=True)
|
|
19
|
+
|
|
20
|
+
objects = ModelTypeManager()
|
|
21
|
+
|
|
22
|
+
def natural_key(self):
|
|
23
|
+
return (self.name,)
|
|
24
|
+
|
|
25
|
+
def __str__(self):
|
|
26
26
|
return self.name
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
from .model_meta import ModelMeta
|
|
2
|
-
|
|
3
|
-
# get latest model meta by model name
|
|
4
|
-
|
|
5
|
-
# TODO MOVE THIS TO A QUERY FILE
|
|
6
|
-
def get_latest_model_meta_by_model_name(model_name):
|
|
7
|
-
model_meta = ModelMeta.objects.filter(name=model_name).order_by('-version').first()
|
|
8
|
-
return model_meta
|
|
1
|
+
from .model_meta import ModelMeta
|
|
2
|
+
|
|
3
|
+
# get latest model meta by model name
|
|
4
|
+
|
|
5
|
+
# TODO MOVE THIS TO A QUERY FILE
|
|
6
|
+
def get_latest_model_meta_by_model_name(model_name):
|
|
7
|
+
model_meta = ModelMeta.objects.filter(name=model_name).order_by('-version').first()
|
|
8
|
+
return model_meta
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
from .image_classification import ImageClassificationAnnotation
|
|
1
|
+
from .image_classification import ImageClassificationAnnotation
|
|
2
2
|
from .binary_classification_annotation_task import LegacyBinaryClassificationAnnotationTask, BinaryClassificationAnnotationTask
|
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
from rest_framework import serializers
|
|
3
|
-
from ..label import Label
|
|
4
|
-
from ..data_file.video_segment import LegacyLabelVideoSegment
|
|
5
|
-
from .image_classification import ImageClassificationAnnotation
|
|
6
|
-
|
|
7
|
-
ANNOTATION_PER_S_THRESHOLD = 2
|
|
8
|
-
|
|
9
|
-
def clear_finished_legacy_tasks():
|
|
10
|
-
# fetch all BinaryClassificationAnnotationTasks that are finished and delete them
|
|
11
|
-
tasks = LegacyBinaryClassificationAnnotationTask.objects.filter(finished=True)
|
|
12
|
-
|
|
13
|
-
# delete tasks with a bulk operation
|
|
14
|
-
tasks.delete()
|
|
15
|
-
|
|
16
|
-
def get_legacy_binary_classification_annotation_tasks_by_label(label:Label, n:int=100, legacy=False):
|
|
17
|
-
clear_finished_legacy_tasks()
|
|
18
|
-
|
|
19
|
-
if legacy:
|
|
20
|
-
# fetch all LegacyLabelVideoSegments with the given label
|
|
21
|
-
_segments = LegacyLabelVideoSegment.objects.filter(label=label)
|
|
22
|
-
frames_for_tasks = []
|
|
23
|
-
|
|
24
|
-
for segment in _segments:
|
|
25
|
-
# check if the segment has already been annotated
|
|
26
|
-
annotations = list(ImageClassificationAnnotation.objects.filter(legacy_frame__in=segment.get_frames(), label=label))
|
|
27
|
-
segment_len_in_s = segment.get_segment_len_in_s()
|
|
28
|
-
|
|
29
|
-
target_annotation_number = segment_len_in_s * ANNOTATION_PER_S_THRESHOLD
|
|
30
|
-
|
|
31
|
-
if len(annotations) < target_annotation_number:
|
|
32
|
-
get_frame_number = int(target_annotation_number - len(annotations))
|
|
33
|
-
frames = segment.get_frames_without_annotation(get_frame_number)
|
|
34
|
-
frames_for_tasks.extend(frames)
|
|
35
|
-
|
|
36
|
-
if len(frames_for_tasks) >= n:
|
|
37
|
-
break
|
|
38
|
-
|
|
39
|
-
# create tasks
|
|
40
|
-
tasks = []
|
|
41
|
-
for frame in frames_for_tasks:
|
|
42
|
-
|
|
43
|
-
# get_or_create task
|
|
44
|
-
task, created = LegacyBinaryClassificationAnnotationTask.objects.get_or_create(
|
|
45
|
-
label=label,
|
|
46
|
-
image_path=frame.image.path,
|
|
47
|
-
frame_id=frame.pk,
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
class AbstractBinaryClassificationAnnotationTask(models.Model):
|
|
52
|
-
label = models.ForeignKey("Label", on_delete=models.CASCADE)
|
|
53
|
-
is_finished = models.BooleanField(default=False)
|
|
54
|
-
date_created = models.DateTimeField(auto_now_add=True)
|
|
55
|
-
date_finished = models.DateTimeField(blank=True, null=True)
|
|
56
|
-
image_path = models.CharField(max_length=255, blank=True, null=True)
|
|
57
|
-
image_type = models.CharField(max_length=255, blank=True, null=True)
|
|
58
|
-
frame_id = models.IntegerField(blank=True, null=True)
|
|
59
|
-
labelstudio_project_id = models.IntegerField(blank=True, null=True)
|
|
60
|
-
labelstudio_task_id = models.IntegerField(blank=True, null=True)
|
|
61
|
-
|
|
62
|
-
class Meta:
|
|
63
|
-
abstract = True
|
|
64
|
-
|
|
65
|
-
class BinaryClassificationAnnotationTask(AbstractBinaryClassificationAnnotationTask):
|
|
66
|
-
frame = models.ForeignKey("Frame", on_delete=models.CASCADE, related_name="binary_classification_annotation_tasks")
|
|
67
|
-
image_type = models.CharField(max_length=255, default="frame")
|
|
68
|
-
|
|
69
|
-
def get_frame(self):
|
|
70
|
-
return self.video_segment.get_frame_by_id(self.frame_id)
|
|
71
|
-
|
|
72
|
-
class LegacyBinaryClassificationAnnotationTask(AbstractBinaryClassificationAnnotationTask):
|
|
73
|
-
frame = models.ForeignKey("LegacyFrame", on_delete=models.CASCADE, related_name="binary_classification_annotation_tasks")
|
|
74
|
-
image_type = models.CharField(max_length=255, default="legacy")
|
|
75
|
-
|
|
76
|
-
def get_frame(self):
|
|
77
|
-
return self.frame
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
1
|
+
from django.db import models
|
|
2
|
+
from rest_framework import serializers
|
|
3
|
+
from ..label import Label
|
|
4
|
+
from ..data_file.video_segment import LegacyLabelVideoSegment
|
|
5
|
+
from .image_classification import ImageClassificationAnnotation
|
|
6
|
+
|
|
7
|
+
ANNOTATION_PER_S_THRESHOLD = 2
|
|
8
|
+
|
|
9
|
+
def clear_finished_legacy_tasks():
|
|
10
|
+
# fetch all BinaryClassificationAnnotationTasks that are finished and delete them
|
|
11
|
+
tasks = LegacyBinaryClassificationAnnotationTask.objects.filter(finished=True)
|
|
12
|
+
|
|
13
|
+
# delete tasks with a bulk operation
|
|
14
|
+
tasks.delete()
|
|
15
|
+
|
|
16
|
+
def get_legacy_binary_classification_annotation_tasks_by_label(label:Label, n:int=100, legacy=False):
|
|
17
|
+
clear_finished_legacy_tasks()
|
|
18
|
+
|
|
19
|
+
if legacy:
|
|
20
|
+
# fetch all LegacyLabelVideoSegments with the given label
|
|
21
|
+
_segments = LegacyLabelVideoSegment.objects.filter(label=label)
|
|
22
|
+
frames_for_tasks = []
|
|
23
|
+
|
|
24
|
+
for segment in _segments:
|
|
25
|
+
# check if the segment has already been annotated
|
|
26
|
+
annotations = list(ImageClassificationAnnotation.objects.filter(legacy_frame__in=segment.get_frames(), label=label))
|
|
27
|
+
segment_len_in_s = segment.get_segment_len_in_s()
|
|
28
|
+
|
|
29
|
+
target_annotation_number = segment_len_in_s * ANNOTATION_PER_S_THRESHOLD
|
|
30
|
+
|
|
31
|
+
if len(annotations) < target_annotation_number:
|
|
32
|
+
get_frame_number = int(target_annotation_number - len(annotations))
|
|
33
|
+
frames = segment.get_frames_without_annotation(get_frame_number)
|
|
34
|
+
frames_for_tasks.extend(frames)
|
|
35
|
+
|
|
36
|
+
if len(frames_for_tasks) >= n:
|
|
37
|
+
break
|
|
38
|
+
|
|
39
|
+
# create tasks
|
|
40
|
+
tasks = []
|
|
41
|
+
for frame in frames_for_tasks:
|
|
42
|
+
|
|
43
|
+
# get_or_create task
|
|
44
|
+
task, created = LegacyBinaryClassificationAnnotationTask.objects.get_or_create(
|
|
45
|
+
label=label,
|
|
46
|
+
image_path=frame.image.path,
|
|
47
|
+
frame_id=frame.pk,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class AbstractBinaryClassificationAnnotationTask(models.Model):
|
|
52
|
+
label = models.ForeignKey("Label", on_delete=models.CASCADE)
|
|
53
|
+
is_finished = models.BooleanField(default=False)
|
|
54
|
+
date_created = models.DateTimeField(auto_now_add=True)
|
|
55
|
+
date_finished = models.DateTimeField(blank=True, null=True)
|
|
56
|
+
image_path = models.CharField(max_length=255, blank=True, null=True)
|
|
57
|
+
image_type = models.CharField(max_length=255, blank=True, null=True)
|
|
58
|
+
frame_id = models.IntegerField(blank=True, null=True)
|
|
59
|
+
labelstudio_project_id = models.IntegerField(blank=True, null=True)
|
|
60
|
+
labelstudio_task_id = models.IntegerField(blank=True, null=True)
|
|
61
|
+
|
|
62
|
+
class Meta:
|
|
63
|
+
abstract = True
|
|
64
|
+
|
|
65
|
+
class BinaryClassificationAnnotationTask(AbstractBinaryClassificationAnnotationTask):
|
|
66
|
+
frame = models.ForeignKey("Frame", on_delete=models.CASCADE, related_name="binary_classification_annotation_tasks")
|
|
67
|
+
image_type = models.CharField(max_length=255, default="frame")
|
|
68
|
+
|
|
69
|
+
def get_frame(self):
|
|
70
|
+
return self.video_segment.get_frame_by_id(self.frame_id)
|
|
71
|
+
|
|
72
|
+
class LegacyBinaryClassificationAnnotationTask(AbstractBinaryClassificationAnnotationTask):
|
|
73
|
+
frame = models.ForeignKey("LegacyFrame", on_delete=models.CASCADE, related_name="binary_classification_annotation_tasks")
|
|
74
|
+
image_type = models.CharField(max_length=255, default="legacy")
|
|
75
|
+
|
|
76
|
+
def get_frame(self):
|
|
77
|
+
return self.frame
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|