from flask import Flask, render_template, request, jsonify from deepface import DeepFace import os import tempfile import shutil app = Flask(__name__) # Configuration pour l'upload des images (facultatif, pour stocker les images temporairement) UPLOAD_FOLDER = 'uploads' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg'} def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS def process_image(image_path): """ Traite une image avec DeepFace (détection, alignement, etc.). Vous pouvez personnaliser cette fonction en fonction de vos besoins. """ try: # Exemple d'extraction des visages avec alignement et détection faces = DeepFace.extract_faces(img_path=image_path, detector_backend='retinaface', align=True) if len(faces) > 0 : return faces[0]['facial_area'] else: return None except Exception as e: print(f"Erreur lors du traitement de l'image : {e}") return None @app.route('/') def index(): return render_template('index.html') @app.route('/compare', methods=['POST']) def compare(): # Gestion des fichiers uploadés if 'file1' not in request.files or 'file2' not in request.files: return jsonify({'error': 'Aucun fichier sélectionné'}), 400 file1 = request.files['file1'] file2 = request.files['file2'] if file1.filename == '' or file2.filename == '': return jsonify({'error': 'Aucun fichier sélectionné'}), 400 if file1 and allowed_file(file1.filename) and file2 and allowed_file(file2.filename): # Créer un dossier temporaire pour stocker les images temp_dir = tempfile.mkdtemp(prefix="face_compare_", dir=app.config['UPLOAD_FOLDER']) # Enregistre les fichiers dans le dossier temporaire file1_path = os.path.join(temp_dir, file1.filename) file2_path = os.path.join(temp_dir, file2.filename) file1.save(file1_path) file2.save(file2_path) # Traitement des images (vous pouvez personnaliser cette partie) processed_img1 = process_image(file1_path) processed_img2 = process_image(file2_path) if processed_img1 is None or processed_img2 is None: # Supprimer le dossier temporaire et son contenu shutil.rmtree(temp_dir) return jsonify({'error': 'Aucun visage détecté dans une ou plusieurs images'}), 400 try: # Comparaison des visages avec DeepFace result = DeepFace.verify( img1_path=file1_path, img2_path=file2_path, model_name="VGG-Face", detector_backend="retinaface", distance_metric="cosine", enforce_detection=False ) # Formater la réponse response_data = { 'verified': result['verified'], 'similarity': round((1 - result['distance']) * 100, 1) if result['verified'] else round((1 - result['distance']) * 100, 1) } # Supprimer le dossier temporaire et son contenu shutil.rmtree(temp_dir) return jsonify(response_data) except Exception as e: # Supprimer le dossier temporaire et son contenu shutil.rmtree(temp_dir) print(f"Erreur lors de la comparaison des visages : {e}") return jsonify({'error': str(e)}), 500 else: return jsonify({'error': 'Type de fichier non autorisé'}), 400 if __name__ == '__main__': # Créer le dossier d'upload si nécessaire os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) app.run(debug=True) # Mettre debug=False en production