Enoder commited on
Commit
cd026f5
·
verified ·
1 Parent(s): fa77944

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -90
app.py CHANGED
@@ -2,109 +2,76 @@ import streamlit as st
2
  import numpy as np
3
  from PIL import Image
4
  import random
5
- import time
6
  import io
7
 
8
- # Configuration de la page Streamlit
9
- st.title("Générateur d'images d'animaux")
10
- st.write("Choisissez un animal pour générer une image ou téléchargez une image à déchiffrer.")
11
 
12
- # Initialisation des variables
13
- validation_data = {}
14
- auto_training_data = {}
15
- rejected_pixel_data = {}
 
 
 
16
 
17
- # Fonction pour créer une image aléatoire basée sur les données de pixels de l'image importée
18
- def create_image_from_data(base_data, label):
19
  width, height = 300, 300
20
- image = np.zeros((height, width, 3), dtype=np.uint8)
21
 
 
22
  for i in range(height):
23
  for j in range(width):
24
- # Utilisation des gradients de couleurs autour de pixels voisins
25
- if (i, j) in base_data:
26
- avg_color = base_data[(i, j)]
 
 
 
27
  else:
28
- # Génère une couleur aléatoire proche du thème
29
- avg_color = [random.randint(100, 200), random.randint(100, 200), random.randint(100, 200)]
30
-
31
- # Appliquer les valeurs du dégradé en fonction de la proximité des pixels rejetés
32
- if (i, j) in rejected_pixel_data:
33
- avg_color = np.clip(np.array(avg_color) * 0.8, 0, 255)
34
-
35
- image[i, j] = avg_color
36
 
37
- return Image.fromarray(image.astype(np.uint8))
 
 
38
 
39
- # Fonction pour extraire les données de pixels de l'image téléchargée
40
- def extract_pixel_data(image):
41
- width, height = image.size
42
- pixels = image.load()
43
- pixel_data = {}
44
-
45
- for i in range(width):
46
- for j in range(height):
47
- pixel_data[(i, j)] = pixels[i, j] # Enregistrer la couleur du pixel
48
-
49
- return pixel_data
50
 
51
- # Fonction pour traiter l'image téléchargée
52
- def process_uploaded_image(uploaded_file):
53
- image = Image.open(uploaded_file).resize((300, 300))
54
- return extract_pixel_data(image)
55
 
56
- # Fonction pour gérer la validation des images
57
- def validate_image(is_valid, label, base_data):
58
- if is_valid:
59
- validation_data[label] = base_data
60
- else:
61
- rejected_pixel_data.update(base_data) # Enregistre les pixels de l'image rejetée
62
 
63
- # Interface utilisateur
64
- animal = st.radio("Sélectionnez un animal :", ("chat", "chien", "cheval"))
65
- uploaded_file = st.file_uploader("Ou téléchargez une image (JPG, PNG)", type=["jpg", "jpeg", "png"])
66
 
67
- # Génération de l'image à partir de données de pixels de l'image importée
68
  if uploaded_file:
69
- base_data = process_uploaded_image(uploaded_file)
70
- st.image(Image.fromarray(np.array([[base_data.get((i, j), (255, 255, 255)) for i in range(300)] for j in range(300)], dtype=np.uint8)), caption="Image importée décryptée", use_column_width=True)
71
- else:
72
- base_data = None
73
-
74
- if st.button("Générer une image"):
75
- if base_data:
76
- img = create_image_from_data(base_data, animal)
77
- else:
78
- st.warning("Veuillez d'abord importer une image pour guider la génération.")
79
- img = create_image_from_data({}, animal) # Génération aléatoire si aucune image n'est importée
80
-
81
- st.image(img, caption=f"Image générée pour un {animal}", use_column_width=True)
82
-
83
- # Boutons de validation
84
- if st.button("Oui"):
85
- validate_image(True, animal, base_data)
86
- st.success("Image validée!")
87
- elif st.button("Non"):
88
- validate_image(False, animal, base_data)
89
- st.error("Image rejetée et données enregistrées pour améliorer la génération future!")
90
-
91
- # Bouton pour réinitialiser le processus
92
- if st.button("Réinitialiser"):
93
- validation_data.clear()
94
- rejected_pixel_data.clear()
95
- st.success("Le processus a été réinitialisé.")
96
-
97
- # Champ de texte pour données manuelles
98
- if st.button("Don"):
99
- don_text = st.text_area("Entrez vos données :", "")
100
- if st.button("Envoyer"):
101
- if don_text:
102
- auto_training_data['data'] = don_text
103
- st.success("Données envoyées!")
104
- else:
105
- st.error("Le champ de texte ne peut pas être vide.")
106
-
107
- # Démarrer le processus automatiquement après 3 secondes si le champ 'Don' n'est pas rempli
108
- if 'data' not in auto_training_data:
109
- time.sleep(3)
110
- st.success("Démarrage automatique du processus d'apprentissage...")
 
2
  import numpy as np
3
  from PIL import Image
4
  import random
 
5
  import io
6
 
7
+ # Initialisation des données pour éviter les erreurs répétées
8
+ error_data = {}
 
9
 
10
+ # Fonction pour traiter et redimensionner l'image importée
11
+ def process_uploaded_image(uploaded_file):
12
+ # Ouvrir et redimensionner l'image importée
13
+ image = Image.open(uploaded_file).resize((300, 300))
14
+ # Convertir l'image en tableau de pixels pour analyse
15
+ pixel_data = np.array(image)
16
+ return pixel_data
17
 
18
+ # Fonction pour générer une image basée sur les pixels environnants
19
+ def generate_image_based_on_pixels(base_pixels, label, avoid_data=None):
20
  width, height = 300, 300
21
+ generated_image = np.zeros((height, width, 3), dtype=np.uint8)
22
 
23
+ # Parcourir les pixels pour générer l'image
24
  for i in range(height):
25
  for j in range(width):
26
+ # Choisir des valeurs de pixels similaires aux pixels environnants de l'image importée
27
+ if i > 0 and j > 0:
28
+ # Prendre en compte le pixel précédent, celui au-dessus et en diagonale
29
+ avg_pixel = (
30
+ base_pixels[i-1, j] + base_pixels[i, j-1] + base_pixels[i-1, j-1]
31
+ ) // 3
32
  else:
33
+ # Premier pixel arbitraire
34
+ avg_pixel = base_pixels[i, j]
 
 
 
 
 
 
35
 
36
+ # Éviter les valeurs problématiques des erreurs enregistrées
37
+ if avoid_data and (i, j) in avoid_data:
38
+ avg_pixel = (avg_pixel + np.array([random.randint(0, 50) for _ in range(3)])) % 255
39
 
40
+ generated_image[i, j] = avg_pixel
 
 
 
 
 
 
 
 
 
 
41
 
42
+ return Image.fromarray(generated_image)
 
 
 
43
 
44
+ # Interface utilisateur pour télécharger et afficher l'image importée
45
+ st.title("Générateur d'images d'animaux basé sur l'image importée")
46
+ st.write("Choisissez un animal pour générer une image ou téléchargez une image comme référence.")
 
 
 
47
 
48
+ # Téléchargement de l'image importée
49
+ uploaded_file = st.file_uploader("Téléchargez une image de référence (JPG ou PNG)", type=["jpg", "jpeg", "png"])
 
50
 
51
+ # Génération d'image selon la référence téléchargée
52
  if uploaded_file:
53
+ # Traiter l'image téléchargée et afficher l'aperçu
54
+ base_pixels = process_uploaded_image(uploaded_file)
55
+ st.image(Image.fromarray(base_pixels), caption="Image importée de référence", use_column_width=True)
56
+
57
+ # Choisir l'animal et générer une nouvelle image basée sur cette référence
58
+ animal = st.selectbox("Sélectionnez un animal :", ["chat", "chien", "cheval"])
59
+ if st.button("Générer une image"):
60
+ generated_image = generate_image_based_on_pixels(base_pixels, animal, avoid_data=error_data.get(animal))
61
+ st.image(generated_image, caption=f"Image générée pour un {animal}", use_column_width=True)
62
+
63
+ # Options de validation de l'image générée
64
+ if st.button("Oui"):
65
+ st.success("Image validée!")
66
+ elif st.button("Non"):
67
+ # Enregistrer les données d'erreurs pour les prochains essais
68
+ error_data[animal] = error_data.get(animal, set())
69
+ for i in range(300):
70
+ for j in range(300):
71
+ error_data[animal].add((i, j))
72
+ st.error("Image rejetée et erreurs enregistrées!")
73
+
74
+ # Bouton pour réinitialiser les erreurs
75
+ if st.button("Réinitialiser les erreurs"):
76
+ error_data.clear()
77
+ st.success("Les erreurs précédentes ont été réinitialisées.")