Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

POL 4993 and 4995: fixes and optimization related to Hamdah's last wholeslide experience #221

Merged
merged 5 commits into from
Jul 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 55 additions & 4 deletions src/nyx/env_features.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <algorithm>
#include <exception>
#include <fstream>
#include <iomanip>
Expand All @@ -9,6 +10,17 @@
#include <vector>
#include "environment.h"
#include "featureset.h"
#include "features/basic_morphology.h"
#include "features/chords.h"
#include "features/convex_hull.h"
#include "features/erosion.h"
#include "features/caliper.h"
#include "features/circle.h"
#include "features/ellipse_fitting.h"
#include "features/euler_number.h"
#include "features/extrema.h"
#include "features/fractal_dim.h"
#include "features/geodetic_len_thickness.h"
#include "features/gabor.h"
#include "features/glcm.h"
#include "features/gldm.h"
Expand All @@ -20,6 +32,7 @@
#include "features/neighbors.h"
#include "features/ngldm.h"
#include "features/ngtdm.h"
#include "features/roi_radius.h"
#include "helpers/helpers.h"
#include "helpers/system_resource.h"
#include "helpers/timing.h"
Expand Down Expand Up @@ -166,8 +179,6 @@ bool Environment::spellcheck_raw_featurelist(const std::string& comma_separated_
return success;
}



// Returns:
// true if s is recognized as a group name
// false if not recognized (s may be an individual feature name)
Expand All @@ -177,6 +188,45 @@ bool Environment::expand_2D_featuregroup (const std::string & s)
if (s == Nyxus::theFeatureSet.findGroupNameByCode(Fgroup2D::FG2_ALL))
{
Nyxus::theFeatureSet.enableAll();

// Handle whole-slide mode differently: disable features irrelevant to this mode (shape, neighbors, etc)
if (singleROI)
{
std::cout << box_text ("Activating whole slide (aka single-ROI) mode\n"
"ATTENTION: disabling inappplicable and time-sonsuming features:\n"
" - morphological features\n"
" - neighbor features\n"
" - GLDM, GLDZM, GLRLM, GLSZM, NGLDM, NGTDM");

theFeatureSet.disableFeatures(BasicMorphologyFeatures::featureset);
theFeatureSet.disableFeatures(EnclosingInscribingCircumscribingCircleFeature::featureset);
theFeatureSet.disableFeatures(ContourFeature::featureset); // and its dependencies below (see file reduce_trivial_rois_manual.cpp)
theFeatureSet.disableFeatures(ConvexHullFeature::featureset); // depends on ContourFeature
theFeatureSet.disableFeatures(FractalDimensionFeature::featureset); // depends on ContourFeature
theFeatureSet.disableFeatures(GeodeticLengthThicknessFeature::featureset); // depends on ContourFeature
theFeatureSet.disableFeatures(NeighborsFeature::featureset); // depends on ContourFeature
theFeatureSet.disableFeatures(RoiRadiusFeature::featureset); // depends on ContourFeature
theFeatureSet.disableFeatures(EllipseFittingFeature::featureset);
theFeatureSet.disableFeatures(EulerNumberFeature::featureset);
theFeatureSet.disableFeatures(ExtremaFeature::featureset);
theFeatureSet.disableFeatures(ErosionPixelsFeature::featureset);
theFeatureSet.disableFeatures(CaliperFeretFeature::featureset);
theFeatureSet.disableFeatures(CaliperMartinFeature::featureset);
theFeatureSet.disableFeatures(CaliperNassensteinFeature::featureset);
theFeatureSet.disableFeatures(ChordsFeature::featureset);

// enabling GaborFeature
// enabling ImageMomentsFeature
// enabling GLCMFeature

theFeatureSet.disableFeatures(GLDMFeature::featureset); // costs about 4.72 %
theFeatureSet.disableFeatures(GLDZMFeature::featureset); // costs about 38.14 %
theFeatureSet.disableFeatures(GLRLMFeature::featureset); // costs about 17.29 %
theFeatureSet.disableFeatures(GLSZMFeature::featureset); // costs about 15.94 %
theFeatureSet.disableFeatures(NGLDMfeature::featureset); // costs about 3.57 %
theFeatureSet.disableFeatures(NGTDMFeature::featureset); // costs about 5.13 %
}

return true;
}
if (s == Nyxus::theFeatureSet.findGroupNameByCode(Fgroup2D::FG2_BUT_GABOR))
Expand Down Expand Up @@ -305,6 +355,7 @@ bool Environment::expand_2D_featuregroup (const std::string & s)
return true;
}

// unrecognized feature group
return false;
}

Expand Down Expand Up @@ -441,13 +492,13 @@ void Environment::expand_featuregroups()
if (dim() == 2)
{
if (expand_2D_featuregroup (s))
return;
continue;
}

if (dim() == 3)
{
if (expand_3D_featuregroup (s))
return;
continue;
}

// 's' is an individual feature name, not feature group name. Process it now
Expand Down
36 changes: 8 additions & 28 deletions src/nyx/environment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,6 @@
#include "environment.h"
#include "featureset.h"
#include "features/glcm.h"
#include "features/gldm.h"
#include "features/gldzm.h"
#include "features/glrlm.h"
#include "features/glszm.h"
#include "features/image_moments.h"
#include "features/ngldm.h"
#include "features/ngtdm.h"
#include "helpers/helpers.h"
#include "helpers/system_resource.h"
#include "helpers/timing.h"
Expand Down Expand Up @@ -484,6 +477,13 @@ bool Environment::parse_cmdline(int argc, char** argv)
return false;
}

//==== whole-slide mode
if (Nyxus::toupper(labels_dir) == Nyxus::toupper(intensity_dir))
{
singleROI = true;
}


if (rawOutpType == "")
{
std::cerr << "Error: Missing argument " << OUTPUTTYPE << "\n";
Expand Down Expand Up @@ -791,7 +791,7 @@ bool Environment::parse_cmdline(int argc, char** argv)
return false;
}

// --Feature names are ok, now expand feature group nicknames and set the enabled flag for each feature in 'theFeatureSet'
// --Feature names are ok, now expand feature group nicknames and enable each feature in 'theFeatureSet'
try
{
expand_featuregroups();
Expand All @@ -802,26 +802,6 @@ bool Environment::parse_cmdline(int argc, char** argv)
return false;
}

//==== Handle the whole-slide mode
if (Nyxus::toupper(labels_dir) == Nyxus::toupper(intensity_dir))
{
singleROI = true;
std::cout <<
"+-----------------------------------------------------------+\n"
"| |\n"
"| Activating whole slide (aka single-ROI) mode |\n"
"| ATTENTION: disabling time-sonsuming erosions features |\n"
"| |\n"
"+-----------------------------------------------------------+\n";

auto F = {
Feature2D::EROSIONS_2_VANISH,
Feature2D::EROSIONS_2_VANISH_COMPLEMENT,
Feature2D::GABOR
};
theFeatureSet.disableFeatures(F);
}

//==== Parse resolution
if (rawXYRes.length() > 0)
{
Expand Down
38 changes: 4 additions & 34 deletions src/nyx/features/basic_morphology.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,44 +7,14 @@

using namespace Nyxus;

bool BasicMorphologyFeatures::required(const FeatureSet& fs) {
return fs.anyEnabled({
Feature2D::AREA_PIXELS_COUNT,
Feature2D::AREA_UM2,
Feature2D::ASPECT_RATIO,
Feature2D::BBOX_XMIN,
Feature2D::BBOX_YMIN,
Feature2D::BBOX_WIDTH,
Feature2D::BBOX_HEIGHT,
Feature2D::CENTROID_X,
Feature2D::CENTROID_Y,
Feature2D::COMPACTNESS,
Feature2D::DIAMETER_EQUAL_AREA,
Feature2D::EXTENT,
Feature2D::MASS_DISPLACEMENT,
Feature2D::WEIGHTED_CENTROID_X,
Feature2D::WEIGHTED_CENTROID_Y });
bool BasicMorphologyFeatures::required(const FeatureSet& fs)
{
return fs.anyEnabled (BasicMorphologyFeatures::featureset);
}

BasicMorphologyFeatures::BasicMorphologyFeatures(): FeatureMethod("BasicMorphologyFeatures")
{
provide_features({
Feature2D::AREA_PIXELS_COUNT,
Feature2D::AREA_UM2,
Feature2D::ASPECT_RATIO,
Feature2D::BBOX_XMIN,
Feature2D::BBOX_YMIN,
Feature2D::BBOX_WIDTH,
Feature2D::BBOX_HEIGHT,
Feature2D::CENTROID_X,
Feature2D::CENTROID_Y,
Feature2D::COMPACTNESS,
Feature2D::EXTENT,
Feature2D::MASS_DISPLACEMENT,
Feature2D::WEIGHTED_CENTROID_X,
Feature2D::WEIGHTED_CENTROID_Y,
Feature2D::DIAMETER_EQUAL_AREA
});
provide_features (BasicMorphologyFeatures::featureset);
}

void BasicMorphologyFeatures::calculate(LR& r)
Expand Down
21 changes: 21 additions & 0 deletions src/nyx/features/basic_morphology.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,27 @@
class BasicMorphologyFeatures : public FeatureMethod
{
public:

const constexpr static std::initializer_list<Nyxus::Feature2D> featureset =
{
Nyxus::Feature2D::AREA_PIXELS_COUNT,
Nyxus::Feature2D::AREA_UM2,
Nyxus::Feature2D::ASPECT_RATIO,
Nyxus::Feature2D::BBOX_XMIN,
Nyxus::Feature2D::BBOX_YMIN,
Nyxus::Feature2D::BBOX_WIDTH,
Nyxus::Feature2D::BBOX_HEIGHT,
Nyxus::Feature2D::CENTROID_X,
Nyxus::Feature2D::CENTROID_Y,
Nyxus::Feature2D::COMPACTNESS,
Nyxus::Feature2D::DIAMETER_EQUAL_AREA,
Nyxus::Feature2D::EXTENT,
Nyxus::Feature2D::MASS_DISPLACEMENT,
Nyxus::Feature2D::WEIGHTED_CENTROID_X,
Nyxus::Feature2D::WEIGHTED_CENTROID_Y
};


BasicMorphologyFeatures();
void calculate (LR& r);
void osized_add_online_pixel(size_t x, size_t y, uint32_t intensity);
Expand Down
35 changes: 20 additions & 15 deletions src/nyx/features/chords.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,8 @@
class ChordsFeature : public FeatureMethod
{
public:
ChordsFeature();

// Trivial
void calculate(LR& r);

// Non-trivial
void osized_add_online_pixel (size_t x, size_t y, uint32_t intensity) {}
void osized_calculate (LR& r, ImageLoader& imloader);
void save_value (std::vector<std::vector<double>>& feature_vals);
static void process_1_batch (size_t start, size_t end, std::vector<int>* ptrLabels, std::unordered_map <int, LR>* ptrLabelData);

// Support of "manual" phase 2
static bool required(const FeatureSet& fs)
const constexpr static std::initializer_list<Nyxus::Feature2D> featureset =
{
return fs.anyEnabled({
Nyxus::Feature2D::MAXCHORDS_MAX,
Nyxus::Feature2D::MAXCHORDS_MAX_ANG,
Nyxus::Feature2D::MAXCHORDS_MIN,
Expand All @@ -46,8 +33,26 @@ class ChordsFeature : public FeatureMethod
Nyxus::Feature2D::ALLCHORDS_MEDIAN,
Nyxus::Feature2D::ALLCHORDS_MEAN,
Nyxus::Feature2D::ALLCHORDS_MODE,
Nyxus::Feature2D::ALLCHORDS_STDDEV });
Nyxus::Feature2D::ALLCHORDS_STDDEV
};

ChordsFeature();

// Trivial
void calculate(LR& r);

// Non-trivial
void osized_add_online_pixel (size_t x, size_t y, uint32_t intensity) {}
void osized_calculate (LR& r, ImageLoader& imloader);
void save_value (std::vector<std::vector<double>>& feature_vals);
static void process_1_batch (size_t start, size_t end, std::vector<int>* ptrLabels, std::unordered_map <int, LR>* ptrLabelData);

// Support of "manual" phase 2
static bool required(const FeatureSet& fs)
{
return fs.anyEnabled (ChordsFeature::featureset);
}

private:
const int n_angle_segments = 20;
const int n_side_segments = 100;
Expand Down
2 changes: 1 addition & 1 deletion src/nyx/features/circle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ using namespace Nyxus;

EnclosingInscribingCircumscribingCircleFeature::EnclosingInscribingCircumscribingCircleFeature() : FeatureMethod("EnclosingInscribingCircumscribingCircleFeature")
{
provide_features({ Feature2D::DIAMETER_MIN_ENCLOSING_CIRCLE, Feature2D::DIAMETER_INSCRIBING_CIRCLE, Feature2D::DIAMETER_CIRCUMSCRIBING_CIRCLE });
provide_features (EnclosingInscribingCircumscribingCircleFeature::featureset);
add_dependencies({ Feature2D::PERIMETER, Feature2D::CENTROID_X, Feature2D::CENTROID_Y }); // Availability of feature 'PERIMETER' ensures availability of LR::contour
}

Expand Down
7 changes: 7 additions & 0 deletions src/nyx/features/circle.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,13 @@
class EnclosingInscribingCircumscribingCircleFeature: public FeatureMethod
{
public:
const constexpr static std::initializer_list<Nyxus::Feature2D> featureset =
{
Nyxus::Feature2D::DIAMETER_MIN_ENCLOSING_CIRCLE,
Nyxus::Feature2D::DIAMETER_INSCRIBING_CIRCLE,
Nyxus::Feature2D::DIAMETER_CIRCUMSCRIBING_CIRCLE
};

EnclosingInscribingCircumscribingCircleFeature();
void calculate(LR& r);
void osized_add_online_pixel(size_t x, size_t y, uint32_t intensity);
Expand Down
Loading
Loading