Actualiser app.py

This commit is contained in:
the_booth 2024-08-27 23:48:42 +02:00
parent ecdaf5b5f4
commit c87f40f2fa

107
app.py
View File

@ -1,30 +1,53 @@
import os import os
import numpy as np
from PIL import Image from PIL import Image
import numpy as np
# Étape 1 : Télécharger des données from tensorflow.keras.preprocessing.image import load_img, img_to_array
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
from tensorflow.keras.models import Sequential from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense 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 = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3))) model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)))
model.add(MaxPooling2D((2, 2))) model.add(MaxPooling2D((2, 2)))
@ -34,12 +57,42 @@ model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2))) model.add(MaxPooling2D((2, 2)))
model.add(Flatten()) model.add(Flatten())
model.add(Dense(128, activation='relu')) model.add(Dense(128, activation='relu'))
model.add(Dense(len(emotion_classes), activation='softmax')) model.add(Dense(1, activation='sigmoid'))
# Compilation du modèle # 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 # Entraînement du modèle
from sklearn.model_selection import train_test_split model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_test, y_test))
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)) # É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.")