python_attendance_image/app6.py

87 lines
3.2 KiB
Python

from flask import Flask, request, jsonify
import os
import face_recognition
import pickle
from werkzeug.utils import secure_filename
from time import time
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads/'
app.config['STUDENT_DATA_FILE'] = 'students_data.pkl'
if not os.path.exists(app.config['UPLOAD_FOLDER']):
os.makedirs(app.config['UPLOAD_FOLDER'])
# Load or initialize student data
if os.path.exists(app.config['STUDENT_DATA_FILE']):
with open(app.config['STUDENT_DATA_FILE'], 'rb') as f:
students_db = pickle.load(f)
else:
students_db = {}
def save_student_data():
with open(app.config['STUDENT_DATA_FILE'], 'wb') as f:
pickle.dump(students_db, f)
@app.route('/upl', methods=['POST'])
def upload_image():
if 'face' not in request.files or 'student_id' not in request.form:
return jsonify({'error': 'Image or student_id not provided'}), 400
image = request.files['face']
student_id = request.form['student_id']
timestamp = int(time())
filename = secure_filename(f"{timestamp}.jpg")
student_folder = os.path.join(app.config['UPLOAD_FOLDER'], student_id)
if not os.path.exists(student_folder):
os.makedirs(student_folder)
filepath = os.path.join(student_folder, filename)
image.save(filepath)
# Load the image file into a numpy array
image_array = face_recognition.load_image_file(filepath)
# Get the face encoding for the image
face_encodings = face_recognition.face_encodings(image_array)
if len(face_encodings) > 0:
# Assuming the first face found in the image is the correct one
students_db[student_id] = face_encodings[0]
save_student_data()
return jsonify({'message': 'Image uploaded and student registered successfully', 'student_id': student_id}), 200
else:
return jsonify({'error': 'No faces found in the image'}), 400
@app.route('/rec', methods=['POST'])
def recognize_image():
if 'image' not in request.files:
return jsonify({'error': 'Image not provided'}), 400
image = request.files['image']
# Load the uploaded image file into a numpy array
unknown_image = face_recognition.load_image_file(image)
# Get the face encodings for the uploaded image
unknown_encodings = face_recognition.face_encodings(unknown_image)
if len(unknown_encodings) > 0:
unknown_encoding = unknown_encodings[0]
best_match_id = None
best_match_score = None
for student_id, known_encoding in students_db.items():
# Calculate the distance between the known encoding and the uploaded image encoding
distance = face_recognition.face_distance([known_encoding], unknown_encoding)[0]
# Convert distance to accuracy score (the closer the distance, the higher the accuracy)
accuracy_score = (1 - distance) * 100
if best_match_score is None or accuracy_score > best_match_score:
best_match_id = student_id
best_match_score = accuracy_score
if best_match_id:
return jsonify({'student_id': best_match_id, 'accuracy_score': best_match_score}), 200
return jsonify({'error': 'Student not recognized'}), 404
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0", port=5005)