Skip to content

Commit 39b9722

Browse files
author
arch
committed
remove delayed tracking lost
1 parent 38e9539 commit 39b9722

File tree

3 files changed

+88
-94
lines changed

3 files changed

+88
-94
lines changed

funscript_editor/algorithms/funscriptgenerator.py

Lines changed: 86 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -814,117 +814,110 @@ def tracking(self) -> str:
814814
delete_last_predictions = 0
815815
bbox_woman = [None for _ in range(self.params.number_of_trackers)]
816816
bbox_men = [None for _ in range(self.params.number_of_trackers)]
817-
while video.isOpen():
818-
cycle_start = time.time()
819-
frame = video.read()
820-
frame_num += 1
821-
822-
if frame is None:
823-
status = 'Reach a corrupt video frame' if video.isOpen() else 'End of video reached'
824-
break
817+
try:
818+
while video.isOpen():
819+
cycle_start = time.time()
820+
frame = video.read()
821+
frame_num += 1
825822

826-
# NOTE: Use != 1 to ensure that the first difference is equal to the folowing (reqired for the interpolation)
827-
if self.params.skip_frames > 0 and frame_num % (self.params.skip_frames + 1) != 1:
828-
continue
823+
if frame is None:
824+
status = 'Reach a corrupt video frame' if video.isOpen() else 'End of video reached'
825+
break
829826

830-
if self.params.end_frame > 0 and frame_num + self.params.start_frame >= self.params.end_frame:
831-
status = "Tracking stop at existing action point"
832-
break
827+
# NOTE: Use != 1 to ensure that the first difference is equal to the folowing (reqired for the interpolation)
828+
if self.params.skip_frames > 0 and frame_num % (self.params.skip_frames + 1) != 1:
829+
continue
833830

834-
for tracker_number in range(self.params.number_of_trackers):
835-
trackers_woman[tracker_number].update(frame)
836-
if self.params.track_men: trackers_men[tracker_number].update(frame)
837-
scene_detector.update(frame)
831+
if self.params.end_frame > 0 and frame_num + self.params.start_frame >= self.params.end_frame:
832+
status = "Tracking stop at existing action point"
833+
break
838834

839-
if last_frame is not None:
840-
# Process data from last step while the next tracking points get predicted.
841-
# This should improve the whole processing speed, because the tracker run in a seperate thread
842835
for tracker_number in range(self.params.number_of_trackers):
843-
if bbox_woman[tracker_number] is not None:
844-
if tracker_number == 0:
845-
bboxes['Woman'][frame_num-1] = { tracker_number: bbox_woman[tracker_number] }
846-
else:
847-
bboxes['Woman'][frame_num-1][tracker_number] = bbox_woman[tracker_number]
848-
last_frame = self.draw_box(last_frame, bboxes['Woman'][frame_num-1][tracker_number], color=(0,255,0))
849-
if self.params.supervised_tracking:
850-
last_frame = self.draw_box(last_frame, tracking_areas_woman[tracker_number], color=(0,255,0))
851-
852-
if self.params.track_men and bbox_men[tracker_number] is not None:
853-
if tracker_number == 0:
854-
bboxes['Men'][frame_num-1] = { tracker_number: bbox_men[tracker_number] }
855-
else:
856-
bboxes['Men'][frame_num-1][tracker_number] = bbox_men[tracker_number]
857-
last_frame = self.draw_box(last_frame, bboxes['Men'][frame_num-1][tracker_number], color=(255,0,255))
858-
if self.params.supervised_tracking:
859-
last_frame = self.draw_box(last_frame, tracking_areas_men[tracker_number], color=(255,0,255))
860-
861-
last_frame = self.draw_fps(last_frame)
862-
last_frame = self.draw_time(last_frame, frame_num + self.params.start_frame)
863-
864-
scene_change_quit_flag = False
865-
if scene_detector.is_scene_change(frame_num-1 + self.params.start_frame):
866-
self.beep()
867-
cv2.putText(last_frame, "Scene change detected, Press 'space' to continue tracking or press 'q' to finalize tracking",
836+
trackers_woman[tracker_number].update(frame)
837+
if self.params.track_men: trackers_men[tracker_number].update(frame)
838+
scene_detector.update(frame)
839+
840+
if last_frame is not None:
841+
# Process data from last step while the next tracking points get predicted.
842+
# This should improve the whole processing speed, because the tracker run in a seperate thread
843+
for tracker_number in range(self.params.number_of_trackers):
844+
if bbox_woman[tracker_number] is not None:
845+
if tracker_number == 0:
846+
bboxes['Woman'][frame_num-1] = { tracker_number: bbox_woman[tracker_number] }
847+
else:
848+
bboxes['Woman'][frame_num-1][tracker_number] = bbox_woman[tracker_number]
849+
last_frame = self.draw_box(last_frame, bboxes['Woman'][frame_num-1][tracker_number], color=(0,255,0))
850+
if self.params.supervised_tracking:
851+
last_frame = self.draw_box(last_frame, tracking_areas_woman[tracker_number], color=(0,255,0))
852+
853+
if self.params.track_men and bbox_men[tracker_number] is not None:
854+
if tracker_number == 0:
855+
bboxes['Men'][frame_num-1] = { tracker_number: bbox_men[tracker_number] }
856+
else:
857+
bboxes['Men'][frame_num-1][tracker_number] = bbox_men[tracker_number]
858+
last_frame = self.draw_box(last_frame, bboxes['Men'][frame_num-1][tracker_number], color=(255,0,255))
859+
if self.params.supervised_tracking:
860+
last_frame = self.draw_box(last_frame, tracking_areas_men[tracker_number], color=(255,0,255))
861+
862+
last_frame = self.draw_fps(last_frame)
863+
last_frame = self.draw_time(last_frame, frame_num + self.params.start_frame)
864+
865+
scene_change_quit_flag = False
866+
if scene_detector.is_scene_change(frame_num-1 + self.params.start_frame):
867+
self.logger.info("Scene change detected, Pause tracking")
868+
self.beep()
869+
cv2.putText(last_frame, "Scene change detected, Press 'space' to continue tracking or press 'q' to finalize tracking",
870+
(self.x_text_start, 75), cv2.FONT_HERSHEY_SIMPLEX, self.font_size, (255,0,0), 2)
871+
cv2.imshow(self.window_name, self.preview_scaling(last_frame))
872+
while True:
873+
key = cv2.waitKey(25)
874+
if self.was_space_pressed() or key == ord(' '):
875+
break
876+
877+
if self.was_key_pressed('q') or key == ord('q'):
878+
scene_change_quit_flag = True
879+
break
880+
881+
cv2.putText(last_frame, "Press 'q' if the tracking point shifts or a video cut occured",
868882
(self.x_text_start, 75), cv2.FONT_HERSHEY_SIMPLEX, self.font_size, (255,0,0), 2)
869883
cv2.imshow(self.window_name, self.preview_scaling(last_frame))
870-
while True:
871-
key = cv2.waitKey(25)
872-
if self.was_space_pressed() or key == ord(' '):
873-
break
874884

875-
if self.was_key_pressed('q') or key == ord('q'):
876-
scene_change_quit_flag = True
877-
break
878-
879-
cv2.putText(last_frame, "Press 'q' if the tracking point shifts or a video cut occured",
880-
(self.x_text_start, 75), cv2.FONT_HERSHEY_SIMPLEX, self.font_size, (255,0,0), 2)
881-
cv2.imshow(self.window_name, self.preview_scaling(last_frame))
882-
883-
if scene_change_quit_flag:
884-
status = 'Tracking stopped at scene change'
885-
if self.params.scene_detector.upper() == "THRESHOLD":
886-
# NOTE: The threshold scene detector has delayed detection
887-
delete_last_predictions = int(self.video_info.fps)
888-
else:
889-
delete_last_predictions = (self.params.skip_frames+1)*2
890-
break
891-
892-
if self.was_key_pressed('q') or cv2.waitKey(1) == ord('q'):
893-
status = 'Tracking stopped by user'
894-
delete_last_predictions = max((1, int((self.get_average_tracking_fps()+1)*HYPERPARAMETER['user_reaction_time_in_milliseconds']/1000.0)))
895-
break
896-
897-
for tracker_number in range(self.params.number_of_trackers):
898-
(woman_tracker_status, bbox_woman[tracker_number]) = trackers_woman[tracker_number].result()
899-
if woman_tracker_status == StaticVideoTracker.Status.FEATURE_OUTSIDE:
900-
status = 'Woman ' + woman_tracker_status
901-
delete_last_predictions = (self.params.skip_frames+1)*2
902-
break
885+
if scene_change_quit_flag:
886+
status = 'Tracking stopped at scene change'
887+
if self.params.scene_detector.upper() == "THRESHOLD":
888+
# NOTE: The threshold scene detector has delayed detection
889+
delete_last_predictions = int(self.video_info.fps)
890+
else:
891+
delete_last_predictions = (self.params.skip_frames+1)*2
892+
break
903893

904-
if woman_tracker_status == StaticVideoTracker.Status.TRACKING_LOST:
905-
if tracking_lost_frames == 0 or len(bboxes['Woman']) == 0 or frame_num - max([x for x in bboxes['Woman'].keys()]) >= tracking_lost_frames:
906-
status = 'Woman ' + woman_tracker_status
907-
delete_last_predictions = (self.params.skip_frames+1)*2
894+
if self.was_key_pressed('q') or cv2.waitKey(1) == ord('q'):
895+
status = 'Tracking stopped by user'
896+
delete_last_predictions = max((1, int((self.get_average_tracking_fps()+1)*0.5*HYPERPARAMETER['user_reaction_time_in_milliseconds']/1000.0)))
908897
break
909898

910-
if self.params.track_men:
911-
(men_tracker_status, bbox_men[tracker_number]) = trackers_men[tracker_number].result()
912-
if men_tracker_status == StaticVideoTracker.Status.FEATURE_OUTSIDE:
913-
status = 'Men ' + men_tracker_status
899+
for tracker_number in range(self.params.number_of_trackers):
900+
(woman_tracker_status, bbox_woman[tracker_number]) = trackers_woman[tracker_number].result()
901+
if woman_tracker_status != StaticVideoTracker.Status.OK:
902+
status = 'Woman ' + woman_tracker_status
914903
delete_last_predictions = (self.params.skip_frames+1)*2
915904
break
916905

917-
if men_tracker_status == StaticVideoTracker.Status.TRACKING_LOST:
918-
if tracking_lost_frames == 0 or len(bboxes['Men']) == 0 or frame_num - max([x for x in bboxes['Men'].keys()]) >= tracking_lost_frames:
906+
if self.params.track_men:
907+
(men_tracker_status, bbox_men[tracker_number]) = trackers_men[tracker_number].result()
908+
if men_tracker_status != StaticVideoTracker.Status.OK:
919909
status = 'Men ' + men_tracker_status
920910
delete_last_predictions = (self.params.skip_frames+1)*2
921911
break
922912

923-
last_frame = frame
913+
last_frame = frame
924914

925-
if cycle_time_in_ms > 0:
926-
wait = cycle_time_in_ms - (time.time() - cycle_start)*float(1000)
927-
if wait > 0: time.sleep(wait/float(1000))
915+
if cycle_time_in_ms > 0:
916+
wait = cycle_time_in_ms - (time.time() - cycle_start)*float(1000)
917+
if wait > 0: time.sleep(wait/float(1000))
918+
except Exception as ex:
919+
self.logger.critical("The program crashed due to a fatal error", exc_info=ex)
920+
return "program crashed"
928921

929922
bboxes = self.correct_bboxes(bboxes, delete_last_predictions)
930923
self.__show_loading_screen(first_frame.shape)
@@ -1153,7 +1146,7 @@ def run(self) -> None:
11531146
self.funscript.invert_actions()
11541147
self.finished(status, True)
11551148
except Exception as ex:
1156-
self.logger.critical("The program crashed die to a fatal error", exc_info=ex)
1149+
self.logger.critical("The program crashed due to a fatal error", exc_info=ex)
11571150
# self.logger.critical("The program crashed due to a fatal error. " \
11581151
# + "Please open an issue on github with the corresponding log file (" \
11591152
# + ','.join(get_logfiles_paths()) + ") and application configuration (" \

funscript_editor/config/hyperparameter.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ changepoint_detection_threshold: 1.2
3030
additional_changepoints_merge_threshold_in_ms: 100
3131

3232
# reaction time of the user to stop the tracking when scene changed or tracking box shifts
33-
user_reaction_time_in_milliseconds: 1500
33+
user_reaction_time_in_milliseconds: 1000
3434

3535

3636
##################

funscript_editor/config/settings.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ tracker: 'CSRT'
2222
notification_sound: 'sound_notification.wav'
2323

2424
# Time in milliseconds at which the tracking is stopped if the selected feature is not found
25+
# THIS feature is not available since v0.1.2
2526
tracking_lost_time: 0
2627

2728
# Specify the scene detector algorithm. Available options:

0 commit comments

Comments
 (0)