image-recognition/src/beniculturali.py

204 lines
6.1 KiB
Python

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)