|
@@ -79,8 +79,8 @@ class MainWindow:
|
|
|
# Help
|
|
|
self.ui.actionAbout.triggered.connect(self._help_about)
|
|
|
|
|
|
- self.ui.actionPredict_Images.triggered.connect(self._predict_via_dialog)
|
|
|
- self.ui.predictButton.clicked.connect(self._predict_via_dialog)
|
|
|
+ self.ui.actionPredict_Images.triggered.connect(self.predict_via_dialog)
|
|
|
+ self.ui.predictButton.clicked.connect(self.predict_via_dialog)
|
|
|
|
|
|
self.ui.imageThumbnailGallery.currentRowChanged.connect(self._prediction_row_changed)
|
|
|
|
|
@@ -162,7 +162,7 @@ class MainWindow:
|
|
|
if w_retval:
|
|
|
self._project = Project(w.project_root, w.project_config)
|
|
|
|
|
|
- def project_open(self, path=None):
|
|
|
+ def project_open(self, path=False):
|
|
|
"""
|
|
|
opens a project by either using the optional parameter path or
|
|
|
or the value the user enters using the ui file dialog
|
|
@@ -176,7 +176,7 @@ class MainWindow:
|
|
|
return
|
|
|
|
|
|
# copy path to selection or question user if not given
|
|
|
- if path is not None and path != False:
|
|
|
+ if path is not False:
|
|
|
selection = path
|
|
|
else:
|
|
|
selection, _ = QtWidgets.QFileDialog.getOpenFileName(self.ui, 'Select Project Folder', filter='project.json')
|
|
@@ -219,18 +219,28 @@ class MainWindow:
|
|
|
#####################################
|
|
|
# Prediction actions and management #
|
|
|
#####################################
|
|
|
- def _predict_via_dialog(self):
|
|
|
- # '''
|
|
|
- # {'filename': filename, 'filetype': filetype, 'jobs': ['detect-faces']}
|
|
|
+ def predict_via_dialog(self, selection=False):
|
|
|
+ """
|
|
|
+ loads images from given paths or ui file dialog
|
|
|
+ :param selection: array of image paths
|
|
|
+ :return:
|
|
|
+ """
|
|
|
+
|
|
|
+ # valid image and video extensions
|
|
|
image_extensions = ['.jpg', '.png', '.jpeg']
|
|
|
video_extensions = ['.mp4', '.avi', '.mkv', '.mpg', '.mpeg']
|
|
|
|
|
|
- name_list = ' '.join(['*' + extension for extension in image_extensions + video_extensions])
|
|
|
- extensions = f'All supported files ({name_list})'
|
|
|
+ # ask user for input
|
|
|
+ if selection is False:
|
|
|
+ name_list = ' '.join(['*' + extension for extension in image_extensions + video_extensions])
|
|
|
+ extensions = f'All supported files ({name_list})'
|
|
|
|
|
|
+ selection, _ = QtWidgets.QFileDialog.getOpenFileNames(self.ui, 'Select Files To Add', filter=extensions)
|
|
|
+
|
|
|
+ # load jobs
|
|
|
jobs = []
|
|
|
- selection = QtWidgets.QFileDialog.getOpenFileNames(self.ui, 'Select Files To Add', filter=extensions)
|
|
|
- for filename in selection[0]:
|
|
|
+
|
|
|
+ for filename in selection:
|
|
|
_, extension = os.path.splitext(filename)
|
|
|
extension = extension.lower()
|
|
|
|
|
@@ -260,29 +270,6 @@ class MainWindow:
|
|
|
progress_dialog.close()
|
|
|
self._predictions += jobs
|
|
|
|
|
|
- '''
|
|
|
- TODO: remove PredictionDialog.py
|
|
|
-
|
|
|
- prediction_dialog = PredictionDialog(parent=self.ui)
|
|
|
- if prediction_dialog.exec_():
|
|
|
-
|
|
|
- # TODO extract callback and progress dialog to make it reusable
|
|
|
- jobs = copy.deepcopy(prediction_dialog.jobs)
|
|
|
- print(jobs)
|
|
|
- progress_dialog = QtWidgets.QProgressDialog('Executing prediction jobs...', 'Abort', 0, 1000, self.ui)
|
|
|
- progress_dialog.setWindowModality(QtCore.Qt.WindowModal)
|
|
|
-
|
|
|
- def callback(progress):
|
|
|
- progress_dialog.setValue(int(progress * 1000))
|
|
|
- for i in range(10):
|
|
|
- QtWidgets.QApplication.processEvents()
|
|
|
-
|
|
|
- self._project.execute(jobs, callback=callback)
|
|
|
-
|
|
|
- progress_dialog.close()
|
|
|
- self._predictions += jobs
|
|
|
- '''
|
|
|
-
|
|
|
def _update_prediction_ui(self):
|
|
|
# TODO implement better sync
|
|
|
self.ui.imageThumbnailGallery.clear()
|