Reduce memory usage of features

This commit is contained in:
Simon Giraudot 2017-03-17 12:54:14 +01:00
parent 77a590d338
commit acb17da8c8
5 changed files with 46 additions and 18 deletions

View File

@ -77,14 +77,11 @@ public:
#endif #endif
{ {
this->set_name ("distance_to_plane"); this->set_name ("distance_to_plane");
#ifdef CGAL_CLASSIFICATION_PRECOMPUTE_FEATURES
#ifndef CGAL_CLASSIFICATION_PRECOMPUTE_FEATURES
std::vector<double> distance_to_plane_feature;
#endif
for(std::size_t i = 0; i < input.size(); i++) for(std::size_t i = 0; i < input.size(); i++)
distance_to_plane_feature.push_back distance_to_plane_feature.push_back
(CGAL::sqrt (CGAL::squared_distance (get(point_map, *(input.begin()+i)), eigen.plane(i)))); (CGAL::sqrt (CGAL::squared_distance (get(point_map, *(input.begin()+i)), eigen.plane(i))));
#endif
} }
/// \cond SKIP_IN_MANUAL /// \cond SKIP_IN_MANUAL

View File

@ -53,15 +53,19 @@ public:
{ {
} }
#ifdef CGAL_CLASSIFICATION_PRECOMPUTE_FEATURES
virtual void init (const PointRange& input, const Local_eigen_analysis& eigen) virtual void init (const PointRange& input, const Local_eigen_analysis& eigen)
{ {
#ifndef CGAL_CLASSIFICATION_PRECOMPUTE_FEATURES
std::vector<double> attrib;
#endif
attrib.reserve (input.size()); attrib.reserve (input.size());
for (std::size_t i = 0; i < input.size(); ++ i) for (std::size_t i = 0; i < input.size(); ++ i)
attrib.push_back (get_value (eigen, i)); attrib.push_back (get_value (eigen, i));
} }
#else
virtual void init (const PointRange&, const Local_eigen_analysis&)
{
}
#endif
virtual double get_value (const Local_eigen_analysis& eigen, std::size_t i) = 0; virtual double get_value (const Local_eigen_analysis& eigen, std::size_t i) = 0;
virtual double value (std::size_t pt_index) virtual double value (std::size_t pt_index)

View File

@ -103,14 +103,14 @@ public:
: input(input), color_map(color_map), m_channel(channel), m_mean(mean), m_sd(sd) : input(input), color_map(color_map), m_channel(channel), m_mean(mean), m_sd(sd)
#endif #endif
{ {
#ifndef CGAL_CLASSIFICATION_PRECOMPUTE_FEATURES
std::vector<double> color_feature; #ifdef CGAL_CLASSIFICATION_PRECOMPUTE_FEATURES
#endif
for(std::size_t i = 0; i < input.size();i++) for(std::size_t i = 0; i < input.size();i++)
{ {
HSV_Color c = Classification::rgb_to_hsv (get(color_map, *(input.begin()+i))); HSV_Color c = Classification::rgb_to_hsv (get(color_map, *(input.begin()+i)));
color_feature.push_back (std::exp (-(c[channel] - mean) * (c[channel] - mean) / (2. * sd * sd))); color_feature.push_back (std::exp (-(c[channel] - mean) * (c[channel] - mean) / (2. * sd * sd)));
} }
#endif
std::ostringstream oss; std::ostringstream oss;
if (channel == 0) oss << "hue"; if (channel == 0) oss << "hue";

View File

@ -55,7 +55,11 @@ class Verticality : public Feature_base
typedef Classification::Local_eigen_analysis<Geom_traits, PointRange, typedef Classification::Local_eigen_analysis<Geom_traits, PointRange,
PointMap, DiagonalizeTraits> Local_eigen_analysis; PointMap, DiagonalizeTraits> Local_eigen_analysis;
const typename Geom_traits::Vector_3 vertical;
std::vector<double> verticality_feature; std::vector<double> verticality_feature;
#ifndef CGAL_CLASSIFICATION_PRECOMPUTE_FEATURES
const Local_eigen_analysis& eigen;
#endif
public: public:
/*! /*!
@ -64,11 +68,12 @@ public:
\param input input range. \param input input range.
\param eigen class with precomputed eigenvectors and eigenvalues. \param eigen class with precomputed eigenvectors and eigenvalues.
*/ */
#ifdef CGAL_CLASSIFICATION_PRECOMPUTE_FEATURES
Verticality (const PointRange& input, Verticality (const PointRange& input,
const Local_eigen_analysis& eigen) const Local_eigen_analysis& eigen)
: vertical (0., 0., 1.)
{ {
this->set_name ("verticality"); this->set_name ("verticality");
typename Geom_traits::Vector_3 vertical (0., 0., 1.);
for (std::size_t i = 0; i < input.size(); i++) for (std::size_t i = 0; i < input.size(); i++)
{ {
@ -76,8 +81,15 @@ public:
normal = normal / CGAL::sqrt (normal * normal); normal = normal / CGAL::sqrt (normal * normal);
verticality_feature.push_back (1. - CGAL::abs(normal * vertical)); verticality_feature.push_back (1. - CGAL::abs(normal * vertical));
} }
} }
#else
Verticality (const PointRange&,
const Local_eigen_analysis& eigen)
: vertical (0., 0., 1.), eigen (eigen)
{
this->set_name ("verticality");
}
#endif
/*! /*!
\brief Constructs the feature using provided normals of points. \brief Constructs the feature using provided normals of points.
@ -91,10 +103,9 @@ public:
template <typename VectorMap> template <typename VectorMap>
Verticality (const PointRange& input, Verticality (const PointRange& input,
VectorMap normal_map) VectorMap normal_map)
: vertical (0., 0., 1.)
{ {
this->set_name ("verticality"); this->set_name ("verticality");
typename Geom_traits::Vector_3 vertical (0., 0., 1.);
for (std::size_t i = 0; i < input.size(); i++) for (std::size_t i = 0; i < input.size(); i++)
{ {
typename Geom_traits::Vector_3 normal = get(normal_map, *(input.begin()+i)); typename Geom_traits::Vector_3 normal = get(normal_map, *(input.begin()+i));
@ -107,7 +118,16 @@ public:
/// \cond SKIP_IN_MANUAL /// \cond SKIP_IN_MANUAL
virtual double value (std::size_t pt_index) virtual double value (std::size_t pt_index)
{ {
return verticality_feature[pt_index]; #ifndef CGAL_CLASSIFICATION_PRECOMPUTE_FEATURES
if (verticality_feature.empty())
{
typename Geom_traits::Vector_3 normal = eigen.normal_vector(pt_index);
normal = normal / CGAL::sqrt (normal * normal);
return (1. - CGAL::abs(normal * vertical));
}
else
#endif
return verticality_feature[pt_index];
} }
/// \endcond /// \endcond
}; };

View File

@ -119,8 +119,10 @@ private:
std::vector<double> m_sum_eigenvalues; std::vector<double> m_sum_eigenvalues;
std::vector<Point> m_centroids; std::vector<Point> m_centroids;
std::vector<Vector> m_smallest_eigenvectors; std::vector<Vector> m_smallest_eigenvectors;
#ifdef CGAL_CLASSIFICATION_EIGEN_FULL_STORAGE
std::vector<Vector> m_middle_eigenvectors; std::vector<Vector> m_middle_eigenvectors;
std::vector<Vector> m_largest_eigenvectors; std::vector<Vector> m_largest_eigenvectors;
#endif
double m_mean_range; double m_mean_range;
@ -159,8 +161,10 @@ public:
m_sum_eigenvalues.resize (input.size()); m_sum_eigenvalues.resize (input.size());
m_centroids.resize (input.size()); m_centroids.resize (input.size());
m_smallest_eigenvectors.resize (input.size()); m_smallest_eigenvectors.resize (input.size());
#ifdef CGAL_CLASSIFICATION_EIGEN_FULL_STORAGE
m_middle_eigenvectors.resize (input.size()); m_middle_eigenvectors.resize (input.size());
m_largest_eigenvectors.resize (input.size()); m_largest_eigenvectors.resize (input.size());
#endif
m_mean_range = 0.; m_mean_range = 0.;
@ -229,8 +233,10 @@ private:
m_eigenvalues[index] = v; m_eigenvalues[index] = v;
m_centroids[index] = query; m_centroids[index] = query;
m_smallest_eigenvectors[index] = Vector (0., 0., 1.); m_smallest_eigenvectors[index] = Vector (0., 0., 1.);
#ifdef CGAL_CLASSIFICATION_EIGEN_FULL_STORAGE
m_middle_eigenvectors[index] = Vector (0., 1., 0.); m_middle_eigenvectors[index] = Vector (0., 1., 0.);
m_largest_eigenvectors[index] = Vector (1., 0., 0.); m_largest_eigenvectors[index] = Vector (1., 0., 0.);
#endif
return; return;
} }
@ -266,9 +272,10 @@ private:
m_sum_eigenvalues[index] = sum; m_sum_eigenvalues[index] = sum;
m_eigenvalues[index] = evalues; m_eigenvalues[index] = evalues;
m_smallest_eigenvectors[index] = Vector (evectors[0], evectors[1], evectors[2]); m_smallest_eigenvectors[index] = Vector (evectors[0], evectors[1], evectors[2]);
#ifdef CGAL_CLASSIFICATION_EIGEN_FULL_STORAGE
m_middle_eigenvectors[index] = Vector (evectors[3], evectors[4], evectors[5]); m_middle_eigenvectors[index] = Vector (evectors[3], evectors[4], evectors[5]);
m_largest_eigenvectors[index] = Vector (evectors[6], evectors[7], evectors[8]); m_largest_eigenvectors[index] = Vector (evectors[6], evectors[7], evectors[8]);
#endif
} }
}; };