Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 21 additions & 5 deletions controller/src/controller/ilabs_tracking.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,13 @@ def from_tracked_object(self, tracked_object, objects):
sscape_object.inferRotationFromVelocity()
break
if not found:
sscape_object.setGID(uuid)
# Check if UUID manager already has a mapping for this rv_id
with self.uuid_manager.active_ids_lock:
existing_gid = self.uuid_manager.active_ids.get(sscape_object.rv_id, [None])[0]
if existing_gid is None:
sscape_object.setGID(uuid)
else:
sscape_object.setGID(existing_gid)

self.uuid_manager.assignID(sscape_object)

Expand Down Expand Up @@ -176,8 +182,13 @@ def trackCategory(self, objects, when, already_tracked_objects):
"""Create reliable tracks for objects detected and tracks detected"""
when = datetime.fromtimestamp(when)
self.update_tracks(objects, when)
tracked_objects = self.tracker.get_reliable_tracks()
self.uuid_manager.pruneInactiveTracks(tracked_objects)
reliable_tracks = self.tracker.get_reliable_tracks()
# Include ALL active C++ tracks to preserve UUID mappings
all_active_tracks = set(reliable_tracks +
self.tracker.get_unreliable_tracks() +
self.tracker.get_suspended_tracks())
tracked_objects = reliable_tracks
self.uuid_manager.pruneInactiveTracks(all_active_tracks)
Comment thread
COZYTRICKSTER marked this conversation as resolved.
tracks_from_detections = [self.from_tracked_object(tracked_object, objects)
for tracked_object in tracked_objects]

Expand All @@ -190,8 +201,13 @@ def trackCategoryBatched(self, objects_per_camera, when, already_tracked_objects
"""Create reliable tracks for objects from multiple cameras using batched tracking"""
when = datetime.fromtimestamp(when)
self.update_tracks_batched(objects_per_camera, when)
tracked_objects = self.tracker.get_reliable_tracks()
self.uuid_manager.pruneInactiveTracks(tracked_objects)
reliable_tracks = self.tracker.get_reliable_tracks()
# Include ALL active C++ tracks to preserve UUID mappings
all_active_tracks = set(reliable_tracks +
self.tracker.get_unreliable_tracks() +
self.tracker.get_suspended_tracks())
tracked_objects = reliable_tracks
self.uuid_manager.pruneInactiveTracks(all_active_tracks)
Comment thread
COZYTRICKSTER marked this conversation as resolved.

# Flatten all objects for from_tracked_object lookup
all_objects = [obj for camera_objects in objects_per_camera for obj in camera_objects]
Expand Down
7 changes: 6 additions & 1 deletion controller/src/controller/uuid_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def pruneInactiveTracks(self, tracked_objects):

@param tracked_objects The objects currently tracked by the tracker
"""
active_tracks = [tracked_object.id for tracked_object in tracked_objects]
active_tracks = {tracked_object.id for tracked_object in tracked_objects}
inactive_tracks = []
new_active_ids = {}
with self.active_ids_lock:
Expand Down Expand Up @@ -290,6 +290,11 @@ def assignID(self, sscape_object):
if sscape_object.rv_id not in self.active_query:
self.active_query[sscape_object.rv_id] = True
self.pool.submit(self.querySimilarity, sscape_object)
else:
# Re-ID is disabled or we don't have enough features; fall back to using the generated GID
with self.active_ids_lock:
if self.active_ids.get(sscape_object.rv_id, [None])[0] is None:
self.active_ids[sscape_object.rv_id] = [sscape_object.gid, None]
else:
self.pickBestID(sscape_object)
return
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,16 @@ class MultipleObjectTracker
return mTrackManager.getReliableTracks();
}

inline std::vector<TrackedObject> getSuspendedTracks()
{
return mTrackManager.getSuspendedTracks();
}

inline std::vector<TrackedObject> getUnreliableTracks()
{
return mTrackManager.getUnreliableTracks();
}

/**
* @brief Returns a the list of all active tracked objects
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,12 @@ py::class_<rv::tracking::Classification>(tracking, "Classification", "Classifica
.def("get_reliable_tracks",
&rv::tracking::MultipleObjectTracker::getReliableTracks,
"Returns a list of all active reliable tracks.")
.def("get_suspended_tracks",
&rv::tracking::MultipleObjectTracker::getSuspendedTracks,
"Returns a list of all suspended tracks.")
.def("get_unreliable_tracks",
&rv::tracking::MultipleObjectTracker::getUnreliableTracks,
"Returns a list of all active unreliable tracks.")
.def("update_tracker_params",
&rv::tracking::MultipleObjectTracker::updateTrackerParams,
"Updates tracker frame based parameters.");
Expand Down