You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
|
|
|
|
|
|
from collections import OrderedDict
|
|
|
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
|
|
|
|
class TrackState:
|
|
|
|
New = 0
|
|
|
|
Tracked = 1
|
|
|
|
Lost = 2
|
|
|
|
Removed = 3
|
|
|
|
|
|
|
|
|
|
|
|
class BaseTrack:
|
|
|
|
_count = 0
|
|
|
|
|
|
|
|
track_id = 0
|
|
|
|
is_activated = False
|
|
|
|
state = TrackState.New
|
|
|
|
|
|
|
|
history = OrderedDict()
|
|
|
|
features = []
|
|
|
|
curr_feature = None
|
|
|
|
score = 0
|
|
|
|
start_frame = 0
|
|
|
|
frame_id = 0
|
|
|
|
time_since_update = 0
|
|
|
|
|
|
|
|
# Multi-camera
|
|
|
|
location = (np.inf, np.inf)
|
|
|
|
|
|
|
|
@property
|
|
|
|
def end_frame(self):
|
|
|
|
return self.frame_id
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def next_id():
|
|
|
|
BaseTrack._count += 1
|
|
|
|
return BaseTrack._count
|
|
|
|
|
|
|
|
def activate(self, *args):
|
|
|
|
raise NotImplementedError
|
|
|
|
|
|
|
|
def predict(self):
|
|
|
|
raise NotImplementedError
|
|
|
|
|
|
|
|
def update(self, *args, **kwargs):
|
|
|
|
raise NotImplementedError
|
|
|
|
|
|
|
|
def mark_lost(self):
|
|
|
|
self.state = TrackState.Lost
|
|
|
|
|
|
|
|
def mark_removed(self):
|
|
|
|
self.state = TrackState.Removed
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def reset_id():
|
|
|
|
BaseTrack._count = 0
|