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进行检索相关推荐

  1. 算法工程 # 深度学习算法落地最后一公里:工业界中的大规模向量检索

    前言:现代深度学习实践中很多场景其实都是对输入数据进行处理.嵌入,最终获得一个 embedding,然后对 embedding 进行相似度检索,而工业界中的被检索数据往往是海量的,因此深度学习模型落地 ...

  2. 【推搜】embedding评估 | faiss的top-k向量检索

    note 在双塔模型召回中,正样本即用户点击过的物品,负样本:全体物品中负采样(简单做法).被排序淘汰的物品(物品). faiss库使用三部曲:构建向量库:构建index,并将向量添加到index中: ...

  3. 构建聊天机器人:检索、seq2seq、RL、SeqGAN

    本文将简要介绍聊天机器人的四种构建方法:检索.seq2seq.Reinforcement Learning.seqGAN. 聊天机器人的现状 检索 seq2seq RL 为什么要用强化学习 强化学习的 ...

  4. 从二值检索到层次竞买图——让搜索广告关键词召回焕然新生

    丨目录: · 背景 · 广告改写的历史与新目标 · 从两阶段到一段式:二值海选 · 从一段式到联合召回:层次竞买图 · 关键词召回的业务思考 本文主要分享过去一年我们在搜索广告召回的传统领域--关键词 ...

  5. AI快车道PaddleNLP系列直播课6|语义检索系统快速搭建落地

    目录 1 搜索核心技术发展 1.1 基于字面匹配的检索流程 传统基于字面匹配的检索的痛点: 2 PaddleNLP语义检索系统 2.1 语义检索系统架构:recall+ranking 2.2 Padd ...

  6. 向量数据库入坑:传统文本检索方式的降维打击,使用 Faiss 实现向量语义检索

    在上一篇文章<聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss>中,我们有聊到如何快速入门向量检索技术,借助 Meta AI(Facebook Research)出品的 fais ...

  7. 面向大规模图像检索的层次语义索引

    Hierarchical Semantic Indexing for Large Scale Image Retrieval 目录 摘要 1 介绍 Introduction 2 相关工作 Relate ...

  8. BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览

    一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...

  9. 基于GaussDB(DWS)的全文检索特性,了解一下?

    摘要:全文检索是在互联网场景下应用非常广泛的特性,搜索引擎.站内搜索.电商搜索等场景下都会使用到,GaussDB(DWS)同样也支持全文检索功能,是基于GIN索引实现的,下面给大家详细介绍一下Gaus ...

最新文章

  1. 用于精确导航和场景重建的 3D 配准方法(ICRA 2021)
  2. kafka中生产者是如何把消息投递到哪个分区的?消费者又是怎么选择分区的?...
  3. vMotion svMotion HA FT概念区别
  4. 计算机二级C语言操作题评分标准,计算机二级C语言题型和评分标准
  5. 关于进程与线程,史上最浅显易懂的一个简单解释!
  6. 接口隔离原则_设计模式的三大分类及六大原则
  7. 链表每k个反转 java_K 个一组翻转链表
  8. 集成电路pad指的是什么_芯片、半导体、集成电路,你分清楚了吗?
  9. Python Selenium Webdriver常用方法总结
  10. python操作adb详解_Python之使用adb shell命令启动应用的方法详解
  11. InfoPath2003 教程
  12. 使用arcface+CrossEntropyLoss处理普通分类
  13. 制作字幕.html教程,手机拍的视频如何加字幕 字幕制作软件使用教程
  14. 微信运动怎么打开?如何查看微信运动步数?原来是这样做的…
  15. fastjson 是反射吗_6种超声检测灵敏度,你都知道吗?
  16. 《Python Excel 教程》
  17. 中国版的Google被阉割掉多少?
  18. 运维老师傅:问题排查经验总结
  19. 鼠标上下滑轮时,来回乱跑的骚操作
  20. FBI也需要云计算吗?

热门文章

  1. DataBinding基础使用二
  2. css实现元素水平垂直居中
  3. Google play billing(Google play 内支付)
  4. 在jQuery和JavaScript中,实现转跳
  5. SVN 集中式版本管理工具
  6. ubuntu 如何在任意终端不填加./就可以执行文件类似ls cd cp
  7. 一般处理程序读写session
  8. 我是如何超越PPG的(摘自:IT经理世界;作者:李黎)
  9. NumPy - np.random.multivariate_normal()
  10. 测序发展史:150年的风雨历程