simba-uw-tf-dev 4.7.7__py3-none-any.whl → 4.7.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -65,5 +65,16 @@
65
65
  "ANIMAL_COUNT": "Number of animals (tracks) in the videos. Used to name classes (e.g. animal_1, animal_2) in the YOLO dataset.",
66
66
  "sleap_remove_animal_ids": "If TRUE, merge all tracks into a single identity (animal_1). Use when animal IDs are not meaningful or for single-animal data.",
67
67
  "sleap_threshold": "Minimum SLEAP instance confidence (the instance.score column in the CSV). Only pose predictions with score ≥ this value are used when building the YOLO dataset. E.g. 90 means keep instances where instance.score ≥ 0.9; lower values include more frames but may add noisy predictions.",
68
- "SLEAP_SLP_DATA_DIR": "Directory containing SLEAP .SLP project/annotation files. Each .SLP file is converted to YOLO pose format."
68
+ "SLEAP_SLP_DATA_DIR": "Directory containing SLEAP .SLP project/annotation files. Each .SLP file is converted to YOLO pose format.",
69
+ "BATCH_CLIP_START_TIME": "Start time for clipping all videos. Use HH:MM:SS (e.g. 00:00:10). Click APPLY to copy this value to every video row.",
70
+ "BATCH_CLIP_END_TIME": "End time for clipping all videos. Use HH:MM:SS (e.g. 00:01:30). Must be after start time. Click APPLY to copy this value to every video row.",
71
+ "BATCH_DOWNSAMPLE_WIDTH": "Output width in pixels when downsampling all videos. Must be even. Click APPLY to copy to every video row.",
72
+ "BATCH_DOWNSAMPLE_HEIGHT": "Output height in pixels when downsampling all videos. Must be even. Click APPLY to copy to every video row.",
73
+ "BATCH_FPS": "Target frames per second for all videos. Click APPLY to copy this value to every video row.",
74
+ "BATCH_APPLY_DOWNSAMPLE": "Tick to check the downsample box for all videos (all will be downsampled on execute). Untick to uncheck all. Set width and height in the DOWNSAMPLE VIDEOS panel, then click APPLY there to copy those values to every row.",
75
+ "BATCH_APPLY_FPS": "Tick to enable FPS change for all videos.\nUntick to disable for all.\nSet FPS in CHANGE FPS panel, then APPLY there.",
76
+ "BATCH_APPLY_GREYSCALE": "Tick to enable greyscale for all videos.\nUntick to disable for all.",
77
+ "BATCH_APPLY_FRAME_COUNT": "Tick to superimpose frame numbers on all videos.\nUntick to disable for all.",
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."
69
80
  }
@@ -19,10 +19,12 @@ from simba.utils.checks import (check_float, check_if_dir_exists, check_int,
19
19
  check_valid_dataframe, check_valid_tuple)
20
20
  from simba.utils.enums import Options
21
21
  from simba.utils.errors import NoFilesFoundError
22
- from simba.utils.printing import SimbaTimer, stdout_success, stdout_information
23
- from simba.utils.read_write import (create_directory,
22
+ from simba.utils.printing import SimbaTimer, stdout_information, stdout_success
23
+ from simba.utils.read_write import (clean_sleap_filenames_in_directory,
24
+ copy_files_to_directory, create_directory,
24
25
  find_files_of_filetypes_in_directory,
25
- get_video_meta_data, read_frm_of_video, copy_files_to_directory, clean_sleap_filenames_in_directory, remove_a_folder)
26
+ get_video_meta_data, read_frm_of_video,
27
+ remove_a_folder)
26
28
  from simba.utils.yolo import keypoint_array_to_yolo_annotation_str
27
29
 
28
30
 
@@ -20,8 +20,8 @@ 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')
24
- self.output_folder_select = FolderSelect(selections_frm, "OUTPUT VIDEO DIRECTORY:", title="Select Folder for Output videos", lblwidth=30, lbl_icon='folder_2')
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')
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)
27
27
  selections_frm.grid(row=0, column=0, sticky=NW)
@@ -51,7 +51,7 @@ from simba.utils.read_write import (
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
53
  get_video_meta_data, seconds_to_timestamp, str_2_bool,
54
- timestamp_to_seconds)
54
+ timestamp_to_seconds, read_frm_of_video)
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
@@ -1590,7 +1590,6 @@ class ClipMultipleVideosByFrameNumbersPopUp(PopUpMixin):
1590
1590
  check_if_dir_exists(in_dir=data_dir, source=self.__class__.__name__, create_if_not_exist=False )
1591
1591
  check_if_dir_exists(in_dir=save_dir, source=self.__class__.__name__, create_if_not_exist=True)
1592
1592
  self.video_paths = find_all_videos_in_directory(directory=data_dir, as_dict=True, raise_error=True)
1593
- print(self.video_paths)
1594
1593
  self.video_meta_data = [get_video_meta_data(video_path=x)["frame_count"]for x in list(self.video_paths.values())]
1595
1594
  max_video_name_len = len(max(list(self.video_paths.keys())))
1596
1595
  super().__init__(title="CLIP MULTIPLE VIDEOS BY FRAME NUMBERS", icon='clip')
@@ -1606,9 +1605,10 @@ class ClipMultipleVideosByFrameNumbersPopUp(PopUpMixin):
1606
1605
  seperator.grid(row=1, column=0, columnspan=5, rowspan=1, sticky="ew")
1607
1606
 
1608
1607
  self.entry_boxes, self.interactive_btns = {}, {}
1609
- for cnt, video_name in enumerate(self.video_paths.keys()):
1608
+ for cnt, (video_name, video_path) in enumerate(self.video_paths.items()):
1610
1609
  self.entry_boxes[video_name] = {}
1611
- SimBALabel(parent=data_frm, font=Formats.FONT_REGULAR.value, txt=video_name + f' (frames: { self.video_meta_data[cnt]})', justify='left').grid(row=cnt + 2, column=0, padx=padx, sticky=NW)
1610
+ img = read_frm_of_video(video_path=video_path, frame_index=0, size=(420, 280), keep_aspect_ratio=True, raise_error=False)
1611
+ SimBALabel(parent=data_frm, font=Formats.FONT_REGULAR_BOLD.value, txt=video_name + f' (frames: { self.video_meta_data[cnt]})', justify='left', hover_img=img).grid(row=cnt + 2, column=0, padx=padx, sticky=NW)
1612
1612
  self.entry_boxes[video_name]["start"] = Entry_Box(data_frm, fileDescription="", labelwidth=0, validation="numeric", justify='center')
1613
1613
  self.entry_boxes[video_name]["end"] = Entry_Box(data_frm, fileDescription="", labelwidth=0, validation="numeric", justify='center')
1614
1614
  self.entry_boxes[video_name]["start"].grid(row=cnt + 2, column=2, sticky=NW, padx=padx)
@@ -1732,7 +1732,7 @@ class InitiateClipMultipleVideosByFrameNumbersPopUp(PopUpMixin):
1732
1732
  icon_link=Links.VIDEO_TOOLS.value,
1733
1733
  )
1734
1734
  self.input_folder = FolderSelect(
1735
- data_frm, "VIDEO DIRECTORY:", title="Select Folder with videos", lblwidth=30, lbl_icon='folder'
1735
+ data_frm, "VIDEO DIRECTORY:", title="Select Folder with videos", lblwidth=30, lbl_icon='folder_video'
1736
1736
  )
1737
1737
  self.output_folder = FolderSelect(
1738
1738
  data_frm,
@@ -1814,9 +1814,10 @@ class ClipMultipleVideosByTimestamps(PopUpMixin):
1814
1814
  seperator.grid(row=1, column=0, columnspan=5, rowspan=1, sticky="ew")
1815
1815
 
1816
1816
  self.entry_boxes, self.interactive_btns = {}, {}
1817
- for cnt, video_name in enumerate(self.video_paths.keys()):
1817
+ for cnt, (video_name, video_path) in enumerate(self.video_paths.items()):
1818
1818
  self.entry_boxes[video_name] = {}
1819
- SimBALabel(parent=data_frm, txt=video_name, justify='center').grid(row=cnt + 2, column=0, sticky=NW, padx=padx)
1819
+ img = read_frm_of_video(video_path=video_path, frame_index=0, size=(420, 280), keep_aspect_ratio=True, raise_error=False)
1820
+ SimBALabel(parent=data_frm, txt=video_name, justify='center', hover_img=img, font=Formats.FONT_REGULAR_BOLD.value).grid(row=cnt + 2, column=0, sticky=NW, padx=padx)
1820
1821
  video_length = self.video_meta_data[cnt]["video_length_s"]
1821
1822
  video_length_hhmmss = seconds_to_timestamp(seconds=video_length)
1822
1823
  SimBALabel(data_frm, txt=video_length_hhmmss, justify='center').grid(row=cnt + 2, column=1, sticky=NW, padx=padx)
@@ -1,6 +1,6 @@
1
1
  import os
2
- import sys
3
2
  import subprocess
3
+ import sys
4
4
  import tempfile
5
5
  from tkinter import *
6
6
  from tkinter import messagebox
@@ -17,12 +17,14 @@ try:
17
17
  except:
18
18
  from typing_extensions import Literal
19
19
 
20
+ import numpy as np
20
21
  import PIL.Image
21
22
  from PIL import ImageTk
22
23
 
23
24
  from simba.utils.enums import Defaults, Formats, TkBinds
24
25
  from simba.utils.lookups import get_icons_paths, get_tooltips
25
26
  from simba.utils.read_write import get_fn_ext
27
+ from simba.utils.checks import check_if_valid_img
26
28
 
27
29
  MENU_ICONS = get_icons_paths()
28
30
  TOOLTIPS = get_tooltips()
@@ -593,7 +595,8 @@ def SimbaCheckbox(parent: Union[Frame, Toplevel, LabelFrame, Canvas],
593
595
  state: Literal["disabled", 'normal'] = NORMAL,
594
596
  indicatoron: bool = True,
595
597
  cmd: Optional[Callable] = None,
596
- tooltip_txt: Optional[str] = None):
598
+ tooltip_txt: Optional[str] = None,
599
+ tooltip_key: Optional[str] = None):
597
600
 
598
601
  var = BooleanVar(value=False)
599
602
  if val: var.set(True)
@@ -610,6 +613,8 @@ def SimbaCheckbox(parent: Union[Frame, Toplevel, LabelFrame, Canvas],
610
613
 
611
614
  if isinstance(tooltip_txt, str):
612
615
  CreateToolTip(widget=cb, text=tooltip_txt)
616
+ elif isinstance(tooltip_key, str) and tooltip_key in TOOLTIPS.keys():
617
+ CreateToolTip(widget=cb, text=TOOLTIPS[tooltip_key])
613
618
 
614
619
  return cb, var
615
620
 
@@ -630,14 +635,56 @@ def SimBALabel(parent: Union[Frame, Canvas, LabelFrame, Toplevel],
630
635
  cursor: Optional[str] = None,
631
636
  img: Optional[str] = None,
632
637
  anchor: Optional[str] = None,
633
- tooltip_key: Optional[str] = None):
634
-
638
+ tooltip_key: Optional[str] = None,
639
+ hover_img: Optional[np.ndarray] = None):
640
+
641
+
642
+ def _hover_enter(e):
643
+ w = e.widget
644
+ if hover_img is not None and check_if_valid_img(data=hover_img, raise_error=False):
645
+ arr = np.asarray(hover_img, dtype=np.uint8)
646
+ if arr.ndim == 3 and arr.shape[2] == 3:
647
+ arr = arr[:, :, ::-1]
648
+ pil_img = PIL.Image.fromarray(arr)
649
+ photo = ImageTk.PhotoImage(pil_img)
650
+ tw = Toplevel(w)
651
+ tw.wm_overrideredirect(True)
652
+ tw.attributes("-topmost", True)
653
+ tw.wm_geometry("+%d+%d" % (w.winfo_rootx() + w.winfo_width() + 4, w.winfo_rooty()))
654
+ frm = Frame(tw, relief="solid", bd=2, bg="#f0f0f0")
655
+ frm.pack(padx=2, pady=2)
656
+ lbl_hover = Label(frm, image=photo, bg="#f0f0f0")
657
+ lbl_hover.image = photo
658
+ lbl_hover.pack(padx=4, pady=(4, 2))
659
+ caption_lbl = Label(frm, text=txt, font=font, fg=txt_clr, bg=bg_clr)
660
+ caption_lbl.pack(pady=(0, 4))
661
+ tw.lift()
662
+ w._hover_toplevel = tw
663
+ elif hover_fg_clr is not None or hover_font is not None:
664
+ w.config(fg=hover_fg_clr, font=hover_font)
665
+
666
+ def _hover_leave(e):
667
+ w = e.widget
668
+ if getattr(w, "_hover_toplevel", None) is not None:
669
+ try:
670
+ w._hover_toplevel.destroy()
671
+ except tkinter.TclError:
672
+ pass
673
+ w._hover_toplevel = None
674
+ if hover_fg_clr is not None or hover_font is not None:
675
+ w.config(fg=txt_clr, bg=bg_clr, font=font)
635
676
 
636
677
  def on_enter(e):
637
- e.widget.config(fg=hover_fg_clr, font=hover_font)
678
+ if hover_img is not None:
679
+ _hover_enter(e)
680
+ else:
681
+ e.widget.config(fg=hover_fg_clr, font=hover_font)
638
682
 
639
683
  def on_leave(e):
640
- e.widget.config(fg=txt_clr, bg=bg_clr, font=font)
684
+ if hover_img is not None:
685
+ _hover_leave(e)
686
+ else:
687
+ e.widget.config(fg=txt_clr, bg=bg_clr, font=font)
641
688
 
642
689
  anchor = 'w' if anchor is None else anchor
643
690
  if isinstance(img, str) and img in MENU_ICONS.keys():
@@ -673,7 +720,7 @@ def SimBALabel(parent: Union[Frame, Canvas, LabelFrame, Toplevel],
673
720
  elif tooltip_key in TOOLTIPS.keys():
674
721
  CreateToolTip(widget=lbl, text=TOOLTIPS[tooltip_key])
675
722
 
676
- if hover_font is not None or hover_fg_clr is not None:
723
+ if hover_font is not None or hover_fg_clr is not None or hover_img is not None:
677
724
  lbl.bind(TkBinds.ENTER.value, on_enter)
678
725
  lbl.bind(TkBinds.LEAVE.value, on_leave)
679
726
 
simba/utils/read_write.py CHANGED
@@ -71,7 +71,7 @@ from simba.utils.errors import (CorruptedFileError, DataHeaderError,
71
71
  NoFilesFoundError, NotDirectoryError,
72
72
  ParametersFileError, PermissionError,
73
73
  SimBAPAckageVersionError)
74
- from simba.utils.printing import SimbaTimer, stdout_success, stdout_information
74
+ from simba.utils.printing import SimbaTimer, stdout_information, stdout_success
75
75
  from simba.utils.warnings import (
76
76
  FileExistWarning, FrameRangeWarning, GPUToolsWarning, InvalidValueWarning,
77
77
  NoFileFoundWarning, ThirdPartyAnnotationsInvalidFileFormatWarning)
@@ -20,7 +20,7 @@ from simba.utils.checks import (check_ffmpeg_available,
20
20
  check_if_string_value_is_valid_video_timestamp,
21
21
  check_int, check_nvidea_gpu_available,
22
22
  check_that_hhmmss_start_is_before_end)
23
- from simba.utils.enums import Formats, Keys, Links, Options, TextOptions
23
+ from simba.utils.enums import Formats, Keys, Links, Options
24
24
  from simba.utils.errors import (FFMPEGCodecGPUError, FFMPEGNotFoundError,
25
25
  NoFilesFoundError)
26
26
  from simba.utils.lookups import (get_color_dict, get_ffmpeg_encoders,
@@ -28,9 +28,7 @@ from simba.utils.lookups import (get_color_dict, get_ffmpeg_encoders,
28
28
  percent_to_crf_lookup,
29
29
  video_quality_to_preset_lookup)
30
30
  from simba.utils.printing import SimbaTimer, stdout_success
31
- from simba.utils.read_write import (
32
- check_if_hhmmss_timestamp_is_valid_part_of_video, get_fn_ext,
33
- get_video_meta_data, str_2_bool)
31
+ from simba.utils.read_write import (check_if_hhmmss_timestamp_is_valid_part_of_video, get_fn_ext, get_video_meta_data, str_2_bool, read_frm_of_video)
34
32
  from simba.video_processors.batch_process_create_ffmpeg_commands import \
35
33
  FFMPEGCommandCreator
36
34
  from simba.video_processors.roi_selector import ROISelector
@@ -76,12 +74,15 @@ class BatchProcessFrame(PopUpMixin):
76
74
  raise FFMPEGNotFoundError(msg='Cannot perform batch video processing: FFMPEG not found', source=self.__class__.__name__)
77
75
 
78
76
 
79
- PopUpMixin.__init__(self, title="BATCH PRE-PROCESS VIDEOS IN SIMBA", size=(2000, 600), icon='factory')
77
+
80
78
  self.input_dir, self.output_dir = input_dir, output_dir
81
79
  if not os.path.exists(self.output_dir):
82
80
  os.makedirs(self.output_dir)
83
81
  self.videos_in_dir_dict, self.crop_dict = {}, {}
84
82
  self.get_input_files()
83
+ if len(list(self.videos_in_dir_dict.keys())) == 0:
84
+ raise NoFilesFoundError(msg=f"The input directory {self.input_dir} contains ZERO video files in either .avi, .mp4, .mov, .flv, or m4v format", source=self.__class__.__name__)
85
+ PopUpMixin.__init__(self, title="BATCH PRE-PROCESS VIDEOS IN SIMBA", size=(2000, 600), icon='factory')
85
86
  self.red_drop_img = ImageTk.PhotoImage(image=PIL.Image.open(MENU_ICONS["crop_red"]["icon_path"]))
86
87
  self.black_crop_img = ImageTk.PhotoImage(image=PIL.Image.open(MENU_ICONS["crop"]["icon_path"]))
87
88
  self.percent_to_crf_lookup = percent_to_crf_lookup()
@@ -91,8 +92,7 @@ class BatchProcessFrame(PopUpMixin):
91
92
  self.video_quality_to_preset_lookup = video_quality_to_preset_lookup()
92
93
  self.clrs = get_color_dict()
93
94
  self.gpu_available_state = NORMAL if check_nvidea_gpu_available() else DISABLED
94
- if len(list(self.videos_in_dir_dict.keys())) == 0:
95
- raise NoFilesFoundError(msg=f"The input directory {self.input_dir} contains ZERO video files in either .avi, .mp4, .mov, .flv, or m4v format", source=self.__class__.__name__)
95
+
96
96
  self.max_char_vid_name = len(max(list(self.videos_in_dir_dict.keys()), key=len))
97
97
  self.root.lift()
98
98
  self.root.attributes("-topmost", True)
@@ -124,24 +124,24 @@ class BatchProcessFrame(PopUpMixin):
124
124
  self.quick_settings_frm = CreateLabelFrameWithIcon(parent=self.main_frm,header="QUICK SETTINGS",icon_name=Keys.DOCUMENTATION.value,icon_link=Links.BATCH_PREPROCESS.value)
125
125
 
126
126
  self.clip_video_settings_frm = CreateLabelFrameWithIcon(parent=self.quick_settings_frm, header='CLIP VIDEOS SETTING', icon_name='clip', padx=5, pady=5)
127
- self.quick_clip_start_entry_box = Entry_Box(parent=self.clip_video_settings_frm, fileDescription='START TIME: ', labelwidth=15, value="00:00:00", justify='center', img='play', entry_box_width=12)
128
- self.quick_clip_end_entry_box = Entry_Box(parent=self.clip_video_settings_frm, fileDescription='END TIME: ', labelwidth=15, value="00:00:00", justify='center', img='finish', entry_box_width=12)
127
+ self.quick_clip_start_entry_box = Entry_Box(parent=self.clip_video_settings_frm, fileDescription='START TIME: ', labelwidth=15, value="00:00:00", justify='center', img='play', entry_box_width=12, tooltip_key='BATCH_CLIP_START_TIME')
128
+ self.quick_clip_end_entry_box = Entry_Box(parent=self.clip_video_settings_frm, fileDescription='END TIME: ', labelwidth=15, value="00:00:00", justify='center', img='finish', entry_box_width=12, tooltip_key='BATCH_CLIP_END_TIME')
129
129
  self.quick_clip_apply = SimbaButton(parent=self.clip_video_settings_frm, txt='APPLY', img='arrow_down_green_2', cmd=self.apply_trim_to_all)
130
130
 
131
131
  self.quick_downsample_frm = CreateLabelFrameWithIcon(parent=self.quick_settings_frm, header='DOWNSAMPLE VIDEOS', icon_name='resize', padx=5, pady=5)
132
- self.quick_downsample_width = Entry_Box(parent=self.quick_downsample_frm, fileDescription='WIDTH: ', labelwidth=15, value=400, justify='center', img='width', entry_box_width=12)
133
- self.quick_downsample_height = Entry_Box(parent=self.quick_downsample_frm, fileDescription='HEIGHT: ', labelwidth=15, value=600, justify='center', img='height', entry_box_width=12)
132
+ self.quick_downsample_width = Entry_Box(parent=self.quick_downsample_frm, fileDescription='WIDTH: ', labelwidth=15, value=400, justify='center', img='width', entry_box_width=12, tooltip_key='BATCH_DOWNSAMPLE_WIDTH')
133
+ self.quick_downsample_height = Entry_Box(parent=self.quick_downsample_frm, fileDescription='HEIGHT: ', labelwidth=15, value=600, justify='center', img='height', entry_box_width=12, tooltip_key='BATCH_DOWNSAMPLE_HEIGHT')
134
134
  self.quick_downsample_apply = SimbaButton(parent=self.quick_downsample_frm, txt='APPLY', img='arrow_down_green_2', cmd=self.apply_resolution_to_all)
135
135
 
136
136
 
137
137
  self.quick_set_fps = CreateLabelFrameWithIcon(parent=self.quick_settings_frm, header="CHANGE FPS", icon_name='camera', padx=5, pady=12)
138
- self.quick_fps_entry_box = Entry_Box(parent=self.quick_set_fps, fileDescription='FPS: ', labelwidth=15, value=15.0, justify='center', img='camera', entry_box_width=12)
138
+ self.quick_fps_entry_box = Entry_Box(parent=self.quick_set_fps, fileDescription='FPS: ', labelwidth=15, value=15.0, justify='center', img='camera', entry_box_width=12, tooltip_key='BATCH_FPS')
139
139
  self.quick_fps_apply = SimbaButton(parent=self.quick_set_fps, txt='APPLY', img='arrow_down_green_2', cmd=self.apply_fps_to_all)
140
140
 
141
141
 
142
142
  self.quick_set_quality = CreateLabelFrameWithIcon(parent=self.quick_settings_frm, header="OUTPUT VIDEO QUALITY", icon_name='star', padx=5, pady=12)
143
- self.use_gpu_dropdown = SimBADropDown(parent=self.quick_set_quality, label="USE GPU", label_width=20, dropdown_options=['TRUE', 'FALSE'], value='FALSE', img='gpu_3', state=self.gpu_available_state, dropdown_width=15)
144
- self.quick_set_quality_dropdown = SimBADropDown(parent=self.quick_set_quality, label='VIDEO QUALITY %', label_width=20, dropdown_options=self.cpu_video_quality, value=60, img='star', dropdown_width=15)
143
+ self.use_gpu_dropdown = SimBADropDown(parent=self.quick_set_quality, label="USE GPU", label_width=20, dropdown_options=['TRUE', 'FALSE'], value='FALSE', img='gpu_3', state=self.gpu_available_state, dropdown_width=15, tooltip_key='USE_GPU')
144
+ self.quick_set_quality_dropdown = SimBADropDown(parent=self.quick_set_quality, label='VIDEO QUALITY %', label_width=20, dropdown_options=self.cpu_video_quality, value=60, img='star', dropdown_width=15, tooltip_key='OUTPUT_VIDEO_QUALITY')
145
145
  self.quick_set_quality_apply = SimbaButton(parent=self.quick_set_quality, txt='APPLY', img='arrow_down_green_2', cmd=self.apply_quality_to_all)
146
146
 
147
147
  self.quick_settings_frm.grid(row=0, column=0, sticky=W, padx=10)
@@ -224,15 +224,15 @@ class BatchProcessFrame(PopUpMixin):
224
224
  self.headings["start_time_col_head"] = SimBALabel(parent=self.videos_frm, txt='START \n TIME', font=Formats.FONT_REGULAR_BOLD.value, justify='center', padx=12, img='play')
225
225
  self.headings["end_time_col_head"] = SimBALabel(parent=self.videos_frm, txt='END \n TIME', font=Formats.FONT_REGULAR_BOLD.value, justify='center', img='stop', padx=12)
226
226
  self.headings["video_quality_head"] = SimBALabel(parent=self.videos_frm, txt='QUALITY', font=Formats.FONT_REGULAR_BOLD.value, justify='center', padx=12, img='star')
227
- self.headings["shorten_all_videos_cbox"], self.headings["clip_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n CLIP', txt_img='clip', cmd=lambda: self.inverse_all_cb_ticks(variable_name="clip_cb_var"))
227
+ self.headings["shorten_all_videos_cbox"], self.headings["clip_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n CLIP', txt_img='clip', cmd=lambda: self.inverse_all_cb_ticks(variable_name="clip_cb_var"), tooltip_key='BATCH_APPLY_CLIP')
228
228
  self.headings["video_width_col_head"] = SimBALabel(parent=self.videos_frm, txt='WIDTH', img='width', font=Formats.FONT_REGULAR_BOLD.value, justify='center', padx=12)
229
229
  self.headings["video_height_col_head"] = SimBALabel(parent=self.videos_frm, txt='HEIGHT', img='height', font=Formats.FONT_REGULAR_BOLD.value, justify='center', padx=12)
230
- self.headings["downsample_all_videos_cbox"], self.headings["downsample_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n DOWNSAMPLE', cmd=lambda: self.inverse_all_cb_ticks(variable_name="downsample_cb_var"))
230
+ self.headings["downsample_all_videos_cbox"], self.headings["downsample_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n DOWNSAMPLE', cmd=lambda: self.inverse_all_cb_ticks(variable_name="downsample_cb_var"), tooltip_key='BATCH_APPLY_DOWNSAMPLE')
231
231
  self.headings["fps_col_head"] = SimBALabel(parent=self.videos_frm, txt='FPS', img='camera', font=Formats.FONT_REGULAR_BOLD.value, justify='center', padx=12)
232
- self.headings["change_fps_all_videos_cbox"], self.headings["fps_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n VIDEO FPS', cmd=lambda: self.inverse_all_cb_ticks(variable_name="fps_cb_var"))
233
- self.headings["grayscale_cbox"], self.headings["grayscale_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n GREYSCALE', cmd=lambda: self.inverse_all_cb_ticks(variable_name="grayscale_cb_var"))
234
- self.headings["frame_cnt_cbox"], self.headings["frame_cnt_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n FRAME COUNT', cmd=lambda: self.inverse_all_cb_ticks(variable_name="frame_cnt_cb_var"))
235
- self.headings["apply_clahe_cbox"], self.headings["apply_clahe_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n CLAHE', cmd=lambda: self.inverse_all_cb_ticks(variable_name="apply_clahe_cb_var"))
232
+ self.headings["change_fps_all_videos_cbox"], self.headings["fps_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n VIDEO FPS', cmd=lambda: self.inverse_all_cb_ticks(variable_name="fps_cb_var"), tooltip_key='BATCH_APPLY_FPS')
233
+ self.headings["grayscale_cbox"], self.headings["grayscale_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n GREYSCALE', cmd=lambda: self.inverse_all_cb_ticks(variable_name="grayscale_cb_var"), tooltip_key='BATCH_APPLY_GREYSCALE')
234
+ self.headings["frame_cnt_cbox"], self.headings["frame_cnt_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n FRAME COUNT', cmd=lambda: self.inverse_all_cb_ticks(variable_name="frame_cnt_cb_var"), tooltip_key='BATCH_APPLY_FRAME_COUNT')
235
+ self.headings["apply_clahe_cbox"], self.headings["apply_clahe_cb_var"] = SimbaCheckbox(parent=self.videos_frm, txt='APPLY \n CLAHE', cmd=lambda: self.inverse_all_cb_ticks(variable_name="apply_clahe_cb_var"), tooltip_key='BATCH_APPLY_CLAHE')
236
236
 
237
237
  self.videos_frm.grid(row=1, column=0, sticky=W, padx=5, pady=15)
238
238
  self.headings["video_name_col_head"].grid(row=0, column=0, sticky=NW)
@@ -270,12 +270,12 @@ class BatchProcessFrame(PopUpMixin):
270
270
  for w in self.videos_frm.grid_slaves():
271
271
  if int(w.grid_info()["row"]) > 1:
272
272
  w.destroy()
273
-
274
273
  for video_cnt, (name, data) in enumerate(self.videos_in_dir_dict.items()):
275
274
  self.videos[name] = {}
276
275
  row = video_cnt * 2 + 2
277
276
  row_color = '#f8f8f8' if video_cnt % 2 == 0 else '#e5e5e5'
278
- self.videos[name]["video_name_lbl"] = SimBALabel(parent=self.videos_frm, txt=name, font=Formats.FONT_REGULAR_BOLD.value, width=self.max_char_vid_name, justify='center', bg_clr=row_color)
277
+ img = read_frm_of_video(video_path=data['file_path'], frame_index=0, raise_error=False, size=(420, 280), keep_aspect_ratio=True)
278
+ self.videos[name]["video_name_lbl"] = SimBALabel(parent=self.videos_frm, txt=name, font=Formats.FONT_REGULAR_BOLD.value, width=self.max_char_vid_name, justify='center', bg_clr=row_color, hover_img=img)
279
279
  self.videos[name]["crop_btn"] = SimbaButton(parent=self.videos_frm, txt='CROP', txt_clr='black', cmd=lambda k=self.videos[name]["video_name_lbl"]["text"]: self.batch_process_crop_function(k), img='crop_2')
280
280
  self.videos[name]["start_entry"] = Entry_Box(parent=self.videos_frm, fileDescription='', value="00:00:00", justify='center', entry_font=Formats.FONT_REGULAR_BOLD.value, entry_box_width=12)
281
281
  self.videos[name]["end_entry"] = Entry_Box(parent=self.videos_frm, fileDescription='', value=data["video_length"], justify='center', entry_font=Formats.FONT_REGULAR_BOLD.value, entry_box_width=12)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simba-uw-tf-dev
3
- Version: 4.7.7
3
+ Version: 4.7.8
4
4
  Summary: Toolkit for computer classification and analysis of behaviors in experimental animals
5
5
  Home-page: https://github.com/sgoldenlab/simba
6
6
  Author: Simon Nilsson, Jia Jie Choong, Sophia Hwang
@@ -464,7 +464,7 @@ simba/assets/lookups/critical_values_05.pickle,sha256=bYlqp9T6ehVIjIJr3Uwfulj-kS
464
464
  simba/assets/lookups/feature_extraction_headers.csv,sha256=I5TLfAihpHgzUZ7OUyGge-Yu-XGbQmHbDFAD4vVAc4w,2987
465
465
  simba/assets/lookups/features.csv,sha256=bc6aN2ZRa2J2dxur-Zjcpc4I3q6vd-gN2erwnhdzLIk,14175
466
466
  simba/assets/lookups/model_names.parquet,sha256=hOuvYONO8wZGcAwRNSf_hS_lUaynC8Gt24MLOg3w5ZA,270783
467
- simba/assets/lookups/tooptips.json,sha256=DfEEEYdtLWfTg2P35N1rTPoxeOCDMJvKQIqCwFyh3zw,9794
467
+ simba/assets/lookups/tooptips.json,sha256=OJurG8K738TNZVwAk-OfUFuC69ZW7UjiU-8mjowKcd8,11349
468
468
  simba/assets/lookups/unsupervised_example_x.csv,sha256=bc6aN2ZRa2J2dxur-Zjcpc4I3q6vd-gN2erwnhdzLIk,14175
469
469
  simba/assets/lookups/yolo.yaml,sha256=3Omt-t-w555E4oAJsRRblBjzyiTW9e5x-0VuyQ-t9C0,278
470
470
  simba/assets/lookups/yolo_schematics/yolo_1.csv,sha256=TzUzWAtia4P-5FRwLPnjU0zDSkAA-nItNFCcq6nG_iQ,72
@@ -1363,7 +1363,7 @@ simba/third_party_label_appenders/transform/labelme_to_yolo_seg.py,sha256=wJOGVZ
1363
1363
  simba/third_party_label_appenders/transform/simba_roi_to_yolo.py,sha256=i0bO_ZwjHSMzCfHlKecuqYXBvJgzhg2ohoVXdjzkemU,12969
1364
1364
  simba/third_party_label_appenders/transform/simba_to_yolo.py,sha256=9_gH94YxdeDwVfZF9Vlv-w5SiOu41X1Lpk98UWztXZ4,13570
1365
1365
  simba/third_party_label_appenders/transform/simba_to_yolo_seg.py,sha256=NzmzQj618_SqTn16b9PPohaFYjzmtFFMUKoDezN_wLA,12732
1366
- simba/third_party_label_appenders/transform/sleap_csv_to_yolo.py,sha256=rep41f1_Mh1Cw4vV875vZuieXYNgBAgJJbft-w-dLgw,12758
1366
+ simba/third_party_label_appenders/transform/sleap_csv_to_yolo.py,sha256=lIPv-QhFO22OYHrcT9OaIjO7UVntZrUA3IzkYnu3fVI,12832
1367
1367
  simba/third_party_label_appenders/transform/sleap_h5_to_yolo.py,sha256=bb-5JgTp8rtOdJgkbsghQNyxM4BwQSRkY37-v2XVMHM,11036
1368
1368
  simba/third_party_label_appenders/transform/sleap_to_yolo.py,sha256=yorjyNlUnPzgVJDHahxBlIE2F-1JTvJaIXynnRZrAFw,10342
1369
1369
  simba/third_party_label_appenders/transform/utils.py,sha256=2W1G0pyUm7oHqu0xhyJowxPp9xxSmMpqXfNzGJIFjvo,31652
@@ -1379,7 +1379,7 @@ simba/ui/import_videos_frame.py,sha256=i0LnQzPLFne9dA_nvpVWAHYGmi0aTRXpiHzEog_-R
1379
1379
  simba/ui/machine_model_settings_ui.py,sha256=hTfpBxtfYGH9Rsf3JdQ5Sc8z874tYAoZefvjF1JD6gA,38292
1380
1380
  simba/ui/ml_settings_frm.py,sha256=f1-E6pEGjWJVF3I6n0azO9zAnsskpZjInViguHIDntw,3101
1381
1381
  simba/ui/px_to_mm_ui.py,sha256=ETedZPFkloU0l3JeGnhiSIAsGBQzzv0YrDWtiVGOmJ4,9387
1382
- simba/ui/tkinter_functions.py,sha256=CUha5AY7iAuFL4Nt2oxHhV9eZIEuyDMq0J_VSoTjSio,41511
1382
+ simba/ui/tkinter_functions.py,sha256=2CFxlXZ8-gRxTRBPtcHsga1PkR8wlwJGIXYsxTgHrRk,43526
1383
1383
  simba/ui/user_defined_pose_creator.py,sha256=QAfdp8r225DONLaCgQJe6kXiZZLj20VQCLJEnCvZsKs,9249
1384
1384
  simba/ui/video_info_ui.py,sha256=ld_fN-3vCYJDFv1t9i5B-VVtoaBCspDmiDUIfOSJb_8,17262
1385
1385
  simba/ui/video_timelaps.py,sha256=GSQAD0Qg_7ctDsUsKFHm-6pSYGau_EZv5oBJ50ssUUE,26010
@@ -1390,7 +1390,7 @@ simba/ui/pop_ups/animal_directing_other_animals_pop_up.py,sha256=eaRVoEJ0WPnR15B
1390
1390
  simba/ui/pop_ups/append_roi_features_animals_pop_up.py,sha256=__UwX3PuzPIeg5mSOY2yk4rJPHwwyCsWpLuqcBhLgH0,3308
1391
1391
  simba/ui/pop_ups/append_roi_features_bodypart_pop_up.py,sha256=b21GIlgBCgAAM-MR_1LUmAdV9oiyHzO4fv_4HvqjVQM,1955
1392
1392
  simba/ui/pop_ups/archive_files_pop_up.py,sha256=4dByXZS0bCZxy06-7WoElmcFSMoKfBbX3ZgamkZgIfs,1734
1393
- simba/ui/pop_ups/batch_preprocess_pop_up.py,sha256=dwyaLJkXyIKUn6zyXXLktBJMbup6hwi8gIKryOQP4G4,2820
1393
+ simba/ui/pop_ups/batch_preprocess_pop_up.py,sha256=DruWHeMYAlf18vK_LeyO9ewGFPKiGbCtIHGwHZQ9RQA,2869
1394
1394
  simba/ui/pop_ups/blob_visualizer_pop_up.py,sha256=6OzJMROHowZWIcI5FL9a8uIo70K_dZKaVNs9-rUWWbE,6924
1395
1395
  simba/ui/pop_ups/boolean_conditional_slicer_pup_up.py,sha256=q3IGjO4rwCCM8ODS2O7CueNRPFvSkJLHAgcV31sE0y4,5506
1396
1396
  simba/ui/pop_ups/change_speed_popup.py,sha256=59Ck0kzLTQpE5AXURVRcNdK-a0kFOnwvTE0RZjs0lfI,5940
@@ -1477,11 +1477,11 @@ simba/ui/pop_ups/subset_feature_extractor_pop_up.py,sha256=M24iJSqh-DpYdpw1pSaIm
1477
1477
  simba/ui/pop_ups/targeted_annotation_clips_pop_up.py,sha256=PFh5ua2f_OMQ1Pth9Ha8Fo5lTPZNQV3bMnRGEoAPhTQ,6997
1478
1478
  simba/ui/pop_ups/third_party_annotator_appender_pop_up.py,sha256=Xnha2UwM-08djObCkL_EXK2L4pernyipzbyNKQvX5aQ,7694
1479
1479
  simba/ui/pop_ups/validation_plot_pop_up.py,sha256=yIo_el2dR_84ZAh_-2fYFg-BJDG0Eip_P_o9vzTQRkk,12174
1480
- simba/ui/pop_ups/video_processing_pop_up.py,sha256=_7nVjWkXoLuvxIjEEAJjzWe7Lf1H_HAWbNp31ZB6AvA,252019
1480
+ simba/ui/pop_ups/video_processing_pop_up.py,sha256=YPFbfbukxIOge2SO1pA57nxVoLwToPrJpsQ_cf1qU9A,252384
1481
1481
  simba/ui/pop_ups/visualize_pose_in_dir_pop_up.py,sha256=PpFs0zaqF4dnHJ_yH-PqYgsjAyxYPVP427Soj-kYtM0,8838
1482
1482
  simba/ui/pop_ups/yolo_inference_popup.py,sha256=C4_WDvEHLp9JMUTjLZuRpKHxMCGpa_pxXELuj-zerCs,14679
1483
1483
  simba/ui/pop_ups/yolo_plot_results.py,sha256=WvDS3kCYZU_27EpADNev0tAKBPI-CUkYv9Dxz0eP83c,9803
1484
- simba/ui/pop_ups/yolo_pose_train_popup.py,sha256=x3ftkUlVZUXlBvee2w9IkQdGlSMEFPKXWExGIZgdHCU,8904
1484
+ simba/ui/pop_ups/yolo_pose_train_popup.py,sha256=30CmqmhgFaFD4eRlENvP4D3Fh2eQ9rXIUPC47Z6dhbs,8904
1485
1485
  simba/unsupervised/.DS_Store,sha256=3YMgk5I3uoYy8KIh_EO-KH7CFu-0y7ileb-YFwM4ks4,6148
1486
1486
  simba/unsupervised/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1487
1487
  simba/unsupervised/bout_aggregator.py,sha256=FJiAdl3RWpCOPdi0Qzq3vPYzG62zQZqeo8mYUrTqRto,4674
@@ -1526,7 +1526,7 @@ simba/utils/enums.py,sha256=ZR2175N06ZHZNiHk8n757T-WGyt1-55LLpcg3Sbb91k,38668
1526
1526
  simba/utils/errors.py,sha256=aC-1qiGlh1vvHxUaPxBMQ9-LW-KKWXCGlH9acCPH0Cc,18788
1527
1527
  simba/utils/lookups.py,sha256=hVUIis9FxgoKvTa2S2Rhrqg_LKrzW13tEBr3Tt8ZP44,50458
1528
1528
  simba/utils/printing.py,sha256=2s-uESy1knuPiniqQ-q277uQ2teYM4OHo9Y4L20JQWM,5353
1529
- simba/utils/read_write.py,sha256=b9BRJxqfJoGj4tNxgJ4WotNpCqOMQa0orGS6_TGoCug,190067
1529
+ simba/utils/read_write.py,sha256=dPVXv1lb748gZipOL6hP40_sRzk_gGsJpHYoJyI5w3o,190067
1530
1530
  simba/utils/warnings.py,sha256=K7w1RiDL4Un7rGaabOVCGc9fHcaKxk66iZyNLS_AtOE,8121
1531
1531
  simba/utils/yolo.py,sha256=UZzpnDqZj81SOMnwsWPQIhFAsHHSSaDawi1UUh0-uAA,19264
1532
1532
  simba/utils/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1535,7 +1535,7 @@ simba/video_processors/.DS_Store,sha256=6gsgZL1uIfKqBNSk6EAKBP9lJ1qMrQy6XrEvluyc
1535
1535
  simba/video_processors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1536
1536
  simba/video_processors/async_frame_reader.py,sha256=_17735pfAKUDHE18snAbWIbxUhIFkx3m-HipWqoE6r8,8059
1537
1537
  simba/video_processors/batch_process_create_ffmpeg_commands.py,sha256=qfGb6KeJ7kOpRreRfpV1Lb9zCOL2g7cDqUFbEk9or2k,14194
1538
- simba/video_processors/batch_process_menus.py,sha256=cLgJCx90wvgzZJX2ygoPIQc1f4cWPaC6O02XH7Ta458,37627
1538
+ simba/video_processors/batch_process_menus.py,sha256=ZyurUh8XPa9iT9vQXIBGCK41ryQT_YE1xp01g1M75jU,38224
1539
1539
  simba/video_processors/blob_tracking_executor.py,sha256=hyB-FYwbCmk44ytOmYQsiWHh7ecE0h5A0-ySjpYWyvY,18395
1540
1540
  simba/video_processors/brightness_contrast_ui.py,sha256=nWmzho1WeJuIp3CuDjJmqMIzge2sTZn6_H0lWyZYaz0,5202
1541
1541
  simba/video_processors/calculate_px_dist.py,sha256=se9M1Kv6VxjVTZqSBmdmx29fg10s-1tL1UqJ6353Iqc,10029
@@ -1549,9 +1549,9 @@ simba/video_processors/roi_selector_circle.py,sha256=SD_lv6V3MGiIQd0VtUFSKe83ySW
1549
1549
  simba/video_processors/roi_selector_polygon.py,sha256=DMtilt__gGwNu6VV73CWbnPqrPBXkan1_akUqGEzfGw,6742
1550
1550
  simba/video_processors/video_processing.py,sha256=hYyAqBQfSwPFruqLvjGr1nBG7Tfp9VAWySh4HN_SPpA,328019
1551
1551
  simba/video_processors/videos_to_frames.py,sha256=8hltNZpwUfb3GFi-63D0PsySmD5l59pbzQGJx8SscgU,7818
1552
- simba_uw_tf_dev-4.7.7.dist-info/LICENSE,sha256=Sjn362upcvYFypam-b-ziOXU1Wl5GGuTt5ICrGimzyA,1720
1553
- simba_uw_tf_dev-4.7.7.dist-info/METADATA,sha256=kqBjJEYd3nc9kFbD9wxAWMhdaKTpOktprgZzt5TdIIE,11432
1554
- simba_uw_tf_dev-4.7.7.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
1555
- simba_uw_tf_dev-4.7.7.dist-info/entry_points.txt,sha256=Nfh_EbfDGdKftLjCnGWtQrBHENiDYMdgupwLyLpU5dc,44
1556
- simba_uw_tf_dev-4.7.7.dist-info/top_level.txt,sha256=ogtimvlqDxDTOBAPfT2WaQ2pGAAbKRXG8z8eUTzf6TU,14
1557
- simba_uw_tf_dev-4.7.7.dist-info/RECORD,,
1552
+ simba_uw_tf_dev-4.7.8.dist-info/LICENSE,sha256=Sjn362upcvYFypam-b-ziOXU1Wl5GGuTt5ICrGimzyA,1720
1553
+ simba_uw_tf_dev-4.7.8.dist-info/METADATA,sha256=eOVBjatTdeyGOyU4tVJ14bW-G7vZd6kOoxRW-GH-MDw,11432
1554
+ simba_uw_tf_dev-4.7.8.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
1555
+ simba_uw_tf_dev-4.7.8.dist-info/entry_points.txt,sha256=Nfh_EbfDGdKftLjCnGWtQrBHENiDYMdgupwLyLpU5dc,44
1556
+ simba_uw_tf_dev-4.7.8.dist-info/top_level.txt,sha256=ogtimvlqDxDTOBAPfT2WaQ2pGAAbKRXG8z8eUTzf6TU,14
1557
+ simba_uw_tf_dev-4.7.8.dist-info/RECORD,,