Example #1
0
def writeVersionInfo():
    try:
        with open(resource_path('./version.json'), 'w') as f:
            info = {'build': __build__, 'date': __versiondate__.toordinal()}
            json.dump(info, f)
    except:
        print("Error: could not write version info to file 'version.json'")
    def __init__(self, parent):
        super(LicenseDialog, self).__init__(parent)

        self.info = QtWidgets.QTextBrowser(self)
        self.info.setReadOnly(True)
        self.info.setOpenLinks(False)
        self.info.setOpenExternalLinks(False)

        # text = open(resource_path('./GPLv3.html')).read()
        # self.info.setHtml(text)
        self.info.setSource(
            QtCore.QUrl.fromLocalFile(resource_path('GPLv3.html')))

        # OK button
        self.button = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok,
                                                 QtCore.Qt.Horizontal, self)
        self.button.accepted.connect(self.accept)

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.info)
        #layout.addStretch(1)
        layout.addWidget(self.button)

        self.setWindowTitle('GNU General Public License...')
        self.resize(500, 600)
Example #3
0
def readVersionInfo():
    global __build__
    global __versiondate__
    try:
        with open(resource_path('./version.json')) as f:
            info = json.load(f)
            __build__ = int(info['build'])
            __versiondate__ = date.fromordinal(int(info['date']))
    except:
        print("Error: could not read version info from file 'version.json'")
 def __init__(self, parent, licenseDialog):
     super(AboutDialog, self).__init__(parent)
     
     self.licenseDialog = licenseDialog
     
     pixmap = QtGui.QPixmap(resource_path('./img/about.png'))
     img = QtWidgets.QLabel(self)
     img.setPixmap(pixmap)
     
     self.info = QtWidgets.QTextBrowser(self)
     self.info.setReadOnly(True)
     self.info.setFixedWidth(560)
     self.info.setFixedHeight(192)
     self.info.setHtml('<h3>Python Classification Toolbox</h3>' +
                  '<font color="#909090"><i>Study popular machine learning algorithms and create your own implementations in Python for a deeper understanding of the algorithms!</i></font><br><br>'
                  'Copyright &copy; 2016 Stefan Steidl<br>' +
                  'Pattern Recognition Lab<br>' +
                  'Computer Science Department 5<br>'+
                  'Friedrich-Alexander University Erlangen-Nuremberg<br>' +
                  '<a href="mailto:[email protected]">[email protected]</a><br><br>' +
                  'This program comes with ABSOLUTELY NO WARRANTY; for details click <a href="func://warranty">here</a>. ' + 
                  'This is free software, and you are welcome to redistribute it ' +
                  'under certain conditions; click <a href="func://gpl">here</a> for details.'
                  )
     self.info.anchorClicked.connect(self.onInfoClicked)
     
     layout = QtWidgets.QHBoxLayout()
     layout.addWidget(img)
     layout.addWidget(self.info)
     layout.addStretch(1)
     
     box = QtWidgets.QWidget()
     box.setLayout(layout)
     
     # OK button
     self.button = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok, QtCore.Qt.Horizontal, self)
     self.button.accepted.connect(self.accept)
     
     layout = QtWidgets.QVBoxLayout(self)
     layout.addWidget(box)
     layout.addStretch(1)
     layout.addWidget(self.button)
     layout.setSizeConstraint(QtGui.QLayout.SetFixedSize)
     
     self.setWindowTitle('About...')
    def initUI(self):
        self.clusteringParameters = ClusteringParameters(self)
        self.dimRedParameters = DimensionalityReductionParameters(self)
        self.classifierParameters = ClassifierParameters(self)
        self.regressionParameters = RegressionParameters(self)
        self.densityEstimationParameters = DensityEstimationParameters(self)
        self.probabilityDensityViewer = ProbabilityDensityViewer(self)
        self.licenseDialog = LicenseDialog(self)
        self.aboutDialog = AboutDialog(self, self.licenseDialog)
        self.infoDialog = InfoDialog(self)
        self.operationStack = OperationStack(self)

        self.createSamplesDockWidget = CreateSamplesProperties(self)
        self.addDockWidget(QtCore.Qt.BottomDockWidgetArea,
                           self.createSamplesDockWidget)

        self.statusbar = QtWidgets.QStatusBar()
        self.setStatusBar(self.statusbar)

        self.featurespace = FeatureSpace(self, self.statusbar,
                                         self.createSamplesDockWidget)
        self.setCentralWidget(self.featurespace)

        self.classifier = None
        self.regressor = None
        self.densityEstimator = None

        featureSpaceNewAction = QtWidgets.QAction('&New', self)
        featureSpaceNewAction.setShortcut('Ctrl+N')
        featureSpaceNewAction.setStatusTip('Create empty feature space')
        featureSpaceNewAction.triggered.connect(self.newFeatureSpace)

        featureSpaceOpenAction = QtWidgets.QAction('&Open...', self)
        featureSpaceOpenAction.setShortcut('Ctrl+O')
        featureSpaceOpenAction.setStatusTip('Load a feature space')
        featureSpaceOpenAction.triggered.connect(self.openFeatureSpace)

        featureSpaceSaveAction = QtWidgets.QAction('&Save', self)
        featureSpaceSaveAction.setShortcut('Ctrl+S')
        featureSpaceSaveAction.setStatusTip('Save the feature space')
        featureSpaceSaveAction.triggered.connect(self.saveFeatureSpace)

        featureSpaceSaveAsAction = QtWidgets.QAction('Save &as...', self)
        featureSpaceSaveAsAction.setStatusTip(
            'Save the feature space to a new file')
        featureSpaceSaveAsAction.triggered.connect(self.saveAsFeatureSpace)

        featureSpaceImportAction = QtWidgets.QAction('&Import samples...',
                                                     self)
        featureSpaceImportAction.setStatusTip(
            'Read feature vectors from an ASCII file')
        featureSpaceImportAction.triggered.connect(self.importFeatureSpace)

        featureSpaceExportAction = QtWidgets.QAction('&Export samples...',
                                                     self)
        featureSpaceExportAction.setStatusTip(
            'Write the feature vectors to an ASCII file')
        featureSpaceExportAction.triggered.connect(self.exportFeatureSpace)

        featureSpaceSaveImageAction = QtWidgets.QAction(
            'Export as image...', self)
        featureSpaceSaveImageAction.setStatusTip(
            'Export the feature space as image')
        featureSpaceSaveImageAction.triggered.connect(
            self.exportFeatureSpaceAsImage)

        self.__featureSpaceHideSamplesAction = QtWidgets.QAction(
            'Hide samples', self)
        self.__featureSpaceHideSamplesAction.setStatusTip('Hide all samples')
        self.__featureSpaceHideSamplesAction.setShortcut('F8')
        self.__featureSpaceHideSamplesAction.triggered.connect(
            self.hideSamples)
        self.__featureSpaceHideSamplesAction.setCheckable(True)
        self.__featureSpaceHideSamplesAction.setChecked(False)

        exitAction = QtWidgets.QAction('&Quit', self)
        exitAction.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_Q)
        exitAction.setStatusTip('Exit the Python Classification Toolbox')
        exitAction.triggered.connect(self.close)

        menubar = self.menuBar()
        menubar.setNativeMenuBar(False)
        featureSpaceMenu = menubar.addMenu('&Feature Space')
        featureSpaceMenu.addAction(featureSpaceNewAction)
        featureSpaceMenu.addAction(featureSpaceOpenAction)
        featureSpaceMenu.addAction(featureSpaceSaveAction)
        featureSpaceMenu.addAction(featureSpaceSaveAsAction)
        featureSpaceMenu.addSeparator()
        featureSpaceMenu.addAction(featureSpaceImportAction)
        featureSpaceMenu.addAction(featureSpaceExportAction)
        featureSpaceMenu.addAction(featureSpaceSaveImageAction)
        featureSpaceMenu.addSeparator()
        featureSpaceMenu.addAction(self.__featureSpaceHideSamplesAction)
        featureSpaceMenu.addSeparator()
        featureSpaceMenu.addAction(exitAction)

        clusteringKMeansAction = QtWidgets.QAction('k-Means Clustering...',
                                                   self)
        clusteringKMeansAction.setStatusTip('k-Means Clustering')
        clusteringKMeansAction.triggered.connect(
            lambda: self.clusterWithParameters(Clustering.kMeans))

        clusteringGMMAction = QtWidgets.QAction('Gaussian Mixture Model...',
                                                self)
        clusteringGMMAction.setStatusTip('Gaussian Mixture Model')
        clusteringGMMAction.triggered.connect(
            lambda: self.clusterWithParameters(Clustering.GMM))

        clusteringParametersAction = QtWidgets.QAction('Parameters...', self)
        clusteringParametersAction.setStatusTip(
            'Edit the parameters of the clustering algorithms')
        clusteringParametersAction.triggered.connect(
            self.editClusteringParameters)

        clusteringMenu = menubar.addMenu('C&lustering')
        clusteringMenu.addAction(clusteringKMeansAction)
        clusteringMenu.addAction(clusteringGMMAction)
        clusteringMenu.addSeparator()
        clusteringMenu.addAction(clusteringParametersAction)

        dimRedPCAAction = QtWidgets.QAction('Principal Component Analysis...',
                                            self)
        dimRedPCAAction.setStatusTip('Principal Component Analysis (PCA)')
        dimRedPCAAction.triggered.connect(
            lambda: self.reduceDimensionalityWithParameters(
                DimensionalityReduction.PCA))

        dimRedMenu = menubar.addMenu('&Dimensionality Reduction')
        dimRedMenu.addAction(dimRedPCAAction)

        classificationLogRegAction = QtWidgets.QAction(
            'Linear Logistic Regression...', self)
        classificationLogRegAction.setStatusTip(
            'Linear Logistic Regression classifier')
        classificationLogRegAction.triggered.connect(
            lambda: self.classifyWithParameters(Classifier.LogReg))

        classificationNormAction = QtWidgets.QAction('Norm classifier...',
                                                     self)
        classificationNormAction.setStatusTip(
            'Classification based on the distance to the class centers')
        classificationNormAction.triggered.connect(
            lambda: self.classifyWithParameters(Classifier.Norm))

        classificationNaiveBayesAction = QtWidgets.QAction('Naive Bayes', self)
        classificationNaiveBayesAction.setStatusTip('Naive Bayes classifier')
        classificationNaiveBayesAction.triggered.connect(
            lambda: self.classify(Classifier.NaiveBayes))

        classificationGaussianAction = QtWidgets.QAction(
            'Gaussian classifier', self)
        classificationGaussianAction.setStatusTip('Gaussian classifier')
        classificationGaussianAction.triggered.connect(
            lambda: self.classify(Classifier.Gauss))

        classificationGMMAction = QtWidgets.QAction('GMM classifier...', self)
        classificationGMMAction.setStatusTip(
            'Gaussian Mixture Model classifier')
        classificationGMMAction.triggered.connect(
            lambda: self.classifyWithParameters(Classifier.GMM))

        classificationKNNAction = QtWidgets.QAction('kNN...', self)
        classificationKNNAction.setStatusTip('k Nearest Neighbor classifier')
        classificationKNNAction.triggered.connect(
            lambda: self.classifyWithParameters(Classifier.kNN))

        classificationLinRegAction = QtWidgets.QAction('Linear Regression...',
                                                       self)
        classificationLinRegAction.setStatusTip('Linear Regression classifier')
        classificationLinRegAction.triggered.connect(
            lambda: self.classifyWithParameters(Classifier.LinReg))

        classificationPerceptronAction = QtWidgets.QAction(
            'Rosenblatt\'s Perceptron...', self)
        classificationPerceptronAction.setStatusTip('Rosenblatt\'s Perceptron')
        classificationPerceptronAction.triggered.connect(
            lambda: self.classifyWithParameters(Classifier.Perceptron))

        classificationMLPAction = QtWidgets.QAction('Multilayer Perceptron...',
                                                    self)
        classificationMLPAction.setStatusTip('Multilayer Perceptron')
        classificationMLPAction.triggered.connect(
            lambda: self.classifyWithParameters(Classifier.MLP))
        try:
            # requires sklearn >= 0.18.dev0
            neural_network.MLPClassifier()
        except:
            classificationMLPAction.setEnabled(False)

        classificationSVMAction = QtWidgets.QAction('SVM...', self)
        classificationSVMAction.setStatusTip('Support Vector Machine')
        classificationSVMAction.triggered.connect(
            lambda: self.classifyWithParameters(Classifier.SVM))

        classificationDecisionTreeAction = QtWidgets.QAction(
            'Decision Tree...', self)
        classificationDecisionTreeAction.setStatusTip(
            'Decision Tree classifier')
        classificationDecisionTreeAction.triggered.connect(
            lambda: self.classifyWithParameters(Classifier.DecisionTree))

        classificationRandomForestAction = QtWidgets.QAction(
            'Random Forest...', self)
        classificationRandomForestAction.setStatusTip(
            'Random Forest classifier')
        classificationRandomForestAction.triggered.connect(
            lambda: self.classifyWithParameters(Classifier.RandomForest))

        classificationParametersAction = QtWidgets.QAction(
            'Parameters...', self)
        classificationParametersAction.setStatusTip(
            'Edit the parameters of the classification algorithms')
        classificationParametersAction.triggered.connect(
            self.editClassificationParameters)

        classificationNoneAction = QtWidgets.QAction('None', self)
        classificationNoneAction.setStatusTip('Delete classification results')
        classificationNoneAction.triggered.connect(self.unsetClassifier)

        classificationMenu = menubar.addMenu('&Classification')
        classificationMenu.addAction(classificationLogRegAction)
        classificationMenu.addAction(classificationNormAction)
        classificationMenu.addAction(classificationNaiveBayesAction)
        classificationMenu.addAction(classificationGaussianAction)
        classificationMenu.addAction(classificationGMMAction)
        classificationMenu.addAction(classificationKNNAction)
        classificationMenu.addAction(classificationLinRegAction)
        classificationMenu.addAction(classificationPerceptronAction)
        classificationMenu.addAction(classificationMLPAction)
        classificationMenu.addAction(classificationSVMAction)
        classificationMenu.addAction(classificationDecisionTreeAction)
        classificationMenu.addAction(classificationRandomForestAction)
        classificationMenu.addSeparator()
        classificationMenu.addAction(classificationParametersAction)
        classificationMenu.addAction(classificationNoneAction)

        regressionLinRegAction = QtWidgets.QAction('Linear Regression...',
                                                   self)
        regressionLinRegAction.setStatusTip('Linear Regression')
        regressionLinRegAction.triggered.connect(
            lambda: self.regressionWithParameters(Regression.LinearRegression))

        regressionSVRAction = QtWidgets.QAction('Support Vector Regression...',
                                                self)
        regressionSVRAction.setStatusTip('Support Vector Regression (SVR)')
        regressionSVRAction.triggered.connect(
            lambda: self.regressionWithParameters(Regression.SVR))

        regressionRegressionTreeAction = QtWidgets.QAction(
            'Regression Tree...', self)
        regressionRegressionTreeAction.setStatusTip('Regression Tree')
        regressionRegressionTreeAction.triggered.connect(
            lambda: self.regressionWithParameters(Regression.RegressionTree))

        regressionRegressionForestAction = QtWidgets.QAction(
            'Regression Forest...', self)
        regressionRegressionForestAction.setStatusTip('Regression Forest')
        regressionRegressionForestAction.triggered.connect(
            lambda: self.regressionWithParameters(Regression.RegressionForest))

        regressionParametersAction = QtWidgets.QAction('Parameters...', self)
        regressionParametersAction.setStatusTip(
            'Edit the parameters of the regression algorithms')
        regressionParametersAction.triggered.connect(
            self.editRegressionParameters)

        regressionNoneAction = QtWidgets.QAction('None', self)
        regressionNoneAction.setStatusTip('Delete regression result')
        regressionNoneAction.triggered.connect(self.unsetRegressor)

        regressionMenu = menubar.addMenu('&Regression')
        regressionMenu.addAction(regressionLinRegAction)
        regressionMenu.addAction(regressionSVRAction)
        regressionMenu.addAction(regressionRegressionTreeAction)
        regressionMenu.addAction(regressionRegressionForestAction)
        regressionMenu.addSeparator()
        regressionMenu.addAction(regressionParametersAction)
        regressionMenu.addAction(regressionNoneAction)

        densityEstimationHistogramAction = QtWidgets.QAction(
            'Histogram...', self)
        densityEstimationHistogramAction.setStatusTip('Histogram estimation')
        densityEstimationHistogramAction.triggered.connect(
            lambda: self.densityEstimationWithParameters(DensityEstimation.
                                                         Histogram))

        densityEstimationSphereAction = QtWidgets.QAction(
            'Sphere Density Estimation...', self)
        densityEstimationSphereAction.setStatusTip('Sphere Density Estimation')
        densityEstimationSphereAction.triggered.connect(
            lambda: self.densityEstimationWithParameters(
                DensityEstimation.SphereDensityEstimation))

        densityEstimationKernelAction = QtWidgets.QAction(
            'Kernel Density Estimation...', self)
        densityEstimationKernelAction.setStatusTip('Kernel Density Estimation')
        densityEstimationKernelAction.triggered.connect(
            lambda: self.densityEstimationWithParameters(
                DensityEstimation.KernelDensityEstimation))

        densityEstimationParametersAction = QtWidgets.QAction(
            'Parameters...', self)
        densityEstimationParametersAction.setStatusTip(
            'Edit the parameters of the density estimation algorithms')
        densityEstimationParametersAction.triggered.connect(
            self.editDensityEstimationParameters)

        densityEstimationNoneAction = QtWidgets.QAction('None', self)
        densityEstimationNoneAction.setStatusTip(
            'Delete density estimation result')
        densityEstimationNoneAction.triggered.connect(
            self.unsetDensityEstimation)

        densityEstimationMenu = menubar.addMenu('Density &Estimation')
        densityEstimationMenu.addAction(densityEstimationHistogramAction)
        densityEstimationMenu.addAction(densityEstimationSphereAction)
        densityEstimationMenu.addAction(densityEstimationKernelAction)
        densityEstimationMenu.addSeparator()
        densityEstimationMenu.addAction(densityEstimationParametersAction)
        densityEstimationMenu.addAction(densityEstimationNoneAction)

        aboutAction = QtWidgets.QAction('About...', self)
        aboutAction.setStatusTip('About this software')
        aboutAction.triggered.connect(self.aboutDialog.exec_)

        licenseAction = QtWidgets.QAction('License...', self)
        licenseAction.setStatusTip('GNU General Public License')
        licenseAction.triggered.connect(self.licenseDialog.showLicense)

        infoAction = QtWidgets.QAction('Info...', self)
        infoAction.setStatusTip('Information about the Python distribution')
        infoAction.triggered.connect(self.infoDialog.exec_)

        helpMenu = menubar.addMenu('&Help')
        helpMenu.addAction(aboutAction)
        helpMenu.addAction(licenseAction)
        helpMenu.addAction(infoAction)

        #		exitAction = QtGui.QAction(QtGui.QIcon('./img/exit.png'), 'Exit', self)
        #		exitAction.setShortcut('Ctrl+Q')
        #		exitAction.triggered.connect(QtGui.qApp.quit)

        #		coordinateSystemAction = QtGui.QAction(QtGui.QIcon('./img/coord.png'), 'Move coordinate system', self)
        #		coordinateSystemAction.triggered.connect(self.onMoveCoordinateSystem)

        #		gaussCreateAction = QtGui.QAction(QtGui.QIcon('./img/create_gauss.png'), 'Create Gaussians', self)
        #		gaussCreateAction.triggered.connect(self.onCreateGaussians)

        #		gaussModifyAction = QtGui.QAction(QtGui.QIcon('./img/modify_gauss.png'), 'Modify Gaussians', self)
        #		gaussModifyAction.triggered.connect(self.onModifyGaussians)

        self.moveCoordinateSystemButton = QtWidgets.QToolButton()
        self.moveCoordinateSystemButton.setIcon(
            QtGui.QIcon(resource_path('./img/coord.png')))
        self.moveCoordinateSystemButton.setStatusTip(
            'Move the coordinate system by dragging the mouse or zoom in or out using the mouse scroll wheel'
        )
        self.moveCoordinateSystemButton.setCheckable(True)
        self.moveCoordinateSystemButton.setChecked(True)
        self.moveCoordinateSystemButton.clicked.connect(
            self.onMoveCoordinateSystem)

        self.createGaussButton = QtWidgets.QToolButton()
        self.createGaussButton.setIcon(
            QtGui.QIcon(resource_path('./img/create_gauss.png')))
        self.createGaussButton.setStatusTip(
            'Create samples drawn from a new Gaussian pdf by spanning the bounding box of the covariance matrix'
        )
        self.createGaussButton.setCheckable(True)
        self.createGaussButton.clicked.connect(self.onCreateGaussians)

        self.modifyGaussButton = QtWidgets.QToolButton()
        self.modifyGaussButton.setIcon(
            QtGui.QIcon(resource_path('./img/modify_gauss.png')))
        self.modifyGaussButton.setStatusTip(
            'Modify existing Gaussian pdfs by left of right clicking on the center'
        )
        self.modifyGaussButton.setCheckable(True)
        self.modifyGaussButton.clicked.connect(self.onModifyGaussians)

        self.createSamplesButton = QtWidgets.QToolButton()
        self.createSamplesButton.setIcon(
            QtGui.QIcon(resource_path('./img/samples.png')))
        self.createSamplesButton.setStatusTip(
            'Create and modify individual samples by spanning a rectangle that contains one or more samples'
        )
        self.createSamplesButton.setCheckable(True)
        self.createSamplesButton.clicked.connect(self.onCreateSamples)

        self.toolbar = QtWidgets.QToolBar(self)
        self.toolbar.setIconSize(QtCore.QSize(48, 48))
        self.addToolBar(QtCore.Qt.RightToolBarArea, self.toolbar)
        # self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
        # self.toolbar.addAction(coordinateSystemAction)
        # self.toolbar.addAction(gaussCreateAction)
        # self.toolbar.addAction(gaussModifyAction)
        self.toolbar.addWidget(self.moveCoordinateSystemButton)
        self.toolbar.addWidget(self.createGaussButton)
        self.toolbar.addWidget(self.modifyGaussButton)
        self.toolbar.addWidget(self.createSamplesButton)

        QtGui.QShortcut(QtGui.QKeySequence("Ctrl+Z"), self, self.undo)
        QtGui.QShortcut(QtGui.QKeySequence("Ctrl+R"), self, self.redo)

        self.printLicenseMessage()
 def showWarranty(self):
     # three backslashes needed for Windows
     url = QtCore.QUrl("file:///" + resource_path('GPLv3.html') +
                       "#section15")
     self.info.setSource(url)
     self.exec_()
 def showLicense(self):
     url = QtCore.QUrl.fromLocalFile(resource_path('GPLv3.html'))
     self.info.setSource(url)
     self.exec_()