[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):
windowMoved = Signal()
manualMove = Signal()
class DetectionSignals(QObject):
hover = Signal((int, QPointF))

View File

@ -57,7 +57,7 @@ class TrackingData(QObject):
return self._selection
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]
self._selection = self._indices[col_indices]
if len(col_indices) < 1:
@ -77,10 +77,9 @@ class TrackingData(QObject):
ids : array-like
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._selected_ids = ids
print(self._selection, self._selected_ids)
def setTrack(self, track_id:int, setUserLabeled:bool=True)-> None:
"""Assign a new track_id to the user-selected detections
@ -92,7 +91,7 @@ class TrackingData(QObject):
setUserLabeled : bool
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
if setUserLabeled:
self.setUserLabeledStatus(True, True)
@ -114,7 +113,7 @@ class TrackingData(QObject):
else:
self["userlabeled"][:] = new_status
def revertAssignmentStatus(self):
def revertUserLabeledStatus(self):
logging.debug("TrackingData:Un-setting assignment status of all data!")
self["userlabeled"][:] = False

View File

@ -119,6 +119,11 @@ class ConsistencyWorker(QRunnable):
last_angle[assignments[i]-1] = self.orientations[idx]
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],
self.positions[(self.tracks == 2) & (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.setData(as_dict(df))
coords = data.coordinates()
cogs = data.centerOfGravity()
userlabeled = data["userlabeled"]
embed()
app = QApplication([])
window = QWidget()
window.setMinimumSize(200, 200)
@ -624,7 +631,7 @@ def main():
# else:
w = ClassifierWidget()
w.setData(data)
w.size_classifier.setCoordinates(coords)
# w.size_classifier.setCoordinates(coords)
layout = QVBoxLayout()
layout.addWidget(w)

View File

@ -30,7 +30,7 @@ class Window(QGraphicsRectItem):
def setWindowX(self, newx):
logging.debug("timeline.window: set position to %.3f", newx)
self.setX(newx)
self.signals.windowMoved.emit()
# self.signals.windowMoved.emit()
def setWindowWidth(self, newwidth):
logging.debug("timeline.window: update window width to %f", newwidth)
@ -38,7 +38,7 @@ class Window(QGraphicsRectItem):
r = self.rect()
r.setWidth(newwidth)
self.setRect(r)
self.signals.windowMoved.emit()
# self.signals.windowMoved.emit()
def setWindow(self, newx:float, newwidth:float):
"""
@ -58,7 +58,7 @@ class Window(QGraphicsRectItem):
r = self.rect()
self.setRect(newx, r.y(), self._width, r.height())
self.update()
self.signals.windowMoved.emit()
# self.signals.windowMoved.emit()
def mouseMoveEvent(self, event):
super().mouseMoveEvent(event)
@ -77,7 +77,7 @@ class Window(QGraphicsRectItem):
if r.y() != self._y:
self.setY(self._y)
super().mouseReleaseEvent(event)
self.signals.windowMoved.emit()
self.signals.manualMove.emit()
def hoverEnterEvent(self, event):
super().hoverEnterEvent(event)
@ -116,7 +116,7 @@ class DetectionTimeline(QWidget):
font.setBold(True)
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.setBackgroundBrush(self._bg_brush)

View File

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