diff --git a/CMakeLists.txt b/CMakeLists.txt index a05e70d..1e718b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ if (PLUGIN_STANDARD_3DMASC) project( Q3DMASC_PLUGIN ) AddPlugin( NAME ${PROJECT_NAME} ) - set(Q3DMASC_PLUGIN_VERSION "0.12") + set(Q3DMASC_PLUGIN_VERSION "0.12+") include( CMakePolicies NO_POLICY_SCOPE ) diff --git a/ContextBasedFeature.cpp b/ContextBasedFeature.cpp index ef9b066..9471118 100644 --- a/ContextBasedFeature.cpp +++ b/ContextBasedFeature.cpp @@ -136,7 +136,10 @@ bool ContextBasedFeature::prepare( const CorePoints& corePoints, if (!scaled() && !sfWasAlreadyExisting) //with 'kNN' neighbors, we can compute the values right away { unsigned pointCount = corePoints.size(); - QString logMessage = QString("Computing %1 on cloud %2 with context cloud %3\n(core points: %4)").arg(typeStr).arg(corePoints.cloud->getName()).arg(cloud1Label).arg(pointCount); + QString logMessage = "Computing " + typeStr + + " on cloud " + corePoints.cloud->getName() + " (" + QString::number(pointCount) + " points)" + + " with context cloud " + cloud1Label + + " (class " + QString::number(ctxClassLabel) + ")"; //first: look for the number of points in the relevent class const ScalarType fClass = static_cast(ctxClassLabel); @@ -165,7 +168,7 @@ bool ContextBasedFeature::prepare( const CorePoints& corePoints, } //compute the octree - ccLog::Print(QString("Computing octree of class %1 points (%2 points)").arg(ctxClassLabel).arg(classCount)); + ccLog::Print(QString("Computing octree of class %1 (%2 points)").arg(ctxClassLabel).arg(classCount)); ccOctree::Shared classOctree = classCloud.computeOctree(progressCb); if (!classOctree) { @@ -191,8 +194,7 @@ bool ContextBasedFeature::prepare( const CorePoints& corePoints, bool cancelled = false; #ifndef _DEBUG #if defined(_OPENMP) - omp_set_num_threads(std::max(1, omp_get_max_threads() - 2)); -#pragma omp parallel for +#pragma omp parallel for num_threads(std::max(1, omp_get_max_threads() - 2)) #endif #endif for (int i = 0; i < static_cast(pointCount); ++i) diff --git a/PointFeature.cpp b/PointFeature.cpp index 5e2d56a..b73bd46 100644 --- a/PointFeature.cpp +++ b/PointFeature.cpp @@ -424,8 +424,7 @@ static bool ComputeMathOpWithNearestNeighbor( const CorePoints& corePoints, error.clear(); #ifndef _DEBUG #if defined(_OPENMP) - omp_set_num_threads(std::max(1, omp_get_max_threads() - 2)); -#pragma omp parallel for +#pragma omp parallel for num_threads(std::max(1, omp_get_max_threads() - 2)) #endif #endif for (int i = 0; i < static_cast(pointCount); ++i) diff --git a/q3DMASC.cpp b/q3DMASC.cpp index 18391de..c551ff4 100644 --- a/q3DMASC.cpp +++ b/q3DMASC.cpp @@ -372,7 +372,7 @@ void q3DMASCPlugin::doTrainAction() masc::TrainParameters tempParams; if (!masc::Tools::LoadTrainingFile(inputFilename, featuresTest, scalesTest, loadedCloudsTest, tempParams)) { - m_app->dispToConsole("Failed to load the training file (for test)", ccMainAppInterface::ERR_CONSOLE_MESSAGE); + m_app->dispToConsole("Failed to load the training file (for TEST)", ccMainAppInterface::ERR_CONSOLE_MESSAGE); return; } } diff --git a/q3DMASCClassifier.cpp b/q3DMASCClassifier.cpp index 60aa91d..8b09c47 100644 --- a/q3DMASCClassifier.cpp +++ b/q3DMASCClassifier.cpp @@ -209,8 +209,7 @@ bool Classifier::classify( const Feature::Source::Set& featureSources, int numberOfTrees = static_cast(m_rtrees->getRoots().size()); #ifndef _DEBUG #if defined(_OPENMP) - omp_set_num_threads(std::max(1, omp_get_max_threads() - 2)); -#pragma omp parallel for +#pragma omp parallel for num_threads(std::max(1, omp_get_max_threads() - 2)) #endif #endif for (int i = 0; i < static_cast(cloud->size()); ++i) diff --git a/q3DMASCTools.cpp b/q3DMASCTools.cpp index 68eb972..d8deeec 100644 --- a/q3DMASCTools.cpp +++ b/q3DMASCTools.cpp @@ -1223,20 +1223,21 @@ bool Tools::PrepareFeatures(const CorePoints& corePoints, Feature::Set& features unsigned char octreeLevel = octree->findBestLevelForAGivenNeighbourhoodSizeExtraction(largestRadius); unsigned pointCount = corePoints.size(); - QString logMessage = QString("Computing %1 features on cloud %2\n(core points: %3)").arg(fas.featureCount).arg(sourceCloud->getName()).arg(pointCount); + QString logMessage = QString("Computing %1 features on cloud %2 (%3 core points)").arg(fas.featureCount).arg(sourceCloud->getName()).arg(pointCount); if (progressCb) { progressCb->setMethodTitle("Compute features"); progressCb->setInfo(qPrintable(logMessage)); } - ccLog::Print(logMessage); + ccLog::Print(logMessage + " , nb threads " + QString::number(omp_get_max_threads() - 2) + ", nb points " + QString::number(pointCount)); CCCoreLib::NormalizedProgress nProgress(progressCb, pointCount); + nProgress.reset(); QMutex mutex; + #ifndef _DEBUG #if defined(_OPENMP) - omp_set_num_threads(std::max(1, omp_get_max_threads() - 2)); -#pragma omp parallel for +#pragma omp parallel for num_threads(std::max(1, omp_get_max_threads() - 2)) #endif #endif for (int i = 0; i < static_cast(pointCount); ++i) @@ -1372,10 +1373,10 @@ bool Tools::PrepareFeatures(const CorePoints& corePoints, Feature::Set& features { break; } - } //for each scale + } //for each scale } - + if (progressCb) { mutex.lock(); @@ -1385,15 +1386,15 @@ bool Tools::PrepareFeatures(const CorePoints& corePoints, Feature::Set& features { //process cancelled by the user ccLog::Warning("Process cancelled"); - errorStr = "Process cancelled"; + errorStr = "Process cancelled, iteration " + QString::number(i); success = false; break; } } - } //for each point - + } //for each cloud + } for (const Feature::Shared& feature : features) diff --git a/q3DMASCTools.h b/q3DMASCTools.h index 6105eb4..bb3eb6c 100644 --- a/q3DMASCTools.h +++ b/q3DMASCTools.h @@ -56,8 +56,8 @@ namespace masc static bool SaveClassifier(QString filename, const Feature::Set& features, const QString corePointsRole, const masc::Classifier& classifier, QWidget* parent = nullptr); - static bool PrepareFeatures(const CorePoints& corePoints, Feature::Set& features, QString& error, - CCCoreLib::GenericProgressCallback* progressCb = nullptr, SFCollector* generatedScalarFields = nullptr); + static bool PrepareFeatures(const CorePoints& corePoints, Feature::Set& features, QString& error, + CCCoreLib::GenericProgressCallback* progressCb = nullptr, SFCollector* generatedScalarFields = nullptr); static bool RandomSubset(ccPointCloud* cloud, float ratio, CCCoreLib::ReferenceCloud* inRatioSubset, CCCoreLib::ReferenceCloud* outRatioSubset);