@@ -75,7 +75,30 @@ class FunscriptGeneratorParameter:
7575 max_threshold : float = float (HYPERPARAMETER ['max_threshold' ])
7676
7777
78+ def merge_score (item : list , number_of_trackers : int ) -> list :
79+ """ Merge score for given number of trackers
7880
81+ Note:
82+ Python multiprocessing methods use a mp.SimpleQueue to pass tasks to the worker processes.
83+ Everything that goes through the mp.SimpleQueue must be pickable.
84+ In python functions are only picklable if they are defined at the top-level of a module.
85+
86+ Args:
87+ item (list): score for each tracker
88+ number_of_trackers (int): number of used tracker (pairs)
89+
90+ Returns:
91+ list: merged score
92+ """
93+ if number_of_trackers == 1 :
94+ return item [0 ] if len (item ) > 0 else []
95+ else :
96+ max_frame_number = max ([len (item [i ]) for i in range (number_of_trackers )])
97+ arr = np .ma .empty ((max_frame_number ,number_of_trackers ))
98+ arr .mask = True
99+ for tracker_number in range (number_of_trackers ):
100+ arr [:item [tracker_number ].shape [0 ],tracker_number ] = item [tracker_number ]
101+ return list (filter (None .__ne__ , arr .mean (axis = 1 ).tolist ()))
79102
80103
81104class FunscriptGeneratorThread (QtCore .QThread ):
@@ -390,26 +413,17 @@ def calculate_score(self, bboxes) -> None:
390413 score ['y' ][tracker_number ] = np .array ([max ([x [1 ] for x in bboxes ['Woman' ][tracker_number ]]) - w [1 ] for w in bboxes ['Woman' ][tracker_number ]])
391414
392415 self .logger .info ("Merge Scores" )
416+ """
417+ pool, queue = {}, {}
418+ for metric in score.keys():
419+ queue[metric] = mp.Queue()
420+ pool[metric] = threading.Thread(target=merge_score, args=(score[metric], self.params.number_of_trackers, queue[metric], ))
421+ pool[metric].start()
393422
394- def merge_score (item : list , number_of_trackers : int ) -> list :
395- """ Merge score for given number of trackers
396-
397- Args:
398- item (list): score for each tracker
399- number_of_trackers (int): number of used tracker (pairs)
400-
401- Returns:
402- list: merged score
403- """
404- if number_of_trackers == 1 :
405- return item [0 ] if len (item ) > 0 else []
406- else :
407- max_frame_number = max ([len (item [i ]) for i in range (number_of_trackers )])
408- arr = np .ma .empty ((max_frame_number ,number_of_trackers ))
409- arr .mask = True
410- for tracker_number in range (number_of_trackers ):
411- arr [:item [tracker_number ].shape [0 ],tracker_number ] = item [tracker_number ]
412- return list (filter (None .__ne__ , arr .mean (axis = 1 ).tolist ()))
423+ for metric in score.keys():
424+ pool[metric].join()
425+ score[metric] = queue[metric].get()
426+ """
413427
414428 for metric in score .keys ():
415429 score [metric ] = merge_score (score [metric ], self .params .number_of_trackers )
0 commit comments