taylorlu / imgFinderServer

image retrieve based on lsh and akaze feature

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

outline

一个精准的图像检索系统, 基于AKAZE featureLSH algorithm.
支持多台机器分布式处理,检索中间结果通过RabbitMQ汇总。

  1. LshTable

failed

  1. LshIndex

failed

  1. architecture

failed

prerequisites

  1. OpenCV3.4.0,修改了lsh处理哈希表的算法,增加了几个Api接口
  2. RabbitMQ,用于分布式通信
  3. Java后台,仅用来操作mysql数据库

compile

./compile.sh 编译c++文件生成imgFinderServer文件。 imgFinderServer有多个执行入口:

  1. ./imgFinderServer --img2hashtable path_of_image BASIC_Hash.dat path_of_tmp id_of_image
    提取某个图片的feature,保存到一个二进制哈希表中,id_of_image是图片的id,和mysql数据库中的对应,BASIC_Hash.dat是一个模板,里面有哈希表个数、哈希值位数、probe次数等meta信息。 执行完之后,会生成2个文件:id_of_image_LSHashTable.dat、id_of_image_LSHashTable.dat,二进制哈希和坐标,放在path_of_tmp文件夹下。
  2. ./imgFinderServer --mergeFromDir path_of_tmp DayLSHashTable.dat DayIndexMap.dat
    将path_of_tmp目录下的所有二进制哈希表合并到一个大的哈希表中,DayLSHashTable.dat和DayIndexMap.dat是合并成的大哈希文件。
  3. ./imgFinderServer --serve retrieve.json
    这是一个服务,后续检索的时候用。

register

配置文件register.json

{"MachineId": "02",
"HashFolder": "/u01/dataset/imgFinderFolder3",
"TmpFolder": "./tmp",`
"TaskUrl": "http://172.18.250.30:9011/arImageHandle"}
  1. MachineId 当前的机器Id,和mysql数据库中的对应
  2. HashFolder 存储的Hash表路径,这个路径下会根据当前时间生成文件夹,每个文件夹下有2个文件:DayLSHashTable.dat和DayIndexMap.dat(二进制哈希和坐标)

├── imgFinderFolder3
│ ├── 20101100121212
│ │ ├── DayLSHashTable.dat
│ │ └── DayIndexMap.dat
│ └── 20101100121256
│ │ ├── DayLSHashTable.dat
│ │ └── DayIndexMap.dat

可能还会有一个reload.dat空文件,用来标识当前注册进程正在merge的目录,检索进程需经常reload最新的哈希表确保数据的完整性。
每次合并生成的`DayLSHashTable.dat`如果>90M(在`reg.py`中配置),会在`HashFolder`下新建一个目录。
  1. TmpFolder 注册过程中暂存的IndexMap和dat和LSHashTable文件,每隔一段时间(reg.py中指定)会自动合并到大文件中
  2. TaskUrl Java服务器接口,将多个Machine处理的图片info信息存储到mysql数据库中

启动: python reg.py register.json

retrieve

配置文件retrieve.json

{"MachineId": "02",
"HashFolder": "/u01/dataset/imgFinderFolder3",
"MQ_IP": "192.168.179.119",
"MQ_Port": 5672,
"MQ_Username": "admin",
"MQ_Password": "test123",
"MQ_Exchange_in": "fanoutExchange",
"MQ_Exchange_out": "callbackExchange"}
  1. MachineId,HashFolder 和注册是对应的。
  2. MQ_* RabbitMQ的配置。
  3. 每一个哈希表启动一个线程,没有用线程池的方式实现。 RabbitMQ获取任务(设置TTL,采用pull的方式)-->LSH检索当前哈希表-->RANSAC过滤-->查询结果JSON提交到RabbitMQ。

启动: ./imgFinderServer --serve retrieve.json

baseline

  1. 配置:Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz, 8 Cores, 32 processors,检索量100,000张图片。
  2. 耗时:每张图在600ms左右。
  3. 准确率:手机扫图的准确率100%。iOS手机扫图Demo
  4. 内存占用:占用10G RAM,平均1万张1G内存。

优点:

  1. 准确率高,不同于Fisher Vector和VLAD等需要使用GMM聚类进行词典生成,直接采用点匹配。可参考FVector
  2. 传输量小,每张图在20kB以下,包含(4B * 5 + 2B * 2) * 800点 = 19.2KB,20B表示每个点的哈希值占用字节数,4B表示每个点的x,y坐标占用字节数,点数不同,数据量不同。

缺点:

  1. 内存量占用太大,因为要多对多匹配,100,000张图片共有将近1亿个特征点。
  2. 检索速度慢,分拆成多台服务器能解决这个问题。

About

image retrieve based on lsh and akaze feature


Languages

Language:C 69.2%Language:C++ 24.2%Language:Python 6.5%Language:Shell 0.2%