image-recognition/src/Searcher.py

75 lines
2.3 KiB
Python

import cv2
import numpy as np
import pickle as pickle
import LFUtilities
import ImageRecognitionSettings as settings
#from BEBLIDRescorerDB import BEBLIDRescorerDB
from BEBLIDRescorer import BEBLIDRescorer
import SearcherParameters
from FAISSSearchEngine import FAISSSearchEngine
import FeatureExtractor as fe
import BEBLIDExtractorQ as lf
from line_profiler_pycharm import profile
class Searcher:
def __init__(self):
# self.dataset = h5py.File(settings.dataset_file, 'r')['rmac'][...]
# np.save('/media/Data/data/beni_culturali/deploy/dataset', self.dataset)
self.search_engine = FAISSSearchEngine()
self.rescorer = BEBLIDRescorer()
def get_id(self, idx):
return self.search_engine.get_id(idx)
def add(self, img_file, id):
self.save(True)
desc = fe.extract(img_file)
#orb = lf.extract(img_file)
self.search_engine.add(desc, id)
#self.rescorer.add(orb)
self.save()
print('added ' + id)
def remove(self, id):
self.save(True)
self.search_engine.remove(id)
#self.rescorer.remove(idx)
self.save()
print('removed ' + id)
def search_by_id(self, query_id, k=10, search_deep_level=1):
kq = k
if search_deep_level > 0:
kq = SearcherParameters.SEARCH_DEEP_K[search_deep_level]
res = self.search_engine.search_by_id(query_id, kq)
if search_deep_level > 0:
res_lf = self.rescorer.rescore_by_id(query_id, res)
res = res_lf if res_lf else res[:k]
return res
@profile
def search_by_img(self, query_img, k=10, search_deep_level=1):
kq = k
if search_deep_level:
kq = SearcherParameters.SEARCH_DEEP_K[search_deep_level]
query_desc = fe.extract(query_img)
res = self.search_engine.search_by_img(query_desc, kq)
if search_deep_level > 0:
query_lf = lf.extract(query_img)
res_lf = self.rescorer.rescore_by_img(query_lf, res)
#res = res_lf if res_lf else res[:k]
res = res_lf if res_lf else res[:k]
res = [result for result in res if result[1] >= SearcherParameters.GEM_THRESHOLD]
return res
def save(self, is_backup=False):
self.search_engine.save(is_backup)
#self.rescorer.save(is_backup)