日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实践:使用FLANN.LSH进行检索

發布時間:2023/12/31 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实践:使用FLANN.LSH进行检索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.Survey:

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倍)

unsigned int table_number =6;unsigned int key_size =8; //unsigned int key_size =32;//32 is so big a value;在庫的內部沒有排錯語句,很失敗!unsigned int multi_probe_level=2; //Create hash indexflann::LshIndex<flann::ChiSquareDistance<unsigned char> > index (data, flann::LshIndexParams (table_number, key_size,multi_probe_level));index.buildIndex ();FILE* StreamIdx =fopen(kdtree_idx_file_name.c_str(),"wb");//Use the FILE* Type.index.saveIndex(StreamIdx);fclose(StreamIdx);

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进行检索的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。