[trackingdata] fixes of selection handling, ...

something is still off with the deletion...
This commit is contained in:
Jan Grewe 2025-02-26 11:15:49 +01:00
parent c0a7631acd
commit 9e2c6f343a

View File

@ -14,8 +14,8 @@ class TrackingData(QObject):
if "userlabeled" not in self._data.keys(): if "userlabeled" not in self._data.keys():
self._data["userlabeled"] = np.zeros_like(self["frame"], dtype=bool) self._data["userlabeled"] = np.zeros_like(self["frame"], dtype=bool)
self._columns = [k for k in self._data.keys()] self._columns = [k for k in self._data.keys()]
self._indices = self["index"] self._indices = np.arange(len(self["index"]), dtype=int)
self._selection = np.asarray([]) self._selection_indices = np.asarray([])
self._selected_ids = None self._selected_ids = None
@property @property
@ -43,8 +43,8 @@ class TrackingData(QObject):
ids = np.sort(ids) ids = np.sort(ids)
indexes = np.ones_like(ids, dtype=int) * -1 indexes = np.ones_like(ids, dtype=int) * -1
j = 0 j = 0
for idx, i in enumerate(self._indices): for idx in self._indices:
if i == ids[j]: if self["index"][idx] == ids[j]:
indexes[j] = idx indexes[j] = idx
j += 1 j += 1
if j == len(indexes): if j == len(indexes):
@ -54,19 +54,23 @@ class TrackingData(QObject):
@property @property
def selectionIndices(self): def selectionIndices(self):
return self._selection return self._selection_indices
@property
def selectionIDs(self):
return self._selected_ids
def setSelectionRange(self, col, start, stop): def setSelectionRange(self, col, start, stop):
logging.info("Trackingdata: set selection range based on column %s to %.2f - %.2f", col, start, stop) logging.info("Trackingdata: set selection range based on column %s to %.2f - %.2f", col, start, stop)
col_indices = np.where((self[col] >= start) & (self[col] < stop))[0] col_indices = np.where((self[col] >= start) & (self[col] < stop))[0]
self._selection = self._indices[col_indices] self._selection_indices = self._indices[col_indices]
if len(col_indices) < 1: if len(col_indices) < 1:
logging.warning("TrackingData: Selection range is empty!") logging.warning("TrackingData: Selection range is empty!")
def selectedData(self, col:str): def selectedData(self, col:str):
if col not in self.columns: if col not in self.columns:
logging.error("TrackingData:selectedData: Invalid column name! %s", col) logging.error("TrackingData:selectedData: Invalid column name! %s", col)
return self[col][self._selection] return self[col][self._selection_indices]
def setSelection(self, ids): def setSelection(self, ids):
""" """
@ -78,8 +82,9 @@ class TrackingData(QObject):
An array-like object containing the IDs to be set as user selections. An array-like object containing the IDs to be set as user selections.
""" """
logging.debug("TrackingData.setSelection: %i number of ids", len(ids)) logging.debug("TrackingData.setSelection: %i number of ids", len(ids))
self._selection = self._find(ids) self._selection_indices = self._find(ids)
self._selected_ids = ids self._selected_ids = ids
print(self._selected_ids, self._selection_indices)
def setTrack(self, track_id:int, setUserLabeled:bool=True)-> None: def setTrack(self, track_id:int, setUserLabeled:bool=True)-> None:
"""Assign a new track_id to the user-selected detections """Assign a new track_id to the user-selected detections
@ -92,9 +97,12 @@ class TrackingData(QObject):
Should the "userlabeled" state of the detections be set to True? Otherwise they will be left untouched. Should the "userlabeled" state of the detections be set to True? Otherwise they will be left untouched.
""" """
logging.info("TrackingData: set track id %i for selection, set user-labeled status %s", track_id, str(setUserLabeled)) logging.info("TrackingData: set track id %i for selection, set user-labeled status %s", track_id, str(setUserLabeled))
self["track"][self._selection] = track_id print(self._selected_ids, self._selection_indices)
print("before: ", self["track"][self._selection_indices], self["frame"][self._selection_indices])
self["track"][self._selection_indices] = track_id
if setUserLabeled: if setUserLabeled:
self.setUserLabeledStatus(True, True) self.setUserLabeledStatus(True, True)
print("after: ", self["track"][self._selection_indices], self["frame"][self._selection_indices])
def setUserLabeledStatus(self, new_status: bool, selection=True): def setUserLabeledStatus(self, new_status: bool, selection=True):
"""Sets the status of the "userlabeled" column to a given value (True|False). This can done for ALL data in one go, or only for the UserSelection. """Sets the status of the "userlabeled" column to a given value (True|False). This can done for ALL data in one go, or only for the UserSelection.
@ -109,7 +117,7 @@ class TrackingData(QObject):
logging.debug("TrackingData: (Re-)setting assignment status of %s to %s", logging.debug("TrackingData: (Re-)setting assignment status of %s to %s",
"user selected data" if selection else " ALL", str(new_status)) "user selected data" if selection else " ALL", str(new_status))
if selection: if selection:
self["userlabeled"][self._selection] = new_status self["userlabeled"][self._selection_indices] = new_status
else: else:
self["userlabeled"][:] = new_status self["userlabeled"][:] = new_status
@ -123,12 +131,14 @@ class TrackingData(QObject):
def deleteDetections(self, ids=None): def deleteDetections(self, ids=None):
if ids is not None: if ids is not None:
logging.debug("TrackingData.deleteDetections of %i detections", len(ids))
del_indices = self._find(ids) del_indices = self._find(ids)
else: else:
del_indices = self._indices logging.debug("TrackingData.deleteDetections of all selected detections (%i)", len(self._selected_ids))
del_indices = self._selected_ids
for c in self._columns: for c in self._columns:
self._data[c] = np.delete(self._data[c], del_indices, axis=0) self._data[c] = np.delete(self._data[c], del_indices, axis=0)
self._indices = self["index"] self._indices = self._indices[:-len(del_indices)]
self._selected_ids = np.setdiff1d(self._selected_ids, del_indices) self._selected_ids = np.setdiff1d(self._selected_ids, del_indices)
def assignTracks(self, tracks:np.ndarray): def assignTracks(self, tracks:np.ndarray):
@ -171,10 +181,10 @@ class TrackingData(QObject):
and M is number of keypoints and M is number of keypoints
""" """
if selection: if selection:
if len(self._selection) < 1: if len(self._selection_indices) < 1:
logging.info("TrackingData.coordinates returns empty array, not detections in range!") logging.info("TrackingData.coordinates returns empty array, not detections in range!")
return np.ndarray([]) return np.ndarray([])
return np.stack(self["keypoints"][self._selection]).astype(np.float32) return np.stack(self["keypoints"][self._selection_indices]).astype(np.float32)
return np.stack(self["keypoints"]).astype(np.float32) return np.stack(self["keypoints"]).astype(np.float32)
def keypointScores(self, selection=False): def keypointScores(self, selection=False):
@ -188,10 +198,10 @@ class TrackingData(QObject):
with N the number of detections and M the number of keypoints. with N the number of detections and M the number of keypoints.
""" """
if selection: if selection:
if len(self._selection) < 1: if len(self._selection_indices) < 1:
logging.info("TrackingData.scores returns empty array, not detections in range!") logging.info("TrackingData.scores returns empty array, not detections in range!")
return None return None
return np.stack(self["keypoint_score"][self._selection]).astype(np.float32) return np.stack(self["keypoint_score"][self._selection_indices]).astype(np.float32)
return np.stack(self["keypoint_score"]).astype(np.float32) return np.stack(self["keypoint_score"]).astype(np.float32)
def centerOfGravity(self, selection=False, threshold=0.8, nodes=[0,1,2]): def centerOfGravity(self, selection=False, threshold=0.8, nodes=[0,1,2]):