summaryrefslogtreecommitdiff
path: root/megapixels/app/server/api.py
blob: cf8241bd2a9552180ac28f19dd4f3ed5c9486e0d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import os
import re
import time
import dlib
from flask import Blueprint, request, jsonify
from PIL import Image  # todo: try to remove PIL dependency

from app.processors import face_recognition
from app.processors import face_detector
from app.models.sql_factory import list_datasets, get_dataset, get_table

sanitize_re = re.compile('[\W]+')
valid_exts = ['.gif', '.jpg', '.jpeg', '.png']

api = Blueprint('api', __name__)

@api.route('/')
def index():
  return jsonify({ 'datasets': list_datasets() })

@api.route('/dataset/<name>')
def show(name):
  dataset = get_dataset(name)
  if dataset:
    return jsonify(dataset.describe())
  else:
    return jsonify({ 'status': 404 })

@api.route('/dataset/<name>/face', methods=['POST'])
def upload(name):
  start = time.time()
  dataset = get_dataset(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' })

  img = Image.open(file.stream).convert('RGB')
  
  # Face detection
  detector = face_detector.DetectorDLIBHOG()

  # get detection as BBox object
  bboxes = detector.detect(im, largest=True)
  bbox = bboxes[0]
  dim = im.shape[:2][::-1]
  bbox = bbox.to_dim(dim)  # convert back to real dimensions

  # face recognition/vector
  recognition = face_recognition.RecognitionDLIB(gpu=-1)

  # print(vec.shape)
  # results = db.search(vec, limit=limit)

  # with the result we have an ID
  # query the sql dataset for the UUID etc here

  query = {
    'timing': time.time() - start,
  }
  results = []

  print(results)
  return jsonify({
    'query': query,
    'results': results,
  })

@api.route('/dataset/<name>/name', methods=['GET'])
def name_lookup(dataset):
  start = time.time()
  dataset = get_dataset(name)

  # we have a query from the request query string...
  # use this to do a like* query on the identities_meta table

  query = {
    'timing': time.time() - start,
  }
  results = []

  print(results)
  return jsonify({
    'query': query,
    'results': results,
  })