[tracks] disentanglement
This commit is contained in:
parent
461f3aadfe
commit
f1a4f4dc84
@ -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))
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user