@@ -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 (" \
0 commit comments