实践:使用FLANN.LSH进行检索
FLANN 庫詳情見:http://en.wikipedia.org/wiki/Flann
http://medievalscotland.org/kmo/AnnalsIndex/Feminine/Flann.shtml
FLANN主頁:http://www.cs.ubc.ca/research/flann/:FLANN is written in C++ and contains bindings for the following languages: C, MATLAB and Python.
OpenCV的FLANN庫相對于原始FLANN庫功能較少;比如不能直接使用flann::Matrix<unsigned char>?? data ();
OpenCV和PCL都使用了FLANN 庫,自從用Python實現CP之后,發現重寫LSH的工作量還是相當大,于是使用PCL的FLANN庫,省去轉化的麻煩。
使用CP的檢索方式,看來只能用matlab實現了,因為沒有辦法實現128位的hash表。
2.使用過程中遇到的麻煩(Vs.KD-Tree):
VS2010不能完全支持CX0標準,不支持vector的下標越界檢驗,很受傷.....
2.1.使用函數載入特征數據集,存入vector:
//Load the data source
loadVotexFModels(pathName, extension, models);
原始特征數據可以直接存入矩陣,貌似只能使用UChar型:
// Convert data into FLANN formatflann::Matrix<unsigned char> data (new unsigned char[models.size () * models[0].second.size ()],models.size (),models[0].second.size ());for (size_t i = 0; i < data.rows; ++i)for (size_t j = 0; j < data.cols; ++j)data[i][j] = models[i].second[j];flann::save_to_file (data, training_data_h5_file_name, "training_data");// Save data to disk (list of models)delete[] data.ptr ();2.1.使用存儲時,使用了C語言的類型FILE* (據說比使用C++的stream快256倍)
2.3 修改文件:
.flann/util/result_set.h?? line263:
size_t j ==0 時,會造成 --j 成為一個很大的數,造成下表越界,故添加語句:if (j>=dist_index_.size()) break; //wishchin 跳出循環。
2.4.對位操作符的修改:
使用unsigned int key_size???? =32;時
向右以為size_t(1)<<? key_size , 產生的值為1造成向量下標超出;或許可以改成power()函數....
long long(1)<<? key_size ;約為4GBits.
|= 或等于的使用,把函數符號拆開 x = x| y;
3.使用LSH檢索特征:
FILE* StreamIdx =fopen(kdtree_idx_file_name.c_str(),"rb");
index.loadIndex(StreamIdx);//唯一調用函數...
測試函數:
testCreateLshindex(argc,argv);void testCreateLshindex(int argc, _TCHAR* argv[]) {CLSH FeatureIndex;std::string pathName(argv[2]);std::string H5_file_Name(argv[3]);std::string idx_file_Name(argv[4]);std::string data_list_file_name(argv[5]);FeatureIndex.genLshVotexFFromFile(pathName,H5_file_Name,idx_file_Name,data_list_file_name);return; }testLshSearch(argc,argv);// 測試檢索結果!準確率挺高的...void testLshSearch(int argc, _TCHAR* argv[]) {CLSH FeatureIndex;std::string pathName(argv[2]);std::string H5_file_Name(argv[3]);std::string idx_file_Name(argv[4]);const std::string data_list_file_name(argv[5]);std::string test_file_name(argv[1]);Votex_model Feature;FeatureIndex.loadVotexFHist(test_file_name,Feature);unsigned int table_number =6;unsigned int key_size =8;unsigned int multi_probe_level=2;int k =6;flann::Matrix<unsigned char> data;std::vector<std::string> Filelist;FeatureIndex.loadLshSQL(H5_file_Name,idx_file_Name,data_list_file_name,data,Filelist);flann::LshIndex<flann::ChiSquareDistance<unsigned char> > index(data, flann::LshIndexParams (table_number, key_size,multi_probe_level));FeatureIndex.loadLshIndex(idx_file_Name,data,index,table_number ,key_size ,multi_probe_level);flann::Matrix<int> k_indices;flann::Matrix<float> k_distances;k_indices = flann::Matrix<int>(new int[k], 1, k);k_distances = flann::Matrix<float>(new float[k], 1, k);FeatureIndex.searchLshSQL(Feature,index,k,k_indices,k_distances);for (int idx =0;idx< k;++idx){cout<< Filelist[(k_indices[0][idx])]<<endl;}
?? ?return;
}
總結
以上是生活随笔為你收集整理的实践:使用FLANN.LSH进行检索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信银行如何转人工服务电话(中国中信集团
- 下一篇: 交通银行房贷利率2022,分为以下三种利