Spaces:
Runtime error
Runtime error
File size: 3,623 Bytes
5a6a88a 120bc6c 00dc7c2 5a6a88a 0618ef0 00dc7c2 0618ef0 00dc7c2 5a6a88a 0618ef0 5a6a88a 00dc7c2 5a6a88a 00dc7c2 5a6a88a 0618ef0 5a6a88a 00dc7c2 0618ef0 00dc7c2 11dd192 00dc7c2 0618ef0 00dc7c2 11dd192 0618ef0 00dc7c2 0618ef0 5a6a88a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
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) |