Commented most relevant files for submission
This commit is contained in:
@@ -11,6 +11,7 @@ import cv2
|
||||
import numpy as np
|
||||
import imutils
|
||||
app = Flask(__name__)
|
||||
#establish connection to minio for this instance of the api
|
||||
minioClient = Minio('minio:9000', access_key=os.environ['s3-name'], secret_key=os.environ['s3-password'], secure=False)
|
||||
|
||||
@app.route('/')
|
||||
@@ -27,25 +28,29 @@ def access_minio():
|
||||
def new_user_id():
|
||||
#save demo object to reserve id in minio
|
||||
id = None
|
||||
#five tries to generate unique id
|
||||
for limited_try in range(0,5):
|
||||
id = str(uuid.uuid4())
|
||||
if check_id(id) == False:
|
||||
break
|
||||
demo_object = ['test']
|
||||
#dump demo object and save it like its a face encoding to reserve id
|
||||
with open('/tmp/demo_object.pkl', 'wb') as f:
|
||||
pickle.dump(demo_object, f)
|
||||
minioClient.fput_object('users', str(id), '/tmp/demo_object.pkl')
|
||||
return jsonify({'id':id})
|
||||
|
||||
@app.route('/init_face')
|
||||
#call like https://face.sguba.de/init_face?id=123&encoded_string=abc
|
||||
#call like https://face.sguba.de/init_face?id=123&encoded_string=base64encoded_urlsafe_string
|
||||
def new_face():
|
||||
id = request.args.get('id', None)
|
||||
img = request.args.get('encoded_string', None)
|
||||
temporary_img_path = '/tmp/'+str(id)+'.jpg'
|
||||
temporary_pkl_path = '/tmp/'+str(id)+'.pkl'
|
||||
#transcode base64_string to img and generate encoding
|
||||
save_img(img, temporary_img_path)
|
||||
face_encoding_response = encode_face(temporary_img_path)
|
||||
#check if encoding was successfull, if yes save encoding in minio
|
||||
if face_encoding_response['success']==True:
|
||||
with open(temporary_pkl_path, 'wb') as file:
|
||||
pickle.dump(face_encoding_response['encoding'], file)
|
||||
@@ -59,8 +64,10 @@ def check_face():
|
||||
img = request.args.get('encoded_string', None)
|
||||
temporary_img_path = '/tmp/'+str(id)+'.jpg'
|
||||
temporary_pkl_path = '/tmp/'+str(id)+'.pkl'
|
||||
#transcode base64_string to img and generate encoding
|
||||
save_img(img, temporary_img_path)
|
||||
face_encoding_response = encode_face(temporary_img_path)
|
||||
#check if encoding was successfull, if yes get initial encoding from minio and compare encodings
|
||||
if face_encoding_response['success']==True:
|
||||
minioClient.fget_object('users', str(id), temporary_pkl_path)
|
||||
with open(temporary_pkl_path, 'rb') as file:
|
||||
@@ -84,7 +91,9 @@ def check_id(id):
|
||||
return known
|
||||
|
||||
def save_img(encoded_data, filename):
|
||||
#length of base64 string is always a multiple of 4, if not its padded with =, here we add padding that might have been lost so there are no errors when decoding the img
|
||||
encoded_data += "=" * ((4 - len(encoded_data) % 4) % 4)
|
||||
#convert string to binary, decode base64, decode image and rotate it 90 degree because android studio rotates the camera, then save image to temp
|
||||
encoded_data = bytes(encoded_data, encoding='utf-8')
|
||||
nparr = np.fromstring(base64.urlsafe_b64decode(encoded_data), np.uint8)
|
||||
img = cv2.imdecode(nparr, cv2.IMREAD_ANYCOLOR)
|
||||
@@ -92,18 +101,18 @@ def save_img(encoded_data, filename):
|
||||
return cv2.imwrite(filename, img)
|
||||
|
||||
def encode_face(path):
|
||||
#create face encoding from data, and check wether it was succesfull. If it was unsuccesfull the encodings list is empty
|
||||
success = None
|
||||
face = face_recognition.load_image_file(path)
|
||||
face_encoding = face_recognition.face_encodings(face)
|
||||
if len(face_encoding)==0:
|
||||
success = False
|
||||
response = {'success':success, 'encoding':None}
|
||||
response = {'success':False, 'encoding':None}
|
||||
else:
|
||||
success = True
|
||||
response = {'success':success, 'encoding':face_encoding[0]}
|
||||
response = {'success':True, 'encoding':face_encoding[0]}
|
||||
return response
|
||||
|
||||
def setup():
|
||||
#create minio buckets that are used at startup if they dont exist already
|
||||
try:
|
||||
minioClient.make_bucket("users")
|
||||
except BucketAlreadyOwnedByYou as err:
|
||||
@@ -113,7 +122,8 @@ def setup():
|
||||
except ResponseError as err:
|
||||
raise
|
||||
|
||||
|
||||
#check if the script is run primarily and not imported etc.
|
||||
if __name__ == '__main__':
|
||||
setup()
|
||||
#start running the api
|
||||
app.run(host='0.0.0.0')
|
Reference in New Issue
Block a user