endoreg-db 0.3.6__py3-none-any.whl → 0.3.8__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.
Files changed (351) hide show
  1. endoreg_db/admin.py +3 -3
  2. endoreg_db/apps.py +6 -6
  3. endoreg_db/data/__init__.py +67 -64
  4. endoreg_db/data/active_model/data.yaml +2 -2
  5. endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -167
  6. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +7 -7
  7. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +8 -8
  8. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +22 -22
  9. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +18 -18
  10. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +18 -18
  11. endoreg_db/data/case_template/rule/19_create_patient.yaml +16 -16
  12. endoreg_db/data/case_template/rule_type/base_types.yaml +35 -35
  13. endoreg_db/data/case_template/rule_value/.init +0 -0
  14. endoreg_db/data/case_template/rule_value_type/base_types.yaml +58 -58
  15. endoreg_db/data/case_template/template/base.yaml +7 -7
  16. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +2 -2
  17. endoreg_db/data/case_template/tmp/_rule_value +13 -13
  18. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -21
  19. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +9 -9
  20. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +6 -6
  21. endoreg_db/data/center/data.yaml +59 -59
  22. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -144
  23. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -48
  24. endoreg_db/data/disease/cardiovascular.yaml +37 -37
  25. endoreg_db/data/disease/hepatology.yaml +4 -4
  26. endoreg_db/data/disease/misc.yaml +5 -5
  27. endoreg_db/data/disease/renal.yaml +4 -4
  28. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +5 -5
  29. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +5 -5
  30. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +40 -40
  31. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +19 -19
  32. endoreg_db/data/distribution/date/patient.yaml +6 -6
  33. endoreg_db/data/distribution/multiple_categorical/.init +0 -0
  34. endoreg_db/data/distribution/numeric/.init +0 -0
  35. endoreg_db/data/distribution/single_categorical/patient.yaml +6 -6
  36. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -132
  37. endoreg_db/data/endoscope_type/data.yaml +10 -10
  38. endoreg_db/data/endoscopy_processor/data.yaml +45 -45
  39. endoreg_db/data/event/cardiology.yaml +27 -27
  40. endoreg_db/data/event/neurology.yaml +13 -13
  41. endoreg_db/data/event/surgery.yaml +12 -12
  42. endoreg_db/data/event/thrombembolism.yaml +19 -19
  43. endoreg_db/data/examination/examinations/data.yaml +65 -65
  44. endoreg_db/data/examination/time/data.yaml +47 -47
  45. endoreg_db/data/examination/time-type/data.yaml +7 -7
  46. endoreg_db/data/examination/type/data.yaml +5 -5
  47. endoreg_db/data/gender/data.yaml +18 -18
  48. endoreg_db/data/information_source/data.yaml +30 -30
  49. endoreg_db/data/information_source/medication.yaml +5 -5
  50. endoreg_db/data/lab_value/cardiac_enzymes.yaml +30 -30
  51. endoreg_db/data/lab_value/coagulation.yaml +48 -48
  52. endoreg_db/data/lab_value/electrolytes.yaml +189 -189
  53. endoreg_db/data/lab_value/gastrointestinal_function.yaml +121 -121
  54. endoreg_db/data/lab_value/hematology.yaml +169 -169
  55. endoreg_db/data/lab_value/hormones.yaml +53 -53
  56. endoreg_db/data/lab_value/lipids.yaml +44 -44
  57. endoreg_db/data/lab_value/misc.yaml +30 -30
  58. endoreg_db/data/lab_value/renal_function.yaml +10 -10
  59. endoreg_db/data/label/label/data.yaml +62 -62
  60. endoreg_db/data/label/label-set/data.yaml +17 -17
  61. endoreg_db/data/label/label-type/data.yaml +6 -6
  62. endoreg_db/data/medication/anticoagulation.yaml +64 -64
  63. endoreg_db/data/medication/tah.yaml +69 -69
  64. endoreg_db/data/medication_indication/anticoagulation.yaml +120 -120
  65. endoreg_db/data/medication_indication_type/data.yaml +10 -10
  66. endoreg_db/data/medication_indication_type/thrombembolism.yaml +40 -40
  67. endoreg_db/data/medication_intake_time/base.yaml +30 -30
  68. endoreg_db/data/medication_schedule/apixaban.yaml +94 -94
  69. endoreg_db/data/medication_schedule/ass.yaml +12 -12
  70. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -26
  71. endoreg_db/data/model_type/data.yaml +6 -6
  72. endoreg_db/data/network_device/data.yaml +17 -0
  73. endoreg_db/data/network_device_type/data.yaml +8 -0
  74. endoreg_db/data/patient_lab_sample_type/generic.yaml +5 -5
  75. endoreg_db/data/pdf_type/data.yaml +28 -28
  76. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -66
  77. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -33
  78. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -308
  79. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -88
  80. endoreg_db/data/profession/data.yaml +70 -70
  81. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -55
  82. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +26 -26
  83. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -19
  84. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -15
  85. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -12
  86. endoreg_db/data/unit/concentration.yaml +92 -92
  87. endoreg_db/data/unit/data.yaml +17 -17
  88. endoreg_db/data/unit/length.yaml +30 -30
  89. endoreg_db/data/unit/misc.yaml +19 -19
  90. endoreg_db/data/unit/rate.yaml +5 -5
  91. endoreg_db/data/unit/time.yaml +12 -12
  92. endoreg_db/data/unit/volume.yaml +35 -35
  93. endoreg_db/data/unit/weight.yaml +37 -37
  94. endoreg_db/data/waste/data.yaml +11 -11
  95. endoreg_db/forms/__init__.py +2 -2
  96. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
  97. endoreg_db/forms/settings/__init__.py +8 -8
  98. endoreg_db/forms/unit.py +5 -5
  99. endoreg_db/management/commands/_load_model_template.py +40 -40
  100. endoreg_db/management/commands/delete_all.py +18 -18
  101. endoreg_db/management/commands/delete_legacy_images.py +19 -19
  102. endoreg_db/management/commands/delete_legacy_videos.py +16 -16
  103. endoreg_db/management/commands/extract_legacy_video_frames.py +18 -18
  104. endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -32
  105. endoreg_db/management/commands/fix_auth_permission.py +20 -20
  106. endoreg_db/management/commands/import_legacy_images.py +94 -94
  107. endoreg_db/management/commands/import_legacy_videos.py +76 -76
  108. endoreg_db/management/commands/load_active_model_data.py +44 -44
  109. endoreg_db/management/commands/load_ai_model_data.py +44 -44
  110. endoreg_db/management/commands/load_base_db_data.py +132 -128
  111. endoreg_db/management/commands/load_center_data.py +42 -42
  112. endoreg_db/management/commands/load_disease_classification_choices_data.py +40 -40
  113. endoreg_db/management/commands/load_disease_classification_data.py +40 -40
  114. endoreg_db/management/commands/load_disease_data.py +39 -39
  115. endoreg_db/management/commands/load_distribution_data.py +65 -65
  116. endoreg_db/management/commands/load_endoscope_type_data.py +44 -44
  117. endoreg_db/management/commands/load_endoscopy_processor_data.py +44 -44
  118. endoreg_db/management/commands/load_event_data.py +40 -40
  119. endoreg_db/management/commands/load_examination_data.py +74 -74
  120. endoreg_db/management/commands/load_g_play_data.py +112 -112
  121. endoreg_db/management/commands/load_gender_data.py +43 -43
  122. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -132
  123. endoreg_db/management/commands/load_information_source.py +44 -44
  124. endoreg_db/management/commands/load_lab_value_data.py +49 -49
  125. endoreg_db/management/commands/load_label_data.py +66 -66
  126. endoreg_db/management/commands/load_medication_data.py +40 -40
  127. endoreg_db/management/commands/load_medication_indication_data.py +62 -62
  128. endoreg_db/management/commands/load_medication_indication_type_data.py +40 -40
  129. endoreg_db/management/commands/load_medication_intake_time_data.py +40 -40
  130. endoreg_db/management/commands/load_medication_schedule_data.py +54 -54
  131. endoreg_db/management/commands/load_network_data.py +49 -0
  132. endoreg_db/management/commands/load_pdf_type_data.py +60 -60
  133. endoreg_db/management/commands/load_profession_data.py +43 -43
  134. endoreg_db/management/commands/load_report_reader_flag.py +45 -45
  135. endoreg_db/management/commands/load_unit_data.py +45 -45
  136. endoreg_db/management/commands/load_user_groups.py +28 -28
  137. endoreg_db/management/commands/register_ai_model.py +65 -65
  138. endoreg_db/management/commands/reset_celery_schedule.py +9 -9
  139. endoreg_db/migrations/0001_initial.py +582 -582
  140. endoreg_db/migrations/0002_rawvideofile.py +26 -26
  141. endoreg_db/migrations/0003_rawvideofile_frames_required.py +18 -18
  142. endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +18 -18
  143. endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +56 -56
  144. endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +25 -25
  145. endoreg_db/migrations/0007_rawvideofile_processor.py +19 -19
  146. endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +18 -18
  147. endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +31 -31
  148. endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +18 -18
  149. endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +18 -18
  150. endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +109 -109
  151. endoreg_db/migrations/0013_rawpdffile.py +31 -31
  152. endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +38 -38
  153. endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +31 -31
  154. endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +18 -18
  155. endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +37 -37
  156. endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +37 -37
  157. endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +42 -42
  158. endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +18 -18
  159. endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +19 -19
  160. endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +19 -19
  161. endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +59 -59
  162. endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +27 -27
  163. endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +42 -42
  164. endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +166 -166
  165. endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +38 -38
  166. endoreg_db/migrations/0028_alter_unit_abbreviation.py +18 -18
  167. endoreg_db/migrations/0029_medicationintaketime_and_more.py +75 -75
  168. endoreg_db/migrations/0030_medicationindicationtype_and_more.py +101 -101
  169. endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +38 -38
  170. endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +18 -18
  171. endoreg_db/migrations/0033_medicationindication_sources.py +18 -18
  172. endoreg_db/migrations/0034_alter_rawpdffile_file.py +20 -20
  173. endoreg_db/migrations/0035_alter_medicationindication_sources.py +18 -18
  174. endoreg_db/migrations/0036_alter_rawpdffile_file.py +20 -20
  175. endoreg_db/migrations/0037_alter_medicationindication_sources.py +18 -18
  176. endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +164 -164
  177. endoreg_db/migrations/0039_referenceproduct_name.py +19 -19
  178. endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +50 -50
  179. endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +40 -40
  180. endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +74 -74
  181. endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +23 -23
  182. endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +23 -23
  183. endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +19 -19
  184. endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +18 -18
  185. endoreg_db/migrations/0047_casetemplaterule_target_model.py +18 -18
  186. endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +22 -22
  187. endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +17 -17
  188. endoreg_db/migrations/0050_casetemplaterule_rule_values.py +18 -18
  189. endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +27 -27
  190. endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +18 -18
  191. endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +38 -38
  192. endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +69 -69
  193. endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +59 -59
  194. endoreg_db/migrations/0056_datevaluedistribution_and_more.py +32 -32
  195. endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +72 -72
  196. endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +28 -28
  197. endoreg_db/migrations/0059_casetemplaterule_rule_values.py +18 -18
  198. endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +44 -44
  199. endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +24 -24
  200. endoreg_db/migrations/0062_labvalue_numeric_precision.py +18 -18
  201. endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +18 -18
  202. endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +23 -23
  203. endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +58 -58
  204. endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +29 -29
  205. endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +19 -19
  206. endoreg_db/migrations/0068_networkdevicetype_networkdevicetypemanager_and_more.py +57 -0
  207. endoreg_db/models/__init__.py +75 -74
  208. endoreg_db/models/ai_model/__init__.py +3 -3
  209. endoreg_db/models/ai_model/active_model.py +9 -9
  210. endoreg_db/models/ai_model/model_meta.py +24 -24
  211. endoreg_db/models/ai_model/model_type.py +25 -25
  212. endoreg_db/models/ai_model/utils.py +8 -8
  213. endoreg_db/models/annotation/__init__.py +1 -1
  214. endoreg_db/models/annotation/binary_classification_annotation_task.py +80 -80
  215. endoreg_db/models/annotation/image_classification.py +26 -26
  216. endoreg_db/models/case_template/__init__.py +5 -5
  217. endoreg_db/models/case_template/case_template.py +81 -81
  218. endoreg_db/models/case_template/case_template_rule.py +276 -276
  219. endoreg_db/models/case_template/case_template_rule_value.py +73 -73
  220. endoreg_db/models/case_template/case_template_type.py +27 -27
  221. endoreg_db/models/center/__init__.py +4 -4
  222. endoreg_db/models/center/center.py +24 -24
  223. endoreg_db/models/center/center_product.py +33 -33
  224. endoreg_db/models/center/center_resource.py +18 -18
  225. endoreg_db/models/center/center_waste.py +10 -10
  226. endoreg_db/models/data_file/__init__.py +5 -5
  227. endoreg_db/models/data_file/base_classes/__init__.py +2 -2
  228. endoreg_db/models/data_file/base_classes/abstract_frame.py +50 -50
  229. endoreg_db/models/data_file/base_classes/abstract_video.py +200 -200
  230. endoreg_db/models/data_file/frame.py +45 -45
  231. endoreg_db/models/data_file/import_classes/__init__.py +31 -31
  232. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +34 -34
  233. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -28
  234. endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -260
  235. endoreg_db/models/data_file/import_classes/raw_pdf.py +188 -188
  236. endoreg_db/models/data_file/import_classes/raw_video.py +343 -343
  237. endoreg_db/models/data_file/metadata/__init__.py +3 -3
  238. endoreg_db/models/data_file/metadata/pdf_meta.py +70 -70
  239. endoreg_db/models/data_file/metadata/sensitive_meta.py +31 -31
  240. endoreg_db/models/data_file/metadata/video_meta.py +132 -132
  241. endoreg_db/models/data_file/report_file.py +89 -89
  242. endoreg_db/models/data_file/video/__init__.py +6 -6
  243. endoreg_db/models/data_file/video/import_meta.py +25 -25
  244. endoreg_db/models/data_file/video/video.py +25 -25
  245. endoreg_db/models/data_file/video_segment.py +107 -107
  246. endoreg_db/models/disease.py +55 -55
  247. endoreg_db/models/emission/emission_factor.py +19 -19
  248. endoreg_db/models/event.py +21 -21
  249. endoreg_db/models/examination/__init__.py +3 -3
  250. endoreg_db/models/examination/examination.py +26 -26
  251. endoreg_db/models/examination/examination_time.py +27 -27
  252. endoreg_db/models/examination/examination_time_type.py +24 -24
  253. endoreg_db/models/examination/examination_type.py +18 -18
  254. endoreg_db/models/hardware/__init__.py +1 -1
  255. endoreg_db/models/hardware/endoscope.py +44 -44
  256. endoreg_db/models/hardware/endoscopy_processor.py +143 -143
  257. endoreg_db/models/information_source.py +29 -29
  258. endoreg_db/models/label/label.py +84 -84
  259. endoreg_db/models/laboratory/lab_value.py +102 -102
  260. endoreg_db/models/legacy_data/__init__.py +3 -3
  261. endoreg_db/models/legacy_data/image.py +34 -34
  262. endoreg_db/models/medication/medication.py +148 -148
  263. endoreg_db/models/network/__init__.py +2 -0
  264. endoreg_db/models/network/network_device.py +27 -0
  265. endoreg_db/models/network/network_device_type.py +23 -0
  266. endoreg_db/models/other/__init__.py +4 -4
  267. endoreg_db/models/other/distribution.py +215 -215
  268. endoreg_db/models/other/material.py +16 -16
  269. endoreg_db/models/other/resource.py +17 -17
  270. endoreg_db/models/other/transport_route.py +20 -20
  271. endoreg_db/models/other/waste.py +20 -20
  272. endoreg_db/models/patient_examination/__init__.py +35 -35
  273. endoreg_db/models/permissions/__init__.py +44 -44
  274. endoreg_db/models/persons/__init__.py +6 -6
  275. endoreg_db/models/persons/examiner/__init__.py +1 -1
  276. endoreg_db/models/persons/examiner/examiner.py +15 -15
  277. endoreg_db/models/persons/examiner/examiner_type.py +1 -1
  278. endoreg_db/models/persons/first_name.py +17 -17
  279. endoreg_db/models/persons/gender.py +22 -22
  280. endoreg_db/models/persons/last_name.py +19 -19
  281. endoreg_db/models/persons/patient/__init__.py +7 -7
  282. endoreg_db/models/persons/patient/case/case.py +30 -30
  283. endoreg_db/models/persons/patient/patient.py +216 -216
  284. endoreg_db/models/persons/patient/patient_disease.py +16 -16
  285. endoreg_db/models/persons/patient/patient_event.py +22 -22
  286. endoreg_db/models/persons/patient/patient_lab_sample.py +106 -106
  287. endoreg_db/models/persons/patient/patient_lab_value.py +176 -176
  288. endoreg_db/models/persons/patient/patient_medication.py +43 -43
  289. endoreg_db/models/persons/patient/patient_medication_schedule.py +27 -27
  290. endoreg_db/models/persons/person.py +31 -31
  291. endoreg_db/models/persons/portal_user_information.py +27 -27
  292. endoreg_db/models/prediction/__init__.py +1 -1
  293. endoreg_db/models/prediction/image_classification.py +37 -37
  294. endoreg_db/models/prediction/video_prediction_meta.py +244 -244
  295. endoreg_db/models/product/__init__.py +4 -4
  296. endoreg_db/models/product/product.py +97 -97
  297. endoreg_db/models/product/product_group.py +19 -19
  298. endoreg_db/models/product/product_material.py +24 -24
  299. endoreg_db/models/product/product_weight.py +26 -26
  300. endoreg_db/models/product/reference_product.py +99 -99
  301. endoreg_db/models/questionnaires/__init__.py +114 -114
  302. endoreg_db/models/quiz/__init__.py +1 -1
  303. endoreg_db/models/quiz/quiz_answer.py +41 -41
  304. endoreg_db/models/quiz/quiz_question.py +54 -54
  305. endoreg_db/models/report_reader/__init__.py +1 -1
  306. endoreg_db/models/report_reader/report_reader_config.py +53 -53
  307. endoreg_db/models/report_reader/report_reader_flag.py +19 -19
  308. endoreg_db/models/rules/__init__.py +4 -4
  309. endoreg_db/models/rules/rule.py +23 -23
  310. endoreg_db/models/rules/rule_applicator.py +224 -224
  311. endoreg_db/models/rules/rule_attribute_dtype.py +18 -18
  312. endoreg_db/models/rules/rule_type.py +21 -21
  313. endoreg_db/models/rules/ruleset.py +19 -19
  314. endoreg_db/models/unit.py +21 -21
  315. endoreg_db/queries/__init__.py +4 -4
  316. endoreg_db/queries/annotations/__init__.py +2 -2
  317. endoreg_db/queries/annotations/legacy.py +159 -159
  318. endoreg_db/queries/get/__init__.py +5 -5
  319. endoreg_db/queries/get/center.py +42 -42
  320. endoreg_db/queries/get/model.py +13 -13
  321. endoreg_db/queries/get/patient.py +14 -14
  322. endoreg_db/queries/get/patient_examination.py +20 -20
  323. endoreg_db/queries/get/report_file.py +33 -33
  324. endoreg_db/queries/get/video.py +31 -31
  325. endoreg_db/serializers/__init__.py +9 -9
  326. endoreg_db/serializers/ai_model.py +18 -18
  327. endoreg_db/serializers/annotation.py +17 -17
  328. endoreg_db/serializers/center.py +11 -11
  329. endoreg_db/serializers/examination.py +32 -32
  330. endoreg_db/serializers/frame.py +13 -13
  331. endoreg_db/serializers/hardware.py +20 -20
  332. endoreg_db/serializers/label.py +22 -22
  333. endoreg_db/serializers/patient.py +10 -10
  334. endoreg_db/serializers/prediction.py +15 -15
  335. endoreg_db/serializers/report_file.py +7 -7
  336. endoreg_db/serializers/video.py +27 -27
  337. endoreg_db/tests.py +3 -3
  338. endoreg_db/utils/cropping.py +28 -28
  339. endoreg_db/utils/dataloader.py +92 -92
  340. endoreg_db/utils/file_operations.py +30 -30
  341. endoreg_db/utils/hashs.py +33 -33
  342. endoreg_db/utils/legacy_ocr.py +201 -201
  343. endoreg_db/utils/ocr.py +197 -197
  344. endoreg_db/utils/uuid.py +4 -4
  345. endoreg_db/utils/video_metadata.py +87 -87
  346. endoreg_db/views.py +3 -3
  347. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/LICENSE +674 -674
  348. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/METADATA +3 -1
  349. endoreg_db-0.3.8.dist-info/RECORD +367 -0
  350. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/WHEEL +1 -1
  351. endoreg_db-0.3.6.dist-info/RECORD +0 -357
@@ -1,201 +1,201 @@
1
- import pytesseract
2
- # import cv2
3
- from endoreg_db.models import EndoscopyProcessor
4
- import os
5
- from collections import Counter
6
- from tempfile import TemporaryDirectory
7
- import re
8
- from datetime import datetime
9
- from typing import Dict, List
10
- from icecream import ic
11
- import numpy as np
12
-
13
- N_FRAMES_MEAN_OCR = 2
14
-
15
- # Helper function to process date strings
16
- def process_date_text(date_text):
17
- """
18
- Processes a string of text that represents a date and returns a datetime.date object.
19
-
20
- Args:
21
- date_text (str): A string of text that represents a date.
22
-
23
- Returns:
24
- datetime.date: A datetime.date object representing the parsed date, or None if the text cannot be parsed.
25
- """
26
- try:
27
- # Remove any non-digit characters
28
- date_text_clean = re.sub(r'\D', '', date_text)
29
- # Reformat to 'ddmmyyyy' if necessary
30
- if len(date_text_clean) == 8:
31
- return datetime.strptime(date_text_clean, "%d%m%Y").date()
32
- elif len(date_text_clean) == 14:
33
- return datetime.strptime(date_text_clean, "%d%m%Y%H%M%S").date()
34
- except ValueError:
35
- # Return None if the text cannot be parsed into a date
36
- # set date to 1/1/1900
37
- return datetime.strptime("01011900", "%d%m%Y").date()
38
-
39
- # Helper function to process patient names
40
- def process_name_text(name_text):
41
- """
42
- Remove all numbers, punctuation, and whitespace from a string of text and return the result.
43
- """
44
- name = re.sub(r'[0-9!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\s]+', '', name_text).strip()
45
- # capitalize first letter of each word
46
- name = ' '.join([word.capitalize() for word in name.split()])
47
- return name
48
-
49
-
50
- # Helper function to process endoscope type text
51
- def process_general_text(endoscope_text):
52
- """
53
- This function takes in a string of text from an endoscope and returns a cleaned version of the text.
54
- """
55
- return ' '.join(endoscope_text.split())
56
-
57
- def roi_values_valid(roi):
58
- """
59
- Check if all values in an ROI dictionary are valid (>=0).
60
- """
61
- return all([value >= 0 for value in roi.values()])
62
-
63
- # Function to extract text from ROIs
64
- def extract_text_from_rois(image_path, processor:EndoscopyProcessor):
65
- """
66
- Extracts text from regions of interest (ROIs) in an image using OCR.
67
-
68
- Args:
69
- image_path (str): The path to the image file.
70
- processor (EndoscopyProcessor): An instance of the EndoscopyProcessor class.
71
-
72
- Returns:
73
- dict: A dictionary containing the extracted text for each ROI.
74
- """
75
- # Read the image using OpenCV
76
- image = cv2.imread(image_path)
77
-
78
- # Initialize the dictionary to hold the extracted text
79
- extracted_texts = {}
80
-
81
- # Define your ROIs and their corresponding post-processing functions in tuples
82
- rois_with_postprocessing = [
83
- ('examination_date', processor.get_roi_examination_date, process_date_text),
84
- ("patient_first_name", processor.get_roi_patient_first_name, process_name_text),
85
- ('patient_last_name', processor.get_roi_patient_last_name, process_name_text),
86
- ('patient_dob', processor.get_roi_patient_dob, process_date_text),
87
- ('endoscope_type', processor.get_roi_endoscope_type, process_general_text),
88
- ('endoscope_sn', processor.get_roi_endoscopy_sn, process_general_text),
89
- ]
90
-
91
- # Extract and post-process text for each ROI
92
- for roi_name, roi_function, post_process in rois_with_postprocessing:
93
- # Get the ROI dictionary
94
- roi = roi_function()
95
-
96
- # Check if the ROI has values
97
-
98
- if roi_values_valid(roi):
99
- # Crop the image to the ROI
100
- x, y, w, h = roi['x'], roi['y'], roi['width'], roi['height']
101
- roi_cropped = image[y:y+h, x:x+w]
102
- # Convert to grayscale
103
- gray = cv2.cvtColor(roi_cropped, cv2.COLOR_BGR2GRAY)
104
-
105
- # Invert colors for white text on black background
106
- gray = cv2.bitwise_not(gray)
107
-
108
- # Binarize the image - using Otsu's method
109
- _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
110
-
111
- # Dilate the image to improve the contour of the pixelated text
112
- kernel = np.ones((2,2), np.uint8)
113
- dilation = cv2.dilate(binary, kernel, iterations=1)
114
-
115
- # OCR configuration: Recognize white text on black background without corrections
116
- config = '--psm 10 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-üöäÜÖÄß'
117
-
118
- # Use pytesseract to do OCR on the preprocessed ROI
119
- text = pytesseract.image_to_string(dilation, config=config).strip()
120
-
121
- # Post-process extracted text
122
- processed_text = post_process(text)
123
- # processed_text = text
124
-
125
- # Store the processed text in the dictionary
126
- extracted_texts[roi_name] = processed_text
127
-
128
- else:
129
- ic(roi_name)
130
- ic(roi)
131
- ic("No values for this ROI")
132
-
133
- return extracted_texts
134
-
135
-
136
- def get_most_frequent_values(rois_texts: Dict[str, List[str]]) -> Dict[str, str]:
137
- """
138
- Given a dictionary of ROIs and their corresponding texts, returns a dictionary of the most frequent text for each ROI.
139
-
140
- Args:
141
- rois_texts: A dictionary where the keys are the names of the ROIs and the values are lists of texts.
142
-
143
- Returns:
144
- A dictionary where the keys are the names of the ROIs and the values are the most frequent text for each ROI.
145
- """
146
- most_frequent = {}
147
- for key in rois_texts.keys():
148
- counter = Counter([text for text in rois_texts[key] if text])
149
- ic(key)
150
- ic(counter)
151
- most_frequent[key], _ = counter.most_common(1)[0] if counter else (None, None)
152
- return most_frequent
153
-
154
- def process_video(video_path, processor):
155
- """
156
- Processes a video file by extracting text from regions of interest (ROIs) in each frame.
157
-
158
- Args:
159
- video_path (str): The path to the video file to process.
160
- processor (OCRProcessor): An instance of the OCRProcessor class that defines the ROIs to extract text from.
161
-
162
- Returns:
163
- dict: A dictionary containing the most frequent text values extracted from each ROI.
164
- """
165
- # Create a temporary directory to store frames
166
- with TemporaryDirectory() as temp_dir:
167
- ic(temp_dir)
168
- # Capture the video
169
- video = cv2.VideoCapture(video_path)
170
- success, frame_number = True, 0
171
- rois_texts = {roi_name: [] for roi_name in processor.get_rois().keys()}
172
- frames_for_mean_extraction = 0
173
-
174
- while success:
175
- success, frame = video.read()
176
-
177
- # Check if this is the 200th frame
178
- if frame_number % 1000 == 0 and success:
179
- frame_path = os.path.join(temp_dir, f"frame_{frame_number}.jpg")
180
- cv2.imwrite(frame_path, frame) # Save the frame as a JPEG file
181
- # cv2.imwrite(f"_tmp/frame_{frame_number}.jpg", frame)
182
-
183
- # Extract text from ROIs
184
- extracted_texts = extract_text_from_rois(frame_path, processor)
185
- ic(extracted_texts)
186
-
187
- # Store the extracted text from each ROI
188
- for key, text in extracted_texts.items():
189
- rois_texts[key].append(text)
190
- frames_for_mean_extraction += 1
191
-
192
- frame_number += 1
193
-
194
- if frames_for_mean_extraction >= N_FRAMES_MEAN_OCR: break
195
-
196
- # Release the video capture object
197
- video.release()
198
-
199
- # Get the most frequent values for each ROI
200
- return get_most_frequent_values(rois_texts)
201
-
1
+ import pytesseract
2
+ # import cv2
3
+ from endoreg_db.models import EndoscopyProcessor
4
+ import os
5
+ from collections import Counter
6
+ from tempfile import TemporaryDirectory
7
+ import re
8
+ from datetime import datetime
9
+ from typing import Dict, List
10
+ from icecream import ic
11
+ import numpy as np
12
+
13
+ N_FRAMES_MEAN_OCR = 2
14
+
15
+ # Helper function to process date strings
16
+ def process_date_text(date_text):
17
+ """
18
+ Processes a string of text that represents a date and returns a datetime.date object.
19
+
20
+ Args:
21
+ date_text (str): A string of text that represents a date.
22
+
23
+ Returns:
24
+ datetime.date: A datetime.date object representing the parsed date, or None if the text cannot be parsed.
25
+ """
26
+ try:
27
+ # Remove any non-digit characters
28
+ date_text_clean = re.sub(r'\D', '', date_text)
29
+ # Reformat to 'ddmmyyyy' if necessary
30
+ if len(date_text_clean) == 8:
31
+ return datetime.strptime(date_text_clean, "%d%m%Y").date()
32
+ elif len(date_text_clean) == 14:
33
+ return datetime.strptime(date_text_clean, "%d%m%Y%H%M%S").date()
34
+ except ValueError:
35
+ # Return None if the text cannot be parsed into a date
36
+ # set date to 1/1/1900
37
+ return datetime.strptime("01011900", "%d%m%Y").date()
38
+
39
+ # Helper function to process patient names
40
+ def process_name_text(name_text):
41
+ """
42
+ Remove all numbers, punctuation, and whitespace from a string of text and return the result.
43
+ """
44
+ name = re.sub(r'[0-9!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\s]+', '', name_text).strip()
45
+ # capitalize first letter of each word
46
+ name = ' '.join([word.capitalize() for word in name.split()])
47
+ return name
48
+
49
+
50
+ # Helper function to process endoscope type text
51
+ def process_general_text(endoscope_text):
52
+ """
53
+ This function takes in a string of text from an endoscope and returns a cleaned version of the text.
54
+ """
55
+ return ' '.join(endoscope_text.split())
56
+
57
+ def roi_values_valid(roi):
58
+ """
59
+ Check if all values in an ROI dictionary are valid (>=0).
60
+ """
61
+ return all([value >= 0 for value in roi.values()])
62
+
63
+ # Function to extract text from ROIs
64
+ def extract_text_from_rois(image_path, processor:EndoscopyProcessor):
65
+ """
66
+ Extracts text from regions of interest (ROIs) in an image using OCR.
67
+
68
+ Args:
69
+ image_path (str): The path to the image file.
70
+ processor (EndoscopyProcessor): An instance of the EndoscopyProcessor class.
71
+
72
+ Returns:
73
+ dict: A dictionary containing the extracted text for each ROI.
74
+ """
75
+ # Read the image using OpenCV
76
+ image = cv2.imread(image_path)
77
+
78
+ # Initialize the dictionary to hold the extracted text
79
+ extracted_texts = {}
80
+
81
+ # Define your ROIs and their corresponding post-processing functions in tuples
82
+ rois_with_postprocessing = [
83
+ ('examination_date', processor.get_roi_examination_date, process_date_text),
84
+ ("patient_first_name", processor.get_roi_patient_first_name, process_name_text),
85
+ ('patient_last_name', processor.get_roi_patient_last_name, process_name_text),
86
+ ('patient_dob', processor.get_roi_patient_dob, process_date_text),
87
+ ('endoscope_type', processor.get_roi_endoscope_type, process_general_text),
88
+ ('endoscope_sn', processor.get_roi_endoscopy_sn, process_general_text),
89
+ ]
90
+
91
+ # Extract and post-process text for each ROI
92
+ for roi_name, roi_function, post_process in rois_with_postprocessing:
93
+ # Get the ROI dictionary
94
+ roi = roi_function()
95
+
96
+ # Check if the ROI has values
97
+
98
+ if roi_values_valid(roi):
99
+ # Crop the image to the ROI
100
+ x, y, w, h = roi['x'], roi['y'], roi['width'], roi['height']
101
+ roi_cropped = image[y:y+h, x:x+w]
102
+ # Convert to grayscale
103
+ gray = cv2.cvtColor(roi_cropped, cv2.COLOR_BGR2GRAY)
104
+
105
+ # Invert colors for white text on black background
106
+ gray = cv2.bitwise_not(gray)
107
+
108
+ # Binarize the image - using Otsu's method
109
+ _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
110
+
111
+ # Dilate the image to improve the contour of the pixelated text
112
+ kernel = np.ones((2,2), np.uint8)
113
+ dilation = cv2.dilate(binary, kernel, iterations=1)
114
+
115
+ # OCR configuration: Recognize white text on black background without corrections
116
+ config = '--psm 10 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-üöäÜÖÄß'
117
+
118
+ # Use pytesseract to do OCR on the preprocessed ROI
119
+ text = pytesseract.image_to_string(dilation, config=config).strip()
120
+
121
+ # Post-process extracted text
122
+ processed_text = post_process(text)
123
+ # processed_text = text
124
+
125
+ # Store the processed text in the dictionary
126
+ extracted_texts[roi_name] = processed_text
127
+
128
+ else:
129
+ ic(roi_name)
130
+ ic(roi)
131
+ ic("No values for this ROI")
132
+
133
+ return extracted_texts
134
+
135
+
136
+ def get_most_frequent_values(rois_texts: Dict[str, List[str]]) -> Dict[str, str]:
137
+ """
138
+ Given a dictionary of ROIs and their corresponding texts, returns a dictionary of the most frequent text for each ROI.
139
+
140
+ Args:
141
+ rois_texts: A dictionary where the keys are the names of the ROIs and the values are lists of texts.
142
+
143
+ Returns:
144
+ A dictionary where the keys are the names of the ROIs and the values are the most frequent text for each ROI.
145
+ """
146
+ most_frequent = {}
147
+ for key in rois_texts.keys():
148
+ counter = Counter([text for text in rois_texts[key] if text])
149
+ ic(key)
150
+ ic(counter)
151
+ most_frequent[key], _ = counter.most_common(1)[0] if counter else (None, None)
152
+ return most_frequent
153
+
154
+ def process_video(video_path, processor):
155
+ """
156
+ Processes a video file by extracting text from regions of interest (ROIs) in each frame.
157
+
158
+ Args:
159
+ video_path (str): The path to the video file to process.
160
+ processor (OCRProcessor): An instance of the OCRProcessor class that defines the ROIs to extract text from.
161
+
162
+ Returns:
163
+ dict: A dictionary containing the most frequent text values extracted from each ROI.
164
+ """
165
+ # Create a temporary directory to store frames
166
+ with TemporaryDirectory() as temp_dir:
167
+ ic(temp_dir)
168
+ # Capture the video
169
+ video = cv2.VideoCapture(video_path)
170
+ success, frame_number = True, 0
171
+ rois_texts = {roi_name: [] for roi_name in processor.get_rois().keys()}
172
+ frames_for_mean_extraction = 0
173
+
174
+ while success:
175
+ success, frame = video.read()
176
+
177
+ # Check if this is the 200th frame
178
+ if frame_number % 1000 == 0 and success:
179
+ frame_path = os.path.join(temp_dir, f"frame_{frame_number}.jpg")
180
+ cv2.imwrite(frame_path, frame) # Save the frame as a JPEG file
181
+ # cv2.imwrite(f"_tmp/frame_{frame_number}.jpg", frame)
182
+
183
+ # Extract text from ROIs
184
+ extracted_texts = extract_text_from_rois(frame_path, processor)
185
+ ic(extracted_texts)
186
+
187
+ # Store the extracted text from each ROI
188
+ for key, text in extracted_texts.items():
189
+ rois_texts[key].append(text)
190
+ frames_for_mean_extraction += 1
191
+
192
+ frame_number += 1
193
+
194
+ if frames_for_mean_extraction >= N_FRAMES_MEAN_OCR: break
195
+
196
+ # Release the video capture object
197
+ video.release()
198
+
199
+ # Get the most frequent values for each ROI
200
+ return get_most_frequent_values(rois_texts)
201
+