[tracks] disentanglement

This commit is contained in:
Jan Grewe 2025-02-25 09:15:10 +01:00
parent 461f3aadfe
commit f1a4f4dc84
5 changed files with 34 additions and 25 deletions

View File

@ -22,6 +22,7 @@ class DetectionSceneSignals(QObject):
class DetectionTimelineSignals(QObject): class DetectionTimelineSignals(QObject):
windowMoved = Signal() windowMoved = Signal()
manualMove = Signal()
class DetectionSignals(QObject): class DetectionSignals(QObject):
hover = Signal((int, QPointF)) hover = Signal((int, QPointF))

View File

@ -57,7 +57,7 @@ class TrackingData(QObject):
return self._selection return self._selection
def setSelectionRange(self, col, start, stop): def setSelectionRange(self, col, start, stop):
logging.debug("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 = self._indices[col_indices]
if len(col_indices) < 1: if len(col_indices) < 1:
@ -77,10 +77,9 @@ class TrackingData(QObject):
ids : array-like ids : array-like
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.
""" """
print(ids) logging.debug("TrackingData.setSelection: %i number of ids", len(ids))
self._selection = self._find(ids) self._selection = self._find(ids)
self._selected_ids = ids self._selected_ids = ids
print(self._selection, self._selected_ids)
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,7 +91,7 @@ class TrackingData(QObject):
setUserLabeled : bool setUserLabeled : bool
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.
""" """
print(self._selection) logging.info("TrackingData: set track id %i for selection, set user-labeled status %s", track_id, str(setUserLabeled))
self["track"][self._selection] = track_id self["track"][self._selection] = track_id
if setUserLabeled: if setUserLabeled:
self.setUserLabeledStatus(True, True) self.setUserLabeledStatus(True, True)
@ -114,7 +113,7 @@ class TrackingData(QObject):
else: else:
self["userlabeled"][:] = new_status self["userlabeled"][:] = new_status
def revertAssignmentStatus(self): def revertUserLabeledStatus(self):
logging.debug("TrackingData:Un-setting assignment status of all data!") logging.debug("TrackingData:Un-setting assignment status of all data!")
self["userlabeled"][:] = False self["userlabeled"][:] = False

View File

@ -119,6 +119,11 @@ class ConsistencyWorker(QRunnable):
last_angle[assignments[i]-1] = self.orientations[idx] last_angle[assignments[i]-1] = self.orientations[idx]
last_length[assignments[i]-1] += ((self.lengths[idx] - last_length[assignments[i]-1])/processed) last_length[assignments[i]-1] += ((self.lengths[idx] - last_length[assignments[i]-1])/processed)
# self.userlabeled
last_pos = [self.positions[(self.tracks == 1) & (self.frames <= self._startframe)][-1], last_pos = [self.positions[(self.tracks == 1) & (self.frames <= self._startframe)][-1],
self.positions[(self.tracks == 2) & (self.frames <= self._startframe)][-1]] self.positions[(self.tracks == 2) & (self.frames <= self._startframe)][-1]]
last_frame = [self.frames[(self.tracks == 1) & (self.frames <= self._startframe)][-1], last_frame = [self.frames[(self.tracks == 1) & (self.frames <= self._startframe)][-1],
@ -614,7 +619,9 @@ def main():
data = TrackingData() data = TrackingData()
data.setData(as_dict(df)) data.setData(as_dict(df))
coords = data.coordinates() coords = data.coordinates()
cogs = data.centerOfGravity()
userlabeled = data["userlabeled"]
embed()
app = QApplication([]) app = QApplication([])
window = QWidget() window = QWidget()
window.setMinimumSize(200, 200) window.setMinimumSize(200, 200)
@ -624,7 +631,7 @@ def main():
# else: # else:
w = ClassifierWidget() w = ClassifierWidget()
w.setData(data) w.setData(data)
w.size_classifier.setCoordinates(coords) # w.size_classifier.setCoordinates(coords)
layout = QVBoxLayout() layout = QVBoxLayout()
layout.addWidget(w) layout.addWidget(w)

View File

@ -30,7 +30,7 @@ class Window(QGraphicsRectItem):
def setWindowX(self, newx): def setWindowX(self, newx):
logging.debug("timeline.window: set position to %.3f", newx) logging.debug("timeline.window: set position to %.3f", newx)
self.setX(newx) self.setX(newx)
self.signals.windowMoved.emit() # self.signals.windowMoved.emit()
def setWindowWidth(self, newwidth): def setWindowWidth(self, newwidth):
logging.debug("timeline.window: update window width to %f", newwidth) logging.debug("timeline.window: update window width to %f", newwidth)
@ -38,7 +38,7 @@ class Window(QGraphicsRectItem):
r = self.rect() r = self.rect()
r.setWidth(newwidth) r.setWidth(newwidth)
self.setRect(r) self.setRect(r)
self.signals.windowMoved.emit() # self.signals.windowMoved.emit()
def setWindow(self, newx:float, newwidth:float): def setWindow(self, newx:float, newwidth:float):
""" """
@ -58,7 +58,7 @@ class Window(QGraphicsRectItem):
r = self.rect() r = self.rect()
self.setRect(newx, r.y(), self._width, r.height()) self.setRect(newx, r.y(), self._width, r.height())
self.update() self.update()
self.signals.windowMoved.emit() # self.signals.windowMoved.emit()
def mouseMoveEvent(self, event): def mouseMoveEvent(self, event):
super().mouseMoveEvent(event) super().mouseMoveEvent(event)
@ -77,7 +77,7 @@ class Window(QGraphicsRectItem):
if r.y() != self._y: if r.y() != self._y:
self.setY(self._y) self.setY(self._y)
super().mouseReleaseEvent(event) super().mouseReleaseEvent(event)
self.signals.windowMoved.emit() self.signals.manualMove.emit()
def hoverEnterEvent(self, event): def hoverEnterEvent(self, event):
super().hoverEnterEvent(event) super().hoverEnterEvent(event)
@ -116,7 +116,7 @@ class DetectionTimeline(QWidget):
font.setBold(True) font.setBold(True)
self._window = Window(0, 0, 100, 60, window_pen, transparent_brush) self._window = Window(0, 0, 100, 60, window_pen, transparent_brush)
self._window.signals.windowMoved.connect(self.on_windowMoved) self._window.signals.manualMove.connect(self.on_windowMoved)
self._scene = QGraphicsScene(QRectF(0, 0, self._total_width, 85.)) self._scene = QGraphicsScene(QRectF(0, 0, self._total_width, 85.))
self._scene.setBackgroundBrush(self._bg_brush) self._scene.setBackgroundBrush(self._bg_brush)

View File

@ -31,6 +31,7 @@ class FixTracks(QWidget):
self._currentWindowPos = 0 # in frames self._currentWindowPos = 0 # in frames
self._currentWindowWidth = 0 # in frames self._currentWindowWidth = 0 # in frames
self._maxframes = 0 self._maxframes = 0
self._manualmove = False
self._data = None self._data = None
self._detectionView = DetectionView() self._detectionView = DetectionView()
@ -161,9 +162,10 @@ class FixTracks(QWidget):
def update(self): def update(self):
start_frame = self._currentWindowPos start_frame = self._currentWindowPos
stop_frame = start_frame + self._currentWindowWidth stop_frame = start_frame + self._currentWindowWidth
self._timeline.setWindow(start_frame / self._maxframes,
self._currentWindowWidth/self._maxframes)
logging.debug("Tracks:update: Updating View for detection range %i, %i frames", start_frame, stop_frame) logging.debug("Tracks:update: Updating View for detection range %i, %i frames", start_frame, stop_frame)
self._data.setSelectionRange("frame", start_frame, stop_frame) self._data.setSelectionRange("frame", start_frame, stop_frame)
self._controls_widget.setWindow(start_frame, stop_frame) self._controls_widget.setWindow(start_frame, stop_frame)
kp = self._keypointcombo.currentText().lower() kp = self._keypointcombo.currentText().lower()
kpi = -1 if "center" in kp else int(kp) kpi = -1 if "center" in kp else int(kp)
@ -208,11 +210,11 @@ class FixTracks(QWidget):
self._saveBtn.setEnabled(True) self._saveBtn.setEnabled(True)
self._currentWindowPos = 0 self._currentWindowPos = 0
self._currentWindowWidth = self._windowspinner.value() self._currentWindowWidth = self._windowspinner.value()
self._maxframes = self._data.max("frame") self._maxframes = np.max(self._data["frame"])
self.populateKeypointCombo(self._data.numKeypoints()) self.populateKeypointCombo(self._data.numKeypoints())
self._timeline.setData(self._data) self._timeline.setData(self._data)
self._timeline.setWindow(self._currentWindowPos / self._maxframes, # self._timeline.setWindow(self._currentWindowPos / self._maxframes,
self._currentWindowWidth / self._maxframes) # self._currentWindowWidth / self._maxframes)
self._detectionView.setData(self._data) self._detectionView.setData(self._data)
self._classifier.setData(self._data) self._classifier.setData(self._data)
self.update() self.update()
@ -276,7 +278,7 @@ class FixTracks(QWidget):
def on_revertUserFlags(self): def on_revertUserFlags(self):
logging.debug("Tracks:revert ALL UserFlags and track assignments") logging.debug("Tracks:revert ALL UserFlags and track assignments")
self._data.revertAssignmentStatus() self._data.revertUserLabeledStatus()
self._data.revertTrackAssignments() self._data.revertTrackAssignments()
self._timeline.update() self._timeline.update()
self.update() self.update()
@ -289,8 +291,10 @@ class FixTracks(QWidget):
def on_windowChanged(self): def on_windowChanged(self):
logging.debug("Tracks:Timeline reports window change ") logging.debug("Tracks:Timeline reports window change ")
self._currentWindowPos = np.round(self._timeline.rangeStart * self._maxframes) if not self._manualmove:
self.update() self._currentWindowPos = np.round(self._timeline.rangeStart * self._maxframes)
self.update()
self._manualmove = False
def on_windowSizeChanged(self, value): def on_windowSizeChanged(self, value):
"""Reacts on the user window-width selection. Selection is done in the unit of frames. """Reacts on the user window-width selection. Selection is done in the unit of frames.
@ -306,8 +310,7 @@ class FixTracks(QWidget):
self._controls_widget.setSelectedTracks(None) self._controls_widget.setSelectedTracks(None)
def on_detectionsSelected(self, detections): def on_detectionsSelected(self, detections):
logging.debug("Tracks: Detections selected") logging.debug("Tracks: %i Detections selected", len(detections))
print(detections)
tracks = np.zeros(len(detections), dtype=int) tracks = np.zeros(len(detections), dtype=int)
ids = np.zeros_like(tracks) ids = np.zeros_like(tracks)
frames = np.zeros_like(tracks) frames = np.zeros_like(tracks)
@ -325,12 +328,11 @@ class FixTracks(QWidget):
self._controls_widget.setSelectedTracks(tracks) self._controls_widget.setSelectedTracks(tracks)
self._skeleton.clear() self._skeleton.clear()
self._skeleton.addSkeletons(coordinates, ids, frames, tracks, QBrush(QColor(10, 255, 65, 255))) self._skeleton.addSkeletons(coordinates, ids, frames, tracks, QBrush(QColor(10, 255, 65, 255)))
self.update()
def moveWindow(self, stepsize): def moveWindow(self, stepsize):
step = np.round(stepsize * (self._currentWindowWidth)) logging.info("Tracks.moveWindow: move window with stepsize %.2f", stepsize)
new_start_frame = self._currentWindowPos + step self._manualmove = True
self._timeline.setWindowPos(new_start_frame / self._maxframes) new_start_frame = self._currentWindowPos + np.round(stepsize * self._currentWindowWidth)
self._currentWindowPos = new_start_frame self._currentWindowPos = new_start_frame
self._controls_widget.setSelectedTracks(None) self._controls_widget.setSelectedTracks(None)
self.update() self.update()