diff --git a/app.py b/app.py index bd2cf98..3f2cc27 100644 --- a/app.py +++ b/app.py @@ -1,30 +1,53 @@ import os -import numpy as np from PIL import Image - -# Étape 1 : Télécharger des données -data_dir = 'donnees' -emotion_classes = ['happy', 'sad', 'angry'] -num_images_per_class = 100 - -for emotion in emotion_classes: - for i in range(num_images_per_class): - filename = f'{emotion}_{i}.jpg' - image_path = os.path.join(data_dir, emotion, filename) - img = Image.open(image_path) - img_array = np.array(img) - # Prétraitement des données - img_array = img_array / 255.0 - # Stocker les images prêtes à être utilisées par le modèle - img_array = np.reshape(img_array, (1, 224, 224, 3)) - # Étape 2 : Prétraitement des données - img_array = np.concatenate((img_array, np.zeros((100, 224, 224, 3)))) - print(f'Données pour {emotion} téléchargées avec succès.') - -# Étape 3 : Formation du modèle +import numpy as np +from tensorflow.keras.preprocessing.image import load_img, img_to_array from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense +import sys +# Chemin vers vos données +data_dir = 'donnees' + +# Chargement des images de personnes contentes +happy_dir = os.path.join(data_dir, 'happy') +images_happy = [] +for filename in os.listdir(happy_dir): + img_path = os.path.join(happy_dir, filename) + img = load_img(img_path, target_size=(224, 224)) + img_array = img_to_array(img) + images_happy.append(img_array) + +x_happy = np.array(images_happy) / 255.0 +y_happy = np.ones((len(images_happy),)) # étiquettes : tous les images sont de personnes contentes (1) + +# Chargement des images de personnes tristes +sad_dir = os.path.join(data_dir, 'sad') +images_sad = [] +for filename in os.listdir(sad_dir): + img_path = os.path.join(sad_dir, filename) + img = load_img(img_path, target_size=(224, 224)) + img_array = img_to_array(img) + images_sad.append(img_array) + +x_sad = np.array(images_sad) / 255.0 +y_sad = np.zeros((len(images_sad),)) # étiquettes : tous les images sont de personnes tristes (0) + +# Préparation des données d'entraînement et de test +x_happy = np.array(images_happy) / 255.0 +y_happy = np.ones((len(images_happy),)) # étiquettes : tous les images sont de personnes contentes (1) +x_sad = np.array(images_sad) / 255.0 +y_sad = np.zeros((len(images_sad),)) # étiquettes : tous les images sont de personnes tristes (0) + +x_train = np.concatenate((x_happy, x_sad)) +y_train = np.concatenate((y_happy, y_sad)) + +# Séparation des données en entraînement et de test +train_size = int(0.8 * len(x_train)) +x_train, x_test = x_train[:train_size], x_train[train_size:] +y_train, y_test = y_train[:train_size], y_train[train_size:] + +# Création du modèle de reconnaissance d'émotion model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3))) model.add(MaxPooling2D((2, 2))) @@ -34,12 +57,42 @@ model.add(Conv2D(128, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Flatten()) model.add(Dense(128, activation='relu')) -model.add(Dense(len(emotion_classes), activation='softmax')) +model.add(Dense(1, activation='sigmoid')) # Compilation du modèle -model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) +model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # Entraînement du modèle -from sklearn.model_selection import train_test_split -X_train, X_val, y_train, y_val = train_test_split(img_array, np.zeros((num_images_per_class * len(emotion_classes), 3)), test_size=0.2) -model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_val, y_val)) \ No newline at end of file +model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_test, y_test)) + +# Évaluation du modèle +loss, accuracy = model.evaluate(x_test, y_test) +print(f'Pertinence : {accuracy:.2f}') + +# Chargement de l'image à tester +img_path = sys.argv[1] + +# Ouvre l'image avec OpenCV +img = load_img(img_path, target_size=(224, 224)) + +# Convertit l'image en tableau NumPy +img_array = img_to_array(img) + +# Prétraitement de l'image (normalisation des pixels) +img_array = img_array / 255.0 + +# Prédiction de l'émotion avec le modèle +prediction = model.predict(np.array([img_array])) + +# Récupération de la probabilité de contenu et de tristesse +content_prob = prediction[0][0] +sadness_prob = 1 - content_prob + +print(f"Probabilité de contenu : {content_prob:.2f}") +print(f"Probabilité de tristesse : {sadness_prob:.2f}") + +# Vous pouvez également utiliser une fonction pour déterminer si l'émotion est plus proche du contenu ou de la tristesse +if content_prob > sadness_prob: + print("L'image semble être un sourire !") +else: + print("L'image semble être une expression triste.") \ No newline at end of file