9 #include <utils/logger.hpp>
15 #if ENABLE_MULTITHREADING && ENABLE_OPENMP
18 #if ENABLE_MULTITHREADING && ENABLE_MPI
21 _INITIALIZE_EASYLOGGINGPP
23 int main(
int argc,
char *argv[]) {
24 #if ENABLE_MULTITHREADING && ENABLE_MPI
25 MPI::Init(argc, argv);
26 int rank = MPI::COMM_WORLD.Get_rank();
30 LINFO << simple_dataset;
34 std::shared_ptr<BagOfWords::TrainParams> train_params = std::make_shared<BagOfWords::TrainParams>();
35 const std::vector< std::shared_ptr<const Image> > &all_images = simple_dataset.random_images(128);
36 bow.
train(simple_dataset, train_params, all_images);
38 #if ENABLE_MULTITHREADING && ENABLE_MPI
42 std::stringstream vocab_output_file;
43 vocab_output_file << simple_dataset.location() <<
"/vocabulary/" << train_params->numClusters <<
".vocab";
44 bow.
save(vocab_output_file.str());
46 #if ENABLE_MULTITHREADING && ENABLE_OPENMP
47 uint32_t num_threads = omp_get_max_threads();
48 std::vector< cv::Ptr<cv::DescriptorMatcher> > matchers;
49 for(uint32_t i=0; i<num_threads; i++) {
52 #pragma omp parallel for schedule(dynamic)
57 for (int64_t i = 0; i < (int64_t)all_images.size(); i++) {
59 #if ENABLE_MULTITHREADING && ENABLE_OPENMP
60 const cv::Ptr<cv::DescriptorMatcher> &matcher = matchers[omp_get_thread_num()];
62 const std::string &sift_descriptor_location = simple_dataset.location(all_images[i]->feature_path(
"descriptors"));
63 const std::string &bow_descriptor_location = simple_dataset.location(all_images[i]->feature_path(
"bow_descriptors"));
65 cv::Mat descriptors, bow_descriptors, descriptorsf;
68 descriptors.convertTo(descriptorsf, CV_32FC1);
72 const std::vector< std::pair<uint32_t, float> > &bow_descriptors_sparse =
numerics::sparsify(bow_descriptors);
75 LINFO <<
"Wrote " << bow_descriptor_location;
77 #if ENABLE_MULTITHREADING && ENABLE_MPI