Carica file su 'src'
This commit is contained in:
parent
7a465b0406
commit
0491140a94
|
@ -0,0 +1,66 @@
|
|||
import cv2
|
||||
import numpy as np
|
||||
|
||||
import LFUtilities
|
||||
import beniculturaliSettings as settings
|
||||
|
||||
|
||||
class BeniCulturaliRescorer:
|
||||
|
||||
def __init__(self):
|
||||
self.lf = LFUtilities.load(settings.DATASET_LF)
|
||||
self.ids = np.loadtxt(settings.DATASET_IDS_LF, dtype=str).tolist()
|
||||
|
||||
self.orb = cv2.ORB_create()
|
||||
self.bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
|
||||
|
||||
def rescore_by_id(self, query_id, resultset):
|
||||
query_idx = self.ids.index(query_id)
|
||||
return self.rescore_by_img(self.lf[query_idx], resultset)
|
||||
|
||||
def rescore_by_img(self, query, resultset):
|
||||
max_inliers = -1
|
||||
res = []
|
||||
|
||||
for data_id, _ in resultset:
|
||||
data_idx = self.ids.index(data_id)
|
||||
try:
|
||||
data_el = self.lf[data_idx]
|
||||
matches = self.bf.match(query[1], data_el[1])
|
||||
good = [m for m in matches if m.distance <= LFUtilities.THRESHOLD]
|
||||
if len(good) > LFUtilities.MIN_GOOD_MATCHES:
|
||||
src_pts = np.float32([query[0][m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
|
||||
dst_pts = np.float32([data_el[0][m.trainIdx].pt for m in good]).reshape(-1, 1, 2)
|
||||
|
||||
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 1.0)
|
||||
matches_mask = mask.ravel().tolist()
|
||||
# print(len(good))
|
||||
inliers = np.count_nonzero(matches_mask)
|
||||
# print(inliers)
|
||||
if (inliers >= LFUtilities.MIN_INLIERS and inliers > max_inliers):
|
||||
max_inliers = inliers
|
||||
res.append((data_id, inliers))
|
||||
except:
|
||||
print('rescore error evaluating ' + data_id)
|
||||
pass
|
||||
|
||||
if res:
|
||||
res.sort(key=lambda result: result[1], reverse=True)
|
||||
return res
|
||||
|
||||
def add(self, lf):
|
||||
self.lf.append(lf)
|
||||
|
||||
def remove(self, idx):
|
||||
self.descs = np.delete(self.descs, idx, axis=0)
|
||||
|
||||
def save(self, is_backup=False):
|
||||
lf_save_file = settings.DATASET_LF
|
||||
ids_file = settings.DATASET_IDS_LF
|
||||
if lf_save_file != "None":
|
||||
if is_backup:
|
||||
lf_save_file += '.bak'
|
||||
ids_file += '.bak'
|
||||
|
||||
LFUtilities.save(lf_save_file, self.lf)
|
||||
np.savetxt(ids_file, self.ids, fmt='%s')
|
|
@ -0,0 +1,61 @@
|
|||
import h5py
|
||||
import numpy as np
|
||||
import beniculturaliSettings as settings
|
||||
|
||||
|
||||
class BeniCulturaliSearchEngine:
|
||||
|
||||
|
||||
def __init__(self):
|
||||
#self.dataset = h5py.File(settings.dataset_file, 'r')['rmac'][...]
|
||||
|
||||
#np.save('/media/Data/data/beni_culturali/deploy/dataset', self.dataset)
|
||||
self.descs = np.load(settings.DATASET)
|
||||
#self.desc1 = np.load(settings.DATASET1)
|
||||
#self.desc2 = np.load(settings.DATASET2)
|
||||
|
||||
#self.descs = (self.desc1 + self.desc2) / 2
|
||||
#self.descs /= np.linalg.norm(self.descs, axis=1, keepdims=True)
|
||||
self.ids = np.loadtxt(settings.DATASET_IDS, dtype=str).tolist()
|
||||
|
||||
|
||||
def get_id(self, idx):
|
||||
return self.ids[idx]
|
||||
|
||||
|
||||
def add(self, desc, id):
|
||||
self.ids.append(id)
|
||||
self.descs = np.vstack((self.descs, desc))
|
||||
self.save()
|
||||
|
||||
|
||||
def remove(self, id):
|
||||
idx = self.ids.index(id)
|
||||
del self.ids[idx]
|
||||
self.descs = np.delete(self.descs, idx, axis=0)
|
||||
|
||||
|
||||
def search_by_id(self, query_id, k=10):
|
||||
query_idx = self.ids.index(query_id)
|
||||
return self.search_by_img(self.descs[query_idx], k)
|
||||
|
||||
def search_by_img(self, query, k=10):
|
||||
print('----------query features-------')
|
||||
print(query)
|
||||
dot_product = np.dot(self.descs, query)
|
||||
idx = dot_product.argsort()[::-1][:k]
|
||||
res = []
|
||||
for i in idx:
|
||||
res.append((self.ids[i], round(float(dot_product[i]), 3)))
|
||||
return res
|
||||
|
||||
def save(self, is_backup=False):
|
||||
descs_file = settings.DATASET
|
||||
ids_file = settings.DATASET_IDS
|
||||
|
||||
if is_backup:
|
||||
descs_file += '.bak'
|
||||
ids_file += '.bak'
|
||||
|
||||
np.save(descs_file, self.descs)
|
||||
np.savetxt(ids_file, self.ids, fmt='%s')
|
|
@ -0,0 +1,68 @@
|
|||
import cv2
|
||||
import numpy as np
|
||||
import pickle as pickle
|
||||
|
||||
import LFUtilities
|
||||
import beniculturaliSettings as settings
|
||||
from BeniCulturaliRescorer import BeniCulturaliRescorer
|
||||
from BeniCulturaliSearchEngine import BeniCulturaliSearchEngine
|
||||
import FeatureExtractor as fe
|
||||
import ORBExtractor as lf
|
||||
|
||||
|
||||
class BeniCulturaliSearcher:
|
||||
K_REORDERING = 15
|
||||
|
||||
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 = BeniCulturaliSearchEngine()
|
||||
#self.rescorer = BeniCulturaliRescorer()
|
||||
|
||||
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, rescorer=False):
|
||||
kq = k
|
||||
if rescorer:
|
||||
kq = self.K_REORDERING
|
||||
res = self.search_engine.search_by_id(query_id, kq)
|
||||
# if rescorer:
|
||||
# res_lf = self.rescorer.rescore_by_id(query_id, res)
|
||||
# res = res_lf if res_lf else res[:k]
|
||||
return res
|
||||
|
||||
def search_by_img(self, query_img, k=10, rescorer=False):
|
||||
kq = k
|
||||
if rescorer:
|
||||
kq = self.K_REORDERING
|
||||
query_desc = fe.extract(query_img)
|
||||
res = self.search_engine.search_by_img(query_desc, kq)
|
||||
#if rescorer:
|
||||
# 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]
|
||||
return res
|
||||
|
||||
def save(self, is_backup=False):
|
||||
self.search_engine.save(is_backup)
|
||||
#self.rescorer.save(is_backup)
|
|
@ -0,0 +1,10 @@
|
|||
import numpy as np
|
||||
import beniculturaliSettings as settings
|
||||
import requests
|
||||
|
||||
|
||||
def extract(img_path):
|
||||
files = {'image': ('img', open(img_path, 'rb'))}
|
||||
data = {'resize': 'true', 'bw': 'true'}
|
||||
r = requests.post(settings.feature_extractor, data=data, files=files)
|
||||
return np.array(r.json())
|
|
@ -0,0 +1,44 @@
|
|||
import glob, os
|
||||
from PIL import Image, ImageOps
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
import tqdm
|
||||
|
||||
|
||||
max_size = 1050
|
||||
|
||||
|
||||
def resize_img(src, dest):
|
||||
if not os.path.isdir(dest):
|
||||
os.mkdir(dest)
|
||||
paths = Path(src).rglob('*.*')
|
||||
paths_list = list(paths)
|
||||
|
||||
for path in tqdm.tqdm(paths_list):
|
||||
#print(path.name)
|
||||
id, _ = os.path.splitext(path.name)
|
||||
|
||||
outfile = os.path.join(dest, id + ".jpg")
|
||||
try:
|
||||
im = Image.open(path)
|
||||
if im.mode in ("RGBA", "P"):
|
||||
im = im.convert("RGB")
|
||||
width, height = im.size
|
||||
if width > max_size or height > max_size:
|
||||
im.thumbnail((max_size, max_size), Image.ANTIALIAS)
|
||||
im = ImageOps.grayscale(im)
|
||||
im.save(outfile, "JPEG")
|
||||
except IOError:
|
||||
print("cannot create thumbnail for '%s'" % path)
|
||||
pass
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description='Image resizing')
|
||||
parser.add_argument('src', type=str, help='images source folder path')
|
||||
parser.add_argument('dest', type=str, help='images dest folder path')
|
||||
|
||||
#args = parser.parse_args()
|
||||
#resize_img(args.src, args.dest)
|
||||
resize_img('/media/Data/data/test/gem/img/originals/export_Immagini_SitoPubblico', '/media/Data/data/test/gem/img/export_Immagini_SitoPubblico_resized_bw_autocontrast')
|
||||
#resize_img('/media/Data/data/test/gem/img/originals/ImmaginiComparazioni', '/media/Data/data/test/gem/img/ImmaginiComparazioni_resized_bw_autocontrast')
|
|
@ -0,0 +1,53 @@
|
|||
import glob, os
|
||||
from PIL import Image, ImageOps
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
import tqdm
|
||||
|
||||
|
||||
max_size = 1050
|
||||
|
||||
|
||||
def resize_img(src, dest):
|
||||
if not os.path.isdir(dest):
|
||||
os.mkdir(dest)
|
||||
res_folder = os.path.join(dest, 'resized')
|
||||
if not os.path.isdir(res_folder):
|
||||
os.mkdir(res_folder)
|
||||
bw_folder = os.path.join(dest, 'bw')
|
||||
if not os.path.isdir(bw_folder):
|
||||
os.mkdir(bw_folder)
|
||||
paths = Path(src).rglob('*.*')
|
||||
paths_list = list(paths)
|
||||
|
||||
for path in tqdm.tqdm(paths_list):
|
||||
#print(path.name)
|
||||
id, _ = os.path.splitext(path.name)
|
||||
|
||||
outfile_res = os.path.join(res_folder, id + ".jpg")
|
||||
outfile_bw = os.path.join(bw_folder, id + ".jpg")
|
||||
try:
|
||||
im = Image.open(path)
|
||||
if im.mode in ("RGBA", "P"):
|
||||
im = im.convert("RGB")
|
||||
width, height = im.size
|
||||
if width > max_size or height > max_size:
|
||||
im.thumbnail((max_size, max_size), Image.ANTIALIAS)
|
||||
im.save(outfile_res, "JPEG")
|
||||
|
||||
im = ImageOps.grayscale(im)
|
||||
im.save(outfile_bw, "JPEG")
|
||||
except IOError:
|
||||
print("cannot process '%s'" % path)
|
||||
pass
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description='Image resizing')
|
||||
parser.add_argument('src', type=str, help='images source folder path')
|
||||
parser.add_argument('dest', type=str, help='images dest folder path')
|
||||
|
||||
args = parser.parse_args()
|
||||
resize_img(args.src, args.dest)
|
||||
#resize_img('/media/Data/data/test/gem/img/originals/export_Immagini_SitoPubblico', '/media/Data/data/test/gem/img/export_Immagini_SitoPubblico_resized_bw_auto')
|
||||
#resize_img('/media/Data/data/test/gem/img/originals/ImmaginiComparazioni', '/media/Data/data/test/gem/img/ImmaginiComparazioni_resized_bw_autocontrast')
|
|
@ -0,0 +1,43 @@
|
|||
import glob, os
|
||||
from PIL import Image
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
import tqdm
|
||||
|
||||
|
||||
max_size = 1050
|
||||
|
||||
|
||||
def resize_img(src, dest):
|
||||
if not os.path.isdir(dest):
|
||||
os.mkdir(dest)
|
||||
paths = Path(src).rglob('*.*')
|
||||
paths_list = list(paths)
|
||||
|
||||
for path in tqdm.tqdm(paths_list):
|
||||
#print(path.name)
|
||||
id, _ = os.path.splitext(path.name)
|
||||
|
||||
outfile = os.path.join(dest, id + ".jpg")
|
||||
try:
|
||||
im = Image.open(path)
|
||||
if im.mode in ("RGBA", "P"):
|
||||
im = im.convert("RGB")
|
||||
width, height = im.size
|
||||
if width > max_size or height > max_size:
|
||||
im.thumbnail((max_size, max_size), Image.ANTIALIAS)
|
||||
im.save(outfile, "JPEG")
|
||||
except IOError:
|
||||
print("cannot create thumbnail for '%s'" % path)
|
||||
pass
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description='Image resizing')
|
||||
parser.add_argument('src', type=str, help='images source folder path')
|
||||
parser.add_argument('dest', type=str, help='images dest folder path')
|
||||
|
||||
#args = parser.parse_args()
|
||||
#resize_img(args.src, args.dest)
|
||||
resize_img('/media/Data/data/test/gem/img/originals/export_Immagini_SitoPubblico', '/media/Data/data/test/gem/img/export_Immagini_SitoPubblico_resized')
|
||||
#resize_img('/media/Data/data/test/gem/img/originals/ImmaginiComparazioni', '/media/Data/data/test/gem/img/ImmaginiComparazioni_resized')
|
|
@ -0,0 +1,38 @@
|
|||
from pathlib import Path
|
||||
import tqdm
|
||||
|
||||
import LFUtilities
|
||||
import ORBExtractor as lf
|
||||
import argparse
|
||||
import os
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description='LF bulk extraction')
|
||||
parser.add_argument('src', type=str, help='img src folder path')
|
||||
parser.add_argument('dest', type=str, help='lf dest folder')
|
||||
|
||||
args = parser.parse_args()
|
||||
src = args.src
|
||||
dest = args.dest
|
||||
|
||||
paths = Path(src).rglob('*.*')
|
||||
paths_list = list(paths)
|
||||
|
||||
dataset = []
|
||||
|
||||
print('Extracting lf...')
|
||||
for path in tqdm.tqdm(paths_list):
|
||||
try:
|
||||
kp, des = lf.extract(os.path.join(path.parent, path.name))
|
||||
dataset.append((kp, des))
|
||||
except:
|
||||
print("cannot process '%s'" % path)
|
||||
pass
|
||||
|
||||
LFUtilities.save(dataset, os.path.join(dest, 'dataset_lf.dat'))
|
||||
with open(os.path.join(dest, 'dataset_lf.ids'), 'w') as f:
|
||||
for path in paths_list:
|
||||
id, _ = os.path.splitext(path.name)
|
||||
f.write("%s\n" % id)
|
||||
print('lf extracted.')
|
|
@ -0,0 +1,67 @@
|
|||
import cv2
|
||||
import numpy as np
|
||||
import pickle as pickle
|
||||
import os
|
||||
|
||||
|
||||
THRESHOLD = 35
|
||||
MIN_GOOD_MATCHES = 12
|
||||
MIN_INLIERS = 6
|
||||
KEYPOINTS = 128
|
||||
IMG_SIZE = 500
|
||||
|
||||
|
||||
def resize(max_side, img):
|
||||
if img.shape[1] > img.shape[0]:
|
||||
r = max_side / img.shape[1]
|
||||
dim = (max_side, int(img.shape[0] * r))
|
||||
else:
|
||||
r = max_side / img.shape[0]
|
||||
dim = (int(img.shape[1] * r), max_side)
|
||||
|
||||
# perform the actual resizing of the image and show it
|
||||
resized = cv2.resize(img, dim, interpolation=cv2.INTER_AREA)
|
||||
return resized
|
||||
|
||||
|
||||
def pickle_keypoints(keypoints, descriptors):
|
||||
i = 0
|
||||
temp_array = []
|
||||
for point in keypoints:
|
||||
temp = (point.pt, point.size, point.angle, point.response, point.octave,
|
||||
point.class_id, descriptors[i])
|
||||
i += 1
|
||||
temp_array.append(temp)
|
||||
return temp_array
|
||||
|
||||
|
||||
def unpickle_keypoints(array):
|
||||
keypoints = []
|
||||
descriptors = []
|
||||
for point in array:
|
||||
temp_feature = cv2.KeyPoint(x=point[0][0],y=point[0][1],_size=point[1], _angle=point[2], _response=point[3], _octave=point[4], _class_id=point[5])
|
||||
temp_descriptor = point[6]
|
||||
keypoints.append(temp_feature)
|
||||
descriptors.append(temp_descriptor)
|
||||
return keypoints, np.array(descriptors)
|
||||
|
||||
|
||||
def load(lf_path):
|
||||
print('loading LF dataset')
|
||||
ser_dataset = pickle.load(open(lf_path, "rb"))
|
||||
lf_dataset = []
|
||||
for item in ser_dataset:
|
||||
kp, desc = unpickle_keypoints(item)
|
||||
lf_dataset.append((kp, desc))
|
||||
return lf_dataset
|
||||
|
||||
|
||||
def save(lf_data, lf_path):
|
||||
data = []
|
||||
for lf in lf_data:
|
||||
data.append(pickle_keypoints(lf[0], lf[1]))
|
||||
pickle.dump(data, open(lf_path, 'wb'))
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
import cv2
|
||||
from pathlib import Path
|
||||
import tqdm
|
||||
import pickle
|
||||
import os
|
||||
|
||||
import LFUtilities as lf
|
||||
|
||||
orb = cv2.ORB.create(lf.KEYPOINTS)
|
||||
|
||||
|
||||
def extract(img_path):
|
||||
img = lf.resize(lf.IMG_SIZE, cv2.imread(img_path))
|
||||
kp, des = orb.detectAndCompute(img, mask=None)
|
||||
return (kp, des)
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
from flask import Flask, request, redirect, url_for, flash, render_template, send_from_directory
|
||||
from random import randint
|
||||
import cv2
|
||||
import io
|
||||
import numpy as np
|
||||
import json
|
||||
|
||||
import urllib
|
||||
|
||||
|
||||
from BeniCulturaliSearchEngine import BeniCulturaliSearchEngine
|
||||
import beniculturaliSettings as settings
|
||||
import uuid
|
||||
import requests
|
||||
|
||||
import os, os.path
|
||||
|
||||
BASE_URL = 'http://bilioso.isti.cnr.it:8190/bcir/'
|
||||
payload = {'id': '54b019e5ed5082b0938b14c4-IMG357781'}
|
||||
r = requests.get(BASE_URL + 'searchById', params=payload)
|
||||
print(r.json())
|
||||
|
||||
files = {'image': ('query', open('/media/Data/data/test/tpc_test/img/data_test/54b019e5ed5082b0938b14c4-IMG357781.jpg', 'rb'))}
|
||||
r = requests.post(BASE_URL + 'searchByImg', files=files)
|
||||
print(r.json())
|
||||
|
||||
payload = {'url': 'http://bilioso.isti.cnr.it:8190/bcir/54b019e5ed5082b0938b14c4-IMG357781.jpg'}
|
||||
r = requests.get(BASE_URL + 'searchByURL', params=payload)
|
||||
print(r.json())
|
||||
|
||||
files = {'image': ('prova', open('/media/Data/data/test/tpc_test/img/data_test/54b019e5ed5082b0938b14c4-IMG357781.jpg', 'rb'))}
|
||||
#files = {'image': ('prova', open('/media/Data/data/beni_culturali/deploy/dataset_ids.bak', 'rb'))}
|
||||
r = requests.post(BASE_URL + 'addImg', files=files)
|
||||
s = r.json()
|
||||
print(r.json())
|
||||
|
||||
files = {'image': ('query', open('/media/Data/data/test/tpc_test/img/data_test/54b019e5ed5082b0938b14c4-IMG357781.jpg', 'rb'))}
|
||||
r = requests.post(BASE_URL + 'searchByImg', files=files)
|
||||
print(r.json())
|
||||
|
||||
payload = {'id': 'prova'}
|
||||
r = requests.get(BASE_URL + 'rmImg', params=payload)
|
||||
print(r.json())
|
||||
|
||||
files = {'image': ('query', open('/media/Data/data/test/tpc_test/img/data_test/54b019e5ed5082b0938b14c4-IMG357781.jpg', 'rb'))}
|
||||
r = requests.post(BASE_URL + 'searchByImg', files=files)
|
||||
print(r.json())
|
|
@ -0,0 +1,203 @@
|
|||
from re import split
|
||||
|
||||
from flask import Flask, request, redirect, url_for, flash, render_template, send_from_directory, abort
|
||||
from random import randint
|
||||
import cv2
|
||||
import io
|
||||
import numpy as np
|
||||
import json
|
||||
|
||||
import urllib
|
||||
|
||||
from BeniCulturaliSearcher import BeniCulturaliSearcher
|
||||
from BeniCulturaliSearchEngine import BeniCulturaliSearchEngine
|
||||
import beniculturaliSettings as settings
|
||||
import uuid
|
||||
import requests
|
||||
import os, os.path
|
||||
from PIL import Image
|
||||
import tornado.wsgi
|
||||
import tornado.httpserver
|
||||
import argparse
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
@app.route('/bcir/')
|
||||
def api_root():
|
||||
print('index_with_randoms.html')
|
||||
random_ids = []
|
||||
for i in range(0, 15):
|
||||
random_ids.append(searcher.get_id(randint(0, 3000)))
|
||||
return render_template('index_with_randoms.html', random_ids=random_ids)
|
||||
|
||||
|
||||
def url_to_file(url):
|
||||
dest_file = uuid.uuid4().hex + ".png"
|
||||
dest_path = settings.logs + "/" + dest_file
|
||||
req = urllib.request.Request(
|
||||
url,
|
||||
data=None,
|
||||
headers={
|
||||
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
|
||||
}
|
||||
)
|
||||
resp = urllib.request.urlopen(req)
|
||||
image = np.asarray(bytearray(resp.read()), dtype="uint8")
|
||||
decoded = cv2.imdecode(image, cv2.IMREAD_COLOR)
|
||||
cv2.imwrite(dest_path, decoded)
|
||||
#im = Image.fromarray(image)
|
||||
#im.save(dest_path)
|
||||
return dest_path
|
||||
|
||||
|
||||
def post_to_file(image):
|
||||
dest_file = uuid.uuid4().hex + ".png"
|
||||
dest_path = settings.logs + "/" + dest_file
|
||||
image.save(dest_path)
|
||||
return dest_path
|
||||
|
||||
|
||||
def get_res(results, query_url=None):
|
||||
if query_url is not None:
|
||||
return render_template('search.html', results=results, query_url=query_url)
|
||||
json_res = json.dumps(results)
|
||||
return json_res
|
||||
|
||||
|
||||
@app.route('/bcir/searchById')
|
||||
def search_by_id():
|
||||
id = request.args.get('id')
|
||||
rescorer = False
|
||||
if request.args.get("rescorer") == 'true':
|
||||
rescorer = True
|
||||
results = searcher.search_by_id(id, settings.k, rescorer)
|
||||
query_url = None
|
||||
if request.args.get("tohtml") is not None:
|
||||
query_url = id + ".jpg"
|
||||
return get_res(results, query_url)
|
||||
|
||||
|
||||
@app.route('/bcir/searchByImg', methods=['POST'])
|
||||
def search_by_img():
|
||||
if 'image' not in request.files:
|
||||
flash('No file part')
|
||||
return redirect(request.url)
|
||||
|
||||
file = request.files['image']
|
||||
img_file = post_to_file(file)
|
||||
rescorer = False
|
||||
if request.form.get("rescorer") == 'true':
|
||||
rescorer = True
|
||||
#dest_file = uuid.uuid4().hex + ".jpg"
|
||||
#dest_path = settings.logs + "/" + dest_file
|
||||
#file.save(dest_path)
|
||||
#files = {'image': (dest_file, open(dest_path, 'rb'))}
|
||||
#r = requests.post(settings.rmac_service, files=files)
|
||||
#results = search_engine.search_by_img(np.array(r.json()), settings.k)
|
||||
results = searcher.search_by_img(img_file, settings.k, rescorer)
|
||||
query_url = None
|
||||
if request.form.get("tohtml") is not None:
|
||||
query_url = ""
|
||||
return get_res(results, query_url)
|
||||
|
||||
|
||||
@app.route('/bcir/searchByURL')
|
||||
def search_by_url():
|
||||
url = request.args.get('url')
|
||||
rescorer = False
|
||||
if request.args.get("rescorer") == 'true':
|
||||
rescorer = True
|
||||
img_file = url_to_file(url)
|
||||
# query = cv2.imdecode(image, cv2.IMREAD_COLOR)
|
||||
# dest_file = uuid.uuid4().hex + ".jpg"
|
||||
# dest_path = settings.logs + "/" + dest_file
|
||||
# cv2.imwrite(dest_path, query)
|
||||
# files = {'image': open(dest_path, 'rb')}
|
||||
# r = requests.post(settings.rmac_service, files=files)
|
||||
# results = search_engine.search_by_img(np.array(r.json()), settings.k)
|
||||
results = searcher.search_by_img(img_file, settings.k, rescorer)
|
||||
query_url = None
|
||||
if request.args.get("tohtml") is not None:
|
||||
query_url = url
|
||||
return get_res(results, query_url)
|
||||
|
||||
@app.route('/bcir/addImg', methods=['POST'])
|
||||
def add_img():
|
||||
if 'image' not in request.files:
|
||||
flash('No file part')
|
||||
return redirect(request.url)
|
||||
try:
|
||||
file = request.files['image']
|
||||
id = request.files['image'].filename
|
||||
id, _ = os.path.splitext(id)
|
||||
img_file = post_to_file(file)
|
||||
searcher.add(img_file, id)
|
||||
json_res = json.dumps("done")
|
||||
return json_res
|
||||
except:
|
||||
abort(500)
|
||||
|
||||
|
||||
@app.route('/bcir/rmImg')
|
||||
def remove_img():
|
||||
try:
|
||||
id = request.args.get('id')
|
||||
searcher.remove(id)
|
||||
json_res = json.dumps("done")
|
||||
return json_res
|
||||
except:
|
||||
abort(500)
|
||||
|
||||
@app.route('/bcir/<path:filename>')
|
||||
def download_file(filename):
|
||||
print(filename)
|
||||
values = filename.split('/')
|
||||
print(values)
|
||||
|
||||
return send_from_directory(settings.img_folder, filename, as_attachment=False)
|
||||
|
||||
"""
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description='Reading configuration file')
|
||||
parser.add_argument('conf', type=str, help='Configuration file path')
|
||||
|
||||
args = parser.parse_args()
|
||||
settings.load_setting(args.conf)
|
||||
global searcher
|
||||
searcher = BeniCulturaliSearcher()
|
||||
|
||||
#app.run(host='0.0.0.0', port=8090, ssl_context='adhoc')
|
||||
app.run(host='0.0.0.0', port=settings.port)
|
||||
|
||||
# app.run(host='0.0.0.0', port=settings.port)
|
||||
"""
|
||||
|
||||
def start_tornado(app, port=8190):
|
||||
http_server = tornado.httpserver.HTTPServer(tornado.wsgi.WSGIContainer(app))
|
||||
http_server.listen(port)
|
||||
app.logger.info("Tornado server starting on port {}".format(port))
|
||||
tornado.ioloop.IOLoop.instance().start()
|
||||
|
||||
|
||||
def start_from_terminal(app):
|
||||
parser = argparse.ArgumentParser(description='Reading configuration file')
|
||||
parser.add_argument('conf', type=str, help='Configuration file path')
|
||||
|
||||
args = parser.parse_args()
|
||||
settings.load_setting(args.conf)
|
||||
global searcher
|
||||
searcher = BeniCulturaliSearcher()
|
||||
|
||||
#if args.debug:
|
||||
# app.run(debug=True, host='0.0.0.0', port=settings.port)
|
||||
# else:
|
||||
#start_tornado(app, settings.port)
|
||||
|
||||
app.run(debug=False, host='0.0.0.0', port=settings.port)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
start_from_terminal(app)
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
import json
|
||||
import os
|
||||
|
||||
def load_setting(conf_file):
|
||||
global port, feature_extractor, k, img_folder, logs, working_folder, data_folder, DATASET, DATASET1, DATASET2, DATASET_LF, DATASET_IDS, DATASET_IDS_LF
|
||||
|
||||
with open(conf_file) as settings_file:
|
||||
|
||||
settings = json.load(settings_file)
|
||||
|
||||
port = settings['port']
|
||||
feature_extractor = settings['fe_service']
|
||||
|
||||
k = settings['k']
|
||||
working_folder = settings['working_folder']
|
||||
|
||||
data_folder = os.path.join(working_folder, settings['data_folder'])
|
||||
|
||||
if not os.path.isdir(data_folder):
|
||||
os.mkdir(data_folder)
|
||||
|
||||
DATASET = os.path.join(data_folder, 'dataset.npy')
|
||||
#DATASET1 = os.path.join(data_folder, 'dataset_resized.npy')
|
||||
#DATASET2 = os.path.join(data_folder, 'dataset_bw.npy')
|
||||
DATASET_LF = os.path.join(data_folder, 'dataset_lf.dat')
|
||||
DATASET_IDS = os.path.join(data_folder, 'dataset.ids')
|
||||
#DATASET_IDS_LF = os.path.join(data_folder, 'dataset_lf.ids')
|
||||
|
||||
img_folder = settings['img_folder']
|
||||
logs = os.path.join(working_folder, settings['log_folder'])
|
||||
if not os.path.isdir(logs):
|
||||
os.mkdir(logs)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue