Spaces:
Runtime error
Runtime error
| 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 | |
| def index(): | |
| logger.info("Index page accessed") | |
| return render_template('index.html') | |
| 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) | |
| }) | |
| 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) |