From 4f6cd5fe6d82922af82f14338e4f1056e65bb14e Mon Sep 17 00:00:00 2001 From: Paul Leroy Date: Wed, 31 May 2023 00:20:19 +0200 Subject: [PATCH] Bug when running several times the classification corrected --- Classify3DMASCDialog.ui | 22 +--------------------- FeaturesInterface.cpp | 3 +-- PointFeature.cpp | 2 +- confusionmatrix.cpp | 6 +++--- confusionmatrix.h | 4 ++-- q3DMASC.cpp | 1 - q3DMASCClassifier.cpp | 4 ++-- q3DMASCTools.cpp | 3 +-- qClassify3DMASCDialog.cpp | 3 --- 9 files changed, 11 insertions(+), 37 deletions(-) diff --git a/Classify3DMASCDialog.ui b/Classify3DMASCDialog.ui index 9a6a8a2..7b147d2 100644 --- a/Classify3DMASCDialog.ui +++ b/Classify3DMASCDialog.ui @@ -7,7 +7,7 @@ 0 0 700 - 393 + 359 @@ -185,26 +185,6 @@ - - - - Use existing attributes - - - - - - - Qt::Vertical - - - - 20 - 23 - - - - diff --git a/FeaturesInterface.cpp b/FeaturesInterface.cpp index 912caad..b71bf90 100644 --- a/FeaturesInterface.cpp +++ b/FeaturesInterface.cpp @@ -73,11 +73,10 @@ CCCoreLib::ScalarField* Feature::PrepareSF(ccPointCloud* cloud, const char* resu } resultSF = newSF; - + resultSF->fill(CCCoreLib::NAN_VALUE); } assert(resultSF); - resultSF->fill(CCCoreLib::NAN_VALUE); return resultSF; } diff --git a/PointFeature.cpp b/PointFeature.cpp index b33c601..8a027d5 100644 --- a/PointFeature.cpp +++ b/PointFeature.cpp @@ -596,7 +596,7 @@ bool PointFeature::prepare( const CorePoints& corePoints, if (field2 && op != Feature::NO_OPERATION && !statSF1WasAlreadyExisting) // nothing to do if statSF1 was already there { - QString resultSFName2 = field2->getName() + QString("_") + Feature::StatToString(stat) + "_" + cloud2Label + "@" + QString::number(scale); + QString resultSFName2 = field2->getName() + QString("_") + cloud2Label + "_" + Feature::StatToString(stat) + "@" + QString::number(scale); //keepStatSF2 = (corePoints.cloud->getScalarFieldIndexByName(qPrintable(resultSFName2)) >= 0); //we remember that the scalar field was already existing! assert(!statSF2); diff --git a/confusionmatrix.cpp b/confusionmatrix.cpp index ccb82ae..befaf73 100644 --- a/confusionmatrix.cpp +++ b/confusionmatrix.cpp @@ -32,7 +32,7 @@ QColor getColor(double value, double r1, double g1, double b1) return QColor(r, g, b); } -ConfusionMatrix::ConfusionMatrix(std::vector &actual, std::vector &predicted, QWidget *parent) : +ConfusionMatrix::ConfusionMatrix(const std::vector &actual, const std::vector &predicted, QWidget *parent) : QWidget(parent), ui(new Ui::ConfusionMatrix) { @@ -46,7 +46,7 @@ ConfusionMatrix::ConfusionMatrix(std::vector &actual, std::vectorui->tableWidget->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); QSize tableSize = this->ui->tableWidget->sizeHint(); QSize labelSize = this->ui->label->sizeHint(); - QSize widgetSize = QSize(tableSize.width() + 10, tableSize.height() + 50); + QSize widgetSize = QSize(tableSize.width() + 20, tableSize.height() + 50); this->setMinimumSize(widgetSize); } @@ -141,7 +141,7 @@ float ConfusionMatrix::computeOverallAccuracy(cv::Mat& matrix) return m_overallAccuracy; } -void ConfusionMatrix::compute(std::vector& actual, std::vector& predicted) +void ConfusionMatrix::compute(const std::vector& actual, const std::vector& predicted) { int idxActual; int idxPredicted; diff --git a/confusionmatrix.h b/confusionmatrix.h index 514c41d..bd3f85f 100644 --- a/confusionmatrix.h +++ b/confusionmatrix.h @@ -24,12 +24,12 @@ public: F1_SCORE = 2 }; - explicit ConfusionMatrix(std::vector& actual, std::vector& predicted, QWidget *parent = nullptr); + explicit ConfusionMatrix(const std::vector& actual, const std::vector& predicted, QWidget *parent = nullptr); ~ConfusionMatrix(); void computePrecisionRecallF1Score(cv::Mat& matrix, cv::Mat& precisionRecallF1Score, cv::Mat &vec_TP_FN); float computeOverallAccuracy(cv::Mat& matrix); - void compute(std::vector& actual, std::vector& predicted); + void compute(const std::vector &actual, const std::vector &predicted); void setSessionRun(QString session, int run); float m_overallAccuracy; bool save(QString filePath); diff --git a/q3DMASC.cpp b/q3DMASC.cpp index c82736e..d1a1da0 100644 --- a/q3DMASC.cpp +++ b/q3DMASC.cpp @@ -293,7 +293,6 @@ void q3DMASCPlugin::doTrainAction() classifDlg.label_trainOrClassify->setText("The classifier will be trained on " + corePointsLabel); classifDlg.classifierFileLineEdit->setText(inputFilename); classifDlg.keepAttributesCheckBox->hide(); // this parameter is set in the trainDlg dialog - classifDlg.checkBox_useExistingScalarFields->hide(); // this parameter is set in the trainDlg dialog if (!classifDlg.exec()) { //process cancelled by the user diff --git a/q3DMASCClassifier.cpp b/q3DMASCClassifier.cpp index d793492..b210192 100644 --- a/q3DMASCClassifier.cpp +++ b/q3DMASCClassifier.cpp @@ -129,8 +129,7 @@ bool Classifier::classify( const Feature::Source::Set& featureSources, int cvConfidenceIdx = cloud->getScalarFieldIndexByName("Classification_confidence"); if (cvConfidenceIdx > 0) // if the scalar field exists, delete it cloud->deleteScalarField(cvConfidenceIdx); - else - cvConfidenceIdx = cloud->addScalarField("Classification_confidence"); + cvConfidenceIdx = cloud->addScalarField("Classification_confidence"); CCCoreLib::ScalarField* cvConfidenceSF = cloud->getScalarField(cvConfidenceIdx); ccScalarField* classifSFBackup = nullptr; @@ -259,6 +258,7 @@ bool Classifier::classify( const Feature::Source::Set& featureSources, break; } } + classificationSF->computeMinAndMax(); cvConfidenceSF->computeMinAndMax(); diff --git a/q3DMASCTools.cpp b/q3DMASCTools.cpp index 4543343..6cd94a6 100644 --- a/q3DMASCTools.cpp +++ b/q3DMASCTools.cpp @@ -1038,7 +1038,7 @@ struct FeaturesAndScales }; bool Tools::PrepareFeatures(const CorePoints& corePoints, Feature::Set& features, QString& errorStr, - CCCoreLib::GenericProgressCallback* progressCb/*=nullptr*/, SFCollector* generatedScalarFields/*=nullptr*/) + CCCoreLib::GenericProgressCallback* progressCb/*=nullptr*/, SFCollector* generatedScalarFields/*=nullptr*/) { if (features.empty() || !corePoints.origin) { @@ -1377,7 +1377,6 @@ bool Tools::PrepareFeatures(const CorePoints& corePoints, Feature::Set& features for (const Feature::Shared& feature : features) { - std::cout << feature->toString().toStdString() << std::endl; //we have to 'finish' the process for scaled features if (feature->scaled() && !feature->finish(corePoints, errorStr)) { diff --git a/qClassify3DMASCDialog.cpp b/qClassify3DMASCDialog.cpp index 5858027..7d47026 100644 --- a/qClassify3DMASCDialog.cpp +++ b/qClassify3DMASCDialog.cpp @@ -124,8 +124,6 @@ void Classify3DMASCDialog::readSettings() settings.beginGroup("3DMASC"); bool keepAttributes = settings.value("keepAttributes", false).toBool(); this->keepAttributesCheckBox->setChecked(keepAttributes); - bool useExistingScalarFields = settings.value("useExistingScalarFields", false).toBool(); - this->checkBox_useExistingScalarFields->setChecked(useExistingScalarFields); } void Classify3DMASCDialog::writeSettings() @@ -133,7 +131,6 @@ void Classify3DMASCDialog::writeSettings() QSettings settings; settings.beginGroup("3DMASC"); settings.setValue("keepAttributes", keepAttributesCheckBox->isChecked()); - settings.setValue("useExistingScalarFields", checkBox_useExistingScalarFields->isChecked()); } void Classify3DMASCDialog::setCloudRoles(const QList& roles, QString corePointsLabel)