endoreg-db 0.2.2__py3-none-any.whl → 0.3.0__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 (39) hide show
  1. endoreg_db/management/commands/delete_all.py +18 -0
  2. endoreg_db/management/commands/fix_auth_permission.py +20 -0
  3. endoreg_db/management/commands/load_user_groups.py +8 -47
  4. endoreg_db/migrations/0001_initial.py +1 -1
  5. endoreg_db/migrations/0002_rawvideofile.py +26 -0
  6. endoreg_db/migrations/0003_rawvideofile_frames_required.py +18 -0
  7. endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +18 -0
  8. endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +56 -0
  9. endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +25 -0
  10. endoreg_db/migrations/0007_rawvideofile_processor.py +19 -0
  11. endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +18 -0
  12. endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +31 -0
  13. endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +18 -0
  14. endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +18 -0
  15. endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +109 -0
  16. endoreg_db/models/data_file/__init__.py +4 -1
  17. endoreg_db/models/data_file/base_classes/__init__.py +0 -1
  18. endoreg_db/models/data_file/base_classes/abstract_video.py +1 -0
  19. endoreg_db/models/data_file/import_classes/__init__.py +31 -0
  20. endoreg_db/models/data_file/import_classes/processing_functions.py +269 -0
  21. endoreg_db/models/data_file/import_classes/raw_video.py +341 -0
  22. endoreg_db/models/data_file/metadata/__init__.py +133 -0
  23. endoreg_db/models/data_file/metadata/sensitive_meta.py +13 -0
  24. endoreg_db/models/data_file/video/__init__.py +1 -1
  25. endoreg_db/models/data_file/video/import_meta.py +21 -21
  26. endoreg_db/models/permissions/__init__.py +44 -0
  27. endoreg_db/utils/__init__.py +1 -0
  28. endoreg_db/utils/cropping.py +29 -0
  29. endoreg_db/utils/dataloader.py +69 -0
  30. endoreg_db/utils/file_operations.py +30 -0
  31. endoreg_db/utils/hashs.py +16 -0
  32. endoreg_db/utils/legacy_ocr.py +201 -0
  33. endoreg_db/utils/ocr.py +197 -0
  34. endoreg_db/utils/uuid.py +4 -0
  35. endoreg_db/utils/video_metadata.py +87 -0
  36. {endoreg_db-0.2.2.dist-info → endoreg_db-0.3.0.dist-info}/METADATA +7 -1
  37. {endoreg_db-0.2.2.dist-info → endoreg_db-0.3.0.dist-info}/RECORD +39 -11
  38. {endoreg_db-0.2.2.dist-info → endoreg_db-0.3.0.dist-info}/LICENSE +0 -0
  39. {endoreg_db-0.2.2.dist-info → endoreg_db-0.3.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,197 @@
1
+ import pytesseract
2
+ from PIL import Image, ImageOps, ImageFilter
3
+ import os
4
+ from collections import Counter
5
+ from tempfile import TemporaryDirectory
6
+ import re
7
+ from datetime import datetime
8
+ from typing import Dict, List
9
+ from icecream import ic
10
+ import numpy as np
11
+ from endoreg_db.utils.cropping import crop_and_insert
12
+
13
+
14
+
15
+ N_FRAMES_MEAN_OCR = 2
16
+
17
+ # Helper function to process date strings
18
+ def process_date_text(date_text):
19
+ """
20
+ Processes a string of text that represents a date and returns a datetime.date object.
21
+
22
+ Args:
23
+ date_text (str): A string of text that represents a date.
24
+
25
+ Returns:
26
+ datetime.date: A datetime.date object representing the parsed date, or None if the text cannot be parsed.
27
+ """
28
+ try:
29
+ # Remove any non-digit characters
30
+ date_text_clean = re.sub(r'\D', '', date_text)
31
+ # Reformat to 'ddmmyyyy' if necessary
32
+ if len(date_text_clean) == 8:
33
+ return datetime.strptime(date_text_clean, "%d%m%Y").date()
34
+ elif len(date_text_clean) == 14:
35
+ return datetime.strptime(date_text_clean, "%d%m%Y%H%M%S").date()
36
+ except ValueError:
37
+ # Return None if the text cannot be parsed into a date
38
+ # set date to 1/1/1900
39
+ return datetime.strptime("01011900", "%d%m%Y").date()
40
+
41
+ # Helper function to process patient names
42
+ def process_name_text(name_text):
43
+ """
44
+ Remove all numbers, punctuation, and whitespace from a string of text and return the result.
45
+ """
46
+ name = re.sub(r'[0-9!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\s]+', '', name_text).strip()
47
+ # capitalize first letter of each word
48
+ name = ' '.join([word.capitalize() for word in name.split()])
49
+ return name
50
+
51
+
52
+ # Helper function to process endoscope type text
53
+ def process_general_text(endoscope_text):
54
+ """
55
+ This function takes in a string of text from an endoscope and returns a cleaned version of the text.
56
+ """
57
+ return ' '.join(endoscope_text.split())
58
+
59
+ def roi_values_valid(roi):
60
+ """
61
+ Check if all values in an ROI dictionary are valid (>=0).
62
+ """
63
+ return all([value >= 0 for value in roi.values()])
64
+
65
+ # Function to extract text from ROIs
66
+ def extract_text_from_rois(image_path, processor):
67
+ """
68
+ Extracts text from regions of interest (ROIs) in an image using OCR.
69
+
70
+ Args:
71
+ image_path (str): The path to the image file.
72
+ processor (EndoscopyProcessor): An instance of the EndoscopyProcessor class.
73
+
74
+ Returns:
75
+ dict: A dictionary containing the extracted text for each ROI.
76
+ """
77
+ # Read the image using Pillow
78
+ image = Image.open(image_path)
79
+ image_dimensions = image.size # (width, height)
80
+
81
+ ####### Adjust Image #######
82
+ # Convert to grayscale
83
+ gray = image.convert('L')
84
+
85
+ # Invert colors for white text on black background
86
+ inverted = ImageOps.invert(gray)
87
+
88
+ # Initialize the dictionary to hold the extracted text
89
+ extracted_texts = {}
90
+
91
+ # Define your ROIs and their corresponding post-processing functions in tuples
92
+ rois_with_postprocessing = [
93
+ ('examination_date', processor.get_roi_examination_date, process_date_text),
94
+ ("patient_first_name", processor.get_roi_patient_first_name, process_name_text),
95
+ ('patient_last_name', processor.get_roi_patient_last_name, process_name_text),
96
+ ('patient_dob', processor.get_roi_patient_dob, process_date_text),
97
+ ('endoscope_type', processor.get_roi_endoscope_type, process_general_text),
98
+ ('endoscope_sn', processor.get_roi_endoscopy_sn, process_general_text),
99
+ ]
100
+
101
+ # Extract and post-process text for each ROI
102
+ for roi_name, roi_function, post_process in rois_with_postprocessing:
103
+ # Get the ROI dictionary
104
+ roi = roi_function()
105
+
106
+ # Check if the ROI has values
107
+
108
+ if roi_values_valid(roi):
109
+ x, y, w, h = roi['x'], roi['y'], roi['width'], roi['height']
110
+
111
+ # Get white image with original shape and just the roi remaining
112
+ roi_image = crop_and_insert(inverted, x,y,h,w)
113
+
114
+ # OCR configuration: Recognize white text on black background without corrections
115
+ config = '--psm 10 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-üöäÜÖÄß'
116
+
117
+ # Use pytesseract to do OCR on the preprocessed ROI
118
+ text = pytesseract.image_to_string(roi_image, config=config).strip()
119
+
120
+ # Post-process extracted text
121
+ processed_text = post_process(text)
122
+
123
+ extracted_texts[roi_name] = processed_text
124
+
125
+ else:
126
+ ic(roi_name)
127
+ ic(roi)
128
+ ic("No values for this ROI")
129
+
130
+ return extracted_texts
131
+
132
+ def get_most_frequent_values(rois_texts: Dict[str, List[str]]) -> Dict[str, str]:
133
+ """
134
+ Given a dictionary of ROIs and their corresponding texts, returns a dictionary of the most frequent text for each ROI.
135
+
136
+ Args:
137
+ rois_texts: A dictionary where the keys are the names of the ROIs and the values are lists of texts.
138
+
139
+ Returns:
140
+ A dictionary where the keys are the names of the ROIs and the values are the most frequent text for each ROI.
141
+ """
142
+ most_frequent = {}
143
+ for key in rois_texts.keys():
144
+ counter = Counter([text for text in rois_texts[key] if text])
145
+ ic(key)
146
+ ic(counter)
147
+ most_frequent[key], _ = counter.most_common(1)[0] if counter else (None, None)
148
+ return most_frequent
149
+
150
+ def process_video(video_path, processor):
151
+ """
152
+ Processes a video file by extracting text from regions of interest (ROIs) in each frame.
153
+
154
+ Args:
155
+ video_path (str): The path to the video file to process.
156
+ processor (OCRProcessor): An instance of the OCRProcessor class that defines the ROIs to extract text from.
157
+
158
+ Returns:
159
+ dict: A dictionary containing the most frequent text values extracted from each ROI.
160
+ """
161
+ # Create a temporary directory to store frames
162
+ with TemporaryDirectory() as temp_dir:
163
+ ic(temp_dir)
164
+ # Capture the video
165
+ video = cv2.VideoCapture(video_path)
166
+ success, frame_number = True, 0
167
+ rois_texts = {roi_name: [] for roi_name in processor.get_rois().keys()}
168
+ frames_for_mean_extraction = 0
169
+
170
+ while success:
171
+ success, frame = video.read()
172
+
173
+ # Check if this is the 200th frame
174
+ if frame_number % 1000 == 0 and success:
175
+ frame_path = os.path.join(temp_dir, f"frame_{frame_number}.jpg")
176
+ cv2.imwrite(frame_path, frame) # Save the frame as a JPEG file
177
+ # cv2.imwrite(f"_tmp/frame_{frame_number}.jpg", frame)
178
+
179
+ # Extract text from ROIs
180
+ extracted_texts = extract_text_from_rois(frame_path, processor)
181
+ ic(extracted_texts)
182
+
183
+ # Store the extracted text from each ROI
184
+ for key, text in extracted_texts.items():
185
+ rois_texts[key].append(text)
186
+ frames_for_mean_extraction += 1
187
+
188
+ frame_number += 1
189
+
190
+ if frames_for_mean_extraction >= N_FRAMES_MEAN_OCR: break
191
+
192
+ # Release the video capture object
193
+ video.release()
194
+
195
+ # Get the most frequent values for each ROI
196
+ return get_most_frequent_values(rois_texts)
197
+
@@ -0,0 +1,4 @@
1
+ import uuid
2
+
3
+ def get_uuid():
4
+ return uuid.uuid4()
@@ -0,0 +1,87 @@
1
+ # import cv2
2
+ from pathlib import Path
3
+ import datetime
4
+
5
+ def _extract_metadata_from_filename(filepath:Path, time_format = None): # deprecated
6
+ """
7
+ Extracts metadata from a video filename.
8
+
9
+ Args:
10
+ filepath (Path): The path to the video file.
11
+ time_format (str, optional): The format of the date in the filename. Defaults to None.
12
+
13
+ Returns:
14
+ dict: A dictionary containing the extracted metadata.
15
+
16
+ Example return value:
17
+ {
18
+ 'examination_date': '2021-03-03',
19
+ 'patient_last_name': 'Doe',
20
+ 'patient_first_name': 'John',
21
+ 'patient_dob': '1990-01-01'
22
+ }
23
+ """
24
+ # get filename without suffix
25
+ filename = filepath.stem
26
+
27
+ if not time_format:
28
+ time_format = "%d.%m.%Y"
29
+
30
+ _info = [_.strip() for _ in filename.split("_")]
31
+
32
+ if len(_info) == 4:
33
+ examination_date, last_name, first_name, birthdate = _info
34
+
35
+ else:
36
+ examination_date, last_name, first_name, birthdate = None, None, None, None
37
+
38
+ metadata = {}
39
+ metadata['examination_date'] = examination_date
40
+ metadata['patient_last_name'] = last_name
41
+ metadata['patient_first_name'] = first_name
42
+ metadata['patient_dob'] = birthdate
43
+
44
+ try:
45
+ metadata['examination_date'] = datetime.datetime.strptime(examination_date, time_format).date()
46
+ metadata['examination_date'] = metadata['examination_date'].strftime("%Y-%m-%d")
47
+ except:
48
+ metadata['examination_date'] = None
49
+
50
+ try:
51
+ metadata['patient_dob'] = datetime.datetime.strptime(birthdate, time_format).date()
52
+ metadata['patient_dob'] = metadata['patient_dob'].strftime("%Y-%m-%d")
53
+ except:
54
+ metadata['patient_dob'] = None
55
+
56
+ return metadata
57
+
58
+ def _get_video_metadata(file_path): # Deprecated
59
+ """
60
+ Returns the framerate, dimensions, and duration of a video file.
61
+
62
+ Parameters:
63
+ file_path (str): The path to the video file.
64
+
65
+ Returns:
66
+ tuple: A tuple containing the framerate (float), dimensions (tuple of ints), and duration (float) of the video.
67
+ """
68
+ # Open the video file
69
+ video = cv2.VideoCapture(file_path)
70
+
71
+ # Get the video framerate
72
+ fps = video.get(cv2.CAP_PROP_FPS)
73
+
74
+ # Get the video dimensions
75
+ width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
76
+ height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
77
+ dimensions = (width, height)
78
+
79
+ # Get the video duration
80
+ frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
81
+ duration = frame_count / fps
82
+
83
+ # Release the video file
84
+ video.release()
85
+
86
+ # Return the metadata
87
+ return fps, dimensions, duration
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: endoreg-db
3
- Version: 0.2.2
3
+ Version: 0.3.0
4
4
  Summary: EndoReg Db Django App
5
5
  License: GNU3
6
6
  Author: Thomas J. Lux
@@ -12,8 +12,11 @@ Classifier: Programming Language :: Python :: 3.12
12
12
  Requires-Dist: django (>=4.2,<4.3)
13
13
  Requires-Dist: django-bootstrap5 (>=23.4,<24.0)
14
14
  Requires-Dist: djangorestframework (>=3.14.0,<4.0.0)
15
+ Requires-Dist: ffmpeg-python (>=0.2.0,<0.3.0)
15
16
  Requires-Dist: icecream (>=2.1.3,<3.0.0)
17
+ Requires-Dist: opencv-python (>=4.9.0.80,<5.0.0.0)
16
18
  Requires-Dist: pillow (>=10.2.0,<11.0.0)
19
+ Requires-Dist: pytesseract (>=0.3.10,<0.4.0)
17
20
  Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
18
21
  Requires-Dist: tqdm (>=4.66.2,<5.0.0)
19
22
  Description-Content-Type: text/markdown
@@ -24,3 +27,6 @@ endoreg-db
24
27
 
25
28
  ## Poetry add pypi token
26
29
  poetry config pypi-token.pypi your-api-token
30
+
31
+
32
+
@@ -24,10 +24,12 @@ endoreg_db/forms/__init__.py,sha256=irncZr5xuZkEEiAVOAhjHk6so1IBW2VZEodaFyQNyHU,
24
24
  endoreg_db/forms/settings/__init__.py,sha256=xKCYyRS1tEAWsm5C9OrG0Btqgitzuh_s31Oa_W6Os0I,259
25
25
  endoreg_db/forms/unit.py,sha256=rywaSXT6E18RwPdGXhDr94Q9_lP-fauY1XAPhj0D7Dc,116
26
26
  endoreg_db/management/commands/_load_model_template.py,sha256=2ELH07EbvcXs4Wdpj9rixm6rggNFJp3P0gb_zDQwNLQ,1379
27
+ endoreg_db/management/commands/delete_all.py,sha256=AA5f5GRAyMdzOdOT7qj-Ox7nbioKMJfjAZCgqd839NI,974
27
28
  endoreg_db/management/commands/delete_legacy_images.py,sha256=gJWkwqSFNVSBceivMYia93l0tN1FDqlQTxTDwQlzjvY,639
28
29
  endoreg_db/management/commands/delete_legacy_videos.py,sha256=T_e0lhsHVEgtgjfK9ORXgh77OXZpHoZ7p6PqjP5BqO0,574
29
30
  endoreg_db/management/commands/extract_legacy_video_frames.py,sha256=YiWRytW8EKqDgvy-wxt3JstHK2ErhokOIL4mzQmouVw,600
30
31
  endoreg_db/management/commands/fetch_legacy_image_dataset.py,sha256=8QJyw25AOdCVLtbBvn7bTiIlZctEuxRmvRuNVqP7_iw,1153
32
+ endoreg_db/management/commands/fix_auth_permission.py,sha256=f7RFMH4ET4ee5ODZtvTP0RmgJcT3JclPW1OGHLfMMoc,947
31
33
  endoreg_db/management/commands/import_legacy_images.py,sha256=IcBmihG9rvqC37XgMgwCwrIkYfHVFjQEWEWZaHtnMuc,3558
32
34
  endoreg_db/management/commands/import_legacy_videos.py,sha256=OHFTNb53RtznRyVay88vo83fkfafTiwTgUMieI70NX4,2732
33
35
  endoreg_db/management/commands/load_active_model_data.py,sha256=NpWIksrVQIyrd-ZhI_B_34NFbLJI1_vhwuN6gXc8hgQ,1337
@@ -41,9 +43,20 @@ endoreg_db/management/commands/load_information_source.py,sha256=3sL906AMa7FGO3b
41
43
  endoreg_db/management/commands/load_label_data.py,sha256=0vSBzBweO-M7mjXJotg4q_W7gbcaBoilrnA9e7dyp8o,2217
42
44
  endoreg_db/management/commands/load_profession_data.py,sha256=oF3OF7zRqxA-SVpMW6e7LJ3MSfEc5Hoz1XlcvcFACRg,1321
43
45
  endoreg_db/management/commands/load_unit_data.py,sha256=tcux-iL-ByT2ApgmHEkLllZSEA3AGMK5l-ze2Mtty1Y,1319
44
- endoreg_db/management/commands/load_user_groups.py,sha256=q6tC6qBXT59TQTCNJMDG1aSyNUs8IljlsJ3m93b0lKQ,2348
46
+ endoreg_db/management/commands/load_user_groups.py,sha256=D7SK2FvZEHoE4TIXNGCjDw5_12MH9bpGZvoS7eEv0Os,1031
45
47
  endoreg_db/management/commands/register_ai_model.py,sha256=e5hgEyLS-E98XWzINcZ79mgtHvZltmbmAmLYaNrcfQs,2544
46
- endoreg_db/migrations/0001_initial.py,sha256=bH2gr2Ws0i9JOY4iuLMMYeo1sVS2uSx5QeBKQEx9zwA,33640
48
+ endoreg_db/migrations/0001_initial.py,sha256=dVrXpuzaaHkollKimmBl5WUw1ZTIx91AWXJ3wRr2mlI,33643
49
+ endoreg_db/migrations/0002_rawvideofile.py,sha256=EazXiUm61IJUxVi24pmzTFQJbfe-rzkfN5ZDULe-BLY,935
50
+ endoreg_db/migrations/0003_rawvideofile_frames_required.py,sha256=wrHZQs6QZjjjO4yfSVQPc_47ksO7z_TwT9drWPJy5uk,399
51
+ endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py,sha256=WbGYmSoKqV8T65xjpaGDnp2Nm-jKR_scv1XteksgJBA,385
52
+ endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py,sha256=wBMIiNt1NgJpptQeQTKkrYHC00Dus0oRKPjG6qLWkak,2658
53
+ endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py,sha256=66-qNUshGzb4vdkH92MS4fxX8NJDTAcGv1FECKev0wU,809
54
+ endoreg_db/migrations/0007_rawvideofile_processor.py,sha256=Kef5DLJ3voCRL2NvNbHR3X2CjE3TyMOHskWFkfowzJg,547
55
+ endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py,sha256=12g3tWO_ENYbgUuWC6GDeXVtpyJ_anXEERZrJpUcK8A,401
56
+ endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py,sha256=pKcFoYyM8HhAvbHenSHni-eGdJKSd3BWsTdQaTde_BA,1334
57
+ endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py,sha256=7kStqnOp3Z-FoDYaAvFcOwfAaAS0mcCmF3hFoUO7WQQ,420
58
+ endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py,sha256=_Mw-OybAZrKsm0zD8iPVkgDv7-BKVxzFP5e_Bqnj5DI,460
59
+ endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py,sha256=iIP5k6SoUFQR4zrN27BOC0MIuErlgTn9LNTfDq86C7I,3769
47
60
  endoreg_db/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
61
  endoreg_db/models/__init__.py,sha256=47Pcu9-CKjtAP8rYCzLsXJ67YN0jWZQuw2AbW6DaV0E,957
49
62
  endoreg_db/models/ai_model/__init__.py,sha256=rh5npLRGml5iiRocx359gsaA82pGJTW7wdVAfnbZP6w,106
@@ -55,14 +68,19 @@ endoreg_db/models/annotation/__init__.py,sha256=jM8ISS4hWciC9cFUCMo6fSkmCGUptWkX
55
68
  endoreg_db/models/annotation/binary_classification_annotation_task.py,sha256=CpvyDxLSJcoJyajtUsDGBt881SNSFcG8lvuQ01knMNM,3292
56
69
  endoreg_db/models/annotation/image_classification.py,sha256=Og1tRo1QKBMztwfdbFryUWghnGdsTqQdepn9rOcmVMc,1387
57
70
  endoreg_db/models/center.py,sha256=hDGN0ABWeCtfjPJfSObeCwXnxxpqVqWlKRrtRUijVXI,550
58
- endoreg_db/models/data_file/__init__.py,sha256=JWmWUwY9y-1BWwnU5s408qcTfb7V2_Sct-oJHvbyMhU,198
59
- endoreg_db/models/data_file/base_classes/__init__.py,sha256=e4mORFpGvxlUKVMqs_B-BDxJxf4Tx1IN6u7zqpG0PjM,85
71
+ endoreg_db/models/data_file/__init__.py,sha256=6_V9G8ghDxIVDwAj4pttEJNt8r74kNgsTc8in_ilY5s,288
72
+ endoreg_db/models/data_file/base_classes/__init__.py,sha256=uyjViKV7N3K264xapYAOCpQx-zSwdRAN_oguUWQlq10,84
60
73
  endoreg_db/models/data_file/base_classes/abstract_frame.py,sha256=wUGkPCYoOESfiragEEy6oMeGpdS2nzha6g2lBiK7pcA,2214
61
- endoreg_db/models/data_file/base_classes/abstract_video.py,sha256=4C0hBRcAtpJCwBAR3e869fVSo8VlII3QF2n0nI85OIk,7393
74
+ endoreg_db/models/data_file/base_classes/abstract_video.py,sha256=4OUgHWbHpESpSnZGSiA13nQwtvUDJweFwJPOuL8taAo,7406
62
75
  endoreg_db/models/data_file/frame.py,sha256=-8O2yCfhTk2eMd3GB5PIPrO0i_oV6yk24UV-8Pvl2Ik,1935
76
+ endoreg_db/models/data_file/import_classes/__init__.py,sha256=-6HVcCu27bhfYDlLTui0HeYcWvsMQbyG8Q_2uS-VYnM,1136
77
+ endoreg_db/models/data_file/import_classes/processing_functions.py,sha256=qXv6MWItFtGMjWleBs8QXyQ2KhWbAaGa2wsuEVMRurA,8642
78
+ endoreg_db/models/data_file/import_classes/raw_video.py,sha256=r1Beml7dFxUdyesRKAvvIRKnfkffpS5jwcbLV-RitBI,12464
79
+ endoreg_db/models/data_file/metadata/__init__.py,sha256=m9Z1kQLK3PyrX9C8KQdf1dzyQ2rMe-_q8IgXyLY-MEY,5407
80
+ endoreg_db/models/data_file/metadata/sensitive_meta.py,sha256=cUwL0NdoCxj8tfd2psBvb4F2EbECrzXxXNrShfpagAM,602
63
81
  endoreg_db/models/data_file/report_file.py,sha256=SsKwzhsaNhfOLCp7dg6GNBwPYdrqw7QHQtYzqeVgD18,3498
64
- endoreg_db/models/data_file/video/__init__.py,sha256=pcm61GxRyzjGKQpWxek76sMq8RpQbtZ84Apxp_DSKIY,100
65
- endoreg_db/models/data_file/video/import_meta.py,sha256=NUph91hSwKaesMU-9H13cM3ASfPSOuTdUpDvHKxZnaA,1269
82
+ endoreg_db/models/data_file/video/__init__.py,sha256=3UUMcrlIZBeVGkt5hOvjUr2-VSxOTFE1miPTcmHF4v0,98
83
+ endoreg_db/models/data_file/video/import_meta.py,sha256=NTRYIZI8TeNoPmJhE0ZFljGIOf5CS9LbFcdYO0p4-mA,1311
66
84
  endoreg_db/models/data_file/video/video.py,sha256=lx3Iu7pdsy_oGlrvKKY8V06ZSNNWcwPYjP5DgCE2MKA,673
67
85
  endoreg_db/models/data_file/video_segment.py,sha256=zQo-ZGrHTRmuV6Cdj8gCAauwevQPk2m5VGo2lx0DojY,4652
68
86
  endoreg_db/models/examination/__init__.py,sha256=fnbGYzLc0kvQMF-nfDXyczy2x14ahgnuGGaU_r7Xv-Q,183
@@ -79,6 +97,7 @@ endoreg_db/models/label/label.py,sha256=NlAEa5T35kNrOF0t6YZCk8aSvC0IncbvkxrEilkz
79
97
  endoreg_db/models/legacy_data/__init__.py,sha256=J0ewe30Y2qCxCUPktcFOm2WOEz2fQnwrgfZ93FRcnio,115
80
98
  endoreg_db/models/legacy_data/image.py,sha256=mKQed6AIJL2XauPB2GevHX6NXaR8gphundI9_IC9Hpc,1622
81
99
  endoreg_db/models/patient_examination/__init__.py,sha256=s3ybaIdnvZDLKPnP1UctMRbao69yZowjmqjSYpfg1MI,1674
100
+ endoreg_db/models/permissions/__init__.py,sha256=p4C61oKuwKwYcN0EZ6SqBZDW0GCRO2VS-12whhOZBuY,1766
82
101
  endoreg_db/models/persons/__init__.py,sha256=hp24oTdoneaXSJUVCFoVi-yqaF8rGoMJ1nl7AZWzb54,183
83
102
  endoreg_db/models/persons/examiner/__init__.py,sha256=-e0mxzCacT04tOAg2NA2aKg6EbKvzuZPQR4E2MqMEfI,92
84
103
  endoreg_db/models/persons/examiner/examiner.py,sha256=-eaRF42Qpr3Tj_XqYhz60noRJ5ndvpoZH_X3wM23rVc,422
@@ -119,8 +138,17 @@ endoreg_db/serializers/prediction.py,sha256=ULeuwyoTSW4zDObOcnweU-hhuC6wbkCfz4zn
119
138
  endoreg_db/serializers/report_file.py,sha256=dsO_-zwybdhq4BWGzD2rp6u1nloZgTMa3Ll8qiq_et4,208
120
139
  endoreg_db/serializers/video.py,sha256=mZ2CsSxVGUXB0FR-CLjIZpE86z1tmFPXBrHbgYY3jWY,831
121
140
  endoreg_db/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
141
+ endoreg_db/utils/__init__.py,sha256=yj_2T_itUgmVW3nAqYLosTvga7J2eghkzbxLcEpYUl4,49
142
+ endoreg_db/utils/cropping.py,sha256=wMLo5sCFdZAEVBe3RbCH26eQjRe8q3th4K3ZKDd9fww,1143
143
+ endoreg_db/utils/dataloader.py,sha256=-XJJuvUpclvreNtTyuNqRhxG-p-xjM_oCsKyiHrUHd4,2999
144
+ endoreg_db/utils/file_operations.py,sha256=3mUY6jARIm927XK0nJoDO7fRp5quoSqPr95jDJERmr0,884
145
+ endoreg_db/utils/hashs.py,sha256=01PRVvGLuFCfJxNIxM-O5rfk6E7DelTLvu_--zEQVpU,509
146
+ endoreg_db/utils/legacy_ocr.py,sha256=c2EBP-9egUYyfsQ1n0QoZY2wKndWoKdEXrB-MQZ0Xn4,7633
147
+ endoreg_db/utils/ocr.py,sha256=jkdT1bl-LSCjZ2PvxlX1AG2TmhdMclayxUPrdZWs7UE,7322
148
+ endoreg_db/utils/uuid.py,sha256=T4HXqYtKwXFqE5kPyvlgWHyllBBF6LL6N48nl9TpwBk,53
149
+ endoreg_db/utils/video_metadata.py,sha256=HDyXxAeNQOK3cGzQ06xosmObzEnJBARuKjwz9vmmRIM,2613
122
150
  endoreg_db/views.py,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63
123
- endoreg_db-0.2.2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
124
- endoreg_db-0.2.2.dist-info/METADATA,sha256=9dyN6Ujlv45_N_PUUvNdN_FQdD_7bOMA1nJ_N03E3oI,781
125
- endoreg_db-0.2.2.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
126
- endoreg_db-0.2.2.dist-info/RECORD,,
151
+ endoreg_db-0.3.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
152
+ endoreg_db-0.3.0.dist-info/METADATA,sha256=lZ6efIFs3Mzsj7Vu84Rrng-U6bjEVAvIqHG-eSWH5To,926
153
+ endoreg_db-0.3.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
154
+ endoreg_db-0.3.0.dist-info/RECORD,,