simba-uw-tf-dev 4.7.8__py3-none-any.whl → 4.7.9__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.
simba/SimBA.py CHANGED
@@ -231,7 +231,7 @@ try:
231
231
  except (ImportError, AttributeError):
232
232
  is_worker_process = False
233
233
  if not is_worker_process:
234
- print(f'SimBA environment variables: {ENV}. Load time: {load_timer.elapsed_time_str}s')
234
+ print(f'SimBA environment variables: {ENV}. SimBA load time: {load_timer.elapsed_time_str}s')
235
235
 
236
236
  class LoadProjectPopUp(object):
237
237
  def __init__(self):
@@ -76,5 +76,25 @@
76
76
  "BATCH_APPLY_GREYSCALE": "Tick to enable greyscale for all videos.\nUntick to disable for all.",
77
77
  "BATCH_APPLY_FRAME_COUNT": "Tick to superimpose frame numbers on all videos.\nUntick to disable for all.",
78
78
  "BATCH_APPLY_CLAHE": "Tick to apply CLAHE (contrast) to all videos.\nUntick to disable for all.",
79
- "BATCH_APPLY_CLIP": "Tick to enable clipping for all videos.\nUntick to disable for all.\nSet start/end in CLIP VIDEOS SETTING, then APPLY there."
79
+ "BATCH_APPLY_CLIP": "Tick to enable clipping for all videos.\nUntick to disable for all.\nSet start/end in CLIP VIDEOS SETTING, then APPLY there.",
80
+ "BLOB_THRESHOLD": "How strict the background subtraction is (1–100). Lower = more counts as animal; higher = only strong differences.\nClick APPLY to put this value in every video row.",
81
+ "BLOB_SMOOTHING_TIME": "Smooth the animal's position over time (seconds). Reduces jitter. None = no smoothing.\nClick APPLY to put this value in every video row.",
82
+ "BLOB_BUFFER": "Extra pixels drawn around the detected animal (padding).\nClick APPLY to put this value in every video row.",
83
+ "BLOB_GAP_FILL_SIZE": "Filter size (as % of frame) that fills small holes in the animal mask. Helps merge broken blobs. None = off.\nClick APPLY to put this value in every video row.",
84
+ "BLOB_NOISE_REMOVAL_SIZE": "Filter size (as % of frame) that removes small speckles from the mask. Reduces false detections. None = off.\nClick APPLY to put this value in every video row.",
85
+ "BLOB_VERTICE_COUNT": "Number of points used to describe the blob shape. Higher = more detailed outline.",
86
+ "BLOB_SAVE_BG_VIDEOS": "If on, save the background-subtracted videos to the output folder.",
87
+ "BLOB_GAP_FILL_ITERATIONS": "How many times to run the gap-fill filter. More = stronger filling.",
88
+ "BLOB_NOISE_REMOVAL_ITERATIONS": "How many times to run the noise-removal filter. More = stronger cleaning.",
89
+ "BLOB_DUPLICATE_INCLUSION": "Copy the inclusion zones you drew for one video to all others. Pick the source video, then click APPLY.",
90
+ "BLOB_BACKGROUND_DIRECTORY": "Folder with one background reference video per video to track. File names must match input videos.\nClick APPLY to fill the BACKGROUND REFERENCE column for all rows.",
91
+ "BLOB_HEADER_VIDEO_NAME": "Input video filename for this row.",
92
+ "BLOB_HEADER_BACKGROUND_REFERENCE": "Background reference video path for this video.",
93
+ "BLOB_HEADER_THRESHOLD": "Background subtraction strictness (1–100) for this video.",
94
+ "BLOB_HEADER_SMOOTHING_TIME": "Smoothing time (seconds) for this video. Reduces jitter.",
95
+ "BLOB_HEADER_BUFFER": "Padding (pixels) around the detected animal for this video.",
96
+ "BLOB_HEADER_GAP_FILL_SIZE": "Gap-fill filter size (% of frame) for this video.",
97
+ "BLOB_HEADER_NOISE_REMOVAL_SIZE": "Noise-removal filter size (% of frame) for this video.",
98
+ "BLOB_HEADER_INCLUSION_ZONES": "Draw regions where the animal must stay. Tracking is ignored outside these zones.",
99
+ "BLOB_HEADER_QUICK_CHECK": "Preview blob tracking for this video with current settings."
80
100
  }
@@ -26,7 +26,7 @@ from simba.utils.read_write import (find_all_videos_in_directory,
26
26
  find_core_cnt,
27
27
  find_files_of_filetypes_in_directory,
28
28
  get_video_meta_data, remove_files,
29
- save_json, str_2_bool, write_pickle)
29
+ save_json, str_2_bool, write_pickle, read_frm_of_video)
30
30
  from simba.video_processors.blob_tracking_executor import BlobTrackingExecutor
31
31
 
32
32
  ABSOLUTE = 'absolute'
@@ -101,15 +101,15 @@ class BlobTrackingUI(PopUpMixin):
101
101
  def get_quick_settings(self):
102
102
  self.settings_frm = CreateLabelFrameWithIcon(parent=self.main_frm, header="SETTINGS", icon_name='settings', padx=15, pady=15)
103
103
  self.quick_settings_frm = CreateLabelFrameWithIcon(parent=self.settings_frm, header="QUICK SETTINGS", icon_name='clock', padx=15, pady=15, relief='solid')
104
- self.quick_setting_threshold_dropdown = SimBADropDown(parent=self.quick_settings_frm, dropdown_options=list(range(1, 101)), label="THRESHOLD:", label_width=30, dropdown_width=10, value=DEFAULT_THRESHOLD, img='threshold')
104
+ self.quick_setting_threshold_dropdown = SimBADropDown(parent=self.quick_settings_frm, dropdown_options=list(range(1, 101)), label="THRESHOLD:", label_width=30, dropdown_width=10, value=DEFAULT_THRESHOLD, img='threshold', tooltip_key='BLOB_THRESHOLD')
105
105
  self.quick_setting_threshold_btn = SimbaButton(parent=self.quick_settings_frm, txt='APPLY', img='tick',cmd=self._set_threshold, cmd_kwargs={'threshold': lambda: self.quick_setting_threshold_dropdown.getChoices()})
106
- self.set_smoothing_time_dropdown = SimBADropDown(parent=self.quick_settings_frm, dropdown_options=SMOOTHING_TIMES, label="SMOOTHING TIME (S):", label_width=30, dropdown_width=10, value=SMOOTHING_TIMES[0], img='smooth')
106
+ self.set_smoothing_time_dropdown = SimBADropDown(parent=self.quick_settings_frm, dropdown_options=SMOOTHING_TIMES, label="SMOOTHING TIME (S):", label_width=30, dropdown_width=10, value=SMOOTHING_TIMES[0], img='smooth', tooltip_key='BLOB_SMOOTHING_TIME')
107
107
  self.set_smoothing_time_btn = SimbaButton(parent=self.quick_settings_frm, txt='APPLY', img='tick', cmd=self._set_smoothing_time, cmd_kwargs={'time': lambda: self.set_smoothing_time_dropdown.getChoices()})
108
- self.set_buffer_dropdown = SimBADropDown(parent=self.quick_settings_frm, dropdown_options=BUFFER_SIZES, label="BUFFER (PIXELS):", label_width=30, dropdown_width=10, value=BUFFER_SIZES[0], img='resize')
108
+ self.set_buffer_dropdown = SimBADropDown(parent=self.quick_settings_frm, dropdown_options=BUFFER_SIZES, label="BUFFER (PIXELS):", label_width=30, dropdown_width=10, value=BUFFER_SIZES[0], img='resize', tooltip_key='BLOB_BUFFER')
109
109
  self.set_buffer_btn = SimbaButton(parent=self.quick_settings_frm, txt='APPLY', img='tick', cmd=self._set_buffer_size, cmd_kwargs={'size': lambda: self.set_buffer_dropdown.getChoices()})
110
- self.closing_kernal_size_dropdown = SimBADropDown(parent=self.quick_settings_frm, dropdown_options=KERNEL_SIZES, label="GAP FILL FILTER SIZE (%):", label_width=30, dropdown_width=10, value=BUFFER_SIZES[0], img='pct')
110
+ self.closing_kernal_size_dropdown = SimBADropDown(parent=self.quick_settings_frm, dropdown_options=KERNEL_SIZES, label="GAP FILL FILTER SIZE (%):", label_width=30, dropdown_width=10, value=BUFFER_SIZES[0], img='pct', tooltip_key='BLOB_GAP_FILL_SIZE')
111
111
  self.set_closing_kernel_btn = SimbaButton(parent=self.quick_settings_frm, txt='APPLY', img='tick', cmd=self._set_close_kernel_dropdown, cmd_kwargs={'size': lambda: self.closing_kernal_size_dropdown.getChoices()})
112
- self.opening_kernal_size_dropdown = SimBADropDown(parent=self.quick_settings_frm, dropdown_options=KERNEL_SIZES, label="NOISE REMOVAL FILTER SIZE (%):", label_width=30, dropdown_width=10, value=BUFFER_SIZES[0], img='pct_2')
112
+ self.opening_kernal_size_dropdown = SimBADropDown(parent=self.quick_settings_frm, dropdown_options=KERNEL_SIZES, label="NOISE REMOVAL FILTER SIZE (%):", label_width=30, dropdown_width=10, value=BUFFER_SIZES[0], img='pct_2', tooltip_key='BLOB_NOISE_REMOVAL_SIZE')
113
113
  self.opening_kernel_btn = SimbaButton(parent=self.quick_settings_frm, txt='APPLY', img='tick', cmd=self._set_open_kernel_dropdown, cmd_kwargs={'size': lambda: self.opening_kernal_size_dropdown.getChoices()})
114
114
 
115
115
  self.settings_frm.grid(row=0, column=0, sticky=NW)
@@ -126,19 +126,17 @@ class BlobTrackingUI(PopUpMixin):
126
126
  self.opening_kernel_btn.grid(row=6, column=1, sticky=NW)
127
127
 
128
128
  self.run_time_settings_frm = CreateLabelFrameWithIcon(parent=self.settings_frm, header="RUN-TIME SETTINGS", icon_name='run', padx=15, pady=15, relief='solid')
129
- self.bg_dir = FolderSelect(parent=self.run_time_settings_frm, folderDescription='BACKGROUND DIRECTORY:', lblwidth=30, initialdir=self.input_dir, lbl_icon='video_2')
129
+ self.bg_dir = FolderSelect(parent=self.run_time_settings_frm, folderDescription='BACKGROUND DIRECTORY:', lblwidth=30, initialdir=self.input_dir, lbl_icon='video_2', tooltip_key='BLOB_BACKGROUND_DIRECTORY')
130
130
  self.bg_dir_apply = SimbaButton(parent=self.run_time_settings_frm, txt='APPLY', img='tick', cmd=self._apply_bg_dir, cmd_kwargs={'bg_dir': lambda: self.bg_dir.folder_path})
131
- self.use_gpu_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=['TRUE', 'FALSE'], label="USE GPU:", label_width=30, dropdown_width=10, value='FALSE', img='gpu_3')
132
- #if not self.gpu_available: self.use_gpu_dropdown.disable()
133
- #else: self.use_gpu_dropdown.set_value(value='TRUE')
131
+ self.use_gpu_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=['TRUE', 'FALSE'], label="USE GPU:", label_width=30, dropdown_width=10, value='FALSE', img='gpu_3', tooltip_key='USE_GPU')
134
132
  self.use_gpu_dropdown.disable()
135
- self.core_cnt_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=list(range(1, self.core_cnt+1)), label="CPU CORE COUNT:", label_width=30, dropdown_width=10, value=int(self.core_cnt / 2), img='cpu_small')
133
+ self.core_cnt_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=list(range(1, self.core_cnt+1)), label="CPU CORE COUNT:", label_width=30, dropdown_width=10, value=int(self.core_cnt / 2), img='cpu_small', tooltip_key='CORE_COUNT')
136
134
 
137
- self.vertice_cnt_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=list(range(10, 501)), label="VERTICE COUNT:", label_width=30, dropdown_width=10, value=30, img='polygon')
138
- self.save_videos_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=['TRUE', 'FALSE'], label="SAVE BACKGROUND VIDEOS:", label_width=30, dropdown_width=10, value='TRUE', img='save_small')
139
- self.close_iterations_dropdown_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=list(range(1, 20)), label="GAP FILLING ITERATIONS:", label_width=30, dropdown_width=10, value=3, img='abacus')
140
- self.open_iterations_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=list(range(1, 20)), label="NOISE REMOVAL ITERATIONS:", label_width=30, dropdown_width=10, value=3, img='abacus_2')
141
- self.duplicate_inclusion_zones_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=list(self.in_videos.keys()), label="DUPLICATE INCLUSION ZONES:", label_width=30, dropdown_width=self.len_max_char, value=list(self.in_videos.keys())[0], img='duplicate')
135
+ self.vertice_cnt_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=list(range(10, 501)), label="VERTICE COUNT:", label_width=30, dropdown_width=10, value=30, img='polygon', tooltip_key='BLOB_VERTICE_COUNT')
136
+ self.save_videos_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=['TRUE', 'FALSE'], label="SAVE BACKGROUND VIDEOS:", label_width=30, dropdown_width=10, value='TRUE', img='save_small', tooltip_key='BLOB_SAVE_BG_VIDEOS')
137
+ self.close_iterations_dropdown_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=list(range(1, 20)), label="GAP FILLING ITERATIONS:", label_width=30, dropdown_width=10, value=3, img='abacus', tooltip_key='BLOB_GAP_FILL_ITERATIONS')
138
+ self.open_iterations_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=list(range(1, 20)), label="NOISE REMOVAL ITERATIONS:", label_width=30, dropdown_width=10, value=3, img='abacus_2', tooltip_key='BLOB_NOISE_REMOVAL_ITERATIONS')
139
+ self.duplicate_inclusion_zones_dropdown = SimBADropDown(parent=self.run_time_settings_frm, dropdown_options=list(self.in_videos.keys()), label="DUPLICATE INCLUSION ZONES:", label_width=30, dropdown_width=self.len_max_char, value=list(self.in_videos.keys())[0], img='duplicate', tooltip_key='BLOB_DUPLICATE_INCLUSION')
142
140
  self.duplicate_inclusion_zones_btn = SimbaButton(parent=self.run_time_settings_frm, txt='APPLY', img='tick', cmd=self._duplicate_inclusion_zones, cmd_kwargs={'video_name': lambda: self.duplicate_inclusion_zones_dropdown.getChoices()})
143
141
  self.run_time_settings_frm.grid(row=0, column=1, sticky=NW, padx=(0, 15))
144
142
 
@@ -162,16 +160,16 @@ class BlobTrackingUI(PopUpMixin):
162
160
  def get_main_table(self):
163
161
  self.headings = {}
164
162
  self.videos_frm = CreateLabelFrameWithIcon(parent=self.main_frm, header="VIDEOS", icon_name='video', pady=5, padx=15, relief='solid')
165
- self.headings['video_name'] = SimBALabel(parent=self.videos_frm, txt='VIDEO NAME', width=self.len_max_char, font=Formats.FONT_HEADER.value)
163
+ self.headings['video_name'] = SimBALabel(parent=self.videos_frm, txt='VIDEO NAME', width=self.len_max_char, font=Formats.FONT_HEADER.value, tooltip_key='BLOB_HEADER_VIDEO_NAME')
166
164
  self.headings['vertical_seperator'] = SimBASeperator(parent=self.videos_frm, color='black', orient='vertical', relief='flat')
167
- self.headings['bg_path'] = SimBALabel(parent=self.videos_frm, txt='BACKGROUND \n REFERENCE', font=Formats.FONT_HEADER.value, justify='center', img='video_2')
168
- self.headings['threshold'] = SimBALabel(parent=self.videos_frm, txt='THRESHOLD', font=Formats.FONT_HEADER.value, justify='center', img='threshold')
169
- self.headings['inclusion_zones'] = SimBALabel(parent=self.videos_frm, txt='INCLUSION \n ZONES', font=Formats.FONT_HEADER.value, img='shapes_small')
170
- self.headings['smoothing_time'] = SimBALabel(parent=self.videos_frm, txt='SMOOTHING \n TIME (S)', font=Formats.FONT_HEADER.value, img='smooth', justify='center')
171
- self.headings['buffer_size'] = SimBALabel(parent=self.videos_frm, txt='BUFFER \n SIZE (PX)', font=Formats.FONT_HEADER.value, img='resize')
172
- self.headings['closing_kernel_size'] = SimBALabel(parent=self.videos_frm, txt='GAP FILL \n SIZE (%)', font=Formats.FONT_HEADER.value, img='pct')
173
- self.headings['opening_kernel_size'] = SimBALabel(parent=self.videos_frm, txt='NOISE \n FILL SIZE (%)', font=Formats.FONT_HEADER.value, img='pct_2')
174
- self.headings['quick_check'] = SimBALabel(parent=self.videos_frm, txt='QUICK \n CHECK', font=Formats.FONT_HEADER.value, img='eye')
165
+ self.headings['bg_path'] = SimBALabel(parent=self.videos_frm, txt='BACKGROUND \n REFERENCE', font=Formats.FONT_HEADER.value, justify='center', img='video_2', tooltip_key='BLOB_HEADER_BACKGROUND_REFERENCE')
166
+ self.headings['threshold'] = SimBALabel(parent=self.videos_frm, txt='THRESHOLD', font=Formats.FONT_HEADER.value, justify='center', img='threshold', tooltip_key='BLOB_HEADER_THRESHOLD')
167
+ self.headings['inclusion_zones'] = SimBALabel(parent=self.videos_frm, txt='INCLUSION \n ZONES', font=Formats.FONT_HEADER.value, img='shapes_small', tooltip_key='BLOB_HEADER_INCLUSION_ZONES')
168
+ self.headings['smoothing_time'] = SimBALabel(parent=self.videos_frm, txt='SMOOTHING \n TIME (S)', font=Formats.FONT_HEADER.value, img='smooth', justify='center', tooltip_key='BLOB_HEADER_SMOOTHING_TIME')
169
+ self.headings['buffer_size'] = SimBALabel(parent=self.videos_frm, txt='BUFFER \n SIZE (PX)', font=Formats.FONT_HEADER.value, img='resize', tooltip_key='BLOB_HEADER_BUFFER')
170
+ self.headings['closing_kernel_size'] = SimBALabel(parent=self.videos_frm, txt='GAP FILL \n SIZE (%)', font=Formats.FONT_HEADER.value, img='pct', tooltip_key='BLOB_HEADER_GAP_FILL_SIZE')
171
+ self.headings['opening_kernel_size'] = SimBALabel(parent=self.videos_frm, txt='NOISE \n FILL SIZE (%)', font=Formats.FONT_HEADER.value, img='pct_2', tooltip_key='BLOB_HEADER_NOISE_REMOVAL_SIZE')
172
+ self.headings['quick_check'] = SimBALabel(parent=self.videos_frm, txt='QUICK \n CHECK', font=Formats.FONT_HEADER.value, img='eye', tooltip_key='BLOB_HEADER_QUICK_CHECK')
175
173
  col_cnt = 0
176
174
  for k, v in self.headings.items():
177
175
  if k == 'vertical_seperator':
@@ -190,7 +188,8 @@ class BlobTrackingUI(PopUpMixin):
190
188
  for video_cnt, (video_name, video_path) in enumerate(self.in_videos.items()):
191
189
  row_cnt = video_cnt * 2 + 2
192
190
  self.videos[video_name] = {}
193
- self.videos[video_name]['name_lbl'] = SimBALabel(parent=self.videos_frm, txt=video_name, width=self.len_max_char, font=Formats.FONT_HEADER.value)
191
+ img = read_frm_of_video(video_path=video_path, frame_index=0, size=(420, 280), keep_aspect_ratio=True, raise_error=False)
192
+ self.videos[video_name]['name_lbl'] = SimBALabel(parent=self.videos_frm, txt=video_name, width=self.len_max_char, font=Formats.FONT_HEADER.value, hover_img=img)
194
193
  self.videos[video_name]["threshold_dropdown"] = SimBADropDown(parent=self.videos_frm, dropdown_options=list(range(1, 100)), label="", label_width=0, dropdown_width=15, value=DEFAULT_THRESHOLD)
195
194
  self.videos[video_name]["inclusion_btn"] = SimbaButton(parent=self.videos_frm, txt="SET INCLUSION ZONES", cmd=lambda k=self.videos[video_name]['name_lbl']["text"]: self._launch_set_inclusion_zones(k), img='shapes_small')
196
195
  self.videos[video_name]["bg_file"] = FileSelect(parent=self.videos_frm, width=25)
@@ -20,7 +20,7 @@ class BatchPreProcessPopUp(PopUpMixin):
20
20
  def __init__(self):
21
21
  PopUpMixin.__init__(self, title="BATCH PROCESS VIDEO", size=(600, 400), icon='stack')
22
22
  selections_frm = CreateLabelFrameWithIcon(parent=self.main_frm, header="SELECTIONS", icon_name=Keys.DOCUMENTATION.value, icon_link=Links.BATCH_PREPROCESS.value,)
23
- self.input_folder_select = FolderSelect(selections_frm, "INPUT VIDEO DIRECTORY:", title="Select Folder with Input Videos", lblwidth=30, lbl_icon='folder', tooltip_key='VIDEO_DIR')
23
+ self.input_folder_select = FolderSelect(selections_frm, "INPUT VIDEO DIRECTORY:", title="Select Folder with Input Videos", lblwidth=30, lbl_icon='folder_video', tooltip_key='VIDEO_DIR')
24
24
  self.output_folder_select = FolderSelect(selections_frm, "OUTPUT VIDEO DIRECTORY:", title="Select Folder for Output videos", lblwidth=30, lbl_icon='folder_2', tooltip_key='SAVE_DIR')
25
25
 
26
26
  confirm_btn = SimbaButton(parent=selections_frm, txt="CONFIRM", img='tick', txt_clr='blue', font=Formats.FONT_REGULAR.value, cmd=self.run)
@@ -19,8 +19,8 @@ class InitializeBlobTrackerPopUp(PopUpMixin):
19
19
  def __init__(self):
20
20
  super().__init__(title="BLOB TRACKER: SELECT INPUT AND OUTPUT DIRECTORIES", size=(500, 500), icon='bubble_green')
21
21
  settings_frm = CreateLabelFrameWithIcon(parent=self.main_frm, header="DATA DIRECTORY SETTINGS", icon_name='settings')
22
- self.input_dir_select = FolderSelect(parent=settings_frm, folderDescription= 'INPUT VIDEO DIRECTORY:', lblwidth=30, entry_width=20, lbl_icon='folder', tooltip_key='VIDEO_DIR')
23
- self.save_dir_select = FolderSelect(parent=settings_frm, folderDescription='SAVE DATA DIRECTORY:', lblwidth=30, entry_width=20, lbl_icon='folder', tooltip_key='SAVE_DIR')
22
+ self.input_dir_select = FolderSelect(parent=settings_frm, folderDescription= 'INPUT VIDEO DIRECTORY:', lblwidth=30, entry_width=20, lbl_icon='folder_video', tooltip_key='VIDEO_DIR')
23
+ self.save_dir_select = FolderSelect(parent=settings_frm, folderDescription='SAVE DATA DIRECTORY:', lblwidth=30, entry_width=20, lbl_icon='folder_2', tooltip_key='SAVE_DIR')
24
24
  self.create_run_frm(run_function=self.run)
25
25
  settings_frm.grid(row=0, column=0, sticky=NW)
26
26
  self.input_dir_select.grid(row=0, column=0, sticky=NW)
@@ -50,8 +50,8 @@ from simba.utils.read_write import (
50
50
  check_if_hhmmss_timestamp_is_valid_part_of_video,
51
51
  concatenate_videos_in_folder, find_all_videos_in_directory, find_core_cnt,
52
52
  find_files_of_filetypes_in_directory, find_video_of_file, get_fn_ext,
53
- get_video_meta_data, seconds_to_timestamp, str_2_bool,
54
- timestamp_to_seconds, read_frm_of_video)
53
+ get_video_meta_data, read_frm_of_video, seconds_to_timestamp, str_2_bool,
54
+ timestamp_to_seconds)
55
55
  from simba.utils.warnings import FrameRangeWarning
56
56
  from simba.video_processors.brightness_contrast_ui import BrightnessContrastUI
57
57
  from simba.video_processors.clahe_ui import interactive_clahe_ui