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)