fr_flask_0.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. from PIL import ImageFile
  2. from flask import Flask, request, jsonify
  3. import face_recognition
  4. import base64
  5. from io import BytesIO
  6. import joblib
  7. import numpy as np
  8. import re
  9. import os
  10. import time
  11. ImageFile.SAFEBLOCK = 2048 * 2048
  12. app = Flask(__name__)
  13. model_file_name = "saved_model_2.pkl"
  14. clf = None
  15. classes = None
  16. dummy_data = [
  17. {
  18. "name": "Bayu",
  19. "address": "299 St Louis Road Oak Forest, IL 60452",
  20. "nik": "1000076456784631"
  21. },
  22. {
  23. "name": "Dio",
  24. "address": "22 Whitemarsh St. Mansfield, MA 02048",
  25. "nik": "1000024792887549"
  26. },
  27. {
  28. "name": "Hadi",
  29. "address": "643 Honey Creek Dr. Milledgeville, GA 31061",
  30. "nik": "1000038502830420"
  31. },
  32. {
  33. "name": "Kevin",
  34. "address": "881 Cooper Ave. Hummelstown, PA 17036",
  35. "nik": "1000045356476664"
  36. },
  37. {
  38. "name": "Matrix",
  39. "address": "580 Glenwood Dr. Garner, NC 27529",
  40. "nik": "1000023452134598"
  41. },
  42. {
  43. "name": "Surya",
  44. "address": "909 South St Paul Street Hopewell, VA 23860",
  45. "nik": "1000075656784734"
  46. },
  47. ]
  48. ssl = None
  49. known_people = "application_data/verification_images"
  50. known_faces = []
  51. total_threshold = 0.2
  52. face_model = "large"
  53. if face_model == "large":
  54. model_file_name = "saved_model_2_large.pkl"
  55. UPLOAD_FOLDER = ""
  56. def scan_known_people(known_people_folder):
  57. known_face_encodings = []
  58. for file in image_files_in_folder(known_people_folder):
  59. img = face_recognition.load_image_file(file)
  60. encodings = face_recognition.face_encodings(img, model=face_model)
  61. if len(encodings) > 1:
  62. print("WARNING: More than one face found in {}. Only considering the first face.".format(file))
  63. if len(encodings) == 0:
  64. print("WARNING: No faces found in {}. Ignoring file.".format(file))
  65. else:
  66. known_face_encodings.append(encodings[0])
  67. return known_face_encodings
  68. def image_files_in_folder(folder):
  69. img_list = [os.path.join(folder, f) for f in os.listdir(folder) if
  70. re.match(r'.*\.(jpg|jpeg|png|webp)', f, flags=re.I)]
  71. img_list.sort()
  72. return img_list
  73. def load_db():
  74. pass
  75. def save_db(name, address, nik):
  76. pass
  77. @app.route('/upload', methods=['POST'])
  78. def upload():
  79. profile = request.files["profile"]
  80. nik = request.form["nik"]
  81. name = request.form["name"]
  82. address = request.form["address"]
  83. @app.route('/predict', methods=['POST'])
  84. def predict():
  85. result = []
  86. if "image" in request.json:
  87. im_b64 = request.json["image"]
  88. elif "image" in request.files:
  89. im_b64 = request.files["image"]
  90. elif "image" in request.form:
  91. im_b64 = request.form["image"]
  92. else:
  93. return {"error": "Error reading image"}
  94. im_bytes = base64.b64decode(im_b64)
  95. im_file = BytesIO(im_bytes)
  96. test_image = face_recognition.load_image_file(im_file)
  97. face_locations = face_recognition.face_locations(test_image)
  98. no = len(face_locations)
  99. if no > 0:
  100. for i in range(no):
  101. start_time = time.perf_counter()
  102. test_image_enc = face_recognition.face_encodings(test_image, model=face_model)[i]
  103. proba_list = clf.predict_proba([test_image_enc])
  104. dist = face_recognition.face_distance(known_faces, test_image_enc)
  105. total = np.subtract(proba_list, dist)
  106. i = np.argmax(total)
  107. proba = list(*proba_list)[i]
  108. name = dummy_data[i]["name"]
  109. address = dummy_data[i]["address"]
  110. nik = dummy_data[i]["nik"]
  111. if total[0][i] > total_threshold:
  112. js = {
  113. "id": str(i),
  114. "name": name,
  115. "address": address,
  116. "nik": nik,
  117. "proba": proba,
  118. "delta": total[0][i]
  119. }
  120. else:
  121. js = {
  122. "id": "-1",
  123. "name": "Unknown",
  124. "address": "",
  125. "nik": "",
  126. "proba": 0.0,
  127. "delta": 0.0
  128. }
  129. if total[0][i] > total_threshold or (not result and i == no - 1):
  130. result.append(js)
  131. end_time = time.perf_counter()
  132. process_time = end_time - start_time
  133. print(time.strftime("%c"))
  134. print(total[0])
  135. print("Process time:", process_time, "s")
  136. print(result)
  137. return jsonify(result)
  138. try:
  139. clf = joblib.load(model_file_name)
  140. classes = clf.classes_
  141. print('model loaded')
  142. known_faces = scan_known_people(known_people)
  143. print('known faces scanned')
  144. except FileNotFoundError as e:
  145. print('No model here')
  146. exit(1)
  147. if __name__ == '__main__':
  148. app.run(host='0.0.0.0', port=8349, debug=True, ssl_context=ssl)