pic00 tell us the general idea of CBIR, in this post I would like to record how to implement step 1~5 by the codes located at github. There are too many variables need to pass in to this example, so I prefer to save those variables in json file--setting.json.
Step 1 ~ 4
cv::Mat cbir_bovw:: read_img(const std::string &name, bool to_gray) const { if(to_gray){ return cv::imread(name, cv::IMREAD_GRAYSCALE); }else{ return cv::imread(name); } } void cbir_bovw:: add_data() { using namespace ocv; //use kaze as feature detector and descriptor cv::Ptr<cv::KAZE> detector = cv::KAZE::create(); cv::Ptr<cv::KAZE> descriptor = detector; cbir::f2d_detector f2d(detector, descriptor); //read the folder path from setting.json auto const folder = std::string(setting_["img_folder"].GetString()); //iterate through the image inside the folder, //extract features and keypoints for(auto const &name : file::get_directory_files(folder)){ auto const img = read_img(folder + "/" + name); if(!img.empty()){ //find the keypoints and features by detector //and descriptor auto const result = f2d.get_descriptor(img); //first is keypoints, second is features fi_.add_features(name, result.first, result.second); }else{ throw std::runtime_error("image is empty"); } } }
In this example, I prefer to store the features, keypoints and other info into the hdf5 format, because these data could be very big, the ram of pc may not able to read them all at once.
Step 5 : Build code book
After I save the features and keypoints into the hdf5, it is time to build the code book. What is code book?In this case, it is just a bunch of features cluster by clustering algorithm. I pick kmeans for this task, because it is fast, robust and support by armadillo and opencv.
After I generate the code book, I try to view what are those codes of the code book represent, although visualize the code book is not necessary, but it could be helpful for debug. Following(pic01, pic02, pic03) are part of the visualization results of code book.
void cbir_bovw::build_code_book(size_t code_size) { ocv::cbir::code_book_builder<feature_type> cb(fi_, setting_["features_ratio"].GetDouble(), cv_type_map<feature_type>::type); cb.create_code_book(arma::uword(code_size), arma::uword(15), true); cb.get_code_book().save(setting_["code_book"].GetString() + std::string("_") + std::to_string(code_size), arma::arma_ascii); }
After I generate the code book, I try to view what are those codes of the code book represent, although visualize the code book is not necessary, but it could be helpful for debug. Following(pic01, pic02, pic03) are part of the visualization results of code book.
pic01 |
pic02 |
pic03 |
The codes of this post are located at github.
No comments:
Post a Comment