python_attendance_image/app4.py

94 lines
3.2 KiB
Python

import os
from flask import Flask, request, jsonify
import face_recognition
import pickle
from PIL import Image
import numpy as np
app = Flask(__name__)
UPLOAD_FOLDER = 'student_roll/uploads/'
FACE_DATA_FOLDER = 'student_roll/face_data/'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(FACE_DATA_FOLDER, exist_ok=True)
def convert_image_to_8bit_rgb(image_path):
with Image.open(image_path) as img:
if img.mode != 'RGB':
img = img.convert('RGB')
img = img.convert('RGB') # Ensure conversion to 8-bit per channel
img_array = np.array(img)
return img_array
@app.route('/upload', methods=['POST'])
def upload_image():
if 'image' not in request.files:
return jsonify({"error": "No image part in the request"}), 400
file = request.files['image']
if file.filename == '':
return jsonify({"error": "No selected file"}), 400
student_roll = request.form.get('student_roll')
if not student_roll:
return jsonify({"error": "Student roll number is required"}), 400
file_path = os.path.join(UPLOAD_FOLDER, f"{student_roll}.jpg")
file.save(file_path)
try:
# Convert image to 8-bit RGB if necessary
image = convert_image_to_8bit_rgb(file_path)
face_encodings = face_recognition.face_encodings(image)
if not face_encodings:
return jsonify({"error": "No face found in the image"}), 400
face_data_path = os.path.join(FACE_DATA_FOLDER, f"{student_roll}.pkl")
with open(face_data_path, 'wb') as f:
pickle.dump(face_encodings[0], f)
return jsonify({"message": "Image and face data uploaded successfully"}), 200
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/recognize_student', methods=['POST'])
def recognize_student():
if 'image' not in request.files:
return jsonify({"error": "No image part in the request"}), 400
file = request.files['image']
if file.filename == '':
return jsonify({"error": "No selected file"}), 400
file_path = os.path.join(UPLOAD_FOLDER, "temp.jpg")
file.save(file_path)
try:
# Convert image to 8-bit RGB if necessary
image = convert_image_to_8bit_rgb(file_path)
face_encodings = face_recognition.face_encodings(image)
if not face_encodings:
return jsonify({"error": "No face found in the image"}), 400
uploaded_face_encoding = face_encodings[0]
# Load all stored face data
for face_data_file in os.listdir(FACE_DATA_FOLDER):
with open(os.path.join(FACE_DATA_FOLDER, face_data_file), 'rb') as f:
known_face_encoding = pickle.load(f)
matches = face_recognition.compare_faces([known_face_encoding], uploaded_face_encoding)
if matches[0]:
student_roll = os.path.splitext(face_data_file)[0]
return jsonify({"student_roll": student_roll}), 200
return jsonify({"error": "No matching student found"}), 404
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0", port=5005)