Bmo411 commited on
Commit
a45d2d7
·
verified ·
1 Parent(s): 00b55a6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +121 -48
app.py CHANGED
@@ -4,11 +4,9 @@ import numpy as np
4
  import cv2
5
  from huggingface_hub import hf_hub_download
6
  import time
 
7
 
8
- # Descargar modelo desde Hugging Face
9
- model_path = hf_hub_download(repo_id="Bmo411/DenoisingAutoencoder", filename="autoencoder_complete_model_Fourier.keras")
10
- model = tf.keras.models.load_model(model_path)
11
-
12
  from tensorflow.keras.saving import register_keras_serializable
13
 
14
  @register_keras_serializable()
@@ -24,14 +22,51 @@ def inverse_fourier_transform(x):
24
  complex_fourier = tf.complex(real_part, imag_part)
25
  return tf.abs(tf.signal.ifft2d(complex_fourier))
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  def degrade_image(image, downscale_factor=4):
28
  """Reduce la calidad de la imagen reduciendo su tamaño y volviéndola a escalar."""
29
  h, w = image.shape[:2]
30
-
 
 
 
 
31
  # Reducir tamaño (forzando pérdida de calidad)
32
- small_img = cv2.resize(image, (w // downscale_factor, h // downscale_factor), interpolation=cv2.INTER_AREA)
 
33
 
34
- # Volver a escalarla al tamaño original SIN mejorar calidad (interpolación brusca)
35
  degraded_img = cv2.resize(small_img, (w, h), interpolation=cv2.INTER_NEAREST)
36
 
37
  return degraded_img
@@ -39,7 +74,15 @@ def degrade_image(image, downscale_factor=4):
39
  def preprocess_image(image, std_dev=0.1, downscale_factor=4, target_size=(256, 256)):
40
  """Recibe una imagen en numpy array, la degrada en calidad, le agrega ruido y la normaliza."""
41
 
42
- # Reducir calidad primero
 
 
 
 
 
 
 
 
43
  degraded_img = degrade_image(image, downscale_factor)
44
 
45
  # Redimensionar a tamaño esperado por el modelo
@@ -49,55 +92,85 @@ def preprocess_image(image, std_dev=0.1, downscale_factor=4, target_size=(256, 2
49
  resized_img = resized_img.astype(np.float32) / 255.0
50
 
51
  # Agregar ruido gaussiano
52
- noise = np.random.normal(0, std_dev, resized_img.shape) # Media=0, desviación estándar=std_dev
53
- noisy_img = resized_img + noise # Sumar el ruido a la imagen
54
- noisy_img = np.clip(noisy_img, 0, 1) # Asegurar valores en el rango [0,1]
55
 
56
  return noisy_img
57
 
 
 
 
58
  def Denoiser(imagen):
59
  """Aplica el modelo autoencoder para eliminar ruido de la imagen."""
 
60
 
61
- # Convertir imagen de entrada a array NumPy y asegurarse de que está en formato correcto
62
- imagen = np.array(imagen) # Convertir de PIL a NumPy
63
-
64
- # Preprocesar imagen (degradarla y agregar ruido)
65
- noisy_image = preprocess_image(imagen)
66
-
67
- # Expandir dimensiones para que tenga el formato correcto para el modelo (batch_size, h, w, c)
68
- noisy_image_input = np.expand_dims(noisy_image, axis=0)
69
-
70
- # Medir el tiempo de la predicción
71
- start_time = time.time()
72
-
73
- # Predecir con el autoencoder
74
- reconstructed = model.predict(noisy_image_input)[0] # Quitar batch_size
75
-
76
- prediction_time = time.time() - start_time
77
- print(f"Tiempo de predicción: {prediction_time} segundos")
78
-
79
- # Asegurarse de que la imagen restaurada esté en el rango [0, 255] para la visualización
80
- noisy_image = np.uint8(noisy_image * 255)
81
- reconstructed = np.uint8(reconstructed * 255)
82
-
83
- return noisy_image, reconstructed
84
-
85
- # Verificar si TensorFlow está utilizando la GPU
86
- physical_devices = tf.config.list_physical_devices('GPU')
87
- if physical_devices:
88
- print("TensorFlow está utilizando la GPU")
89
- else:
90
- print("TensorFlow no está utilizando la GPU")
91
-
92
- # Crear interfaz en Gradio con dos salidas de imagen
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  demo = gr.Interface(
94
  fn=Denoiser,
95
- inputs=gr.Image(type="numpy"), # Para que Gradio pase la imagen como un array de NumPy
96
- outputs=[gr.Image(type="numpy", label="Imagen con Ruido"),
97
- gr.Image(type="numpy", label="Imagen Restaurada")],
 
 
98
  title="Autoencoder para Denoising",
99
- description="Este modelo de autoencoder reduce el ruido en imágenes. Sube una imagen y el modelo generará una versión restaurada."
 
 
 
 
100
  )
101
 
102
  # Lanzar la aplicación en Gradio
103
- demo.launch()
 
 
4
  import cv2
5
  from huggingface_hub import hf_hub_download
6
  import time
7
+ import os
8
 
9
+ # Registrar las funciones personalizadas
 
 
 
10
  from tensorflow.keras.saving import register_keras_serializable
11
 
12
  @register_keras_serializable()
 
22
  complex_fourier = tf.complex(real_part, imag_part)
23
  return tf.abs(tf.signal.ifft2d(complex_fourier))
24
 
25
+ # Configuración de GPU para TensorFlow
26
+ physical_devices = tf.config.list_physical_devices('GPU')
27
+ if physical_devices:
28
+ print("GPU disponible. Configurando...")
29
+ try:
30
+ # Permitir crecimiento de memoria según sea necesario
31
+ for gpu in physical_devices:
32
+ tf.config.experimental.set_memory_growth(gpu, True)
33
+ print("Configuración de GPU completada")
34
+ except Exception as e:
35
+ print(f"Error en configuración de GPU: {e}")
36
+ else:
37
+ print("No se detectó GPU. El procesamiento será más lento.")
38
+
39
+ # Descargar modelo desde Hugging Face (con caché)
40
+ cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "huggingface")
41
+ model_path = hf_hub_download(
42
+ repo_id="Bmo411/DenoisingAutoencoder",
43
+ filename="autoencoder_complete_model_Fourier.keras",
44
+ cache_dir=cache_dir
45
+ )
46
+ print(f"Modelo cargado desde: {model_path}")
47
+
48
+ # Cargar el modelo una sola vez
49
+ model = tf.keras.models.load_model(model_path)
50
+
51
+ # Crear versión optimizada para inferencia
52
+ @tf.function(jit_compile=True)
53
+ def predict_optimized(input_tensor):
54
+ return model(input_tensor, training=False)
55
+
56
+ # Funciones de preprocesamiento optimizadas
57
  def degrade_image(image, downscale_factor=4):
58
  """Reduce la calidad de la imagen reduciendo su tamaño y volviéndola a escalar."""
59
  h, w = image.shape[:2]
60
+
61
+ # Verificar tamaño mínimo
62
+ if h < downscale_factor*4 or w < downscale_factor*4:
63
+ return image # Evitar downscaling excesivo en imágenes pequeñas
64
+
65
  # Reducir tamaño (forzando pérdida de calidad)
66
+ small_img = cv2.resize(image, (w // downscale_factor, h // downscale_factor),
67
+ interpolation=cv2.INTER_AREA)
68
 
69
+ # Volver a escalarla al tamaño original
70
  degraded_img = cv2.resize(small_img, (w, h), interpolation=cv2.INTER_NEAREST)
71
 
72
  return degraded_img
 
74
  def preprocess_image(image, std_dev=0.1, downscale_factor=4, target_size=(256, 256)):
75
  """Recibe una imagen en numpy array, la degrada en calidad, le agrega ruido y la normaliza."""
76
 
77
+ # Verificar si la imagen es a color o en escala de grises
78
+ if len(image.shape) == 2:
79
+ # Convertir a RGB si es escala de grises
80
+ image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)
81
+ elif image.shape[2] == 4:
82
+ # Convertir de RGBA a RGB si tiene canal alpha
83
+ image = cv2.cvtColor(image, cv2.COLOR_RGBA2RGB)
84
+
85
+ # Reducir calidad
86
  degraded_img = degrade_image(image, downscale_factor)
87
 
88
  # Redimensionar a tamaño esperado por el modelo
 
92
  resized_img = resized_img.astype(np.float32) / 255.0
93
 
94
  # Agregar ruido gaussiano
95
+ noise = np.random.normal(0, std_dev, resized_img.shape)
96
+ noisy_img = resized_img + noise
97
+ noisy_img = np.clip(noisy_img, 0, 1)
98
 
99
  return noisy_img
100
 
101
+ # Variable para medir el tiempo total de la primera ejecución
102
+ first_run = True
103
+
104
  def Denoiser(imagen):
105
  """Aplica el modelo autoencoder para eliminar ruido de la imagen."""
106
+ global first_run
107
 
108
+ # Verificar que la imagen no sea None
109
+ if imagen is None:
110
+ return None, None
111
+
112
+ # Convertir imagen de entrada a array NumPy
113
+ imagen = np.array(imagen)
114
+
115
+ # Verificar dimensiones de la imagen
116
+ if len(imagen.shape) < 2:
117
+ return None, None
118
+
119
+ try:
120
+ # Preprocesar imagen (degradarla y agregar ruido)
121
+ noisy_image = preprocess_image(imagen)
122
+
123
+ # Expandir dimensiones para el formato del modelo
124
+ noisy_image_input = np.expand_dims(noisy_image, axis=0)
125
+
126
+ # Medir el tiempo de la predicción
127
+ start_time = time.time()
128
+
129
+ # Predecir con el autoencoder utilizando la función optimizada
130
+ reconstructed = predict_optimized(noisy_image_input).numpy()[0]
131
+
132
+ prediction_time = time.time() - start_time
133
+
134
+ if first_run:
135
+ print(f"Primera ejecución: {prediction_time:.2f} segundos")
136
+ first_run = False
137
+ else:
138
+ print(f"Tiempo de predicción: {prediction_time:.2f} segundos")
139
+
140
+ # Asegurarse de que las imágenes estén en el rango [0, 255]
141
+ noisy_image = np.uint8(noisy_image * 255)
142
+ reconstructed = np.uint8(reconstructed * 255)
143
+
144
+ return noisy_image, reconstructed
145
+
146
+ except Exception as e:
147
+ print(f"Error en el procesamiento: {e}")
148
+ return None, None
149
+
150
+ # Ejemplo para precalentamiento (warm-up) del modelo
151
+ try:
152
+ dummy_input = np.zeros((1, 256, 256, 3), dtype=np.float32)
153
+ _ = predict_optimized(dummy_input)
154
+ print("Modelo precalentado con éxito")
155
+ except Exception as e:
156
+ print(f"Error en precalentamiento: {e}")
157
+
158
+ # Crear interfaz en Gradio
159
  demo = gr.Interface(
160
  fn=Denoiser,
161
+ inputs=gr.Image(type="numpy"),
162
+ outputs=[
163
+ gr.Image(type="numpy", label="Imagen con Ruido"),
164
+ gr.Image(type="numpy", label="Imagen Restaurada")
165
+ ],
166
  title="Autoencoder para Denoising",
167
+ description="Este modelo de autoencoder reduce el ruido en imágenes. Sube una imagen y el modelo generará una versión restaurada.",
168
+ examples=[
169
+ "https://raw.githubusercontent.com/gradio-app/gradio/main/demo/english_htr/images/Create%20a%20free%20Gradio%20account%20to%20access%20our%20most%20powerful%20features.jpeg"
170
+ ],
171
+ cache_examples=True
172
  )
173
 
174
  # Lanzar la aplicación en Gradio
175
+ if __name__ == "__main__":
176
+ demo.launch(share=False)