app.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import os
  2. import tempfile
  3. import face_recognition
  4. import requests
  5. from flask import Flask, request, jsonify, json
  6. def create_app():
  7. app = Flask(__name__)
  8. def init_app():
  9. known_faces_dir = "./known_faces"
  10. load_known_faces(known_faces_dir)
  11. init_app()
  12. @app.route('/')
  13. def index(): # put application's code here
  14. return 'OK'
  15. @app.route('/recognize/url', methods=['POST'])
  16. def recognize_url():
  17. if 'url' not in request.json:
  18. return jsonify({'error': 'No URL provided'}), 400
  19. url = request.json.get('url')
  20. if not url:
  21. return jsonify({'error': 'Invalid URL'}), 400
  22. try:
  23. # 从 URL 下载文件
  24. response = requests.get(url)
  25. if response.status_code != 200:
  26. return jsonify({'error': 'Failed to download image from URL'}), 400
  27. # 创建一个临时文件保存下载的文件
  28. temp_file = tempfile.NamedTemporaryFile(delete=False)
  29. temp_file.write(response.content)
  30. temp_file.close()
  31. find = find_faces_in_image(temp_file.name)
  32. os.remove(temp_file.name) # 删除临时文件
  33. results = return_json(find)
  34. return results
  35. except Exception as e:
  36. return jsonify({'error': str(e)}), 500
  37. @app.route('/recognize/file', methods=['POST'])
  38. def recognize_file():
  39. if 'file' not in request.files:
  40. return jsonify({'error': 'No file part'}), 400
  41. file = request.files['file']
  42. if file.filename == '':
  43. return jsonify({'error': 'No selected file'}), 400
  44. if file:
  45. # 创建一个临时文件保存上传的文件
  46. temp_file = tempfile.NamedTemporaryFile(delete=False)
  47. file.save(temp_file.name)
  48. find = find_faces_in_image(temp_file.name)
  49. os.remove(temp_file.name)# 删除临时文件
  50. results = return_json(find)
  51. return results
  52. return jsonify({'error': 'An error occurred'}), 500
  53. return app
  54. def return_json(find):
  55. result = {
  56. "code": 0,
  57. "msg": "success",
  58. "data": None, # 将 data 初始化为 None
  59. "success": True
  60. }
  61. if find:
  62. result["data"] = {"find_face_status": 1}
  63. else:
  64. result["data"] = {"find_face_status": 2}
  65. json_result = json.dumps(result)
  66. return json_result
  67. # 全局变量存储已知人脸编码和名称
  68. known_face_encodings = []
  69. known_face_names = []
  70. def load_known_faces(known_faces_dir):
  71. global known_face_encodings, known_face_names
  72. known_face_encodings = []
  73. known_face_names = []
  74. for filename in os.listdir(known_faces_dir):
  75. if filename.endswith(".jpg") or filename.endswith(".png"):
  76. image_path = os.path.join(known_faces_dir, filename)
  77. image = face_recognition.load_image_file(image_path)
  78. face_encoding = face_recognition.face_encodings(image)[0]
  79. known_face_encodings.append(face_encoding)
  80. known_face_names.append(os.path.splitext(filename)[0])
  81. def find_faces_in_image(image_path):
  82. image = face_recognition.load_image_file(image_path)
  83. face_locations = face_recognition.face_locations(image)
  84. face_encodings = face_recognition.face_encodings(image, face_locations)
  85. found_faces = []
  86. for face_encoding in face_encodings:
  87. matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=0.35)
  88. if True in matches:
  89. first_match_index = matches.index(True)
  90. name = known_face_names[first_match_index]
  91. found_faces.append(name)
  92. if found_faces:
  93. return True
  94. else:
  95. return False
  96. if __name__ == '__main__':
  97. app = create_app()
  98. app.run(host='0.0.0.0', port=5000)