Docfile commited on
Commit
4e90819
1 Parent(s): deddb46

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +121 -0
app.py ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify, send_from_directory
2
+ from flask_cors import CORS # Importe CORS
3
+ from deepface import DeepFace
4
+ import os
5
+ import tempfile
6
+ import shutil
7
+ import uuid
8
+
9
+ app = Flask(__name__, static_folder='static')
10
+ CORS(app) # Active CORS pour toutes les routes de l'application
11
+
12
+ # Configuration pour l'upload des fichiers
13
+ UPLOAD_FOLDER = 'static/uploads' # Utilise le dossier 'static' pour servir les fichiers statiques
14
+ ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg'}
15
+ app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
16
+ app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # Limite à 16MB
17
+
18
+ # Fonction pour vérifier l'extension des fichiers
19
+ def allowed_file(filename):
20
+ return '.' in filename and \
21
+ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
22
+
23
+ # Fonction pour générer un nom de fichier unique
24
+ def unique_filename(filename):
25
+ name, ext = os.path.splitext(filename)
26
+ new_name = f"{name}-{uuid.uuid4().hex}{ext}"
27
+ return new_name
28
+
29
+ # Route pour servir les fichiers statiques (y compris le HTML, CSS, JS et les images uploadées)
30
+ @app.route('/')
31
+ def index():
32
+ return send_from_directory(app.static_folder, 'index.html')
33
+
34
+ # Route pour la comparaison de visages
35
+ @app.route('/verify', methods=['POST'])
36
+ def verify_faces():
37
+ if 'image1' not in request.files or 'image2' not in request.files:
38
+ return jsonify({'error': 'Deux images sont requises pour la comparaison.'}), 400
39
+
40
+ image1 = request.files['image1']
41
+ image2 = request.files['image2']
42
+
43
+ if image1.filename == '' or image2.filename == '':
44
+ return jsonify({'error': 'Les noms de fichiers ne peuvent pas être vides.'}), 400
45
+
46
+ if image1 and allowed_file(image1.filename) and image2 and allowed_file(image2.filename):
47
+ temp_dir = tempfile.mkdtemp(dir=app.config['UPLOAD_FOLDER'])
48
+
49
+ # Sauvegarder les images temporairement avec des noms de fichiers uniques
50
+ image1_filename = unique_filename(image1.filename)
51
+ image2_filename = unique_filename(image2.filename)
52
+ image1_path = os.path.join(temp_dir, image1_filename)
53
+ image2_path = os.path.join(temp_dir, image2_filename)
54
+ image1.save(image1_path)
55
+ image2.save(image2_path)
56
+
57
+ try:
58
+ result = DeepFace.verify(img1_path=image1_path, img2_path=image2_path)
59
+
60
+ # Renvoyer les résultats de la comparaison et les URLs des images
61
+ result['image1_url'] = os.path.join(app.config['UPLOAD_FOLDER'], image1_filename)
62
+ result['image2_url'] = os.path.join(app.config['UPLOAD_FOLDER'], image2_filename)
63
+
64
+ # Déplacer les images du dossier temporaire vers le dossier d'upload
65
+ shutil.move(image1_path, os.path.join(app.config['UPLOAD_FOLDER'], image1_filename))
66
+ shutil.move(image2_path, os.path.join(app.config['UPLOAD_FOLDER'], image2_filename))
67
+
68
+ # Nettoyer le dossier temporaire
69
+ os.rmdir(temp_dir)
70
+
71
+ return jsonify(result)
72
+ except Exception as e:
73
+ # Nettoyer en cas d'erreur
74
+ if os.path.exists(temp_dir):
75
+ shutil.rmtree(temp_dir, ignore_errors=True)
76
+ return jsonify({'error': str(e)}), 500
77
+ else:
78
+ return jsonify({'error': 'Extensions de fichiers non autorisées.'}), 400
79
+
80
+ # Route pour l'analyse d'un visage
81
+ @app.route('/analyze', methods=['POST'])
82
+ def analyze_face():
83
+ if 'image' not in request.files:
84
+ return jsonify({'error': 'Aucune image fournie.'}), 400
85
+
86
+ image = request.files['image']
87
+
88
+ if image.filename == '':
89
+ return jsonify({'error': 'Le nom de fichier ne peut pas être vide.'}), 400
90
+
91
+ if image and allowed_file(image.filename):
92
+ temp_dir = tempfile.mkdtemp(dir=app.config['UPLOAD_FOLDER'])
93
+ image_filename = unique_filename(image.filename)
94
+ image_path = os.path.join(temp_dir, image_filename)
95
+ image.save(image_path)
96
+
97
+ try:
98
+ result = DeepFace.analyze(img_path=image_path, actions=['age', 'gender', 'race', 'emotion'])
99
+
100
+ # Renvoyer les résultats de l'analyse et l'URL de l'image
101
+ result['image_url'] = os.path.join(app.config['UPLOAD_FOLDER'], image_filename)
102
+
103
+ # Déplacer l'image du dossier temporaire vers le dossier d'upload
104
+ shutil.move(image_path, os.path.join(app.config['UPLOAD_FOLDER'], image_filename))
105
+
106
+ # Nettoyer le dossier temporaire
107
+ os.rmdir(temp_dir)
108
+
109
+ return jsonify(result)
110
+ except Exception as e:
111
+ # Nettoyer en cas d'erreur
112
+ if os.path.exists(temp_dir):
113
+ shutil.rmtree(temp_dir, ignore_errors=True)
114
+ return jsonify({'error': str(e)}), 500
115
+ else:
116
+ return jsonify({'error': 'Extension de fichier non autorisée.'}), 400
117
+
118
+ if __name__ == '__main__':
119
+ if not os.path.exists(UPLOAD_FOLDER):
120
+ os.makedirs(UPLOAD_FOLDER)
121
+ app.run(debug=True)