def execute(self, tracker: Tracker, sequence: Sequence, force: bool = False, callback: Callable = None): results = self.results(tracker, sequence) with self._get_runtime(tracker, sequence) as runtime: for i in range(1, self.repetitions+1): name = "%s_%03d" % (sequence.name, i) if Trajectory.exists(results, name) and not force: continue if self._can_stop(tracker, sequence): return trajectory = Trajectory(sequence.length) frame = 0 while frame < sequence.length: _, properties, elapsed = runtime.initialize(sequence.frame(frame), self._get_initialization(sequence, frame)) properties["time"] = elapsed trajectory.set(frame, Special(Special.INITIALIZATION), properties) frame = frame + 1 while frame < sequence.length: region, properties, elapsed = runtime.update(sequence.frame(frame)) properties["time"] = elapsed if calculate_overlap(region, sequence.groundtruth(frame), sequence.size) <= self.failure_overlap: trajectory.set(frame, Special(Special.FAILURE), properties) frame = frame + self.skip_initialize if self.skip_tags: while frame < sequence.length: if not [t for t in sequence.tags(frame) if t in self.skip_tags]: break frame = frame + 1 break else: trajectory.set(frame, region, properties) frame = frame + 1 if callback: callback(i / self.repetitions) trajectory.write(results, name)
def equals(self, trajectory: 'Trajectory', check_properties: bool = False, overlap_threshold: float = 0.99999): if not len(self) == len(trajectory): return False for r1, r2 in zip(self.regions(), trajectory.regions()): if calculate_overlap(r1, r2) < overlap_threshold and not (r1.type == RegionType.SPECIAL and r2.type == RegionType.SPECIAL): return False if check_properties: if not set(self._properties.keys()) == set(trajectory._properties.keys()): return False for name, _ in self._properties.items(): for p1, p2 in zip(self._properties[name], trajectory._properties[name]): if not p1 == p2 and not (p1 is None and p2 is None): return False return True