endoreg-db 0.6.4__py3-none-any.whl → 0.8.2__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.

Files changed (779) hide show
  1. endoreg_db/admin.py +26 -26
  2. endoreg_db/api_urls.py +4 -0
  3. endoreg_db/apps.py +12 -0
  4. endoreg_db/assets/dummy_model.ckpt +1 -0
  5. endoreg_db/codemods/readme.md +88 -0
  6. endoreg_db/codemods/rename_datetime_fields.py +92 -0
  7. endoreg_db/config/env.py +101 -0
  8. endoreg_db/data/__init__.py +12 -0
  9. endoreg_db/data/ai_model/data.yaml +1 -1
  10. endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
  11. endoreg_db/data/ai_model_label/label-set/data.yaml +20 -1
  12. endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
  13. endoreg_db/data/center/data.yaml +13 -12
  14. endoreg_db/data/center_shift/ukw.yaml +9 -0
  15. endoreg_db/data/db_summary.csv +58 -0
  16. endoreg_db/data/db_summary.xlsx +0 -0
  17. endoreg_db/data/disease/misc.yaml +1 -2
  18. endoreg_db/data/endoscopy_processor/data.yaml +3 -0
  19. endoreg_db/data/event/cardiology.yaml +0 -13
  20. endoreg_db/data/examination/examinations/data.yaml +14 -9
  21. endoreg_db/data/examination_indication/endoscopy.yaml +30 -30
  22. endoreg_db/data/examination_indication_classification/endoscopy.yaml +11 -11
  23. endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
  24. endoreg_db/data/finding/anatomy_colon.yaml +128 -0
  25. endoreg_db/data/finding/colonoscopy.yaml +40 -0
  26. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
  27. endoreg_db/data/finding/complication.yaml +16 -0
  28. endoreg_db/data/finding/data.yaml +3 -46
  29. endoreg_db/data/finding/examination_setting.yaml +16 -0
  30. endoreg_db/data/finding/medication_related.yaml +18 -0
  31. endoreg_db/data/finding/outcome.yaml +12 -0
  32. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
  33. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
  34. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
  35. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
  36. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
  37. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
  38. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
  39. endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
  40. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
  41. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
  42. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
  43. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
  44. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
  45. endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
  46. endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
  47. endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
  48. endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
  49. endoreg_db/data/finding_classification/medication_related.yaml +23 -0
  50. endoreg_db/data/finding_classification/visualized.yaml +33 -0
  51. endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
  52. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_circularity_default.yaml +0 -2
  53. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
  54. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
  55. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
  56. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_nice.yaml +4 -7
  57. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_paris.yaml +0 -8
  58. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_planarity_default.yaml +6 -13
  59. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
  60. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_surface_intact_default.yaml +3 -6
  61. endoreg_db/data/{finding_location_classification_choice/colonoscopy.yaml → finding_classification_choice/colonoscopy_location.yaml} +11 -22
  62. endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
  63. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
  64. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
  65. endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
  66. endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
  67. endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
  68. endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
  69. endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
  70. endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
  71. endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
  72. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +8 -3
  73. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +6 -6
  74. endoreg_db/data/finding_type/data.yaml +23 -10
  75. endoreg_db/data/gender/data.yaml +8 -1
  76. endoreg_db/data/information_source/annotation.yaml +6 -0
  77. endoreg_db/data/information_source/prediction.yaml +7 -0
  78. endoreg_db/data/information_source_type/data.yaml +8 -0
  79. endoreg_db/data/lab_value/misc.yaml +43 -0
  80. endoreg_db/data/medication/anticoagulation.yaml +5 -5
  81. endoreg_db/data/medication/tah.yaml +5 -5
  82. endoreg_db/data/medication_intake_time/base.yaml +4 -4
  83. endoreg_db/data/names_first/first_names.yaml +3 -0
  84. endoreg_db/data/pdf_type/data.yaml +26 -2
  85. endoreg_db/data/qualification/endoscopy.yaml +36 -0
  86. endoreg_db/data/qualification/m2.yaml +39 -0
  87. endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
  88. endoreg_db/data/qualification/sonography.yaml +36 -0
  89. endoreg_db/data/qualification_type/base.yaml +29 -0
  90. endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
  91. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
  92. endoreg_db/data/requirement/age.yaml +26 -0
  93. endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
  94. endoreg_db/data/requirement/disease_cardiovascular.yaml +6 -6
  95. endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +9 -6
  96. endoreg_db/data/requirement/disease_hepatology.yaml +1 -1
  97. endoreg_db/data/requirement/disease_misc.yaml +3 -3
  98. endoreg_db/data/requirement/disease_renal.yaml +18 -2
  99. endoreg_db/data/requirement/{colonoscopy_indications.yaml → endoscopy_bleeding_risk.yaml} +6 -3
  100. endoreg_db/data/requirement/event_cardiology.yaml +17 -17
  101. endoreg_db/data/requirement/event_requirements.yaml +145 -0
  102. endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
  103. endoreg_db/data/requirement/gender.yaml +25 -0
  104. endoreg_db/data/requirement/lab_value.yaml +352 -31
  105. endoreg_db/data/requirement/medication.yaml +93 -0
  106. endoreg_db/data/requirement_operator/age.yaml +13 -0
  107. endoreg_db/data/requirement_operator/lab_operators.yaml +36 -35
  108. endoreg_db/data/requirement_operator/model_operators.yaml +13 -7
  109. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
  110. endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
  111. endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +42 -2
  112. endoreg_db/data/requirement_type/requirement_types.yaml +82 -0
  113. endoreg_db/data/shift/endoscopy.yaml +21 -0
  114. endoreg_db/data/shift_type/base.yaml +35 -0
  115. endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
  116. endoreg_db/data/unit/concentration.yaml +23 -0
  117. endoreg_db/exceptions.py +19 -0
  118. endoreg_db/forms/patient_finding_intervention_form.py +4 -5
  119. endoreg_db/forms/patient_form.py +7 -6
  120. endoreg_db/forms/questionnaires/__init__.py +1 -1
  121. endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
  122. endoreg_db/helpers/count_db.py +45 -0
  123. endoreg_db/helpers/data_loader.py +208 -0
  124. endoreg_db/helpers/default_objects.py +359 -0
  125. endoreg_db/helpers/download_segmentation_model.py +31 -0
  126. endoreg_db/helpers/interact.py +6 -0
  127. endoreg_db/helpers/test_video_helper.py +119 -0
  128. endoreg_db/logger_conf.py +140 -0
  129. endoreg_db/management/__init__.py +1 -0
  130. endoreg_db/management/commands/__init__.py +1 -0
  131. endoreg_db/management/commands/anonymize_video.py +0 -0
  132. endoreg_db/management/commands/check_auth.py +125 -0
  133. endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
  134. endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
  135. endoreg_db/management/commands/fix_video_paths.py +165 -0
  136. endoreg_db/management/commands/import_fallback_video.py +203 -0
  137. endoreg_db/management/commands/import_report.py +298 -0
  138. endoreg_db/management/commands/import_video.py +422 -0
  139. endoreg_db/management/commands/import_video_with_classification.py +367 -0
  140. endoreg_db/management/commands/init_default_ai_model.py +112 -0
  141. endoreg_db/management/commands/load_ai_model_data.py +2 -7
  142. endoreg_db/management/commands/load_base_db_data.py +1 -0
  143. endoreg_db/management/commands/load_endoscope_data.py +2 -2
  144. endoreg_db/management/commands/load_examination_indication_data.py +2 -3
  145. endoreg_db/management/commands/load_finding_data.py +49 -92
  146. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -1
  147. endoreg_db/management/commands/load_information_source.py +13 -7
  148. endoreg_db/management/commands/load_name_data.py +37 -0
  149. endoreg_db/management/commands/load_qualification_data.py +59 -0
  150. endoreg_db/management/commands/load_requirement_data.py +30 -6
  151. endoreg_db/management/commands/load_shift_data.py +60 -0
  152. endoreg_db/management/commands/load_tag_data.py +57 -0
  153. endoreg_db/management/commands/register_ai_model.py +1 -1
  154. endoreg_db/management/commands/start_filewatcher.py +106 -0
  155. endoreg_db/management/commands/storage_management.py +548 -0
  156. endoreg_db/management/commands/summarize_db_content.py +189 -0
  157. endoreg_db/management/commands/validate_video.py +204 -0
  158. endoreg_db/management/commands/validate_video_files.py +161 -0
  159. endoreg_db/management/commands/video_validation.py +22 -0
  160. endoreg_db/migrations/0001_initial.py +625 -813
  161. endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
  162. endoreg_db/models/__init__.py +270 -307
  163. endoreg_db/models/administration/__init__.py +116 -0
  164. endoreg_db/models/{ai_model → administration/ai}/__init__.py +6 -1
  165. endoreg_db/models/administration/ai/active_model.py +35 -0
  166. endoreg_db/models/administration/ai/ai_model.py +156 -0
  167. endoreg_db/models/{ai_model → administration/ai}/model_type.py +6 -1
  168. endoreg_db/models/administration/case/__init__.py +19 -0
  169. endoreg_db/models/administration/case/case.py +114 -0
  170. endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +3 -3
  171. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +3 -10
  172. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +2 -4
  173. endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
  174. endoreg_db/models/{center → administration/center}/__init__.py +3 -1
  175. endoreg_db/models/administration/center/center.py +61 -0
  176. endoreg_db/models/administration/center/center_product.py +64 -0
  177. endoreg_db/models/{center → administration/center}/center_resource.py +19 -3
  178. endoreg_db/models/administration/center/center_shift.py +88 -0
  179. endoreg_db/models/administration/center/center_waste.py +30 -0
  180. endoreg_db/models/administration/permissions/__init__.py +44 -0
  181. endoreg_db/models/administration/person/__init__.py +24 -0
  182. endoreg_db/models/administration/person/employee/__init__.py +3 -0
  183. endoreg_db/models/administration/person/employee/employee.py +35 -0
  184. endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
  185. endoreg_db/models/administration/person/employee/employee_type.py +42 -0
  186. endoreg_db/models/administration/person/examiner/__init__.py +4 -0
  187. endoreg_db/models/administration/person/examiner/examiner.py +54 -0
  188. endoreg_db/models/administration/person/names/__init__.py +0 -0
  189. endoreg_db/models/{persons → administration/person/names}/first_name.py +1 -1
  190. endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
  191. endoreg_db/models/administration/person/patient/__init__.py +5 -0
  192. endoreg_db/models/administration/person/patient/patient.py +460 -0
  193. endoreg_db/models/administration/person/profession/__init__.py +24 -0
  194. endoreg_db/models/administration/person/user/__init__.py +5 -0
  195. endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
  196. endoreg_db/models/administration/product/product.py +97 -0
  197. endoreg_db/models/administration/product/product_group.py +39 -0
  198. endoreg_db/models/administration/product/product_material.py +54 -0
  199. endoreg_db/models/{product → administration/product}/product_weight.py +9 -0
  200. endoreg_db/models/{product → administration/product}/reference_product.py +26 -11
  201. endoreg_db/models/administration/qualification/__init__.py +7 -0
  202. endoreg_db/models/administration/qualification/qualification.py +37 -0
  203. endoreg_db/models/administration/qualification/qualification_type.py +35 -0
  204. endoreg_db/models/administration/shift/__init__.py +9 -0
  205. endoreg_db/models/administration/shift/scheduled_days.py +69 -0
  206. endoreg_db/models/administration/shift/shift.py +51 -0
  207. endoreg_db/models/administration/shift/shift_type.py +108 -0
  208. endoreg_db/models/label/__init__.py +24 -1
  209. endoreg_db/models/label/annotation/__init__.py +12 -0
  210. endoreg_db/models/label/annotation/image_classification.py +84 -0
  211. endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
  212. endoreg_db/models/label/label.py +45 -74
  213. endoreg_db/models/label/label_set.py +53 -0
  214. endoreg_db/models/label/label_type.py +29 -0
  215. endoreg_db/models/label/label_video_segment/__init__.py +3 -0
  216. endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
  217. endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
  218. endoreg_db/models/label/video_segmentation_label.py +31 -0
  219. endoreg_db/models/{annotation → label}/video_segmentation_labelset.py +7 -0
  220. endoreg_db/models/media/__init__.py +14 -0
  221. endoreg_db/models/media/frame/__init__.py +3 -0
  222. endoreg_db/models/media/frame/frame.py +111 -0
  223. endoreg_db/models/media/pdf/__init__.py +11 -0
  224. endoreg_db/models/media/pdf/raw_pdf.py +608 -0
  225. endoreg_db/models/media/pdf/report_file.py +162 -0
  226. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
  227. endoreg_db/models/media/video/__init__.py +4 -0
  228. endoreg_db/models/media/video/create_from_file.py +336 -0
  229. endoreg_db/models/media/video/pipe_1.py +207 -0
  230. endoreg_db/models/media/video/pipe_2.py +105 -0
  231. endoreg_db/models/media/video/refactor_plan.md +0 -0
  232. endoreg_db/models/media/video/video_file.py +680 -0
  233. endoreg_db/models/media/video/video_file_ai.py +443 -0
  234. endoreg_db/models/media/video/video_file_anonymize.py +348 -0
  235. endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
  236. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
  237. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
  238. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
  239. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
  240. endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
  241. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
  242. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
  243. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
  244. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
  245. endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
  246. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
  247. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +129 -0
  248. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
  249. endoreg_db/models/media/video/video_file_frames.py +0 -0
  250. endoreg_db/models/media/video/video_file_io.py +166 -0
  251. endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
  252. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
  253. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
  254. endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
  255. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
  256. endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
  257. endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
  258. endoreg_db/models/media/video/video_file_meta.py +11 -0
  259. endoreg_db/models/media/video/video_file_segments.py +209 -0
  260. endoreg_db/models/medical/__init__.py +146 -0
  261. endoreg_db/models/{contraindication → medical/contraindication}/__init__.py +1 -5
  262. endoreg_db/models/{disease.py → medical/disease.py} +60 -52
  263. endoreg_db/models/{event.py → medical/event.py} +31 -54
  264. endoreg_db/models/{examination → medical/examination}/__init__.py +1 -1
  265. endoreg_db/models/medical/examination/examination.py +148 -0
  266. endoreg_db/models/{examination → medical/examination}/examination_indication.py +64 -35
  267. endoreg_db/models/{examination → medical/examination}/examination_time.py +0 -4
  268. endoreg_db/models/{examination → medical/examination}/examination_time_type.py +1 -8
  269. endoreg_db/models/{examination → medical/examination}/examination_type.py +1 -7
  270. endoreg_db/models/medical/finding/__init__.py +18 -0
  271. endoreg_db/models/medical/finding/finding.py +96 -0
  272. endoreg_db/models/medical/finding/finding_classification.py +142 -0
  273. endoreg_db/models/{finding → medical/finding}/finding_intervention.py +2 -10
  274. endoreg_db/models/medical/finding/finding_type.py +35 -0
  275. endoreg_db/models/medical/hardware/__init__.py +8 -0
  276. endoreg_db/models/{hardware → medical/hardware}/endoscope.py +28 -23
  277. endoreg_db/models/medical/laboratory/__init__.py +5 -0
  278. endoreg_db/models/medical/laboratory/lab_value.py +419 -0
  279. endoreg_db/models/{medication → medical/medication}/medication.py +1 -3
  280. endoreg_db/models/{medication → medical/medication}/medication_indication_type.py +8 -3
  281. endoreg_db/models/{medication → medical/medication}/medication_intake_time.py +21 -3
  282. endoreg_db/models/{medication → medical/medication}/medication_schedule.py +13 -5
  283. endoreg_db/models/{organ → medical/organ}/__init__.py +3 -6
  284. endoreg_db/models/medical/patient/__init__.py +56 -0
  285. endoreg_db/models/medical/patient/medication_examples.py +38 -0
  286. endoreg_db/models/medical/patient/patient_disease.py +63 -0
  287. endoreg_db/models/medical/patient/patient_event.py +75 -0
  288. endoreg_db/models/medical/patient/patient_examination.py +249 -0
  289. endoreg_db/models/{persons → medical}/patient/patient_examination_indication.py +21 -9
  290. endoreg_db/models/medical/patient/patient_finding.py +357 -0
  291. endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
  292. endoreg_db/models/{patient → medical/patient}/patient_finding_intervention.py +15 -1
  293. endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
  294. endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +40 -15
  295. endoreg_db/models/medical/patient/patient_medication.py +104 -0
  296. endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
  297. endoreg_db/models/{risk → medical/risk}/risk_type.py +0 -4
  298. endoreg_db/models/{data_file/metadata → metadata}/__init__.py +6 -0
  299. endoreg_db/models/metadata/frame_ocr_result.py +0 -0
  300. endoreg_db/models/metadata/model_meta.py +193 -0
  301. endoreg_db/models/metadata/model_meta_logic.py +236 -0
  302. endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +28 -13
  303. endoreg_db/models/metadata/sensitive_meta.py +288 -0
  304. endoreg_db/models/metadata/sensitive_meta_logic.py +643 -0
  305. endoreg_db/models/metadata/video_meta.py +332 -0
  306. endoreg_db/models/metadata/video_prediction_logic.py +190 -0
  307. endoreg_db/models/metadata/video_prediction_meta.py +270 -0
  308. endoreg_db/models/other/__init__.py +17 -0
  309. endoreg_db/models/other/distribution/date_value_distribution.py +0 -2
  310. endoreg_db/models/other/distribution/numeric_value_distribution.py +30 -2
  311. endoreg_db/models/{emission → other/emission}/emission_factor.py +15 -6
  312. endoreg_db/models/{persons → other}/gender.py +8 -3
  313. endoreg_db/models/other/information_source.py +159 -0
  314. endoreg_db/models/other/material.py +10 -2
  315. endoreg_db/models/other/resource.py +6 -2
  316. endoreg_db/models/other/tag.py +27 -0
  317. endoreg_db/models/other/transport_route.py +13 -2
  318. endoreg_db/models/{unit.py → other/unit.py} +16 -6
  319. endoreg_db/models/other/waste.py +10 -3
  320. endoreg_db/models/requirement/requirement.py +556 -114
  321. endoreg_db/models/requirement/requirement_evaluation/__init__.py +4 -132
  322. endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
  323. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
  324. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +80 -87
  325. endoreg_db/models/requirement/requirement_operator.py +132 -14
  326. endoreg_db/models/requirement/requirement_set.py +181 -21
  327. endoreg_db/models/rule/__init__.py +13 -0
  328. endoreg_db/models/{rules → rule}/rule.py +6 -3
  329. endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
  330. endoreg_db/models/{rules → rule}/rule_type.py +0 -2
  331. endoreg_db/models/{rules → rule}/ruleset.py +0 -2
  332. endoreg_db/models/state/__init__.py +12 -0
  333. endoreg_db/models/state/abstract.py +11 -0
  334. endoreg_db/models/state/audit_ledger.py +150 -0
  335. endoreg_db/models/state/label_video_segment.py +22 -0
  336. endoreg_db/models/state/raw_pdf.py +187 -0
  337. endoreg_db/models/state/sensitive_meta.py +46 -0
  338. endoreg_db/models/state/video.py +232 -0
  339. endoreg_db/models/upload_job.py +99 -0
  340. endoreg_db/models/utils.py +135 -0
  341. endoreg_db/models/video_metadata.py +66 -0
  342. endoreg_db/models/video_processing.py +153 -0
  343. endoreg_db/renames.yml +8 -0
  344. endoreg_db/root_urls.py +9 -0
  345. endoreg_db/schemas/__init__.py +0 -0
  346. endoreg_db/schemas/examination_evaluation.py +27 -0
  347. endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
  348. endoreg_db/serializers/__init__.py +147 -10
  349. endoreg_db/serializers/{raw_pdf_meta_validation.py → _old/raw_pdf_meta_validation.py} +3 -3
  350. endoreg_db/serializers/{raw_video_meta_validation.py → _old/raw_video_meta_validation.py} +18 -14
  351. endoreg_db/serializers/_old/video.py +71 -0
  352. endoreg_db/serializers/administration/__init__.py +14 -0
  353. endoreg_db/serializers/administration/ai/__init__.py +10 -0
  354. endoreg_db/serializers/administration/ai/active_model.py +10 -0
  355. endoreg_db/serializers/administration/ai/ai_model.py +18 -0
  356. endoreg_db/serializers/administration/ai/model_type.py +10 -0
  357. endoreg_db/serializers/administration/center.py +9 -0
  358. endoreg_db/serializers/administration/gender.py +9 -0
  359. endoreg_db/serializers/anonymization.py +69 -0
  360. endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
  361. endoreg_db/serializers/examination/__init__.py +10 -0
  362. endoreg_db/serializers/examination/base.py +46 -0
  363. endoreg_db/serializers/examination/dropdown.py +21 -0
  364. endoreg_db/serializers/examination_serializer.py +12 -0
  365. endoreg_db/serializers/finding/__init__.py +5 -0
  366. endoreg_db/serializers/finding/finding.py +54 -0
  367. endoreg_db/serializers/finding_classification/__init__.py +7 -0
  368. endoreg_db/serializers/finding_classification/choice.py +19 -0
  369. endoreg_db/serializers/finding_classification/classification.py +13 -0
  370. endoreg_db/serializers/label/__init__.py +7 -0
  371. endoreg_db/serializers/label/image_classification_annotation.py +62 -0
  372. endoreg_db/serializers/label/label.py +15 -0
  373. endoreg_db/serializers/label_video_segment/__init__.py +7 -0
  374. endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
  375. endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
  376. endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
  377. endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
  378. endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
  379. endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
  380. endoreg_db/serializers/meta/__init__.py +19 -0
  381. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
  382. endoreg_db/serializers/meta/report_meta.py +53 -0
  383. endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
  384. endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
  385. endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
  386. endoreg_db/serializers/meta/video_meta.py +39 -0
  387. endoreg_db/serializers/misc/__init__.py +14 -0
  388. endoreg_db/serializers/misc/file_overview.py +152 -0
  389. endoreg_db/serializers/misc/stats.py +33 -0
  390. endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
  391. endoreg_db/serializers/misc/upload_job.py +71 -0
  392. endoreg_db/serializers/misc/vop_patient_data.py +120 -0
  393. endoreg_db/serializers/patient/__init__.py +11 -0
  394. endoreg_db/serializers/patient/patient.py +86 -0
  395. endoreg_db/serializers/patient/patient_dropdown.py +27 -0
  396. endoreg_db/serializers/patient_examination/__init__.py +7 -0
  397. endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
  398. endoreg_db/serializers/patient_finding/__init__.py +15 -0
  399. endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
  400. endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
  401. endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
  402. endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
  403. endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
  404. endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
  405. endoreg_db/serializers/pdf/__init__.py +5 -0
  406. endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
  407. endoreg_db/serializers/report/__init__.py +9 -0
  408. endoreg_db/serializers/report/mixins.py +45 -0
  409. endoreg_db/serializers/report/report.py +105 -0
  410. endoreg_db/serializers/report/report_list.py +22 -0
  411. endoreg_db/serializers/report/secure_file_url.py +26 -0
  412. endoreg_db/serializers/requirements/requirement_schema.py +25 -0
  413. endoreg_db/serializers/requirements/requirement_sets.py +29 -0
  414. endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
  415. endoreg_db/serializers/video/__init__.py +7 -0
  416. endoreg_db/serializers/video/segmentation.py +263 -0
  417. endoreg_db/serializers/video/video_file_brief.py +10 -0
  418. endoreg_db/serializers/video/video_file_detail.py +83 -0
  419. endoreg_db/serializers/video/video_file_list.py +67 -0
  420. endoreg_db/serializers/video/video_metadata.py +105 -0
  421. endoreg_db/serializers/video/video_processing_history.py +153 -0
  422. endoreg_db/services/__init__.py +5 -0
  423. endoreg_db/services/anonymization.py +223 -0
  424. endoreg_db/services/examination_evaluation.py +149 -0
  425. endoreg_db/services/finding_description_service.py +0 -0
  426. endoreg_db/services/lookup_service.py +241 -0
  427. endoreg_db/services/lookup_store.py +122 -0
  428. endoreg_db/services/ollama_api_docs.py +1528 -0
  429. endoreg_db/services/pdf_import.py +963 -0
  430. endoreg_db/services/polling_coordinator.py +288 -0
  431. endoreg_db/services/pseudonym_service.py +89 -0
  432. endoreg_db/services/requirements_object.py +147 -0
  433. endoreg_db/services/segment_sync.py +155 -0
  434. endoreg_db/services/storage_aware_video_processor.py +344 -0
  435. endoreg_db/services/video_import.py +1118 -0
  436. endoreg_db/tasks/upload_tasks.py +207 -0
  437. endoreg_db/tasks/video_ingest.py +157 -0
  438. endoreg_db/tasks/video_processing_tasks.py +327 -0
  439. endoreg_db/urls/__init__.py +70 -0
  440. endoreg_db/urls/anonymization.py +32 -0
  441. endoreg_db/urls/auth.py +16 -0
  442. endoreg_db/urls/classification.py +39 -0
  443. endoreg_db/urls/examination.py +54 -0
  444. endoreg_db/urls/files.py +6 -0
  445. endoreg_db/urls/label_video_segment_validate.py +33 -0
  446. endoreg_db/urls/label_video_segments.py +44 -0
  447. endoreg_db/urls/media.py +229 -0
  448. endoreg_db/urls/patient.py +19 -0
  449. endoreg_db/urls/report.py +48 -0
  450. endoreg_db/urls/requirements.py +13 -0
  451. endoreg_db/urls/stats.py +46 -0
  452. endoreg_db/urls/upload.py +20 -0
  453. endoreg_db/urls/video.py +61 -0
  454. endoreg_db/urls.py +6 -283
  455. endoreg_db/utils/__init__.py +66 -57
  456. endoreg_db/utils/ai/__init__.py +9 -0
  457. endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
  458. endoreg_db/{models/ai_model/lightning → utils/ai}/inference_dataset.py +0 -1
  459. endoreg_db/{models/ai_model/lightning → utils/ai}/multilabel_classification_net.py +14 -10
  460. endoreg_db/{models/ai_model/lightning → utils/ai}/postprocess.py +15 -5
  461. endoreg_db/utils/ai/predict.py +291 -0
  462. endoreg_db/{models/ai_model/lightning → utils/ai}/preprocess.py +1 -1
  463. endoreg_db/utils/calc_duration_seconds.py +24 -0
  464. endoreg_db/utils/case_generator/__init__.py +0 -0
  465. endoreg_db/utils/check_video_files.py +148 -0
  466. endoreg_db/utils/dataloader.py +50 -12
  467. endoreg_db/utils/dates.py +21 -0
  468. endoreg_db/utils/env.py +33 -0
  469. endoreg_db/utils/extract_specific_frames.py +72 -0
  470. endoreg_db/utils/file_operations.py +29 -1
  471. endoreg_db/utils/fix_video_path_direct.py +141 -0
  472. endoreg_db/utils/frame_anonymization_utils.py +463 -0
  473. endoreg_db/utils/links/__init__.py +0 -0
  474. endoreg_db/utils/links/requirement_link.py +193 -0
  475. endoreg_db/utils/mime_types.py +0 -0
  476. endoreg_db/utils/names.py +2 -0
  477. endoreg_db/utils/paths.py +100 -82
  478. endoreg_db/utils/permissions.py +143 -0
  479. endoreg_db/utils/pipelines/Readme.md +235 -0
  480. endoreg_db/utils/pipelines/__init__.py +0 -0
  481. endoreg_db/utils/pipelines/process_video_dir.py +120 -0
  482. endoreg_db/utils/product/__init__.py +0 -0
  483. endoreg_db/utils/product/sum_emissions.py +20 -0
  484. endoreg_db/utils/product/sum_weights.py +18 -0
  485. endoreg_db/utils/pydantic_models/db_config.py +1 -1
  486. endoreg_db/utils/requirement_helpers.py +0 -0
  487. endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
  488. endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
  489. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
  490. endoreg_db/utils/translation.py +27 -0
  491. endoreg_db/utils/validate_video_detailed.py +357 -0
  492. endoreg_db/utils/video/__init__.py +19 -6
  493. endoreg_db/utils/video/extract_frames.py +37 -70
  494. endoreg_db/utils/video/ffmpeg_wrapper.py +772 -0
  495. endoreg_db/utils/video/names.py +42 -0
  496. endoreg_db/utils/video/streaming_processor.py +312 -0
  497. endoreg_db/utils/video/video_splitter.py +94 -0
  498. endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
  499. endoreg_db/views/__init__.py +282 -2
  500. endoreg_db/views/anonymization/__init__.py +27 -0
  501. endoreg_db/views/anonymization/media_management.py +454 -0
  502. endoreg_db/views/anonymization/overview.py +216 -0
  503. endoreg_db/views/anonymization/validate.py +66 -0
  504. endoreg_db/views/auth/__init__.py +13 -0
  505. endoreg_db/views/{views.py → auth/keycloak.py} +19 -13
  506. endoreg_db/views/examination/__init__.py +33 -0
  507. endoreg_db/views/examination/examination.py +37 -0
  508. endoreg_db/views/examination/examination_manifest_cache.py +26 -0
  509. endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
  510. endoreg_db/views/examination/get_finding_classifications.py +36 -0
  511. endoreg_db/views/examination/get_findings.py +41 -0
  512. endoreg_db/views/examination/get_instruments.py +18 -0
  513. endoreg_db/views/examination/get_interventions.py +14 -0
  514. endoreg_db/views/finding/__init__.py +9 -0
  515. endoreg_db/views/finding/finding.py +112 -0
  516. endoreg_db/views/finding/get_classifications.py +14 -0
  517. endoreg_db/views/finding/get_interventions.py +17 -0
  518. endoreg_db/views/finding_classification/__init__.py +13 -0
  519. endoreg_db/views/finding_classification/base.py +0 -0
  520. endoreg_db/views/finding_classification/finding_classification.py +42 -0
  521. endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
  522. endoreg_db/views/label/__init__.py +5 -0
  523. endoreg_db/views/label/label.py +15 -0
  524. endoreg_db/views/label_video_segment/__init__.py +16 -0
  525. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
  526. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
  527. endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
  528. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
  529. endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
  530. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
  531. endoreg_db/views/label_video_segment/validate.py +226 -0
  532. endoreg_db/views/media/__init__.py +45 -0
  533. endoreg_db/views/media/pdf_media.py +386 -0
  534. endoreg_db/views/media/segments.py +71 -0
  535. endoreg_db/views/media/sensitive_metadata.py +314 -0
  536. endoreg_db/views/media/video_media.py +272 -0
  537. endoreg_db/views/media/video_segments.py +596 -0
  538. endoreg_db/views/meta/__init__.py +15 -0
  539. endoreg_db/views/meta/available_files_list.py +146 -0
  540. endoreg_db/views/meta/report_meta.py +53 -0
  541. endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
  542. endoreg_db/views/meta/sensitive_meta_list.py +104 -0
  543. endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
  544. endoreg_db/views/misc/__init__.py +63 -0
  545. endoreg_db/views/misc/center.py +13 -0
  546. endoreg_db/views/misc/gender.py +14 -0
  547. endoreg_db/views/misc/secure_file_serving_view.py +80 -0
  548. endoreg_db/views/misc/secure_file_url_view.py +84 -0
  549. endoreg_db/views/misc/secure_url_validate.py +79 -0
  550. endoreg_db/views/misc/stats.py +220 -0
  551. endoreg_db/views/misc/translation.py +182 -0
  552. endoreg_db/views/misc/upload_views.py +240 -0
  553. endoreg_db/views/patient/__init__.py +5 -0
  554. endoreg_db/views/patient/patient.py +210 -0
  555. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
  556. endoreg_db/views/patient_examination/__init__.py +11 -0
  557. endoreg_db/views/patient_examination/patient_examination.py +140 -0
  558. endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
  559. endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
  560. endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
  561. endoreg_db/views/patient_examination/video.py +194 -0
  562. endoreg_db/views/patient_finding/__init__.py +7 -0
  563. endoreg_db/views/patient_finding/base.py +0 -0
  564. endoreg_db/views/patient_finding/patient_finding.py +64 -0
  565. endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
  566. endoreg_db/views/patient_finding_classification/__init__.py +5 -0
  567. endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
  568. endoreg_db/views/patient_finding_location/__init__.py +5 -0
  569. endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
  570. endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
  571. endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
  572. endoreg_db/views/pdf/__init__.py +11 -0
  573. endoreg_db/views/pdf/pdf_media.py +239 -0
  574. endoreg_db/views/pdf/pdf_stream_views.py +127 -0
  575. endoreg_db/views/pdf/reimport.py +161 -0
  576. endoreg_db/views/report/__init__.py +9 -0
  577. endoreg_db/views/report/report_list.py +112 -0
  578. endoreg_db/views/report/report_with_secure_url.py +28 -0
  579. endoreg_db/views/report/start_examination.py +7 -0
  580. endoreg_db/views/requirement/__init__.py +10 -0
  581. endoreg_db/views/requirement/evaluate.py +279 -0
  582. endoreg_db/views/requirement/lookup.py +483 -0
  583. endoreg_db/views/requirement/lookup_store.py +252 -0
  584. endoreg_db/views/requirement_lookup/lookup.py +0 -0
  585. endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
  586. endoreg_db/views/stats/__init__.py +13 -0
  587. endoreg_db/views/stats/stats_views.py +229 -0
  588. endoreg_db/views/video/__init__.py +64 -0
  589. endoreg_db/views/video/correction.py +672 -0
  590. endoreg_db/views/video/reimport.py +195 -0
  591. endoreg_db/views/video/segmentation.py +274 -0
  592. endoreg_db/views/video/task_status.py +49 -0
  593. endoreg_db/views/{views_for_timeline.py → video/timeline.py} +3 -3
  594. endoreg_db/views/video/video_analyze.py +52 -0
  595. endoreg_db/views/video/video_apply_mask.py +48 -0
  596. endoreg_db/views/video/video_correction.py +21 -0
  597. endoreg_db/views/video/video_download_processed.py +58 -0
  598. endoreg_db/views/video/video_examination_viewset.py +329 -0
  599. endoreg_db/views/video/video_media.py +158 -0
  600. endoreg_db/views/video/video_meta.py +29 -0
  601. endoreg_db/views/video/video_processing_history.py +24 -0
  602. endoreg_db/views/video/video_remove_frames.py +48 -0
  603. endoreg_db/views/video/video_reprocess.py +40 -0
  604. endoreg_db/views/video/video_stream.py +306 -0
  605. endoreg_db-0.8.2.dist-info/METADATA +384 -0
  606. endoreg_db-0.8.2.dist-info/RECORD +790 -0
  607. endoreg_db/data/agl_service/data.yaml +0 -19
  608. endoreg_db/data/finding_location_classification/colonoscopy.yaml +0 -46
  609. endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +0 -48
  610. endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +0 -57
  611. endoreg_db/management/commands/_load_model_template.py +0 -41
  612. endoreg_db/management/commands/delete_all.py +0 -18
  613. endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
  614. endoreg_db/management/commands/fix_auth_permission.py +0 -20
  615. endoreg_db/management/commands/load_active_model_data.py +0 -45
  616. endoreg_db/management/commands/load_g_play_data.py +0 -113
  617. endoreg_db/management/commands/load_logging_data.py +0 -39
  618. endoreg_db/management/commands/load_lx_data.py +0 -64
  619. endoreg_db/management/commands/load_medication_indication_data.py +0 -63
  620. endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
  621. endoreg_db/management/commands/load_medication_intake_time_data.py +0 -41
  622. endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
  623. endoreg_db/management/commands/load_network_data.py +0 -57
  624. endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +0 -23
  625. endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +0 -23
  626. endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +0 -25
  627. endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +0 -33
  628. endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +0 -23
  629. endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +0 -24
  630. endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +0 -48
  631. endoreg_db/migrations/0009_requirementoperator_requirementsettype_and_more.py +0 -154
  632. endoreg_db/models/ai_model/active_model.py +0 -9
  633. endoreg_db/models/ai_model/ai_model.py +0 -90
  634. endoreg_db/models/ai_model/lightning/__init__.py +0 -3
  635. endoreg_db/models/ai_model/lightning/predict.py +0 -172
  636. endoreg_db/models/ai_model/lightning/prediction_visualizer.py +0 -55
  637. endoreg_db/models/ai_model/lightning/run_visualizer.py +0 -21
  638. endoreg_db/models/ai_model/model_meta.py +0 -240
  639. endoreg_db/models/annotation/__init__.py +0 -32
  640. endoreg_db/models/annotation/anonymized_image_annotation.py +0 -115
  641. endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -117
  642. endoreg_db/models/annotation/image_classification.py +0 -86
  643. endoreg_db/models/annotation/video_segmentation_annotation.py +0 -52
  644. endoreg_db/models/case/__init__.py +0 -1
  645. endoreg_db/models/case/case.py +0 -34
  646. endoreg_db/models/center/center.py +0 -51
  647. endoreg_db/models/center/center_product.py +0 -33
  648. endoreg_db/models/center/center_waste.py +0 -16
  649. endoreg_db/models/data_file/__init__.py +0 -39
  650. endoreg_db/models/data_file/base_classes/__init__.py +0 -7
  651. endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -98
  652. endoreg_db/models/data_file/base_classes/abstract_pdf.py +0 -127
  653. endoreg_db/models/data_file/base_classes/abstract_video.py +0 -806
  654. endoreg_db/models/data_file/base_classes/frame_helpers.py +0 -17
  655. endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +0 -19
  656. endoreg_db/models/data_file/base_classes/utils.py +0 -58
  657. endoreg_db/models/data_file/frame.py +0 -29
  658. endoreg_db/models/data_file/import_classes/__init__.py +0 -18
  659. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
  660. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
  661. endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
  662. endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -254
  663. endoreg_db/models/data_file/import_classes/raw_video.py +0 -290
  664. endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -290
  665. endoreg_db/models/data_file/metadata/video_meta.py +0 -199
  666. endoreg_db/models/data_file/report_file.py +0 -56
  667. endoreg_db/models/data_file/video/__init__.py +0 -11
  668. endoreg_db/models/data_file/video/import_meta.py +0 -25
  669. endoreg_db/models/data_file/video/video.py +0 -196
  670. endoreg_db/models/data_file/video_segment.py +0 -214
  671. endoreg_db/models/examination/examination.py +0 -67
  672. endoreg_db/models/finding/__init__.py +0 -11
  673. endoreg_db/models/finding/finding.py +0 -75
  674. endoreg_db/models/finding/finding_location_classification.py +0 -94
  675. endoreg_db/models/finding/finding_morphology_classification.py +0 -89
  676. endoreg_db/models/finding/finding_type.py +0 -22
  677. endoreg_db/models/hardware/__init__.py +0 -2
  678. endoreg_db/models/information_source.py +0 -65
  679. endoreg_db/models/laboratory/__init__.py +0 -1
  680. endoreg_db/models/laboratory/lab_value.py +0 -162
  681. endoreg_db/models/logging/__init__.py +0 -11
  682. endoreg_db/models/logging/agl_service.py +0 -19
  683. endoreg_db/models/logging/base.py +0 -22
  684. endoreg_db/models/logging/log_type.py +0 -23
  685. endoreg_db/models/logging/network_device.py +0 -27
  686. endoreg_db/models/lx/__init__.py +0 -4
  687. endoreg_db/models/lx/client.py +0 -57
  688. endoreg_db/models/lx/identity.py +0 -34
  689. endoreg_db/models/lx/permission.py +0 -18
  690. endoreg_db/models/lx/user.py +0 -16
  691. endoreg_db/models/network/__init__.py +0 -9
  692. endoreg_db/models/network/agl_service.py +0 -38
  693. endoreg_db/models/network/network_device.py +0 -58
  694. endoreg_db/models/network/network_device_type.py +0 -23
  695. endoreg_db/models/other/distribution.py +0 -5
  696. endoreg_db/models/patient/__init__.py +0 -24
  697. endoreg_db/models/patient/patient_examination.py +0 -182
  698. endoreg_db/models/patient/patient_finding.py +0 -143
  699. endoreg_db/models/patient/patient_finding_location.py +0 -120
  700. endoreg_db/models/patient/patient_finding_morphology.py +0 -166
  701. endoreg_db/models/permissions/__init__.py +0 -44
  702. endoreg_db/models/persons/__init__.py +0 -34
  703. endoreg_db/models/persons/examiner/__init__.py +0 -2
  704. endoreg_db/models/persons/examiner/examiner.py +0 -60
  705. endoreg_db/models/persons/examiner/examiner_type.py +0 -2
  706. endoreg_db/models/persons/patient/__init__.py +0 -8
  707. endoreg_db/models/persons/patient/patient.py +0 -389
  708. endoreg_db/models/persons/patient/patient_disease.py +0 -22
  709. endoreg_db/models/persons/patient/patient_event.py +0 -52
  710. endoreg_db/models/persons/patient/patient_lab_sample.py +0 -108
  711. endoreg_db/models/persons/patient/patient_medication.py +0 -59
  712. endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -88
  713. endoreg_db/models/persons/portal_user_information.py +0 -27
  714. endoreg_db/models/prediction/__init__.py +0 -8
  715. endoreg_db/models/prediction/image_classification.py +0 -51
  716. endoreg_db/models/prediction/video_prediction_meta.py +0 -306
  717. endoreg_db/models/product/product.py +0 -110
  718. endoreg_db/models/product/product_group.py +0 -27
  719. endoreg_db/models/product/product_material.py +0 -28
  720. endoreg_db/models/questionnaires/__init__.py +0 -114
  721. endoreg_db/models/quiz/__init__.py +0 -9
  722. endoreg_db/models/quiz/quiz_answer.py +0 -41
  723. endoreg_db/models/quiz/quiz_question.py +0 -54
  724. endoreg_db/models/report_reader/report_reader_config.py +0 -53
  725. endoreg_db/models/rules/__init__.py +0 -5
  726. endoreg_db/queries/get/__init__.py +0 -6
  727. endoreg_db/queries/get/center.py +0 -42
  728. endoreg_db/queries/get/model.py +0 -13
  729. endoreg_db/queries/get/patient.py +0 -14
  730. endoreg_db/queries/get/patient_examination.py +0 -20
  731. endoreg_db/queries/get/report_file.py +0 -33
  732. endoreg_db/queries/get/video.py +0 -31
  733. endoreg_db/serializers/ai_model.py +0 -19
  734. endoreg_db/serializers/annotation.py +0 -14
  735. endoreg_db/serializers/center.py +0 -11
  736. endoreg_db/serializers/examination.py +0 -33
  737. endoreg_db/serializers/frame.py +0 -9
  738. endoreg_db/serializers/hardware.py +0 -21
  739. endoreg_db/serializers/label.py +0 -22
  740. endoreg_db/serializers/patient.py +0 -33
  741. endoreg_db/serializers/prediction.py +0 -10
  742. endoreg_db/serializers/raw_pdf_anony_text_validation.py +0 -137
  743. endoreg_db/serializers/report_file.py +0 -7
  744. endoreg_db/serializers/video.py +0 -20
  745. endoreg_db/serializers/video_segmentation.py +0 -574
  746. endoreg_db/tests.py +0 -3
  747. endoreg_db/utils/legacy_ocr.py +0 -201
  748. endoreg_db/utils/video/transcode_videofile.py +0 -111
  749. endoreg_db/views/patient_views.py +0 -90
  750. endoreg_db/views/raw_pdf_anony_text_validation_views.py +0 -95
  751. endoreg_db/views/raw_pdf_meta_validation_views.py +0 -111
  752. endoreg_db/views/raw_video_meta_validation_views.py +0 -148
  753. endoreg_db/views/report_views.py +0 -96
  754. endoreg_db/views/video_segmentation_views.py +0 -166
  755. endoreg_db-0.6.4.dist-info/METADATA +0 -161
  756. endoreg_db-0.6.4.dist-info/RECORD +0 -470
  757. /endoreg_db/{case_generator/__init__.py → api/serializers/finding_descriptions.py} +0 -0
  758. /endoreg_db/{queries/get/annotation.py → api/views/finding_descriptions.py} +0 -0
  759. /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
  760. /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
  761. /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
  762. /endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +0 -0
  763. /endoreg_db/models/{persons → administration/person}/person.py +0 -0
  764. /endoreg_db/models/{product → administration/product}/__init__.py +0 -0
  765. /endoreg_db/models/{report_reader → media/pdf/report_reader}/__init__.py +0 -0
  766. /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
  767. /endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +0 -0
  768. /endoreg_db/models/{medication → medical/medication}/__init__.py +0 -0
  769. /endoreg_db/models/{medication → medical/medication}/medication_indication.py +0 -0
  770. /endoreg_db/models/{risk → medical/risk}/__init__.py +0 -0
  771. /endoreg_db/models/{risk → medical/risk}/risk.py +0 -0
  772. /endoreg_db/models/{emission → other/emission}/__init__.py +0 -0
  773. /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
  774. /endoreg_db/{case_generator → utils/case_generator}/case_generator.py +0 -0
  775. /endoreg_db/{case_generator → utils/case_generator}/lab_sample_factory.py +0 -0
  776. /endoreg_db/{case_generator → utils/case_generator}/utils.py +0 -0
  777. /endoreg_db/views/{csrf.py → misc/csrf.py} +0 -0
  778. {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.2.dist-info}/WHEEL +0 -0
  779. {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,806 +0,0 @@
1
- """ """
2
-
3
- from django.db import models
4
- from pathlib import Path
5
- from collections import defaultdict, Counter
6
- import shutil
7
- import os
8
- from typing import Optional, List, TYPE_CHECKING, Union
9
- from icecream import ic
10
- from endoreg_db.utils.hashs import get_video_hash
11
- from endoreg_db.utils.file_operations import get_uuid_filename
12
- from endoreg_db.utils.ocr import extract_text_from_rois
13
-
14
- from ....utils.video import (
15
- transcode_videofile,
16
- transcode_videofile_if_required,
17
- initialize_frame_objects,
18
- extract_frames,
19
- )
20
-
21
- from ..metadata import VideoMeta, SensitiveMeta
22
- from ....utils import (
23
- STORAGE_DIR,
24
- VIDEO_DIR,
25
- FRAME_DIR,
26
- )
27
-
28
- if TYPE_CHECKING:
29
- from endoreg_db.models import (
30
- VideoPredictionMeta,
31
- Video,
32
- RawVideoFile,
33
- RawVideoPredictionMeta,
34
- LabelRawVideoSegment,
35
- LabelVideoSegment,
36
- ModelMeta,
37
- Center,
38
- EndoscopyProcessor,
39
- VideoMeta,
40
- Frame,
41
- RawFrame,
42
- PatientExamination,
43
- ) #
44
- from django.db.models import QuerySet
45
-
46
- TEST_RUN = os.environ.get("TEST_RUN", "False")
47
- TEST_RUN = TEST_RUN.lower() == "true"
48
-
49
- TEST_RUN_FRAME_NUMBER = int(os.environ.get("TEST_RUN_FRAME_NUMBER", "500"))
50
-
51
- if TEST_RUN:
52
- ic("-----\nTEST RUN ENABLED\n-----")
53
-
54
-
55
- class AbstractVideoFile(models.Model):
56
- """
57
- Abstract base class for video files.
58
- """
59
-
60
- uuid = models.UUIDField()
61
-
62
- sensitive_meta = models.OneToOneField(
63
- "SensitiveMeta", on_delete=models.CASCADE, blank=True, null=True
64
- )
65
-
66
- center = models.ForeignKey("Center", on_delete=models.CASCADE)
67
- processor = models.ForeignKey( # TODO Migrate to VideoMeta
68
- "EndoscopyProcessor", on_delete=models.CASCADE, blank=True, null=True
69
- )
70
- # TODO Reduce redundancies between VideoFile and VideoMeta (e.g. center, processor)
71
-
72
- video_meta = models.OneToOneField(
73
- "VideoMeta", on_delete=models.CASCADE, blank=True, null=True
74
- )
75
- examination = models.ForeignKey(
76
- "PatientExamination", on_delete=models.SET_NULL, blank=True, null=True
77
- )
78
- original_file_name = models.CharField(max_length=255)
79
- video_hash = models.CharField(max_length=255, unique=True)
80
- uploaded_at = models.DateTimeField(auto_now_add=True)
81
-
82
- frame_dir = models.CharField(max_length=255)
83
- prediction_dir = models.CharField(max_length=255)
84
- predictions = models.JSONField(default=dict)
85
- fps = models.FloatField(blank=True, null=True)
86
- duration = models.FloatField(blank=True, null=True)
87
- frame_count = models.IntegerField(blank=True, null=True)
88
-
89
- readable_predictions = models.JSONField(default=dict)
90
- merged_predictions = models.JSONField(default=dict)
91
- smooth_merged_predictions = models.JSONField(default=dict)
92
- binary_smooth_merged_predictions = models.JSONField(default=dict)
93
- sequences = models.JSONField(default=dict)
94
- ai_model_meta = models.ForeignKey(
95
- "ModelMeta", on_delete=models.CASCADE, blank=True, null=True
96
- )
97
-
98
- # Frame Extraction States
99
- state_frames_required = models.BooleanField(default=True)
100
- state_frames_extracted = models.BooleanField(default=False)
101
-
102
- # Video
103
- ## Prediction
104
- state_initial_prediction_required = models.BooleanField(default=True)
105
- state_initial_prediction_completed = models.BooleanField(default=False)
106
- state_initial_prediction_import_required = models.BooleanField(default=True)
107
- state_initial_prediction_import_completed = models.BooleanField(default=False)
108
-
109
- # Dataset complete?
110
- state_histology_required = models.BooleanField(blank=True, null=True)
111
- state_histology_available = models.BooleanField(default=False)
112
- state_follow_up_intervention_required = models.BooleanField(blank=True, null=True)
113
- state_follow_up_intervention_available = models.BooleanField(default=False)
114
- state_dataset_complete = models.BooleanField(default=False)
115
-
116
- state_frames_initialized = models.BooleanField(default=False)
117
-
118
- is_raw = models.BooleanField(default=False)
119
-
120
- if TYPE_CHECKING:
121
- self: Union["RawVideoFile", "Video"]
122
- label_video_segments: Union[
123
- "QuerySet[LabelVideoSegment]",
124
- "QuerySet[LabelRawVideoSegment]",
125
- ]
126
- examination: "PatientExamination"
127
- video_meta: "VideoMeta"
128
- processor: "EndoscopyProcessor"
129
- center: "Center"
130
- ai_model_meta: "ModelMeta"
131
- sensitive_meta: "SensitiveMeta"
132
- frames: Union["QuerySet[RawFrame]", "QuerySet[Frame]"]
133
-
134
- class Meta:
135
- abstract = True #
136
-
137
- @classmethod
138
- def transcode_videofile(cls, filepath: Path, transcoded_path: Path):
139
- """ """
140
- transcoded_path = transcode_videofile(filepath, transcoded_path)
141
- return transcoded_path
142
-
143
- @classmethod
144
- def check_hash_exists(cls, video_hash: str):
145
- return cls.objects.filter(video_hash=video_hash).exists()
146
-
147
- @classmethod
148
- def create_from_file( # TODO Rename to get_or_create_from_file
149
- cls,
150
- file_path: Path,
151
- center_name: str,
152
- processor_name: str,
153
- frame_dir_parent: Path = FRAME_DIR,
154
- video_dir: Path = VIDEO_DIR,
155
- save: bool = True,
156
- frame_paths: List[dict] = None,
157
- ):
158
- from endoreg_db.models import Center, EndoscopyProcessor # pylint: disable=import-outside-toplevel
159
-
160
- video_dir.mkdir(parents=True, exist_ok=True)
161
- ic(f"Creating {cls} from {file_path}")
162
- original_file_name = file_path.name
163
-
164
- transcoded_file_path = transcode_videofile_if_required(file_path)
165
- video_hash = get_video_hash(transcoded_file_path)
166
-
167
- vid_with_hash_exists = cls.check_hash_exists(video_hash=video_hash) # pylint: disable=no-member
168
- if vid_with_hash_exists:
169
- existing: Union["RawVideoFile", "Video"] = cls.objects.get(
170
- video_hash=video_hash
171
- )
172
- ic(f"Existing DB entry found: {existing}")
173
-
174
- return existing
175
-
176
- _new_file_name, uuid = get_uuid_filename(file_path)
177
- ic(f"No existing DB entry found, creating new with UUID {uuid}")
178
-
179
- try:
180
- relative_path = transcoded_file_path.relative_to(STORAGE_DIR)
181
- except ValueError as e:
182
- raise Exception(
183
- f"{transcoded_file_path} is outside STORAGE_DIR {STORAGE_DIR}"
184
- ) from e
185
-
186
- video = cls(
187
- uuid=uuid,
188
- file=relative_path.as_posix(),
189
- center=Center.objects.get(name=center_name),
190
- processor=EndoscopyProcessor.objects.get(name=processor_name),
191
- original_file_name=original_file_name,
192
- video_hash=video_hash,
193
- )
194
- video.save()
195
- if frame_paths:
196
- ic(f"Initializing frames using provided paths ({len(frame_paths)})")
197
- video.initialize_frames(frame_paths)
198
-
199
- # Save the instance to the database
200
- video.save()
201
- ic(f"Saved {video}")
202
-
203
- return video
204
-
205
- def get_video_model(self):
206
- from endoreg_db.models import RawVideoFile, Video
207
-
208
- if self.is_raw:
209
- return RawVideoFile
210
- return Video
211
-
212
- def get_frame_model(self):
213
- from endoreg_db.models import RawFrame, Frame
214
-
215
- if self.is_raw_video_file():
216
- return RawFrame
217
-
218
- return Frame
219
-
220
- def get_label_segment_model(self):
221
- from endoreg_db.models import LabelVideoSegment, LabelRawVideoSegment # pylint: disable=import-outside-toplevel
222
-
223
- if self.is_raw:
224
- return LabelRawVideoSegment
225
- return LabelVideoSegment
226
-
227
- def sequences_to_label_video_segments(
228
- self,
229
- video_prediction_meta: Union["VideoPredictionMeta", "RawVideoPredictionMeta"],
230
- ):
231
- """
232
- Convert sequences to label video segments.
233
- """
234
- from endoreg_db.models import Label, InformationSource
235
-
236
- label_video_segment_model = self.get_label_segment_model()
237
- for label, sequences in self.sequences.items():
238
- label = Label.objects.get(name=label)
239
- for sequence in sequences:
240
- start_frame_number = sequence[0]
241
- end_frame_number = sequence[1]
242
-
243
- label_video_segment = label_video_segment_model.objects.create(
244
- video=self,
245
- prediction_meta=video_prediction_meta,
246
- label=label,
247
- start_frame_number=start_frame_number,
248
- end_frame_number=end_frame_number,
249
- )
250
- label_video_segment.save()
251
-
252
- def get_frame_number(self):
253
- """
254
- Get the number of frames in the video.
255
- """
256
- frame_model = self.get_frame_model()
257
- framecount = frame_model.objects.filter(video=self).count()
258
- return framecount
259
-
260
- def set_frames_extracted(self, value: bool = True):
261
- self.state_frames_extracted = value
262
- self.save()
263
-
264
- def get_frames(self):
265
- """
266
- Retrieve all frames for this video in the correct order.
267
- """
268
- frame_model = self.get_frame_model()
269
- return frame_model.objects.filter(video=self).order_by("frame_number")
270
-
271
- def get_frame(self, frame_number):
272
- """
273
- Retrieve a specific frame for this video.
274
- """
275
- frame_model = self.get_frame_model()
276
- return frame_model.objects.get(video=self, frame_number=frame_number)
277
-
278
- def get_frame_range(self, start_frame_number: int, end_frame_number: int):
279
- """
280
- Expects numbers of start and stop frame.
281
- Returns all frames of this video within the given range in ascending order.
282
- """
283
- frame_model = self.get_frame_model()
284
- return frame_model.objects.filter(
285
- video=self,
286
- frame_number__gte=start_frame_number,
287
- frame_number__lte=end_frame_number,
288
- ).order_by("frame_number")
289
-
290
- def is_raw_video_file(self):
291
- if self.__class__.__name__ == "RawVideoFile":
292
- return True
293
- return False
294
-
295
- def get_prediction_meta_model(self):
296
- from endoreg_db.models import VideoPredictionMeta, RawVideoPredictionMeta
297
-
298
- if self.is_raw_video_file():
299
- return RawVideoPredictionMeta
300
- return VideoPredictionMeta
301
-
302
- def predict_video(
303
- self,
304
- model_meta_name: str,
305
- dataset_name: str = "inference_dataset",
306
- model_meta_version: Optional[int] = None,
307
- smooth_window_size_s: int = 1,
308
- binarize_threshold: float = 0.5,
309
- anonymized_frames: bool = True,
310
- img_suffix: str = ".jpg",
311
- test_run: bool = TEST_RUN,
312
- n_test_frames: int = TEST_RUN_FRAME_NUMBER,
313
- ):
314
- """
315
- WARNING: When using with Video Objects "anonymous_frames" should be set to False
316
- Predict the video file using the given model.
317
- Frames should be extracted and anonymized frames should be generated before prediction.
318
- """
319
- from endoreg_db.models import (
320
- RawVideoFile,
321
- Video,
322
- ModelMeta,
323
- AiModel,
324
- ) # pylint: disable=import-outside-toplevel
325
- #TODO Create issue to movie this function to the endo-ai module
326
- #endoreg-db is our "base" module, so it should not depend "upstream" models
327
- from endo_ai.predictor.inference_dataset import InferenceDataset # pylint: disable=import-outside-toplevel
328
- from endo_ai.predictor.model_loader import MultiLabelClassificationNet
329
- from endo_ai.predictor.predict import Classifier
330
- from endo_ai.predictor.postprocess import (
331
- concat_pred_dicts,
332
- make_smooth_preds,
333
- find_true_pred_sequences,
334
- )
335
-
336
- if TEST_RUN:
337
- test_run = True
338
-
339
- datasets = {
340
- "inference_dataset": InferenceDataset,
341
- }
342
-
343
- if isinstance(self, RawVideoFile):
344
- self: "RawVideoFile"
345
- elif isinstance(self, Video):
346
- self: "Video"
347
- else:
348
- raise Exception("Invalid instance type")
349
-
350
- dataset_model_class = datasets[dataset_name]
351
-
352
- if anonymized_frames and self.is_raw:
353
- try:
354
- frame_dir = self.get_anonymized_frame_dir()
355
- except: # FIXME
356
- frame_dir = Path(self.frame_dir)
357
- assert self.state_frames_extracted, "Frames not extracted"
358
-
359
- else:
360
- frame_dir = Path(self.frame_dir)
361
- assert self.state_frames_extracted, "Frames not extracted"
362
-
363
- model_meta = ModelMeta.get_by_name(model_meta_name, model_meta_version)
364
- model: AiModel = model_meta.model
365
-
366
- ic(f"Model: {model}, Model Meta: {model_meta}")
367
-
368
- model_type = model.model_type
369
- model_subtype = model.model_subtype
370
-
371
- ic(f"Model type: {model_type}, Model subtype: {model_subtype}")
372
- ic(f"self: {self}, Type: {type(self)}")
373
-
374
- prediction_meta_model = self.get_prediction_meta_model()
375
-
376
- ic(
377
- f"Prediction Meta Model: {prediction_meta_model}, Type: {type(prediction_meta_model)}"
378
- )
379
-
380
- video_prediction_meta, _created = prediction_meta_model.objects.get_or_create(
381
- video=self, model_meta=model_meta
382
- )
383
-
384
- video_prediction_meta.save()
385
-
386
- ic(video_prediction_meta)
387
-
388
- paths = self.get_frame_paths()
389
- ic(f"Found {len(paths)} images in {frame_dir}")
390
-
391
- # frame names in format "frame_{index}.jpg"
392
- indices = [int(p.stem.split("_")[1]) for p in paths]
393
- path_index_tuples = list(zip(paths, indices))
394
- # sort ascending by index
395
- path_index_tuples.sort(key=lambda x: x[1])
396
- paths, indices = zip(*path_index_tuples)
397
-
398
- crop_template = self.get_crop_template()
399
-
400
- string_paths = [p.resolve().as_posix() for p in paths]
401
- crops = [crop_template for _ in paths]
402
-
403
- ic(f"Detected {len(paths)} frames")
404
-
405
- if test_run: # only use the first 10 frames
406
- ic(f"Running in test mode, using only the first {n_test_frames} frames")
407
- paths = paths[:n_test_frames]
408
- indices = indices[:n_test_frames]
409
- string_paths = string_paths[:n_test_frames]
410
- crops = crops[:n_test_frames]
411
-
412
- assert paths, f"No images found in {frame_dir}"
413
-
414
- ds_config = model_meta.get_inference_dataset_config()
415
-
416
- # Create dataset
417
- ds = dataset_model_class(string_paths, crops, config=ds_config)
418
- ic(f"Dataset length: {len(ds)}")
419
-
420
- # Get a sample image
421
- sample = ds[0]
422
- ic("Shape:", sample.shape) # e.g., torch.Size([3, 716, 716])
423
-
424
- # unorm = get_unorm(ds_config)
425
-
426
- weights_path = model_meta.weights.path
427
-
428
- ic(f"Model path: {weights_path}")
429
-
430
- # FIXME implement support for different model types
431
- ai_model_instance = MultiLabelClassificationNet.load_from_checkpoint(
432
- checkpoint_path=weights_path,
433
- )
434
-
435
- _ = ai_model_instance.cuda()
436
- _ = ai_model_instance.eval()
437
- classifier = Classifier(ai_model_instance, verbose=True)
438
-
439
- ic("Starting inference")
440
- predictions = classifier.pipe(string_paths, crops)
441
-
442
- ic("Creating Prediction Dict")
443
- prediction_dict = classifier.get_prediction_dict(predictions, string_paths)
444
- self.predictions = prediction_dict
445
-
446
- ic("Creating Readable Predictions")
447
- readable_predictions = [classifier.readable(p) for p in predictions]
448
- self.readable_predictions = readable_predictions
449
-
450
- ic("Creating Merged Predictions")
451
- merged_predictions = concat_pred_dicts(readable_predictions)
452
-
453
- fps = self.get_fps()
454
- ic(
455
- f"Creating Smooth Merged Predictions; FPS: {fps}, \
456
- Smooth Window Size: {smooth_window_size_s}"
457
- )
458
-
459
- smooth_merged_predictions = {}
460
- for key in merged_predictions.keys():
461
- smooth_merged_predictions[key] = make_smooth_preds(
462
- prediction_array=merged_predictions[key],
463
- window_size_s=smooth_window_size_s,
464
- fps=fps,
465
- )
466
-
467
- ic(
468
- "Creating Binary Smooth Merged Predictions; Binarize Threshold: ",
469
- binarize_threshold,
470
- )
471
- binary_smooth_merged_predictions = {}
472
- for key in smooth_merged_predictions.keys(): # pylint: disable=consider-using-dict-items
473
- binary_smooth_merged_predictions[key] = (
474
- smooth_merged_predictions[key] > binarize_threshold
475
- )
476
-
477
- ic("Creating Sequences")
478
- sequences = {}
479
- for label, prediction_array in binary_smooth_merged_predictions.items():
480
- sequences[label] = find_true_pred_sequences(prediction_array)
481
-
482
- self.sequences = sequences
483
-
484
- self.sequences_to_label_video_segments(
485
- video_prediction_meta=video_prediction_meta
486
- )
487
-
488
- ic("Finished inference")
489
- ic("Saving predictions to DB")
490
- ic(sequences)
491
- self.state_initial_prediction_required = False
492
- self.state_initial_prediction_completed = True
493
- self.save()
494
-
495
- def get_outside_segments(self, outside_label_name: str = "outside"):
496
- """
497
- Get sequences of outside frames.
498
- """
499
- from endoreg_db.models import Label # pylint: disable=import-outside-toplevel
500
-
501
- outside_label = Label.objects.get(name="outside")
502
- assert outside_label is not None
503
-
504
- outside_segments = self.label_video_segments.filter(label=outside_label)
505
-
506
- ic(f"Getting outside sequences using label: {outside_label}")
507
-
508
- return outside_segments
509
-
510
- def get_outside_frames(self) -> List["Frame"]:
511
- """
512
- Get outside frames.
513
- """
514
- outside_segments = self.get_outside_segments()
515
- frames = []
516
- for segment in outside_segments:
517
- frames.extend(segment.get_frames())
518
- return frames
519
-
520
- def get_outside_frame_paths(self):
521
- """
522
- Get paths to outside frames.
523
- """
524
- frames = self.get_outside_frames()
525
-
526
- frame_paths = [Path(frame.image.path) for frame in frames]
527
-
528
- return frame_paths
529
-
530
- def __str__(self):
531
- return self.file.name
532
-
533
- def delete_with_file(self):
534
- file_path = Path(self.file.path)
535
- if file_path.exists():
536
- file_path.unlink()
537
- self.delete_frames()
538
- self.delete_frames_anonymized()
539
- self.delete()
540
- return f"Deleted {self.file.name}; Deleted frames; Deleted anonymized frames"
541
-
542
- def get_endo_roi(self):
543
- """
544
- Fetches the endoscope ROI from the video meta.
545
- Returns a dictionary with keys "x", "y", "width", "height"
546
- """
547
- endo_roi = self.video_meta.get_endo_roi()
548
- return endo_roi
549
-
550
- def get_crop_template(self):
551
- """
552
- Creates a crop template (e.g., [0, 1080, 550, 1920 - 20] for a 1080p frame) from the endoscope ROI.
553
- """
554
- endo_roi = self.get_endo_roi()
555
- x = endo_roi["x"]
556
- y = endo_roi["y"]
557
- width = endo_roi["width"]
558
- height = endo_roi["height"]
559
-
560
- crop_template = [y, y + height, x, x + width]
561
- return crop_template
562
-
563
- def set_frame_dir(self):
564
- self.frame_dir = f"{FRAME_DIR}/{self.uuid}"
565
-
566
- # video meta should be created when video file is created
567
- def save(self, *args, **kwargs):
568
- assert self.processor is not None, "Processor must be set"
569
- if not self.fps:
570
- self.fps = self.get_fps()
571
- if self.is_raw_video_file():
572
- self.is_raw = True
573
- if self.video_meta is None:
574
- center = self.center
575
- processor = self.processor
576
- self.video_meta = VideoMeta.objects.create(
577
- center=center, processor=processor
578
- )
579
- self.video_meta.initialize_ffmpeg_meta(self.file.path)
580
-
581
- if not self.frame_dir:
582
- self.set_frame_dir()
583
-
584
- sm = self.sensitive_meta
585
- if sm:
586
- self.patient = sm.pseudo_patient
587
- self.patient_examination = sm.pseudo_examination
588
-
589
- super(AbstractVideoFile, self).save(*args, **kwargs)
590
-
591
- def extract_frames(
592
- self,
593
- quality: int = 2,
594
- overwrite: bool = False,
595
- ext="jpg",
596
- verbose=False,
597
- ) -> List[Path]:
598
- """
599
- Extract frames from the video file and save them to the frame_dir.
600
- For this, ffmpeg must be available in in the current environment.
601
- """
602
-
603
- return extract_frames(
604
- video=self,
605
- quality=quality,
606
- overwrite=overwrite,
607
- ext=ext,
608
- verbose=verbose,
609
- )
610
-
611
- def initialize_frames(self, paths: List[Path]):
612
- """
613
- Initialize frame objects for the video file.
614
- """
615
- initialize_frame_objects(self, paths)
616
-
617
- def delete_frames(self):
618
- """
619
- Delete frames extracted from the video file.
620
- """
621
- frame_dir = Path(self.frame_dir)
622
- if frame_dir.exists():
623
- shutil.rmtree(frame_dir)
624
- self.state_frames_extracted = False
625
- self.save()
626
- return f"Frames deleted from {frame_dir}"
627
- else:
628
- return f"No frames to delete for {self.file.name}"
629
-
630
- def delete_frames_anonymized(self):
631
- """
632
- Delete anonymized frames extracted from the video file.
633
- """
634
- frame_dir = Path(self.frame_dir)
635
- anonymized_frame_dir = frame_dir.parent / f"anonymized_{self.uuid}"
636
- if anonymized_frame_dir.exists():
637
- shutil.rmtree(anonymized_frame_dir)
638
- return f"Anonymized frames deleted from {anonymized_frame_dir}"
639
- else:
640
- return f"No anonymized frames to delete for {self.file.name}"
641
-
642
- def get_frame_path(self, n: int = 0, anonymized=False):
643
- """
644
- Get the path to the n-th frame extracted from the video file.
645
- Note that the frame numbering starts at 1 in our naming convention.
646
- """
647
- # Adjust index
648
- n = n + 1
649
-
650
- if anonymized:
651
- _frame_dir = Path(self.frame_dir)
652
- frame_dir = _frame_dir.parent / f"anonymized_{_frame_dir.name}"
653
- else:
654
- frame_dir = Path(self.frame_dir)
655
- return frame_dir / f"frame_{n:07d}.jpg"
656
-
657
- def get_frame_paths(self):
658
- """
659
- Get paths to frames extracted from the video file.
660
- """
661
- frames = self.frames.filter(extracted=True).order_by("frame_number")
662
-
663
- paths = [Path(frame.image.path) for frame in frames]
664
- return paths
665
-
666
- def get_prediction_dir(self):
667
- return Path(self.prediction_dir)
668
-
669
- def get_predictions_path(self, suffix=".json"):
670
- pred_dir = self.get_prediction_dir()
671
- return pred_dir.joinpath("predictions").with_suffix(suffix)
672
-
673
- def get_smooth_predictions_path(self, suffix=".json"):
674
- pred_dir = self.get_prediction_dir()
675
- return pred_dir.joinpath("smooth_predictions").with_suffix(suffix)
676
-
677
- def get_binary_predictions_path(self, suffix=".json"):
678
- pred_dir = self.get_prediction_dir()
679
- return pred_dir.joinpath("binary_predictions").with_suffix(suffix)
680
-
681
- def get_raw_sequences_path(self, suffix=".json"):
682
- pred_dir = self.get_prediction_dir()
683
- return pred_dir.joinpath("raw_sequences").with_suffix(suffix)
684
-
685
- def get_filtered_sequences_path(self, suffix=".json"):
686
- pred_dir = self.get_prediction_dir()
687
- return pred_dir.joinpath("filtered_sequences").with_suffix(suffix)
688
-
689
- def extract_text_information(self, frame_fraction: float = 0.001):
690
- """
691
- Extract text information from the video file.
692
- Makes sure that frames are extracted and then processes the frames.
693
- gets all frames from frame_dir and selects a fraction of them to process (at least 1)
694
- """
695
- if not self.state_frames_extracted:
696
- print(f"Frames not extracted for {self.file.name}")
697
- return None
698
-
699
- processor = self.processor
700
-
701
- frame_paths = self.get_frame_paths()
702
- n_frames = len(frame_paths)
703
- n_frames_to_process = max(1, int(frame_fraction * n_frames))
704
-
705
- # Select evenly spaced frames
706
- frame_paths = frame_paths[:: n_frames // n_frames_to_process]
707
-
708
- # extract text from each frame and store the value to
709
- # defaultdict of lists.
710
- # Then, extract the most frequent value from each list
711
- # Finally, return the dictionary of most frequent values
712
-
713
- # Create a defaultdict to store the extracted text from each ROI
714
- rois_texts = defaultdict(list)
715
-
716
- print(f"Processing {n_frames_to_process} frames from {self.file.name}")
717
- # Process frames
718
- for frame_path in frame_paths[:n_frames_to_process]:
719
- extracted_texts = extract_text_from_rois(frame_path, processor)
720
- for roi, text in extracted_texts.items():
721
- rois_texts[roi].append(text)
722
-
723
- # Get the most frequent text values for each ROI using Counter
724
- for key in rois_texts.keys(): # pylint: disable=consider-using-dict-items
725
- counter = Counter([text for text in rois_texts[key] if text])
726
- rois_texts[key] = counter.most_common(1)[0][0] if counter else None
727
-
728
- return rois_texts
729
-
730
- def update_text_metadata(self, ocr_frame_fraction=0.001):
731
- ic(f"Updating metadata for {self.file.name}")
732
- extracted_data_dict = self.extract_text_information(ocr_frame_fraction)
733
- if extracted_data_dict is None:
734
- ic("No text extracted; skipping metadata update.")
735
- return
736
- extracted_data_dict["center_name"] = self.center.name
737
-
738
- ic(extracted_data_dict)
739
-
740
- extracted_data_dict["center_name"] = self.center.name
741
-
742
- ic("____________")
743
- ic(extracted_data_dict)
744
- ic("____________")
745
-
746
- self.sensitive_meta = SensitiveMeta.create_from_dict(extracted_data_dict)
747
- self.state_sensitive_data_retrieved = True # pylint: disable=attribute-defined-outside-init
748
- self.save()
749
-
750
- # Resulting dict depends on defined ROIs for this processor type!
751
-
752
- def update_video_meta(self):
753
- video_meta = self.video_meta
754
- video_path = Path(self.file.path)
755
- center = self.center
756
- assert self.processor
757
-
758
- if video_meta is None:
759
- video_meta = VideoMeta.create_from_file(
760
- video_path,
761
- center=center,
762
- processor=self.processor,
763
- )
764
- self.video_meta = video_meta
765
- self.save()
766
-
767
- else:
768
- video_meta.update_meta(video_path)
769
-
770
- def get_fps(self):
771
- # # FIXME
772
- # fps = 50
773
- # return fps
774
-
775
- if self.video_meta is None:
776
- self.update_video_meta()
777
-
778
- if self.video_meta.ffmpeg_meta is None:
779
- self.video_meta.initialize_ffmpeg_meta(self.file.path)
780
-
781
- return self.video_meta.get_fps()
782
-
783
- def create_frame_object(
784
- self, frame_number, image_file=None, extracted: bool = False
785
- ):
786
- """
787
- Returns a frame instance with the image_file set.
788
- """
789
- frame_model = self.get_frame_model()
790
- return frame_model(
791
- video=self,
792
- frame_number=frame_number,
793
- image=image_file,
794
- extracted=extracted,
795
- )
796
-
797
- def bulk_create_frames(self, frames_to_create):
798
- """
799
- Bulk create frames, then save their images to storage.
800
- """
801
- frame_model = self.get_frame_model()
802
- created = frame_model.objects.bulk_create(frames_to_create)
803
- # for frame in created:
804
- # frame_name = f"frame_{frame.frame_number:07d}.jpg"
805
- # frame.image.save(frame_name, frame.image)
806
- # frame.save()