JDomingoDelgadoAlonso commited on
Commit
2283654
·
1 Parent(s): 0b1ff79
Files changed (2) hide show
  1. app3.py +67 -53
  2. requirements.txt +2 -1
app3.py CHANGED
@@ -7,21 +7,34 @@ import torch
7
  from transformers import AutoModelForCausalLM, AutoTokenizer
8
 
9
  # Detectar si hay GPU
10
- device = "cuda" if torch.cuda.is_available() else "cpu"
11
 
12
- # Cargar el modelo de Stable Diffusion
13
  pipe = StableDiffusionPipeline.from_pretrained(
14
- "CompVis/stable-diffusion-v1-4", # Modelo general para fantasía
15
- torch_dtype=torch.float16 if device == "cuda" else torch.float32,
16
- revision="fp16" if device == "cuda" else None,
17
- use_auth_token=True # Asegúrate de estar logueado en Hugging Face CLI o usar token
18
  )
19
  pipe = pipe.to(device)
20
 
21
- # Función para analizar la imagen y obtener una descripción literal
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  def analizar_rostro(image):
23
  image_np = np.array(image)
24
-
25
  result = DeepFace.analyze(image_np, actions=["age", "gender", "emotion", "race"], enforce_detection=False)
26
 
27
  if isinstance(result, list):
@@ -39,68 +52,67 @@ def analizar_rostro(image):
39
  "latino hispanic": "latino/hispano"
40
  }
41
  color_piel = raza.get(result.get('dominant_race', '').lower(), "de piel desconocida")
 
 
42
 
43
- # Asignar valores predeterminados para ojos y cabello
44
- color_ojos = "con ojos azules" # Valor predeterminado
45
- color_pelo = "y pelo rubio" # Valor predeterminado
46
-
47
- descripcion_literal = (
48
  f"Una persona {color_piel}, {color_ojos} {color_pelo}, de aproximadamente {result.get('age', 'una edad desconocida')} años, "
49
  f"que parece estar {result.get('dominant_emotion', 'sin emoción destacada')}. Esta persona es {gender_text}."
50
  )
51
- return descripcion_literal
52
-
53
- # Cargar el modelo GPT-Neo o GPT-J y su tokenizador desde Hugging Face
54
- model_name = "EleutherAI/gpt-neo-1.3B" # Modelo GPT-Neo 1.3B
55
- model = AutoModelForCausalLM.from_pretrained(model_name)
56
- tokenizer = AutoTokenizer.from_pretrained(model_name)
57
 
 
58
  def generar_fantasia(descripcion_literal):
59
- # Agregar descripción breve de ropa mágica y lugar fantástico
60
- prompt = (
61
- f"{descripcion_literal} Esta persona lleva una capa brillante que cambia de color según la luz. "
62
- "Su atuendo está adornado con gemas que brillan con una luz etérea. "
63
- "Está en un mundo lleno de paisajes impresionantes: castillos flotantes, cielos con auroras mágicas, "
64
- "y un bosque donde los árboles hablan y el aire está lleno de magia."
65
  )
66
 
67
- # Generar el texto basado en el prompt
68
- inputs = tokenizer(prompt, return_tensors="pt")
69
-
70
- # Generar la salida con el modelo, controlando la longitud y la creatividad
71
  outputs = model.generate(
72
  **inputs,
73
- max_new_tokens=50, # Limitar la longitud del texto para que no se enrede
74
- num_return_sequences=1, # Solo una salida
75
- temperature=0.7, # Control de creatividad
76
- no_repeat_ngram_size=2, # Evitar repeticiones
77
- top_p=0.9, # Nucleus sampling
78
- top_k=50 # Limitar las opciones de palabras
79
  )
80
 
81
- # Decodificar la salida y asegurarse de que solo generemos lo necesario
82
- generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
 
83
 
84
- # Asegurarse de que no repita el prompt y solo genere lo necesario
85
- if generated_text.startswith(prompt):
86
- generated_text = generated_text[len(prompt):].strip()
87
 
88
- # Devolver la descripción literal junto con lo generado (ropa mágica + lugar fantástico)
89
- return descripcion_literal + " " + generated_text.strip()
 
 
90
 
 
 
 
91
 
92
- # Generar imagen con Stable Diffusion
93
- def generar_imagen_fantasia(descripcion_fantasia):
94
- # Genera la imagen usando el modelo Stable Diffusion
95
- image = pipe(descripcion_fantasia).images[0]
 
 
 
 
 
 
 
 
96
  return image
97
 
98
- # Interfaz con Gradio
99
  with gr.Blocks() as demo:
100
  with gr.Row():
101
  image_input = gr.Image(type="pil", label="Sube tu imagen")
102
  descripcion_output = gr.Textbox(label="Descripción literal", interactive=True)
103
-
104
  with gr.Row():
105
  boton_fantasia = gr.Button("Generar personaje de fantasía")
106
  descripcion_fantasia_output = gr.Textbox(label="Descripción de fantasía", interactive=False)
@@ -109,13 +121,15 @@ with gr.Blocks() as demo:
109
  boton_imagen = gr.Button("Generar imagen de fantasía")
110
  output_image = gr.Image(label="Imagen de fantasía")
111
 
112
- # Procesos de análisis y generación de fantasía
113
  image_input.change(analizar_rostro, inputs=image_input, outputs=descripcion_output)
114
  boton_fantasia.click(generar_fantasia, inputs=descripcion_output, outputs=descripcion_fantasia_output)
115
  boton_imagen.click(generar_imagen_fantasia, inputs=descripcion_fantasia_output, outputs=output_image)
116
 
117
  print(f"Usando dispositivo: {device}")
118
- import torch
119
- print("CUDA disponible:", torch.cuda.is_available())
120
- print("Dispositivo actual:", torch.cuda.get_device_name(0) if torch.cuda.is_available() else "Ninguno")
121
- demo.launch()
 
 
 
 
7
  from transformers import AutoModelForCausalLM, AutoTokenizer
8
 
9
  # Detectar si hay GPU
10
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
11
 
12
+ # Cargar modelo de difusión especializado en fantasía (modelo público)
13
  pipe = StableDiffusionPipeline.from_pretrained(
14
+ "nitrosocke/Arcane-Diffusion", # o el que prefieras
15
+ torch_dtype=torch.float16 if device.type == "cuda" else torch.float32
 
 
16
  )
17
  pipe = pipe.to(device)
18
 
19
+ # Modelo GPT-Neo para enriquecer la descripción
20
+ model_name = "EleutherAI/gpt-neo-1.3B"
21
+ model = AutoModelForCausalLM.from_pretrained(model_name).to(device)
22
+ 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):
 
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
 
79
  )
80
 
81
+ generated = tokenizer.decode(outputs[0], skip_special_tokens=True)
82
+ if generated.startswith(prompt_base):
83
+ generated = generated[len(prompt_base):].strip()
84
 
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)
 
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()
requirements.txt CHANGED
@@ -7,4 +7,5 @@ tf-keras
7
  diffusers==0.32.2
8
  accelerate==1.5.2
9
  pydantic==2.10.6
10
- hf_xet
 
 
7
  diffusers==0.32.2
8
  accelerate==1.5.2
9
  pydantic==2.10.6
10
+ hf_xet
11
+ scipy