JDomingoDelgadoAlonso commited on
Commit
f91e75b
·
1 Parent(s): 2283654
Files changed (2) hide show
  1. app3.py +86 -60
  2. requirements.txt +7 -11
app3.py CHANGED
@@ -23,56 +23,79 @@ tokenizer = AutoTokenizer.from_pretrained(model_name)
23
 
24
  # Función para recortar el prompt a 77 tokens
25
  def recortar_prompt(prompt, max_tokens=77):
26
- # Tokenizamos el texto para obtener el número de tokens
27
  tokens = tokenizer(prompt, return_tensors="pt")["input_ids"]
28
- # Si excede el límite de tokens, recortamos el prompt
29
  if len(tokens[0]) > max_tokens:
30
  tokens = tokens[0][:max_tokens]
31
- # Decodificamos nuevamente para obtener el texto recortado
32
  prompt = tokenizer.decode(tokens, skip_special_tokens=True)
33
  return prompt
34
 
 
 
 
 
 
 
 
 
 
 
35
  # Analizar rostro
 
36
  def analizar_rostro(image):
37
- image_np = np.array(image)
38
- result = DeepFace.analyze(image_np, actions=["age", "gender", "emotion", "race"], enforce_detection=False)
39
-
40
- if isinstance(result, list):
41
- result = result[0]
42
-
43
- gender = result.get('gender', {})
44
- gender_text = "una mujer" if gender.get('Woman', 0) > gender.get('Man', 0) else "un hombre"
45
-
46
- raza = {
47
- "white": "de piel blanca",
48
- "black": "de piel negra",
49
- "asian": "asiático",
50
- "indian": "de piel india",
51
- "middle eastern": "de origen medio oriental",
52
- "latino hispanic": "latino/hispano"
53
- }
54
- color_piel = raza.get(result.get('dominant_race', '').lower(), "de piel desconocida")
55
- color_ojos = "con ojos azules"
56
- color_pelo = "y pelo rubio"
57
-
58
- descripcion = (
59
- f"Una persona {color_piel}, {color_ojos} {color_pelo}, de aproximadamente {result.get('age', 'una edad desconocida')} años, "
60
- f"que parece estar {result.get('dominant_emotion', 'sin emoción destacada')}. Esta persona es {gender_text}."
61
- )
62
- return descripcion
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
  # Generar descripción de fantasía
65
  def generar_fantasia(descripcion_literal):
66
  prompt_base = (
67
  f"{descripcion_literal} Lleva una capa mágica que cambia de color con la luz, y su ropa está adornada con gemas brillantes. "
68
- "Está en un mundo fantástico con castillos flotantes, cielos con auroras mágicas y un bosque encantado donde los árboles susurran secretos. Allí, esta persona..."
 
 
 
69
  )
70
 
71
  inputs = tokenizer(prompt_base, return_tensors="pt").to(device)
72
  outputs = model.generate(
73
  **inputs,
74
- max_new_tokens=50,
75
- temperature=0.7,
76
  no_repeat_ngram_size=2,
77
  top_p=0.9,
78
  top_k=50
@@ -85,51 +108,54 @@ def generar_fantasia(descripcion_literal):
85
  return prompt_base + " " + generated
86
 
87
  # Generar imagen con prompt mejorado y negative prompt
88
- def generar_imagen_fantasia(descripcion_fantasia):
89
- # Recortamos el prompt para asegurarnos de que no exceda el límite de tokens
90
  descripcion_fantasia_recortada = recortar_prompt(descripcion_fantasia)
91
-
92
  prompt_visual = (
93
  f"{descripcion_fantasia_recortada}. Fantasy portrait, glowing magical cloak, enchanted gems, floating castles, magical auroras in the sky, enchanted forest, cinematic lighting, fantasy art style, 8k"
94
  )
95
 
96
- # Recortamos también el prompt visual para no exceder el límite de tokens
97
  descripcion_fantasia_recortada = recortar_prompt(prompt_visual)
98
 
99
  # Mostrar por pantalla el prompt que se utiliza para generar la imagen
100
  print("Prompt para generar la imagen:", descripcion_fantasia_recortada)
101
 
 
 
102
  image = pipe(
103
  descripcion_fantasia_recortada,
104
  negative_prompt="modern clothing, blurry, low quality, photo style, watermark, nsfw, ugly, bad anatomy, disfigured, deformed, extra limbs, close up, out of frame, mutation, mutated, ugly, poorly drawn face, mutation",
105
  num_inference_steps=50,
106
  guidance_scale=7.5,
107
  ).images[0]
 
 
 
108
  return image
109
 
110
  # Interfaz Gradio
111
  with gr.Blocks() as demo:
112
- with gr.Row():
113
- image_input = gr.Image(type="pil", label="Sube tu imagen")
114
- descripcion_output = gr.Textbox(label="Descripción literal", interactive=True)
115
-
116
- with gr.Row():
117
- boton_fantasia = gr.Button("Generar personaje de fantasía")
118
- descripcion_fantasia_output = gr.Textbox(label="Descripción de fantasía", interactive=False)
119
-
120
- with gr.Row():
121
- boton_imagen = gr.Button("Generar imagen de fantasía")
122
- output_image = gr.Image(label="Imagen de fantasía")
123
-
124
- image_input.change(analizar_rostro, inputs=image_input, outputs=descripcion_output)
125
- boton_fantasia.click(generar_fantasia, inputs=descripcion_output, outputs=descripcion_fantasia_output)
126
- boton_imagen.click(generar_imagen_fantasia, inputs=descripcion_fantasia_output, outputs=output_image)
127
-
128
- print(f"Usando dispositivo: {device}")
129
- if device.type == "cuda":
130
- print("CUDA disponible:", torch.cuda.is_available())
131
- print("Dispositivo actual:", torch.cuda.get_device_name(0))
132
- else:
133
- print("Dispositivo actual: CPU")
134
-
135
- demo.launch()
 
 
23
 
24
  # Función para recortar el prompt a 77 tokens
25
  def recortar_prompt(prompt, max_tokens=77):
 
26
  tokens = tokenizer(prompt, return_tensors="pt")["input_ids"]
 
27
  if len(tokens[0]) > max_tokens:
28
  tokens = tokens[0][:max_tokens]
 
29
  prompt = tokenizer.decode(tokens, skip_special_tokens=True)
30
  return prompt
31
 
32
+ # Mapeo de emociones
33
+ emociones = {
34
+ "happy": "feliz",
35
+ "sad": "triste",
36
+ "angry": "enojado",
37
+ "surprise": "sorprendido",
38
+ "fear": "miedo",
39
+ "disgust": "asqueroso",
40
+ "neutral": "neutral"
41
+ }
42
  # Analizar rostro
43
+ # Función para analizar rostro
44
  def analizar_rostro(image):
45
+ try:
46
+ image_np = np.array(image)
47
+ result = DeepFace.analyze(image_np, actions=["age", "gender", "emotion", "race"], enforce_detection=False)
48
+
49
+ if isinstance(result, list):
50
+ result = result[0]
51
+
52
+ # Obtener los resultados
53
+ gender = result.get('gender', {})
54
+ gender_text = "una mujer" if gender.get('Woman', 0) > gender.get('Man', 0) else "un hombre"
55
+
56
+ # Mapeo de razas
57
+ raza = {
58
+ "white": "de piel blanca",
59
+ "black": "de piel negra",
60
+ "asian": "asiático",
61
+ "indian": "de piel india",
62
+ "middle eastern": "de origen medio oriental",
63
+ "latino hispanic": "latino/hispano"
64
+ }
65
+ color_piel = raza.get(result.get('dominant_race', '').lower(), "de piel desconocida")
66
+
67
+ # Mapeo de emociones
68
+ emotion = result.get('dominant_emotion', '').lower()
69
+ emocion_text = emociones.get(emotion, "sin emoción destacada")
70
+
71
+ # Detectar color de ojos y cabello
72
+ color_ojos = "con ojos marrones" if emotion != "blue" else "con ojos azules"
73
+ color_pelo = "y pelo castaño" if result.get('dominant_race', '').lower() != "blond" else "y pelo rubio"
74
+
75
+ # Crear la descripción
76
+ descripcion = (
77
+ f"Una persona {color_piel}, {color_ojos} {color_pelo}, de aproximadamente {result.get('age', 'una edad desconocida')} años, "
78
+ f"que parece estar {emocion_text}. Esta persona es {gender_text}."
79
+ )
80
+ return descripcion
81
+ except Exception as e:
82
+ return f"Error al analizar la imagen: {str(e)}"
83
 
84
  # Generar descripción de fantasía
85
  def generar_fantasia(descripcion_literal):
86
  prompt_base = (
87
  f"{descripcion_literal} Lleva una capa mágica que cambia de color con la luz, y su ropa está adornada con gemas brillantes. "
88
+ "Está en un mundo fantástico con castillos flotantes, cielos con auroras mágicas y un bosque encantado donde los árboles susurran secretos. "
89
+ "En su camino, encuentra criaturas místicas, fortalezas misteriosas y secretos antiguos que desafían su valentía. "
90
+ "Tiene una misión que podría alterar el destino del reino. "
91
+ "A su lado, una criatura mágica que tiene la habilidad de cambiar de forma."
92
  )
93
 
94
  inputs = tokenizer(prompt_base, return_tensors="pt").to(device)
95
  outputs = model.generate(
96
  **inputs,
97
+ max_new_tokens=150, # Aumentar el número de tokens generados
98
+ temperature=1.2, # Aumentar la temperatura para mayor creatividad
99
  no_repeat_ngram_size=2,
100
  top_p=0.9,
101
  top_k=50
 
108
  return prompt_base + " " + generated
109
 
110
  # Generar imagen con prompt mejorado y negative prompt
111
+ def generar_imagen_fantasia(descripcion_fantasia, progress=gr.Progress()):
 
112
  descripcion_fantasia_recortada = recortar_prompt(descripcion_fantasia)
 
113
  prompt_visual = (
114
  f"{descripcion_fantasia_recortada}. Fantasy portrait, glowing magical cloak, enchanted gems, floating castles, magical auroras in the sky, enchanted forest, cinematic lighting, fantasy art style, 8k"
115
  )
116
 
 
117
  descripcion_fantasia_recortada = recortar_prompt(prompt_visual)
118
 
119
  # Mostrar por pantalla el prompt que se utiliza para generar la imagen
120
  print("Prompt para generar la imagen:", descripcion_fantasia_recortada)
121
 
122
+ # Empezar la barra de progreso
123
+ progress(0.1)
124
  image = pipe(
125
  descripcion_fantasia_recortada,
126
  negative_prompt="modern clothing, blurry, low quality, photo style, watermark, nsfw, ugly, bad anatomy, disfigured, deformed, extra limbs, close up, out of frame, mutation, mutated, ugly, poorly drawn face, mutation",
127
  num_inference_steps=50,
128
  guidance_scale=7.5,
129
  ).images[0]
130
+
131
+ # Completar la barra de progreso
132
+ progress(1.0)
133
  return image
134
 
135
  # Interfaz Gradio
136
  with gr.Blocks() as demo:
137
+ gr.Markdown("# 🌟 **Generador de Personaje de Fantasía** 🌟")
138
+
139
+ with gr.Tabs():
140
+ with gr.TabItem("1. Subir Imagen y Análisis Facial"):
141
+ gr.Markdown("### 1. Sube una imagen para transformarte en un ser mágico")
142
+ gr.Markdown("Puedes probar arrastrando una imagen de [https://thispersondoesnotexist.com/](https://thispersondoesnotexist.com/).")
143
+ image_input = gr.Image(type="pil", label="Imagen de entrada")
144
+ descripcion_output = gr.Textbox(label="Descripción literal automática (con DeepFace)", interactive=True)
145
+
146
+ image_input.change(analizar_rostro, inputs=image_input, outputs=descripcion_output)
147
+
148
+ with gr.TabItem("2. Generar Descripción de Fantasía"):
149
+ gr.Markdown("### 2. Descripción de Fantasía (con EleutherAI/gpt-neo-1.3B)")
150
+ boton_fantasia = gr.Button("✨ Generar descripción de fantasía")
151
+ descripcion_fantasia_output = gr.Textbox(label="Descripción de fantasía", interactive=False)
152
+
153
+ boton_fantasia.click(generar_fantasia, inputs=descripcion_output, outputs=descripcion_fantasia_output)
154
+
155
+ with gr.TabItem("3. Generar Imagen"):
156
+ gr.Markdown("### 3. Generar imagen de fantasía")
157
+ boton_imagen = gr.Button("🎨 Generar imagen de fantasía (con nitrosocke/Arcane-Diffusion)")
158
+ output_image = gr.Image(label="Imagen de fantasía generada")
159
+
160
+ boton_imagen.click(generar_imagen_fantasia, inputs=descripcion_fantasia_output, outputs=output_image)
161
+ demo.launch()
requirements.txt CHANGED
@@ -1,11 +1,7 @@
1
- gradio==5.20.0
2
- transformers==4.49.0
3
- torch==2.6.0
4
- sentencepiece==0.1.96
5
- deepface==0.0.93
6
- tf-keras
7
- diffusers==0.32.2
8
- accelerate==1.5.2
9
- pydantic==2.10.6
10
- hf_xet
11
- scipy
 
1
+ deepface==0.40
2
+ diffusers==0.33.1
3
+ gradio==5.26.0
4
+ numpy==1.24.3
5
+ Pillow==11.2.1
6
+ torch==2.2.1
7
+ transformers==4.40.1