220 lines
7.8 KiB
C++
220 lines
7.8 KiB
C++
// Copyright (C) 2011 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#ifndef DLIB_SETUP_HAShED_FEATURES_Hh_
|
|
#define DLIB_SETUP_HAShED_FEATURES_Hh_
|
|
|
|
#include "setup_hashed_features_abstract.h"
|
|
#include "scan_image_pyramid.h"
|
|
#include "scan_image_boxes.h"
|
|
#include "../lsh.h"
|
|
#include "../statistics.h"
|
|
#include "../image_keypoint.h"
|
|
#include "../geometry.h"
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
class image_hash_construction_failure : public error
|
|
{
|
|
public:
|
|
image_hash_construction_failure(
|
|
const std::string& a
|
|
): error(a) {}
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename image_scanner
|
|
>
|
|
void use_uniform_feature_weights (
|
|
image_scanner& scanner
|
|
)
|
|
{
|
|
typename image_scanner::feature_extractor_type fe;
|
|
fe.copy_configuration(scanner.get_feature_extractor());
|
|
fe.use_uniform_feature_weights();
|
|
scanner.copy_configuration(fe);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename image_scanner
|
|
>
|
|
void use_relative_feature_weights (
|
|
image_scanner& scanner
|
|
)
|
|
{
|
|
typename image_scanner::feature_extractor_type fe;
|
|
fe.copy_configuration(scanner.get_feature_extractor());
|
|
fe.use_relative_feature_weights();
|
|
scanner.copy_configuration(fe);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
// stuff for scan_image_pyramid
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename image_array,
|
|
typename pyramid,
|
|
typename feature_extractor,
|
|
template <typename fe, typename hash> class feature_image
|
|
>
|
|
void setup_hashed_features (
|
|
scan_image_pyramid<pyramid, feature_image<feature_extractor, projection_hash> >& scanner,
|
|
const image_array& images,
|
|
const feature_extractor& fe,
|
|
int bits,
|
|
unsigned long num_samples = 200000
|
|
)
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_ASSERT(0 < bits && bits <= 32 &&
|
|
num_samples > 1 &&
|
|
images.size() > 0,
|
|
"\t void setup_hashed_features()"
|
|
<< "\n\t Invalid inputs were given to this function. "
|
|
<< "\n\t bits: " << bits
|
|
<< "\n\t num_samples: " << num_samples
|
|
<< "\n\t images.size(): " << images.size()
|
|
);
|
|
|
|
pyramid pyr;
|
|
|
|
const random_subset_selector<typename feature_extractor::descriptor_type>& samps =
|
|
randomly_sample_image_features(images, pyr, fe, num_samples);
|
|
|
|
if (samps.size() <= 1)
|
|
throw dlib::image_hash_construction_failure("Images too small, not able to gather enough samples to make hash");
|
|
|
|
projection_hash phash = create_random_projection_hash(samps, bits);
|
|
|
|
feature_image<feature_extractor, projection_hash> hfe;
|
|
hfe.copy_configuration(scanner.get_feature_extractor());
|
|
hfe.set_hash(phash);
|
|
hfe.copy_configuration(fe);
|
|
scanner.copy_configuration(hfe);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename image_array,
|
|
typename pyramid,
|
|
typename feature_extractor,
|
|
template <typename fe, typename hash> class feature_image
|
|
>
|
|
void setup_hashed_features (
|
|
scan_image_pyramid<pyramid, feature_image<feature_extractor, projection_hash> >& scanner,
|
|
const image_array& images,
|
|
int bits,
|
|
unsigned long num_samples = 200000
|
|
)
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_ASSERT(0 < bits && bits <= 32 &&
|
|
num_samples > 1 &&
|
|
images.size() > 0,
|
|
"\t void setup_hashed_features()"
|
|
<< "\n\t Invalid inputs were given to this function. "
|
|
<< "\n\t bits: " << bits
|
|
<< "\n\t num_samples: " << num_samples
|
|
<< "\n\t images.size(): " << images.size()
|
|
);
|
|
|
|
feature_extractor fe;
|
|
setup_hashed_features(scanner, images, fe, bits, num_samples);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
// stuff for scan_image_boxes
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename image_array,
|
|
typename feature_extractor,
|
|
template <typename fe, typename hash> class feature_image,
|
|
typename box_generator
|
|
>
|
|
void setup_hashed_features (
|
|
scan_image_boxes<feature_image<feature_extractor, projection_hash>,box_generator >& scanner,
|
|
const image_array& images,
|
|
const feature_extractor& fe,
|
|
int bits,
|
|
unsigned long num_samples = 200000
|
|
)
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_ASSERT(0 < bits && bits <= 32 &&
|
|
num_samples > 1 &&
|
|
images.size() > 0,
|
|
"\t void setup_hashed_features()"
|
|
<< "\n\t Invalid inputs were given to this function. "
|
|
<< "\n\t bits: " << bits
|
|
<< "\n\t num_samples: " << num_samples
|
|
<< "\n\t images.size(): " << images.size()
|
|
);
|
|
|
|
pyramid_disable pyr;
|
|
|
|
const random_subset_selector<typename feature_extractor::descriptor_type>& samps =
|
|
randomly_sample_image_features(images, pyr, fe, num_samples);
|
|
|
|
if (samps.size() <= 1)
|
|
throw dlib::image_hash_construction_failure("Images too small, not able to gather enough samples to make hash");
|
|
|
|
projection_hash phash = create_random_projection_hash(samps, bits);
|
|
|
|
feature_image<feature_extractor, projection_hash> hfe;
|
|
hfe.copy_configuration(scanner.get_feature_extractor());
|
|
hfe.set_hash(phash);
|
|
hfe.copy_configuration(fe);
|
|
scanner.copy_configuration(hfe);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename image_array,
|
|
typename feature_extractor,
|
|
template <typename fe, typename hash> class feature_image,
|
|
typename box_generator
|
|
>
|
|
void setup_hashed_features (
|
|
scan_image_boxes<feature_image<feature_extractor, projection_hash>,box_generator>& scanner,
|
|
const image_array& images,
|
|
int bits,
|
|
unsigned long num_samples = 200000
|
|
)
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_ASSERT(0 < bits && bits <= 32 &&
|
|
num_samples > 1 &&
|
|
images.size() > 0,
|
|
"\t void setup_hashed_features()"
|
|
<< "\n\t Invalid inputs were given to this function. "
|
|
<< "\n\t bits: " << bits
|
|
<< "\n\t num_samples: " << num_samples
|
|
<< "\n\t images.size(): " << images.size()
|
|
);
|
|
|
|
feature_extractor fe;
|
|
setup_hashed_features(scanner, images, fe, bits, num_samples);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
#endif // DLIB_SETUP_HAShED_FEATURES_Hh_
|
|
|
|
|