[detectionview, tracks] selection of keypoint supported ...

aalpha value of detection codes for time
This commit is contained in:
Jan Grewe 2025-02-02 16:19:38 +01:00
parent b9943f176b
commit f366d6b8ff
3 changed files with 34 additions and 9 deletions

Binary file not shown.

View File

@ -78,7 +78,7 @@ class DetectionView(QWidget):
super().__init__(parent) super().__init__(parent)
self._img = None self._img = None
self._pixmapitem = None self._pixmapitem = None
self._scene = None self._scene = DetectionScene()
self._view = QGraphicsView() self._view = QGraphicsView()
self._view.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) self._view.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
self._view.setMouseTracking(True) self._view.setMouseTracking(True)
@ -89,7 +89,6 @@ class DetectionView(QWidget):
def setImage(self, image: QImage): def setImage(self, image: QImage):
self._img = image self._img = image
self._scene = DetectionScene()
self._scene.signals.itemsSelected.connect(self.on_itemSelection) self._scene.signals.itemsSelected.connect(self.on_itemSelection)
self._pixmapitem = self._scene.addPixmap(QPixmap.fromImage(self._img)) self._pixmapitem = self._scene.addPixmap(QPixmap.fromImage(self._img))
self._view.setScene(self._scene) self._view.setScene(self._scene)
@ -104,11 +103,14 @@ class DetectionView(QWidget):
del it del it
def addDetections(self, coordinates:np.array, track_ids:np.array, detection_ids:np.array, brush:QBrush): def addDetections(self, coordinates:np.array, track_ids:np.array, detection_ids:np.array, brush:QBrush):
logging.debug("DetectionView: add %i detections with color", coordinates.shape[0]) image_rect = self._pixmapitem.boundingRect() if self._pixmapitem is not None else QRectF(0,0,0,0)
image_rect = self._pixmapitem.boundingRect() num_detections = coordinates.shape[0]
for i in range(coordinates.shape[0]): for i in range(num_detections):
x = coordinates[i, 0] x = coordinates[i, 0]
y = coordinates[i, 1] y = coordinates[i, 1]
c = brush.color()
c.setAlpha(int(i * 255 / num_detections))
brush.setColor(c)
item = Detection(image_rect.left() + x, image_rect.top() + y, 20, 20, brush=brush) item = Detection(image_rect.left() + x, image_rect.top() + y, 20, 20, brush=brush)
item.setData(0, track_ids[i]) item.setData(0, track_ids[i])
item.setData(1, detection_ids[i]) item.setData(1, detection_ids[i])

View File

@ -7,7 +7,7 @@ import pandas as pd
from PySide6.QtCore import Qt, QThreadPool, Signal, QAbstractTableModel, QSortFilterProxyModel, QSize, QObject from PySide6.QtCore import Qt, QThreadPool, Signal, QAbstractTableModel, QSortFilterProxyModel, QSize, QObject
from PySide6.QtGui import QImage, QBrush, QColor, QFont from PySide6.QtGui import QImage, QBrush, QColor, QFont
from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QComboBox from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QComboBox
from PySide6.QtWidgets import QSpinBox, QSpacerItem, QProgressBar, QTableView, QSplitter, QGridLayout, QFileDialog from PySide6.QtWidgets import QSpinBox, QSpacerItem, QProgressBar, QSplitter, QGridLayout, QFileDialog, QGridLayout
from fixtracks.utils.reader import PickleLoader from fixtracks.utils.reader import PickleLoader
from fixtracks.utils.writer import PickleWriter from fixtracks.utils.writer import PickleWriter
@ -293,6 +293,11 @@ class DataController(QObject):
with open(filename, 'wb') as f: with open(filename, 'wb') as f:
pickle.dump(df, f) pickle.dump(df, f)
def numKeypoints(self):
if len(self._data["keypoints"]) == 0:
return 0
return self._data["keypoints"][0].shape[0]
class FixTracks(QWidget): class FixTracks(QWidget):
back = Signal() back = Signal()
@ -327,11 +332,18 @@ class FixTracks(QWidget):
self._windowspinner.setSingleStep(100) self._windowspinner.setSingleStep(100)
self._windowspinner.setValue(500) self._windowspinner.setValue(500)
self._windowspinner.valueChanged.connect(self.on_windowSizeChanged) self._windowspinner.valueChanged.connect(self.on_windowSizeChanged)
self._keypointcombo = QComboBox()
self._keypointcombo.currentIndexChanged.connect(self.on_keypointSelected)
combo_layout = QGridLayout()
combo_layout.addWidget(QLabel("Window:"), 0, 0)
combo_layout.addWidget(self._windowspinner, 0, 1)
combo_layout.addWidget(QLabel("Keypoint:"), 1, 0)
combo_layout.addWidget(self._keypointcombo, 1, 1)
timelinebox = QHBoxLayout() timelinebox = QHBoxLayout()
timelinebox.addWidget(self._timeline) timelinebox.addWidget(self._timeline)
timelinebox.addWidget(QLabel("Window")) timelinebox.addLayout(combo_layout)
timelinebox.addWidget(self._windowspinner)
self._controls_widget = SelectionControls() self._controls_widget = SelectionControls()
self._controls_widget.assignOne.connect(self.on_assignOne) self._controls_widget.assignOne.connect(self.on_assignOne)
@ -407,7 +419,8 @@ class FixTracks(QWidget):
def update_detectionView(df, name): def update_detectionView(df, name):
if len(df) == 0: if len(df) == 0:
return return
coords = np.stack(df["keypoints"].values).astype(np.float32)[:,0,:] keypoint = self._keypointcombo.currentIndex()
coords = np.stack(df["keypoints"].values).astype(np.float32)[:, keypoint,:]
tracks = df["track"].values.astype(int) tracks = df["track"].values.astype(int)
ids = df.index.values.astype(int) ids = df.index.values.astype(int)
self._detectionView.addDetections(coords, tracks, ids, self._brushes[name]) self._detectionView.addDetections(coords, tracks, ids, self._brushes[name])
@ -459,6 +472,12 @@ class FixTracks(QWidget):
self._data_combo.addItem("Please select") self._data_combo.addItem("Please select")
self._data_combo.addItems(self.fileList) self._data_combo.addItems(self.fileList)
self._data_combo.setCurrentIndex(0) self._data_combo.setCurrentIndex(0)
def populateKeypointCombo(self, num_keypoints):
self._keypointcombo.clear()
for i in range(num_keypoints):
self._keypointcombo.addItem(str(i))
self._keypointcombo.setCurrentIndex(0)
def _on_dataOpenend(self, state): def _on_dataOpenend(self, state):
logging.info("Finished loading data with state %s", state) logging.info("Finished loading data with state %s", state)
@ -467,6 +486,7 @@ class FixTracks(QWidget):
self._progress_bar.setValue(0) self._progress_bar.setValue(0)
if state and self._reader is not None: if state and self._reader is not None:
self._data.setData(self._reader.asdict) self._data.setData(self._reader.asdict)
self.populateKeypointCombo(self._data.numKeypoints())
self._timeline.setDetectionData(self._data.data) self._timeline.setDetectionData(self._data.data)
maxframes = self._data.max("frame") maxframes = self._data.max("frame")
rel_width = self._windowspinner.value() / maxframes rel_width = self._windowspinner.value() / maxframes
@ -474,6 +494,9 @@ class FixTracks(QWidget):
self.update() self.update()
self._saveBtn.setEnabled(True) self._saveBtn.setEnabled(True)
def on_keypointSelected(self):
self.update()
def on_save(self): def on_save(self):
logging.debug("Saving fixtracks results") logging.debug("Saving fixtracks results")
self._tasklabel.setText("Saving results to file...") self._tasklabel.setText("Saving results to file...")