face_detection / app.py
arshtech's picture
Update app.py
0618ef0 verified
from flask import Flask, render_template, request, jsonify
import cv2
import numpy as np
import base64
import io
from PIL import Image
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = Flask(__name__)
# Initialize face detector
try:
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
logger.info("Face cascade classifier loaded successfully")
except Exception as e:
logger.error(f"Error loading face cascade: {e}")
face_cascade = None
def detect_faces(image_data, scale_factor=1.1):
"""Detect faces in image and return results"""
try:
if face_cascade is None:
raise Exception("Face detector not initialized")
# Convert base64 image to numpy array
image_data = image_data.split(',')[1] # Remove data:image/jpeg;base64,
image_bytes = base64.b64decode(image_data)
image = Image.open(io.BytesIO(image_bytes))
image_np = np.array(image)
# Convert to grayscale for face detection
gray_image = cv2.cvtColor(image_np, cv2.COLOR_RGB2GRAY)
# Detect faces
faces = face_cascade.detectMultiScale(
gray_image,
scaleFactor=scale_factor,
minNeighbors=5,
minSize=(30, 30)
)
# Draw bounding boxes and labels
for (x, y, w, h) in faces:
cv2.rectangle(image_np, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.putText(image_np, f"Face", (x, y-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
# Convert back to base64
result_image = Image.fromarray(image_np)
buffered = io.BytesIO()
result_image.save(buffered, format="JPEG")
result_base64 = base64.b64encode(buffered.getvalue()).decode()
# Simple age/gender estimation (placeholder)
results = []
for i, (x, y, w, h) in enumerate(faces):
import random
ages = ["20-25", "26-32", "33-40", "41-50", "51-60"]
genders = ["Male", "Female"]
results.append({
'id': i + 1,
'age': random.choice(ages),
'gender': random.choice(genders),
'position': {'x': int(x), 'y': int(y), 'width': int(w), 'height': int(h)}
})
return f"data:image/jpeg;base64,{result_base64}", results
except Exception as e:
logger.error(f"Error in detect_faces: {e}")
raise e
@app.route('/')
def index():
logger.info("Index page accessed")
return render_template('index.html')
@app.route('/detect', methods=['POST'])
def detect():
try:
data = request.json
image_data = data['image']
scale_factor = float(data.get('scale', 1.1))
result_image, face_data = detect_faces(image_data, scale_factor)
return jsonify({
'success': True,
'result_image': result_image,
'faces_detected': len(face_data),
'face_data': face_data
})
except Exception as e:
logger.error(f"Error in detect endpoint: {e}")
return jsonify({
'success': False,
'error': str(e)
})
@app.route('/health')
def health():
return jsonify({'status': 'healthy', 'face_detector_loaded': face_cascade is not None})
if __name__ == '__main__':
logger.info("Starting Flask application...")
app.run(host='0.0.0.0', port=5000, debug=False)