实践:使用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 format
flann::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 index
flann::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进行检索的更多相关文章
- 图像检索(6):局部敏感哈希索引(LSH)
图像检索中,对一幅图像编码后的向量的维度是很高.以VLAD为例,基于SIFT特征点,设视觉词汇表的大小为256,那么一幅图像编码后的VLAD向量的长度为$128 \times 256 = 32768 ...
- 用Elasticsearch做大规模数据的多字段、多类型索引检索
本文同时发布在我的个人博客 之前尝试了用mysql做大规模数据的检索优化,可以看到单字段检索的情况下,是可以通过各种手段做到各种类型索引快速检索的,那是一种相对简单的场景. 但是实际应用往往会复杂一些 ...
- paloalto防火墙安装内容和软件更新
1.为了确保您始终不会受到最新威胁(包括尚未发现的威胁)的攻击,您必须确保防火墙始终具有 Palo Alto Networks 发布的最新更新内容及软件. • Antivirus(防病毒)— 包括新的 ...
- BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览
一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...
- RxJS中高阶操作符的全面讲解:switchMap,mergeMap,concatMap,exhaustMap
RxJS中高阶映射操作符的全面讲解:switchMap, mergeMap, concatMap (and exhaustMap) 原文链接:https://blog.angular-universi ...
- 位姿检索PoseRecognition:LSH算法.p稳定哈希
位姿检索使用了LSH方法,而不使用PNP方法,是有一定的来由的.主要的工作会转移到特征提取和检索的算法上面来,有得必有失.因此,放弃了解析的方法之后,又放弃了优化的方法,最后陷入了检索的汪洋大海. 0 ...
- TKE用户故事 | 作业帮检索服务基于Fluid的计算存储分离实践
作者 吕亚霖,2019年加入作业帮,作业帮基础架构-架构研发团队负责人,在作业帮期间主导了云原生架构演进.推动实施容器化改造.服务治理.GO微服务框架.DevOps的落地实践. 张浩然,2019年加入 ...
- zz阿里妈妈深度树检索技术(TDM)及应用框架的探索实践
分享嘉宾:何杰 阿里妈妈 高级算法专家 编辑整理:孙锴 内容来源:DataFun AI Talk 出品社区:DataFun 注:欢迎转载,转载请注明出处 导读:阿里妈妈是阿里巴巴集团旗下数字营销的大中 ...
- 彻底弄懂LSH之simHash算法
马克·吐温曾经说过,所谓经典小说,就是指很多人希望读过,但很少人真正花时间去读的小说.这种说法同样适用于“经典”的计算机书籍. 最近一直在看LSH,不过由于matlab基础比较差,一直没搞懂.最近看的 ...
随机推荐
- 【剑指Offer】47、求1+2+3+4+···+n
题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 解题思路: 本题本身没有太多 ...
- PY简易爬虫
然而,实用性很差,仅仅是能用而已. 已知bug: 由于土啬的问题,经常会炸掉.网络不稳定导致各种Connection Aborted/SSLError: EOF occurred in violati ...
- ScrollReveal-元素随页面滚动产生动画的js插件
简介 和 WOW.js 一样,scrollReveal.js 也是一款页面滚动显示动画的 JavaScript,能让页面更加有趣,更吸引用户眼球.不同的是 WOW.js 的动画只播放一次,而 scro ...
- MYSQL(一) 简单语法
MYSQL(一) 简单语法 1.默认约束:mysql里面DEFAULT关键字后面是不用加括号的 --1.1 创建数据库 mysql> create database holly; Query O ...
- 彻底禁用chrome请停用以开发者模式运行的扩展程序弹框
首先上图 怎么解决呢? 进入安装目录-->下图目录(一串数字的目录) 2. 找到chrome.dll 3.下载patch.exe 下载网址 https://itdocs.pipipan.co ...
- lunix下的redis数据库操作——zset有序集合
创建:(有序集合存在一个权重的概念) zadd zset 1 a 2 b 3 c 4 d 5 e 6 f 7 g # 输出: # 1) "a" # 2) "b" ...
- [bzoj4864][BeiJing2017Wc]神秘物质_非旋转Treap
神秘物质 bzoj-4864 BeiJing-2017-Wc 题目大意:给定一个长度为n的序列,支持插入,将相邻两个元素合并并在该位置生成一个指定权值的元素:查询:区间内的任意一段子区间的最大值减最小 ...
- innodb_max_purge_lag
mysql 现象: 线上数据库每个表分配一个ibdata,但是总的ibdata文件很大,超过10G,用相关工具查看,大部分空间都是undo_log 分析了db33的ibdata1的记过 Total ...
- Android Internet - WebView 的使用
WebView是Android 提供的操作网页的一个组件. 用于浏览网页及其它Internet资源. 这里总结了一些WebView 的经常使用接口.和2个小演示样例程序用于自己开发时直接使用.就不用再 ...
- 数学之路-python计算实战(4)-Lempel-Ziv压缩(2)
Format characters have the following meaning; the conversion between C and Python values should be o ...