summaryrefslogtreecommitdiff
path: root/megapixels
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2018-12-14 17:24:23 +0100
committerJules Laplace <julescarbon@gmail.com>2018-12-14 17:24:23 +0100
commit36b6082dfa768cbf35d40dc2c82706dfae0b687b (patch)
tree70a49e3623b708caad8d93cd722512d5438a0bec /megapixels
parentb39b1d51db2d485e9c60fb4d3f5445474cef8700 (diff)
flask server click script
Diffstat (limited to 'megapixels')
-rw-r--r--megapixels/app/models/sql_factory.py1
-rw-r--r--megapixels/app/server/api/image.py40
-rw-r--r--megapixels/app/server/create.py27
l---------megapixels/app/server/static1
-rw-r--r--megapixels/cli_flask.py19
-rw-r--r--megapixels/commands/faiss/build_db.py21
6 files changed, 101 insertions, 8 deletions
diff --git a/megapixels/app/models/sql_factory.py b/megapixels/app/models/sql_factory.py
index ecca0c7f..525492f1 100644
--- a/megapixels/app/models/sql_factory.py
+++ b/megapixels/app/models/sql_factory.py
@@ -14,7 +14,6 @@ connection_url = "mysql+mysqldb://{}:{}@{}/{}".format(
# Session = sessionmaker(bind=engine)
# session = Session()
-
class SqlDataset:
"""
Bridge between the facial information CSVs connected to the datasets, and MySQL
diff --git a/megapixels/app/server/api/image.py b/megapixels/app/server/api/image.py
new file mode 100644
index 00000000..f2f4a4f9
--- /dev/null
+++ b/megapixels/app/server/api/image.py
@@ -0,0 +1,40 @@
+from flask import Blueprint, render_template, abort
+# from jinja2 import TemplateNotFound
+
+router = Blueprint('image', __name__)
+
+@router.route('/<dataset>/test', methods=['POST'])
+def test(name):
+ # dataset =
+@router.route('/<dataset>/face', methods=['POST'])
+def upload(name):
+ file = request.files['query_img']
+ fn = file.filename
+ if fn.endswith('blob'):
+ fn = 'filename.jpg'
+
+ basename, ext = os.path.splitext(fn)
+ print("got {}, type {}".format(basename, ext))
+ if ext.lower() not in valid_exts:
+ return jsonify({ 'error': 'not an image' })
+
+ uploaded_fn = datetime.now().isoformat() + "_" + basename
+ uploaded_fn = sanitize_re.sub('', uploaded_fn)
+ uploaded_img_path = "static/uploaded/" + uploaded_fn + ext
+ uploaded_img_path = uploaded_img_path.lower()
+ print('query: {}'.format(uploaded_img_path))
+
+ img = Image.open(file.stream).convert('RGB')
+ # img.save(uploaded_img_path)
+ # vec = db.load_feature_vector_from_file(uploaded_img_path)
+ vec = fe.extract(img)
+ # print(vec.shape)
+
+ results = db.search(vec, limit=limit)
+ query = {
+ 'timing': time.time() - start,
+ }
+ print(results)
+ return jsonify({
+ 'results': results,
+ })
diff --git a/megapixels/app/server/create.py b/megapixels/app/server/create.py
new file mode 100644
index 00000000..1119ee8f
--- /dev/null
+++ b/megapixels/app/server/create.py
@@ -0,0 +1,27 @@
+from flask import Flask, Blueprint
+from flask_sqlalchemy import SQLAlchemy
+from app.models.sql_factory import connection_url
+
+from app.server.api import router as api_router
+
+# from app.server.views.assets import assets
+
+db = SQLAlchemy()
+
+def create_app(script_info=None):
+ app = Flask(__name__, static_url_path='')
+ app.config['SQLALCHEMY_DATABASE_URI'] = connection_url
+ app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
+
+ db.init_app(app)
+ app.register_blueprint(api)
+
+ @app.route('/', methods=['GET'])
+ def index():
+ return app.send_static_file('index.html')
+
+ @app.shell_context_processor
+ def shell_context():
+ return { 'app': app, 'db': db }
+
+ return app
diff --git a/megapixels/app/server/static b/megapixels/app/server/static
new file mode 120000
index 00000000..1dc7a639
--- /dev/null
+++ b/megapixels/app/server/static
@@ -0,0 +1 @@
+../../../site/public \ No newline at end of file
diff --git a/megapixels/cli_flask.py b/megapixels/cli_flask.py
new file mode 100644
index 00000000..369bec01
--- /dev/null
+++ b/megapixels/cli_flask.py
@@ -0,0 +1,19 @@
+# --------------------------------------------------------
+# wrapper for flask CLI API
+# --------------------------------------------------------
+
+import click
+
+from flask.cli import FlaskGroup
+from app.server.create import create_app
+
+# from app.settings import app_cfg as cfg
+# from app.utils import logger_utils
+
+cli = FlaskGroup(create_app=create_app)
+
+# --------------------------------------------------------
+# Entrypoint
+# --------------------------------------------------------
+if __name__ == '__main__':
+ cli()
diff --git a/megapixels/commands/faiss/build_db.py b/megapixels/commands/faiss/build_db.py
index c90d178b..52c4980f 100644
--- a/megapixels/commands/faiss/build_db.py
+++ b/megapixels/commands/faiss/build_db.py
@@ -17,11 +17,15 @@ from app.settings import app_cfg as cfg
def cli(ctx):
"""import the various CSVs into MySQL
"""
- datasets = []
+ load_sql_datasets(clobber=True)
+
+def load_sql_datasets(path, clobber=False):
+ datasets = {}
for path in glob.iglob(os.path.join(cfg.DIR_FAISS_METADATA, "*")):
- build_dataset(path)
+ dataset = load_sql_dataset(path, clobber)
+ datasets[dataset.name] = dataset
-def build_dataset(path):
+def load_sql_dataset(path, clobber=False):
name = os.path.basename(path)
dataset = SqlDataset(name)
@@ -30,9 +34,12 @@ def build_dataset(path):
table = dataset.get_table(key)
if table is None:
continue
- df = pd.read_csv(fn)
+ if clobber:
+ df = pd.read_csv(fn)
+
+ # fix columns that are named "index", a sql reserved word
+ df.columns = table.__table__.columns.keys()
- # fix columns that are named "index", a sql reserved word
- df.columns = table.__table__.columns.keys()
+ df.to_sql(name=table.__tablename__, con=engine, if_exists='replace', index=False)
- df.to_sql(name=table.__tablename__, con=engine, if_exists='replace', index=False)
+ return dataset \ No newline at end of file