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)