Skip to content

Commit 450c386

Browse files
author
arch
committed
fixes for delayed tracking lost
1 parent 2011713 commit 450c386

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

funscript_editor/algorithms/funscriptgenerator.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -464,24 +464,34 @@ def plot_scores(self, name: str, dpi : int = 300) -> None:
464464
figure.savefig(fname=name, dpi=dpi, bbox_inches='tight')
465465

466466

467-
def delete_last_tracking_predictions(self, bboxes: dict, num :int) -> dict:
467+
def correct_bboxes(self, bboxes: dict, num :int) -> dict:
468468
""" Delete the latest tracking predictions e.g. to clear bad tracking values
469469
470470
Args:
471-
bboxes (dict): the raw bboxes
471+
bboxes (dict): the raw bboxes
472472
num (int): number of frames to remove from predicted boxes
473473
474474
Returns:
475475
dict: the filtered bboxes
476476
"""
477+
if self.params.track_men:
478+
last_relevant_prediction = min((
479+
max([0]+[k for k in bboxes['Woman'].keys()]),
480+
max([0]+[k for k in bboxes['Men'].keys()])
481+
))
482+
else:
483+
last_relevant_prediction = max([0]+[k for k in bboxes['Woman'].keys()])
484+
477485
if len(bboxes['Woman'].keys()) > 0:
478-
keys = [k for k in bboxes['Woman'].keys()]
479-
del_keys = [k for k in keys if k > max(keys) - num]
480-
for k in del_keys:
481-
try:
482-
del bboxes['Woman'][k]
483-
if self.params.track_men: del bboxes['Men'][k]
486+
for k in [k for k in bboxes['Woman'].keys() if k > last_relevant_prediction - num]:
487+
try: del bboxes['Woman'][k]
484488
except: pass
489+
490+
if len(bboxes['Men'].keys()) > 0:
491+
for k in [k for k in bboxes['Men'].keys() if k > last_relevant_prediction - num]:
492+
try: del bboxes['Men'][k]
493+
except: pass
494+
485495
return bboxes
486496

487497

@@ -707,6 +717,7 @@ def tracking(self) -> str:
707717
status = "End of video reached"
708718
self.clear_keypress_queue()
709719
last_frame, frame_num = None, 1 # first frame is init frame
720+
delete_last_predictions = 0
710721
while video.isOpen():
711722
cycle_start = time.time()
712723
frame = video.read()
@@ -750,32 +761,32 @@ def tracking(self) -> str:
750761

751762
if self.was_key_pressed('q') or cv2.waitKey(1) == ord('q'):
752763
status = 'Tracking stopped by user'
753-
bboxes = self.delete_last_tracking_predictions(bboxes, int((self.get_average_tracking_fps()+1)*2.0))
764+
delete_last_predictions = int((self.get_average_tracking_fps()+1)*2.0)
754765
break
755766

756767
(woman_tracker_status, bbox_woman) = tracker_woman.result()
757768
if woman_tracker_status == StaticVideoTracker.Status.FEATURE_OUTSIDE:
758769
status = 'Woman ' + woman_tracker_status
759-
bboxes = self.delete_last_tracking_predictions(bboxes, (self.params.skip_frames+1)*2)
770+
delete_last_predictions = (self.params.skip_frames+1)*2
760771
break
761772

762773
if woman_tracker_status == StaticVideoTracker.Status.TRACKING_LOST:
763774
if len(bboxes['Woman']) == 0 or frame_num - max([x for x in bboxes['Woman'].keys()]) >= tracking_lost_frames:
764775
status = 'Woman ' + woman_tracker_status
765-
bboxes = self.delete_last_tracking_predictions(bboxes, (self.params.skip_frames+1)*2)
776+
delete_last_predictions = (self.params.skip_frames+1)*2
766777
break
767778

768779
if self.params.track_men:
769780
(men_tracker_status, bbox_men) = tracker_men.result()
770781
if men_tracker_status == StaticVideoTracker.Status.FEATURE_OUTSIDE:
771782
status = 'Men ' + men_tracker_status
772-
bboxes = self.delete_last_tracking_predictions(bboxes, (self.params.skip_frames+1)*2)
783+
delete_last_predictions = (self.params.skip_frames+1)*2
773784
break
774785

775786
if men_tracker_status == StaticVideoTracker.Status.TRACKING_LOST:
776787
if len(bboxes['Men']) == 0 or frame_num - max([x for x in bboxes['Men'].keys()]) >= tracking_lost_frames:
777788
status = 'Men ' + men_tracker_status
778-
bboxes = self.delete_last_tracking_predictions(bboxes, (self.params.skip_frames+1)*2)
789+
delete_last_predictions = (self.params.skip_frames+1)*2
779790
break
780791

781792
last_frame = frame
@@ -784,6 +795,7 @@ def tracking(self) -> str:
784795
wait = cycle_time_in_ms - (time.time() - cycle_start)*float(1000)
785796
if wait > 0: time.sleep(wait/float(1000))
786797

798+
bboxes = self.correct_bboxes(bboxes, delete_last_predictions)
787799
self.__show_loading_screen(first_frame.shape)
788800
video.stop()
789801
self.logger.info(status)

funscript_editor/algorithms/videotracker.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ def is_bbox_in_tracking_area(bbox: tuple, supervised_tracking_area: tuple = None
6868
"""
6969
if bbox is None:
7070
return False
71+
if bbox[0] == 0 and bbox[1] == 0 and bbox[2] == 0 and bbox[3] == 0:
72+
return False
7173
if supervised_tracking_area is None:
7274
return True
7375
if supervised_tracking_area[2] <= 1:
@@ -159,6 +161,9 @@ def run(self) -> None:
159161
bbox = (int(bbox[0] + x0), int(bbox[1] + y0), int(bbox[2]), int(bbox[3]))
160162
if not StaticVideoTracker.is_bbox_in_tracking_area(bbox, self.supervised_tracking_area):
161163
status = StaticVideoTracker.Status.FEATURE_OUTSIDE
164+
bbox = None
165+
else:
166+
bbox = None
162167

163168
self.queue_out.put((status, bbox))
164169

0 commit comments

Comments
 (0)