vocabtree  0.0.1
compute_bow_simple.cxx File Reference
#include "tests_config.hpp"
#include <config.hpp>
#include <utils/filesystem.hpp>
#include <utils/numerics.hpp>
#include <utils/dataset.hpp>
#include <utils/vision.hpp>
#include <utils/logger.hpp>
#include <search/bag_of_words/bag_of_words.hpp>
#include <iostream>
#include <sstream>
Include dependency graph for compute_bow_simple.cxx:

Go to the source code of this file.

Functions

_INITIALIZE_EASYLOGGINGPP int main (int argc, char *argv[])
 

Function Documentation

_INITIALIZE_EASYLOGGINGPP int main ( int  argc,
char *  argv[] 
)

Definition at line 23 of file compute_bow_simple.cxx.

References vision::compute_bow_feature(), vision::construct_descriptor_matcher(), filesystem::create_file_directory(), filesystem::file_exists(), filesystem::load_cvmat(), s_oxfordmini_data_dir, s_oxfordmini_database_location, BagOfWords::save(), numerics::sparsify(), BagOfWords::train(), BagOfWords::vocabulary(), and filesystem::write_sparse_vector().

23  {
24 #if ENABLE_MULTITHREADING && ENABLE_MPI
25  MPI::Init(argc, argv);
26  int rank = MPI::COMM_WORLD.Get_rank();
27 #endif
28 
30  LINFO << simple_dataset;
31 
32  BagOfWords bow;
33 
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);
37 
38 #if ENABLE_MULTITHREADING && ENABLE_MPI
39  if(rank == 0) {
40 #endif
41 
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());
45 
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++) {
50  matchers.push_back(vision::construct_descriptor_matcher(bow.vocabulary()));
51  }
52 #pragma omp parallel for schedule(dynamic)
53 #else
54  const cv::Ptr<cv::DescriptorMatcher> &matcher = vision::construct_descriptor_matcher(bow.vocabulary());
55 #endif
56 
57  for (int64_t i = 0; i < (int64_t)all_images.size(); i++) {
58 
59 #if ENABLE_MULTITHREADING && ENABLE_OPENMP
60  const cv::Ptr<cv::DescriptorMatcher> &matcher = matchers[omp_get_thread_num()];
61 #endif
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"));
64 
65  cv::Mat descriptors, bow_descriptors, descriptorsf;
66  if (!filesystem::file_exists(sift_descriptor_location)) continue;
67  if (!filesystem::load_cvmat(sift_descriptor_location, descriptors)) continue;
68  descriptors.convertTo(descriptorsf, CV_32FC1);
69  filesystem::create_file_directory(bow_descriptor_location);
70 
71  if (!vision::compute_bow_feature(descriptorsf, matcher, bow_descriptors, nullptr)) continue;
72  const std::vector< std::pair<uint32_t, float> > &bow_descriptors_sparse = numerics::sparsify(bow_descriptors);
73  filesystem::write_sparse_vector(bow_descriptor_location, bow_descriptors_sparse);
74 
75  LINFO << "Wrote " << bow_descriptor_location;
76  }
77 #if ENABLE_MULTITHREADING && ENABLE_MPI
78  }
79  MPI::Finalize();
80 #endif
81  return 0;
82 }