diff --git a/fixtracks/utils/trackingdata.py b/fixtracks/utils/trackingdata.py index 213b520..ef5d243 100644 --- a/fixtracks/utils/trackingdata.py +++ b/fixtracks/utils/trackingdata.py @@ -84,7 +84,7 @@ class TrackingData(QObject): logging.debug("TrackingData.setSelection: %i number of ids", len(ids)) self._selection_indices = self._find(ids) self._selected_ids = ids - print(self._selected_ids, self._selection_indices) + # print(self._selected_ids, self._selection_indices) def setTrack(self, track_id:int, setUserLabeled:bool=True)-> None: """Assign a new track_id to the user-selected detections @@ -97,12 +97,12 @@ class TrackingData(QObject): 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)) - print(self._selected_ids, self._selection_indices) - print("before: ", self["track"][self._selection_indices], self["frame"][self._selection_indices]) + # 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: self.setUserLabeledStatus(True, True) - print("after: ", self["track"][self._selection_indices], self["frame"][self._selection_indices]) + # print("after: ", self["track"][self._selection_indices], self["frame"][self._selection_indices]) 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. diff --git a/fixtracks/widgets/classifier.py b/fixtracks/widgets/classifier.py index 758c228..4683e73 100644 --- a/fixtracks/widgets/classifier.py +++ b/fixtracks/widgets/classifier.py @@ -94,6 +94,7 @@ class ConsistencyWorker(QRunnable): logging.debug("Encountered probably invalid position %s", str(self.positions[i])) continue if self._min_confidence > 0.0 and self.confidence[i] < self._min_confidence: + self.tracks[i] = -1 continue d = Detection(i, frame, self.tracks[i], self.positions[i], self.orientations[i], self.lengths[i], @@ -135,7 +136,7 @@ class ConsistencyWorker(QRunnable): def check_multiple_detections(detections): if self._min_confidence > 0.0: - for i, d in detections: + for i, d in enumerate(detections): if d.confidence < self._min_confidence: del detections[i] distances = np.zeros((len(detections), len(detections))) @@ -236,6 +237,7 @@ class ConsistencyWorker(QRunnable): if assignments[0] == assignments[1]: d.track = -1 error = True + errors += 1 message = f"Frame {f}: Classification error: both detections in the same frame are assigned to the same track!" break elif assignments[0] != assignments[1]: @@ -254,6 +256,7 @@ class ConsistencyWorker(QRunnable): self.tracks[detections[0].id] = -1 message = f"Frame: {f}: Decision based on distance not safe. Track set to unassigned." error = True + errors += 1 if not error: for k in temp: @@ -263,7 +266,7 @@ class ConsistencyWorker(QRunnable): for idx in indices: self.tracks[idx] = -1 errors += 1 - if self._stoponerror: + if error and self._stoponerror: self.signals.message.emit(message) break processed += 1 @@ -271,6 +274,7 @@ class ConsistencyWorker(QRunnable): if steps > 0 and f % steps == 0: progress += 1 self.signals.progress.emit(progress, processed, errors) + self.signals.message.emit(f"Tracking stopped at frame {f}.") self.signals.stopped.emit(f) @@ -475,6 +479,7 @@ class ConsistencyClassifier(QWidget): self._all_lengths = None self._all_bendedness = None self._all_scores = None + self._confidence = None self._userlabeled = None self._maxframes = 0 self._frames = None @@ -603,6 +608,7 @@ class ConsistencyClassifier(QWidget): self._startframe_spinner.setMaximum(max_startframe) self._startframe_spinner.setValue(min_startframe) self._startframe_spinner.setSingleStep(20) + self._startframe_spinner.setToolTip(f"Maximum possible start frame: {max_startframe}") self._startbtn.setEnabled(True) self._assignedlabel.setText("0") self._errorlabel.setText("0") diff --git a/fixtracks/widgets/tracks.py b/fixtracks/widgets/tracks.py index b22c6cf..c810618 100644 --- a/fixtracks/widgets/tracks.py +++ b/fixtracks/widgets/tracks.py @@ -55,8 +55,10 @@ class FixTracks(QWidget): self._keypointcombo = QComboBox() self._keypointcombo.currentIndexChanged.connect(self.on_keypointSelected) - self._gotoframe = QSpinBox() - self._gotoframe.setSingleStep(1) + self._goto_spinner = QSpinBox() + self._goto_spinner.setSingleStep(1) + self._goto_spinner.returnPressed.connect(self.on_goto) + self._gotobtn = QPushButton("go!") self._gotobtn.setToolTip("Jump to a given frame") self._gotobtn.clicked.connect(self.on_goto) @@ -65,12 +67,12 @@ class FixTracks(QWidget): combo_layout.addWidget(QLabel("Window width:")) combo_layout.addWidget(self._windowspinner) combo_layout.addWidget(QLabel("frames")) - combo_layout.addItem(QSpacerItem(10, 10, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)) + combo_layout.addItem(QSpacerItem(10, 10, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)) combo_layout.addWidget(QLabel("Keypoint:")) combo_layout.addWidget(self._keypointcombo) - combo_layout.addItem(QSpacerItem(10, 10, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)) + combo_layout.addItem(QSpacerItem(10, 10, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)) combo_layout.addWidget(QLabel("Jump to frame:")) - combo_layout.addWidget(self._gotoframe) + combo_layout.addWidget(self._goto_spinner) combo_layout.addWidget(self._gotobtn) combo_layout.addItem(QSpacerItem(100, 10, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)) combo_layout.setSpacing(1) @@ -234,7 +236,7 @@ class FixTracks(QWidget): self._currentWindowPos = 0 self._currentWindowWidth = self._windowspinner.value() self._maxframes = np.max(self._data["frame"]) - self._gotoframe.setMaximum(self._maxframes) + self._goto_spinner.setMaximum(self._maxframes) self.populateKeypointCombo(self._data.numKeypoints()) self._timeline.setData(self._data) # self._timeline.setWindow(self._currentWindowPos / self._maxframes, @@ -359,7 +361,7 @@ class FixTracks(QWidget): self._controls_widget.setSelectedTracks(None) def on_goto(self): - target = self._gotoframe.value() + target = self._goto_spinner.value() if target > self._maxframes - self._currentWindowWidth: target = self._maxframes - self._currentWindowWidth logging.info("Jump to frame %i", target)