Skip to content

Commit

Permalink
remove possibility of using other kf than xysr
Browse files Browse the repository at this point in the history
  • Loading branch information
Mikel Broström committed Jun 21, 2024
1 parent b4b6708 commit ed92e46
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 96 deletions.
1 change: 0 additions & 1 deletion boxmot/configs/deepocsort.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,4 @@ inertia: 0.2
iou_thresh: 0.3
max_age: 30
min_hits: 1
new_kf_off: false
w_association_emb: 0.75
68 changes: 14 additions & 54 deletions boxmot/motion/kalman_filters/xysr_kf.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,42 +108,29 @@ def __init__(self, dim_x, dim_z, dim_u=0, max_obs=50):
self.observed = False


def apply_affine_correction(self, m, t, new_kf):
def apply_affine_correction(self, m, t):
"""
Apply to both last state and last observation for OOS smoothing.
Messy due to internal logic for kalman filter being messy.
"""
if new_kf:
big_m = np.kron(np.eye(4, dtype=float), m)
self.x = big_m @ self.x
self.x[:2] += t
self.P = big_m @ self.P @ big_m.T

# If frozen, also need to update the frozen state for OOS
if not self.observed and self.attr_saved is not None:
self.attr_saved["x"] = big_m @ self.attr_saved["x"]
self.attr_saved["x"][:2] += t
self.attr_saved["P"] = big_m @ self.attr_saved["P"] @ big_m.T
self.attr_saved["last_measurement"][:2] = m @ self.attr_saved["last_measurement"][:2] + t
self.attr_saved["last_measurement"][2:] = m @ self.attr_saved["last_measurement"][2:]
else:
scale = np.linalg.norm(m[:, 0])
self.x[:2] = m @ self.x[:2] + t
self.x[4:6] = m @ self.x[4:6]

scale = np.linalg.norm(m[:, 0])
self.x[:2] = m @ self.x[:2] + t
self.x[4:6] = m @ self.x[4:6]

self.P[:2, :2] = m @ self.P[:2, :2] @ m.T
self.P[4:6, 4:6] = m @ self.P[4:6, 4:6] @ m.T
self.P[:2, :2] = m @ self.P[:2, :2] @ m.T
self.P[4:6, 4:6] = m @ self.P[4:6, 4:6] @ m.T

# If frozen, also need to update the frozen state for OOS
if not self.observed and self.attr_saved is not None:
self.attr_saved["x"][:2] = m @ self.attr_saved["x"][:2] + t
self.attr_saved["x"][4:6] = m @ self.attr_saved["x"][4:6]
# If frozen, also need to update the frozen state for OOS
if not self.observed and self.attr_saved is not None:
self.attr_saved["x"][:2] = m @ self.attr_saved["x"][:2] + t
self.attr_saved["x"][4:6] = m @ self.attr_saved["x"][4:6]

self.attr_saved["P"][:2, :2] = m @ self.attr_saved["P"][:2, :2] @ m.T
self.attr_saved["P"][4:6, 4:6] = m @ self.attr_saved["P"][4:6, 4:6] @ m.T
self.attr_saved["P"][:2, :2] = m @ self.attr_saved["P"][:2, :2] @ m.T
self.attr_saved["P"][4:6, 4:6] = m @ self.attr_saved["P"][4:6, 4:6] @ m.T

self.attr_saved["last_measurement"][:2] = m @ self.attr_saved["last_measurement"][:2] + t
self.attr_saved["last_measurement"][:2] = m @ self.attr_saved["last_measurement"][:2] + t


def predict(self, u=None, B=None, F=None, Q=None):
Expand Down Expand Up @@ -334,33 +321,6 @@ def likelihood(self):

return self._likelihood

def rts_smoother(self, Xs, Ps, Fs=None, Qs=None):
""" Runs the Rauch-Tung-Striebel (RTS) smoother on a set of
Kalman filter output, consisting of means and covariances.
"""

if len(Xs) != len(Ps):
raise ValueError("length of Xs and Ps must be equal")

n = len(Xs)
dim_x = Xs[0].shape[0]

if Fs is None:
Fs = [self.F] * n
if Qs is None:
Qs = [self.Q] * n

# smoother gain
K = np.zeros((n, dim_x, dim_x))

x, P = Xs.copy(), Ps.copy()
for k in range(n-2, -1, -1):
P_pred = dot(dot(Fs[k], P[k]), Fs[k].T) + Qs[k]
K[k] = dot(dot(P[k], Fs[k].T), self.inv(P_pred))
x[k] += dot(K[k], x[k+1] - dot(Fs[k], x[k]))
P[k] += dot(dot(K[k], P[k+1] - P_pred), K[k].T)
return (x, P, K)

def batch_filter(self, zs, us=None, Bs=None, Fs=None, Qs=None, Hs=None, Rs=None):
""" Batch processes a sequence of measurements.
Expand Down
46 changes: 7 additions & 39 deletions boxmot/trackers/deepocsort/deep_ocsort.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,35 +73,20 @@ def speed_direction(bbox1, bbox2):
return speed / norm


def new_kf_process_noise(w, h, p=1 / 20, v=1 / 160):
Q = np.diag(
((p * w) ** 2, (p * h) ** 2, (p * w) ** 2, (p * h) ** 2, (v * w) ** 2, (v * h) ** 2, (v * w) ** 2, (v * h) ** 2)
)
return Q


def new_kf_measurement_noise(w, h, m=1 / 20):
w_var = (m * w) ** 2
h_var = (m * h) ** 2
R = np.diag((w_var, h_var, w_var, h_var))
return R


class KalmanBoxTracker(object):
"""
This class represents the internal state of individual tracked objects observed as bbox.
"""

count = 0

def __init__(self, det, delta_t=3, emb=None, alpha=0, new_kf=False, max_obs=50):
def __init__(self, det, delta_t=3, emb=None, alpha=0, max_obs=50):
"""
Initialises a tracker using initial bounding box.
"""
# define constant velocity model
self.max_obs=max_obs
self.new_kf = new_kf
bbox = det[0:5]
self.conf = det[4]
self.cls = det[5]
Expand Down Expand Up @@ -200,11 +185,8 @@ def update(self, det):
self.time_since_update = 0
self.hits += 1
self.hit_streak += 1
if self.new_kf:
R = new_kf_measurement_noise(self.kf.x[2, 0], self.kf.x[3, 0])
self.kf.update(self.bbox_to_z_func(bbox), R=R)
else:
self.kf.update(self.bbox_to_z_func(bbox))

self.kf.update(self.bbox_to_z_func(bbox))
else:
self.kf.update(det)
self.frozen = True
Expand Down Expand Up @@ -233,27 +215,16 @@ def apply_affine_correction(self, affine):
self.observations[self.age - dt][:4] = ps.T.reshape(-1)

# Also need to change kf state, but might be frozen
self.kf.apply_affine_correction(m, t, self.new_kf)
self.kf.apply_affine_correction(m, t)

def predict(self):
"""
Advances the state vector and returns the predicted bounding box estimate.
"""
# Don't allow negative bounding boxes
if self.new_kf:
if self.kf.x[2] + self.kf.x[6] <= 0:
self.kf.x[6] = 0
if self.kf.x[3] + self.kf.x[7] <= 0:
self.kf.x[7] = 0

# Stop velocity, will update in kf during OOS
if self.frozen:
self.kf.x[6] = self.kf.x[7] = 0
Q = new_kf_process_noise(self.kf.x[2, 0], self.kf.x[3, 0])
else:
if (self.kf.x[6] + self.kf.x[2]) <= 0:
self.kf.x[6] *= 0.0
Q = None
if (self.kf.x[6] + self.kf.x[2]) <= 0:
self.kf.x[6] *= 0.0
Q = None

self.kf.predict(Q=Q)
self.age += 1
Expand Down Expand Up @@ -294,7 +265,6 @@ def __init__(
embedding_off=False,
cmc_off=False,
aw_off=False,
new_kf_off=False,
**kwargs
):
super().__init__(max_age=max_age)
Expand Down Expand Up @@ -323,7 +293,6 @@ def __init__(
self.embedding_off = embedding_off
self.cmc_off = cmc_off
self.aw_off = aw_off
self.new_kf_off = new_kf_off

@PerClassDecorator
def update(self, dets: np.ndarray, img: np.ndarray, embs: np.ndarray = None) -> np.ndarray:
Expand Down Expand Up @@ -469,7 +438,6 @@ def update(self, dets: np.ndarray, img: np.ndarray, embs: np.ndarray = None) ->
delta_t=self.delta_t,
emb=dets_embs[i],
alpha=dets_alpha[i],
new_kf= False,
max_obs=self.max_obs
)
self.active_tracks.append(trk)
Expand Down
2 changes: 0 additions & 2 deletions tracking/evolve.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,6 @@ def get_new_config(self, trial):
embedding_off = trial.suggest_categorical("embedding_off", [True, False])
cmc_off = trial.suggest_categorical("cmc_off", [True, False])
aw_off = trial.suggest_categorical("aw_off", [True, False])
new_kf_off = trial.suggest_categorical("new_kf_off", [True, False])

d = {
'det_thresh': det_thresh,
Expand All @@ -199,7 +198,6 @@ def get_new_config(self, trial):
'embedding_off': embedding_off,
'cmc_off': cmc_off,
'aw_off': aw_off,
'new_kf_off': new_kf_off
}

# overwrite existing config for tracker
Expand Down

0 comments on commit ed92e46

Please sign in to comment.