Menu iconMenu icon
Aprendizaje Profundo Generativo Edición Actualizada

Capítulo 3: Profundizando en las Redes Generativas Antagónicas (GANs)

3.4 Evaluación de GANs

Es fundamental para comprender la efectividad de las Redes Generativas Adversariales (GANs) realizar una evaluación adecuada. Este proceso de evaluación asegura que los datos generados por estas redes cumplan con los estándares de calidad previstos.

Esto no es una tarea sencilla, ya que, a diferencia de los modelos de aprendizaje automático tradicionales, las GANs no tienen una métrica de evaluación directa y sencilla. Esto se debe en gran medida a su objetivo principal: generar datos que sean, en su complejidad y detalle, lo más realistas posible.

En esta sección, exploraremos de manera exhaustiva los diversos métodos disponibles para la evaluación de las GANs. Examinaremos tanto los enfoques cuantitativos como cualitativos, analizando sus respectivos méritos y posibles desventajas. Además, exploraremos algunas de las métricas más comúnmente utilizadas en este campo de estudio. Para complementar esta discusión teórica, también proporcionaremos ejemplos prácticos para iluminar mejor los conceptos y técnicas discutidos.

3.4.1 Métricas de Evaluación Cuantitativa

Las métricas de evaluación cuantitativa ofrecen una gama de medidas objetivas que son cruciales para evaluar el rendimiento de las Redes Generativas Adversariales (GANs). Estas métricas sirven para proporcionar una evaluación clara, definitiva e imparcial de la efectividad de estas redes, y por lo tanto, son esenciales para comprender el rendimiento general y las posibles mejoras que podrían mejorar el funcionamiento de las GANs.

Algunas métricas comúnmente utilizadas incluyen:

1. Inception Score (IS):

El Inception Score (IS) es una métrica cuantitativa significativa utilizada para evaluar el rendimiento de las Redes Generativas Adversariales (GANs), particularmente en la calidad de las imágenes que generan. Se introdujo como un medio para cuantificar y calificar las imágenes generadas en función de dos factores principales: diversidad y calidad.

La diversidad se refiere a la gama de diferentes imágenes que la GAN puede producir. Un modelo que genera una variedad de imágenes, en lugar de producir repetidamente imágenes similares o idénticas, se consideraría que tiene una alta diversidad. Un puntaje más alto en diversidad refleja la capacidad de la GAN para capturar una amplia representación del conjunto de datos en el que se entrenó.

La calidad, por otro lado, se refiere a cuán 'reales' son las imágenes generadas o cuán cerca están de las imágenes reales en el conjunto de datos de entrenamiento. Las imágenes de alta calidad deben ser indistinguibles de las fotos reales, lo que demuestra que la GAN ha aprendido con precisión la distribución de datos del conjunto de entrenamiento.

El Inception Score utiliza una red preentrenada Inception v3 para calcular estos factores. Cada imagen generada se pasa a través de la red Inception, que produce una distribución de etiquetas condicional. Luego, el puntaje se calcula utilizando estas distribuciones, con la suposición de que los buenos modelos producirán imágenes diversas (alta entropía de la distribución marginal) pero también estarán seguros en sus predicciones para imágenes individuales (baja entropía de la distribución condicional).

Un Inception Score alto generalmente indica que la GAN está produciendo imágenes diversas y de alta calidad que son similares a los datos reales. Sin embargo, es importante tener en cuenta que, aunque el Inception Score puede ser una herramienta útil para evaluar y comparar GANs, no es perfecto y tiene sus limitaciones. Por ejemplo, depende en gran medida del modelo Inception para sus cálculos, lo que significa que su precisión está limitada por qué tan bien se haya entrenado el modelo Inception.

El Inception Score evalúa la calidad y la diversidad de las imágenes generadas. Utiliza una red preentrenada Inception v3 para calcular la distribución de etiquetas condicional $p(y|x)$ para cada imagen generada $x$ y la distribución de etiquetas marginal $p(y)$. El puntaje se da por:

IS(G)=exp(Ex[DKL(p(y∣x)∣∣p(y))])

Un Inception Score alto indica que las imágenes generadas son tanto diversas como de alta calidad.

2. Fréchet Inception Distance (FID):

La métrica FID calcula la similitud entre dos conjuntos de datos de imágenes. En este caso, se usa para comparar la distribución de las imágenes generadas con la distribución de las imágenes reales.

El cálculo del FID implica el uso de un modelo preentrenado Inception v3, un modelo que originalmente fue diseñado y entrenado para tareas de clasificación de imágenes. Este modelo se usa para extraer características tanto de las imágenes reales como de las generadas. Las características extraídas luego se representan como una distribución Gaussiana multivariante, caracterizada por una media y una covarianza.

Luego se calcula la distancia de Fréchet entre estas dos Gaussianas. Esta distancia proporciona una medida de la similitud entre los dos conjuntos de imágenes. Cuanto menor sea el puntaje FID, más cercanas serán las imágenes generadas a las imágenes reales en términos de las distribuciones de características. Por lo tanto, un FID más bajo indica que el modelo generativo ha realizado mejor la producción de imágenes más realistas.

En el contexto de las GANs, el puntaje FID se utiliza a menudo como una medida de evaluación para comparar el rendimiento de diferentes modelos o diferentes configuraciones del mismo modelo. Proporciona una evaluación más confiable y robusta que algunas otras métricas, como el Inception Score, ya que toma en cuenta la distribución completa de características multidimensionales, en lugar de solo observar distribuciones marginales y condicionales.

El puntaje FID mide la distancia entre las distribuciones de las imágenes reales y generadas en el espacio de características de una red preentrenada Inception v3. Puntajes FID más bajos indican que las imágenes generadas son más similares a las imágenes reales.

FID=∣∣μr−μg∣∣2+Tr(Σr+Σg−2(ΣrΣg)1/2)

donde (μr​,Σr​) and (μg,Σg) son la media y la covarianza de los vectores de características de las imágenes reales y generadas, respectivamente.

3. Precision y Recall para Distribuciones:

La Precisión y Recall para Distribuciones son medidas estadísticas utilizadas para evaluar el rendimiento de las Redes Generativas Adversariales (GANs), particularmente en términos de la calidad y diversidad de los datos que generan. Estas métricas se toman del campo de la recuperación de información y también se usan comúnmente para evaluar tareas de clasificación en el aprendizaje automático.

La precisión mide la calidad de las muestras generadas. En el contexto de las GANs, evalúa cuántas de las muestras generadas son 'reales' o están cerca de la distribución de datos real. Un puntaje alto en precisión implica que la mayoría de las muestras generadas son de alta calidad, asemejándose estrechamente a los datos reales. Indica que la GAN está haciendo un buen trabajo generando muestras que son casi indistinguibles de las muestras reales.

El recall, por otro lado, mide la cobertura de la distribución de datos reales por las muestras generadas. Evalúa si la GAN es capaz de generar muestras que cubran toda la gama de la distribución de datos reales. Un puntaje alto en recall implica que la GAN tiene una buena comprensión de la distribución de datos real y es capaz de generar muestras diversas que cubren diferentes aspectos de los datos reales.

Juntas, la precisión y el recall proporcionan una evaluación integral de las GANs. Valores altos de precisión y recall indican que la GAN está generando muestras de alta calidad que cubren la diversidad de los datos reales. Sin embargo, a menudo hay una compensación entre precisión y recall. Un modelo que se centra demasiado en obtener muestras de alta calidad podría perder la diversidad de los datos (alta precisión, bajo recall), mientras que un modelo que se centra en cubrir toda la distribución de datos podría generar más muestras de baja calidad (baja precisión, alto recall).

Para obtener una visión equilibrada del rendimiento del modelo, es común combinar la precisión y el recall en una sola métrica llamada puntaje F1. El puntaje F1 es la media armónica de precisión y recall, y da el mismo peso a ambas medidas. Un puntaje F1 alto indica que la GAN está funcionando bien en ambos aspectos, generando muestras diversas y de alta calidad.

La precisión mide la calidad de las muestras generadas, mientras que el recall mide la cobertura de la distribución de datos reales por las muestras generadas. Valores altos de precisión y recall indican que la GAN está generando muestras de alta calidad que cubren la diversidad de los datos reales.

Ejemplo: Calcular Inception Score y FID

A continuación, se muestra cómo puede calcular el Inception Score y el FID utilizando TensorFlow y modelos preentrenados:

import tensorflow as tf
import numpy as np
from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input
from scipy.linalg import sqrtm

# Function to calculate Inception Score
def calculate_inception_score(images, num_splits=10):
    model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))
    images = tf.image.resize(images, (299, 299))
    images = preprocess_input(images)
    preds = model.predict(images)

    scores = []
    for i in range(num_splits):
        part = preds[i * len(preds) // num_splits: (i + 1) * len(preds) // num_splits]
        py = np.mean(part, axis=0)
        scores.append(np.exp(np.mean([np.sum(p * np.log(p / py)) for p in part])))
    return np.mean(scores), np.std(scores)

# Function to calculate FID score
def calculate_fid(real_images, generated_images):
    model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))
    real_images = tf.image.resize(real_images, (299, 299))
    real_images = preprocess_input(real_images)
    gen_images = tf.image.resize(generated_images, (299, 299))
    gen_images = preprocess_input(gen_images)

    act1 = model.predict(real_images)
    act2 = model.predict(gen_images)

    mu1, sigma1 = act1.mean(axis=0), np.cov(act1, rowvar=False)
    mu2, sigma2 = act2.mean(axis=0), np.cov(act2, rowvar=False)

    ssdiff = np.sum((mu1 - mu2) ** 2.0)
    covmean = sqrtm(sigma1.dot(sigma2))

    if np.iscomplexobj(covmean):
        covmean = covmean.real

    fid = ssdiff + np.trace(sigma1 + sigma2 - 2.0 * covmean)
    return fid

# Generate some fake images using the trained GAN generator
noise = np.random.normal(0, 1, (1000, 100))
generated_images = generator.predict(noise)

# Calculate Inception Score
is_mean, is_std = calculate_inception_score(generated_images)
print(f"Inception Score: {is_mean} ± {is_std}")

# Calculate FID Score
real_images = x_train[np.random.choice(x_train.shape[0], 1000, replace=False)]
fid_score = calculate_fid(real_images, generated_images)
print(f"FID Score: {fid_score}")

Este ejemplo utiliza la biblioteca TensorFlow para calcular dos métricas clave para evaluar Redes Generativas Adversariales (GANs): el Inception Score (IS) y la Fréchet Inception Distance (FID). Estas métricas son esenciales para evaluar la calidad y diversidad de las imágenes sintéticas producidas por las GANs.

La primera función, calculate_inception_score, está diseñada para calcular el Inception Score. El Inception Score es una métrica que evalúa la calidad y diversidad de las imágenes producidas por una GAN. Lo hace utilizando un modelo preentrenado, específicamente el modelo InceptionV3, para hacer predicciones sobre las imágenes generadas. La función redimensiona las imágenes para que coincidan con la forma de entrada esperada por el modelo InceptionV3, las preprocesa para que coincidan con el formato que el modelo espera, y luego las pasa al modelo para obtener predicciones. Luego, calcula el puntaje basado en estas predicciones.

El cálculo del puntaje implica dividir las predicciones en varios subconjuntos (el número de los cuales está determinado por el parámetro num_splits), calcular la media de cada subconjunto y luego usar estas medias para calcular la divergencia KL entre la distribución de etiquetas predichas y la distribución uniforme. La divergencia KL mide cuánto difiere una distribución de probabilidad de una segunda distribución esperada. El Inception Score final es el exponencial de la media de la divergencia KL en todos los subconjuntos.

La segunda función, calculate_fid, se utiliza para calcular la Fréchet Inception Distance. La Fréchet Inception Distance es otra métrica para evaluar GANs, pero mide específicamente la similitud entre dos conjuntos de imágenes. En el contexto de las GANs, estos dos conjuntos son típicamente las imágenes reales del conjunto de entrenamiento y las imágenes sintéticas generadas por la GAN.

El cálculo del FID implica utilizar el mismo modelo InceptionV3 para extraer características tanto de las imágenes reales como de las generadas. Estas características se utilizan luego para crear una distribución Gaussiana multivariante, caracterizada por una media y una covarianza. Luego se calcula la distancia de Fréchet entre estas dos distribuciones Gaussianas. La distancia de Fréchet es una medida de similitud entre dos distribuciones, por lo que un puntaje FID más bajo indica que las imágenes generadas son más similares a las imágenes reales.

Después de definir estas dos funciones, el código procede a generar algunas imágenes falsas utilizando un generador de GAN. El generador se alimenta con ruido aleatorio, siguiendo una distribución normal, para generar estas imágenes sintéticas. El Inception Score y el FID para estas imágenes generadas se calculan utilizando las funciones definidas anteriormente. Finalmente, se imprimen los resultados de estos cálculos.

En resumen, este ejemplo proporciona una demostración práctica de cómo evaluar el rendimiento de una Red Generativa Adversarial (GAN) utilizando dos métricas comúnmente utilizadas: el Inception Score y la Fréchet Inception Distance. Ambas métricas proporcionan información valiosa sobre la calidad y diversidad de las imágenes generadas por la GAN, lo cual es crucial para evaluar la efectividad de la GAN.

Ejemplo de Fréchet Inception Distance (FID) para la Evaluación de GANs con TensorFlow

Aquí tienes un ejemplo completo de cómo calcular el FID para la evaluación de GANs utilizando TensorFlow:

  1. Dependencias:
import tensorflow as tf
from tensorflow.keras.applications import inception_v3
from tensorflow.keras.preprocessing import image
from scipy import linalg
import numpy as np

2. Modelo InceptionV3 para Extracción de Características:

def inception_model():
  """
  Loads the pre-trained InceptionV3 model for feature extraction.
  Removes the final classification layer.
  """
  model = inception_v3.InceptionV3(include_top=False, weights='imagenet')
  model.output = model.layers[-1].output
  return model

Esta función define inception_model que carga el modelo preentrenado InceptionV3 excluyendo la capa de clasificación final. Esta capa no es necesaria para el cálculo del FID, y solo queremos la representación de características aprendida por el modelo.

  1. Función de Preprocesamiento:
def preprocess_image(img_path):
  """
  Preprocesses an image for InceptionV3 input.
  """
  target_size = (299, 299)
  img = image.load_img(img_path, target_size=target_size)
  img = image.img_to_array(img)
  img = img / 255.0
  img = np.expand_dims(img, axis=0)
  return img

Esta función define preprocess_image, la cual toma una ruta de imagen y la preprocesa para la entrada de InceptionV3. Esto incluye redimensionar la imagen al tamaño objetivo (299x299 para InceptionV3) y normalización.

  1. Función de Extracción de Características:
def extract_features(model, img_paths):
  """
  Extracts features from a list of images using the InceptionV3 model.
  """
  features = []
  for img_path in img_paths:
    img = preprocess_image(img_path)
    feature = model.predict(img)
    features.append(feature)
  return np.array(features)

Esta función define extract_features, la cual toma el modelo InceptionV3 y una lista de rutas de imágenes. Itera a través de cada ruta, preprocesa la imagen, la alimenta al modelo y almacena las características extraídas en un array de NumPy.

  1. Función de Cálculo del FID:
def calculate_fid(real_imgs, generated_imgs):
  """
  Calculates the Fréchet Inception Distance (FID) between two sets of images.
  """
  # Load InceptionV3 model
  model = inception_model()

  # Extract features for real and generated images
  real_features = extract_features(model, real_imgs)
  generated_features = extract_features(model, generated_imgs)

  # Calculate statistics for real and generated features
  real_mean = np.mean(real_features, axis=0)
  real_cov = np.cov(real_features.reshape(real_features.shape[0], -1), rowvar=False)
  generated_mean = np.mean(generated_features, axis=0)
  generated_cov = np.cov(generated_features.reshape(generated_features.shape[0], -1), rowvar=False)

  # Calculate squared mean difference
  ssdiff = np.sum((real_mean - generated_mean)**2)

  # Calculate FID
  covmean = linalg.sqrtm(np.dot(real_cov, generated_cov))
  if np.iscomplexobj(covmean):
    covmean = covmean.real
  fid = ssdiff + np.trace(real_cov + generated_cov - 2.0 * covmean)
  return fid

Esta función define calculate_fid, la cual toma dos listas de rutas de imágenes (reales y generadas). Utiliza las funciones definidas previamente para extraer características de ambos conjuntos y luego calcula el FID. Aquí hay un desglose de los pasos clave:

  • Extrae características para las imágenes reales y generadas utilizando el modelo InceptionV3.
  • Calcula la media y la matriz de covarianza para ambos conjuntos de características.
  • Calcula la diferencia de medias al cuadrado entre las medias reales y generadas.
  • Calcula la raíz cuadrada del producto de las covarianzas.
  • Maneja posibles problemas de números complejos que surgen de la raíz cuadrada del producto.
  • El FID se define como la suma de las diferencias de medias al cuadrado.

Ejemplo de Precisión y Recall para Modelos Generativos con TensorFlow

Aunque no hay una implementación estándar utilizando TensorFlow para Precisión y Recall (PR) específicamente diseñados para modelos generativos, podemos explorar un enfoque similar aprovechando las características de Inception como se propone en el artículo "Assessing Generative Models via Precision and Recall". Aquí hay un desglose del concepto y un ejemplo de implementación:

  1. Comprendiendo PR para Modelos Generativos:
  • Precisión: Mide la calidad de las muestras generadas por el modelo. Una alta precisión indica que un mayor porcentaje de muestras generadas se asemejan a la distribución de datos reales.
  • Recall: Mide la capacidad del modelo para capturar la diversidad de la distribución de datos reales. Un alto recall indica que las muestras generadas cubren una gama más amplia de variaciones presentes en los datos reales.
  1. Emparejamiento de Características de Inception:

Este enfoque utiliza el modelo preentrenado InceptionV3 para extraer características tanto de los datos reales como de los generados. La idea es comparar estas características para evaluar qué tan bien se alinean los datos generados con la distribución de datos reales.

  1. Ejemplo de Implementación:
import tensorflow as tf
from tensorflow.keras.applications import inception_v3
from tensorflow.keras.preprocessing import image
import numpy as np

def inception_model():
  """
  Loads the pre-trained InceptionV3 model for feature extraction.
  """
  model = inception_v3.InceptionV3(include_top=False, weights='imagenet')
  model.output = model.layers[-1].output
  return model

def preprocess_image(img_path):
  """
  Preprocesses an image for InceptionV3 input.
  """
  target_size = (299, 299)
  img = image.load_img(img_path, target_size=target_size)
  img = image.img_to_array(img)
  img = img / 255.0
  img = np.expand_dims(img, axis=0)
  return img

def extract_features(model, img_paths):
  """
  Extracts features from a list of images using the InceptionV3 model.
  """
  features = []
  for img_path in img_paths:
    img = preprocess_image(img_path)
    feature = model.predict(img)
    features.append(feature)
  return np.array(features)

def compute_pr(real_features, generated_features):
  """
  Estimates precision and recall based on Inception feature distances.
  **Note:** This is a simplified approach and may not capture the full 
  complexity of PR for generative models.

  Parameters:
      real_features: NumPy array of features from real data.
      generated_features: NumPy array of features from generated data.

  Returns:
      precision: Estimated precision value.
      recall: Estimated recall value.
  """
  # Calculate pairwise distances between real and generated features
  real_distances = np.linalg.norm(real_features[:, np.newaxis] - generated_features, axis=2)

  # Threshold for considering a generated sample close to real data (hyperparameter)
  threshold = 0.5

  # Count samples within the threshold distance
  close_samples = np.sum(real_distances < threshold, axis=1)

  # Precision: Ratio of close generated samples to total generated samples
  precision = np.mean(close_samples / generated_features.shape[0])

  # Recall: Ratio of generated samples close to at least one real sample
  recall = np.mean(close_samples > 0)

  return precision, recall

# Example usage
model = inception_model()
real_imgs = ["path/to/real/image1.jpg", "path/to/real/image2.png"]
generated_imgs = ["path/to/generated/image1.jpg", "path/to/generated/image2.png"]

real_features = extract_features(model, real_imgs)
generated_features = extract_features(model, generated_imgs)

precision, recall = compute_pr(real_features, generated_features)

print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")

4. Nota Importante:

Este ejemplo proporciona un enfoque simplificado para estimar la Precisión y Recall (PR) para modelos generativos utilizando características de Inception. Utiliza un umbral de distancia para categorizar las muestras generadas como "cercanas" a los datos reales. Para una evaluación más completa, considere técnicas del artículo original que involucran la estimación de densidad del kernel y el cálculo de curvas PR en un rango de umbrales.

Evaluación de Modelos Generativos mediante Precisión y Recall: https://proceedings.neurips.cc/paper_files/paper/2018/file/f7696a9b362ac5a51c3dc8f098b73923-Paper.pdf

3.4.2 Evaluación Cualitativa

La evaluación cualitativa implica la inspección visual de las muestras generadas para evaluar su calidad. Este enfoque es subjetivo pero proporciona información valiosa sobre el realismo y la diversidad de los datos generados.

En el contexto de las Redes Generativas Adversariales (GANs), la evaluación cualitativa implica examinar de cerca las muestras generadas para evaluar su nivel de realismo y la diversidad que presentan. Esto puede implicar buscar cualquier artefacto visual, evaluar la claridad o el desenfoque de las muestras y verificar qué tan bien representan las muestras generadas la diversidad de los datos reales.

Por ejemplo, si la GAN está diseñada para generar imágenes de rostros, una evaluación cualitativa podría involucrar observar los rostros generados para ver qué tan bien se parecen a los rostros humanos reales y qué tan diversos son en términos de edad, género, etnia y otras características.

Aunque la evaluación cualitativa no proporciona una métrica concreta y numérica para evaluar el rendimiento como lo hace la evaluación cuantitativa, proporciona información valiosa que puede ayudar a mejorar el modelo. Por ejemplo, si el observador nota que las imágenes generadas son principalmente borrosas, esto podría indicar que el generador de la GAN no es lo suficientemente potente y necesita ser ajustado.

Además de la inspección visual, la evaluación cualitativa también puede involucrar la comparación con datos reales. Esto implica comparar las muestras generadas lado a lado con muestras de datos reales para evaluar qué tan similares son. Este método, aunque sigue siendo subjetivo, podría proporcionar una comparación más objetiva que la inspección visual por sí sola.

En general, la evaluación cualitativa juega un papel esencial en la evaluación del rendimiento de las Redes Generativas Adversariales. Si bien idealmente debería usarse junto con métodos cuantitativos para una evaluación más completa, puede proporcionar información valiosa que pueda guiar el ajuste fino del modelo.

Ejemplo: Inspección Visual de Imágenes Generadas

import matplotlib.pyplot as plt

# Generate new samples
noise = np.random.normal(0, 1, (10, 100))
generated_images = generator.predict(noise)

# Plot generated images
fig, axs = plt.subplots(1, 10, figsize=(20, 2))
for i, img in enumerate(generated_images):
    axs[i].imshow(img.squeeze(), cmap='gray')
    axs[i].axis('off')
plt.show()

En este ejemplo:

Este fragmento de código se centra en la visualización de los datos generados por la GAN. Comienza importando la biblioteca Matplotlib, que se usa extensamente en Python para crear visualizaciones estáticas, animadas e interactivas.

La primera parte del análisis implica la generación de nuevas muestras de datos. Esto se hace creando 'ruido', que son números aleatorios que siguen una distribución normal (en este caso, centrada en 0 con una desviación estándar de 1). Se crea un array de tamaño 10x100, donde cada fila es una muestra de ruido separada. Estas muestras de ruido sirven como entradas para el generador de la GAN, que las utiliza para crear nuevas muestras de datos. En este caso, se espera que el generador devuelva imágenes, de ahí el nombre 'generated_images'.

La segunda parte del análisis implica la visualización de estas imágenes generadas. Se crea una figura con una cuadrícula de 1 fila y 10 columnas, y un tamaño de 20x2. Cada celda en esta cuadrícula contendrá una de las imágenes generadas. Las imágenes se trazan una por una en cada celda. Las imágenes se comprimen (para eliminar las entradas de dimensión única de sus formas) y se convierten a escala de grises para mayor claridad visual. Los ejes también se desactivan para cada imagen, para que las imágenes mismas sean el foco de la visualización.

Una vez que todas las imágenes se han trazado, la figura se muestra usando plt.show(). Este comando revela toda la figura y sus subgráficos como una sola salida. Esta visualización proporcionaría una mirada a la diversidad y calidad de las imágenes generadas por la GAN, basándose en las entradas de ruido aleatorias iniciales.

Este tipo de visualización es extremadamente útil para evaluar qué tan bien ha aprendido la GAN a generar nuevos datos. Al inspeccionar visualmente las imágenes generadas, podemos tener una idea de cuán realistas se ven y cómo imitan los datos de entrenamiento. Esta evaluación cualitativa, aunque subjetiva, es una parte importante de la evaluación de la efectividad de las GANs.

3.4.3 Estudios de Usuario

El proceso de realizar estudios de usuario es una parte esencial para evaluar la calidad de los datos generados. Este método implica obtener valiosos comentarios de los participantes humanos que interactúan con los datos. El propósito principal de estos estudios es medir la calidad y realismo percibidos de las imágenes generadas por el sistema.

A los participantes en estos estudios se les suele pedir que proporcionen sus calificaciones sobre una variedad de criterios. Algunos de estos criterios pueden incluir aspectos como el realismo de las imágenes, la diversidad de las imágenes producidas y el atractivo visual general de las salidas generadas. Al solicitar comentarios sobre estos aspectos específicos, los investigadores pueden obtener una comprensión integral de qué tan bien se desempeña el sistema en términos de generación de datos.

Es importante tener en cuenta que los estudios de usuario ofrecen una ventaja significativa sobre otras formas de evaluación. A diferencia de confiar únicamente en la inspección visual, donde la evaluación puede ser algo subjetiva y propensa a sesgos, los estudios de usuario proporcionan una evaluación más objetiva y robusta del rendimiento del sistema.

Esto se debe al hecho de que incorporan una amplia gama de perspectivas de múltiples participantes, lo que mejora la fiabilidad y credibilidad de los resultados de la evaluación.

Ejemplo: Realización de un Estudio de Usuario

# Generate new samples for the user study
noise = np.random.normal(0, 1, (20, 100))
generated_images = generator.predict(noise)

# Save generated images to disk for user study
for i, img in enumerate(generated_images):
    plt.imsave(f'generated_image_{i}.png', img.squeeze(), cmap='gray')

# Instructions for the user study:
# 1. Show participants the saved generated images.
# 2. Ask participants to rate each image on a scale of 1 to 5 for realism and visual appeal.
# 3. Collect the ratings and analyze the results to assess the quality of the GAN.

Este ejemplo de código genera nuevas muestras de imágenes para un estudio de usuario. Crea ruido aleatorio y lo usa como entrada para un modelo generativo (el generador) para producir imágenes. Estas imágenes se guardan en el disco. El resto de los comentarios describen instrucciones para un estudio de usuario.

A los usuarios se les mostrarán las imágenes generadas y se les pedirá que las califiquen en una escala del 1 al 5 en términos de realismo y atractivo visual. Las calificaciones recopiladas se analizan luego para evaluar la calidad de la Red Generativa Adversarial (GAN) que produjo las imágenes.

3.4.4 Evaluación de Aplicaciones Específicas

Los criterios para evaluar las Redes Generativas Adversariales (GANs) pueden diferir significativamente según la aplicación particular para la cual se estén utilizando. Es esencial adaptar las métricas de evaluación para que se ajusten al propósito específico y las demandas de la aplicación en cuestión. Aquí hay algunos ejemplos:

  • Superresolución de Imágenes: En este caso, el objetivo es evaluar la calidad de las imágenes que han sido aumentadas de resolución. La evaluación debe centrarse en determinar la nitidez y claridad de las imágenes mejoradas, para lo cual se emplean típicamente métricas como la Relación Señal-Ruido Pico (PSNR) y el Índice de Similitud Estructural (SSIM). Estas son medidas cuantitativas que proporcionan una indicación clara del éxito del proceso de superresolución.
  • Generación de Texto: Cuando las GANs se utilizan para la generación de texto, el enfoque cambia a evaluar la fluidez y coherencia del texto que se ha generado. Este puede ser un proceso algo subjetivo, pero existen algunas métricas establecidas, como las puntuaciones BLEU o ROUGE, que proporcionan una medida objetiva de la calidad del texto generado.
  • Transferencia de Estilo: Para aplicaciones que implican transferencia de estilo, la evaluación debe centrarse en la consistencia y calidad artística de los estilos que se han transferido a las imágenes objetivo. Esto implica comparar las imágenes de salida con imágenes de referencia para determinar qué tan bien se ha capturado y transferido el estilo. La calidad de la transferencia de estilo a menudo puede ser una medida más subjetiva, ya que puede depender de las percepciones individuales de la calidad artística.

Ejemplo: Evaluación de Superresolución de Imágenes

Aquí se muestra un ejemplo de cómo evaluar una aplicación de superresolución de imágenes utilizando métricas como PSNR y SSIM:

from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.metrics import structural_similarity as ssim

# Low-resolution and high-resolution images
low_res_images = ...  # Load low-resolution images
high_res_images = ...  # Load corresponding high-resolution images

# Generate super-resolved images using the GAN generator
super_res_images = generator.predict(low_res_images)

# Calculate PSNR and SSIM for each image
psnr_values = [psnr(hr, sr) for hr, sr in zip(high_res_images, super_res_images)]
ssim_values = [ssim(hr, sr, multichannel=True) for hr, sr in zip(high_res_images, super_res_images)]

# Print average PSNR and SSIM
print(f"Average PSNR: {np.mean(psnr_values)}")
print(f"Average SSIM: {np.mean(ssim_values)}")

Este ejemplo de código calcula efectivamente el PSNR (Relación Señal-Ruido Pico) y el SSIM (Índice de Similitud Estructural) entre imágenes de alta resolución (HR) y sus correspondientes imágenes de superresolución (SR) generadas por una GAN.

Aquí hay un desglose de los pasos:

Importar Métricas:

  • peak_signal_noise_ratio (psnr) y structural_similarity (ssim) se importan desde skimage.metrics. Estas funciones se utilizan para calcular las métricas respectivas.

Cargar Imágenes:

  • low_res_images: Esta variable probablemente contiene las imágenes de baja resolución precargadas que deseas usar para la superresolución.
  • high_res_images: Esta variable contiene las imágenes de alta resolución correspondientes para comparación.

Generar Imágenes de Superresolución:

  • super_res_images = generator.predict(low_res_images): Esta línea asume que tienes un modelo GAN entrenado con una función generator que toma imágenes de baja resolución como entrada y predice imágenes de superresolución.

Calcular PSNR y SSIM:

  • El código itera a través de pares de imágenes HR y SR correspondientes usando zip.
  • psnr_values: Para cada par, calcula el PSNR entre las imágenes HR y SR usando la función psnr y añade el valor a una lista llamada psnr_values.
  • ssim_values: De manera similar, calcula el SSIM entre cada par de imágenes HR y SR usando la función ssim con multichannel=True (asumiendo imágenes RGB) y añade el valor a una lista llamada ssim_values.

Imprimir Valores Promedio:

  • np.mean(psnr_values) calcula el PSNR promedio en todos los pares de imágenes.
  • np.mean(ssim_values) calcula el SSIM promedio en todos los pares de imágenes.
  • Finalmente, el código imprime los valores promedio de PSNR y SSIM.

En general, este ejemplo de código evalúa efectivamente la calidad de las imágenes de superresolución generadas comparándolas con las imágenes de alta resolución originales utilizando las métricas PSNR y SSIM.

3.4 Evaluación de GANs

Es fundamental para comprender la efectividad de las Redes Generativas Adversariales (GANs) realizar una evaluación adecuada. Este proceso de evaluación asegura que los datos generados por estas redes cumplan con los estándares de calidad previstos.

Esto no es una tarea sencilla, ya que, a diferencia de los modelos de aprendizaje automático tradicionales, las GANs no tienen una métrica de evaluación directa y sencilla. Esto se debe en gran medida a su objetivo principal: generar datos que sean, en su complejidad y detalle, lo más realistas posible.

En esta sección, exploraremos de manera exhaustiva los diversos métodos disponibles para la evaluación de las GANs. Examinaremos tanto los enfoques cuantitativos como cualitativos, analizando sus respectivos méritos y posibles desventajas. Además, exploraremos algunas de las métricas más comúnmente utilizadas en este campo de estudio. Para complementar esta discusión teórica, también proporcionaremos ejemplos prácticos para iluminar mejor los conceptos y técnicas discutidos.

3.4.1 Métricas de Evaluación Cuantitativa

Las métricas de evaluación cuantitativa ofrecen una gama de medidas objetivas que son cruciales para evaluar el rendimiento de las Redes Generativas Adversariales (GANs). Estas métricas sirven para proporcionar una evaluación clara, definitiva e imparcial de la efectividad de estas redes, y por lo tanto, son esenciales para comprender el rendimiento general y las posibles mejoras que podrían mejorar el funcionamiento de las GANs.

Algunas métricas comúnmente utilizadas incluyen:

1. Inception Score (IS):

El Inception Score (IS) es una métrica cuantitativa significativa utilizada para evaluar el rendimiento de las Redes Generativas Adversariales (GANs), particularmente en la calidad de las imágenes que generan. Se introdujo como un medio para cuantificar y calificar las imágenes generadas en función de dos factores principales: diversidad y calidad.

La diversidad se refiere a la gama de diferentes imágenes que la GAN puede producir. Un modelo que genera una variedad de imágenes, en lugar de producir repetidamente imágenes similares o idénticas, se consideraría que tiene una alta diversidad. Un puntaje más alto en diversidad refleja la capacidad de la GAN para capturar una amplia representación del conjunto de datos en el que se entrenó.

La calidad, por otro lado, se refiere a cuán 'reales' son las imágenes generadas o cuán cerca están de las imágenes reales en el conjunto de datos de entrenamiento. Las imágenes de alta calidad deben ser indistinguibles de las fotos reales, lo que demuestra que la GAN ha aprendido con precisión la distribución de datos del conjunto de entrenamiento.

El Inception Score utiliza una red preentrenada Inception v3 para calcular estos factores. Cada imagen generada se pasa a través de la red Inception, que produce una distribución de etiquetas condicional. Luego, el puntaje se calcula utilizando estas distribuciones, con la suposición de que los buenos modelos producirán imágenes diversas (alta entropía de la distribución marginal) pero también estarán seguros en sus predicciones para imágenes individuales (baja entropía de la distribución condicional).

Un Inception Score alto generalmente indica que la GAN está produciendo imágenes diversas y de alta calidad que son similares a los datos reales. Sin embargo, es importante tener en cuenta que, aunque el Inception Score puede ser una herramienta útil para evaluar y comparar GANs, no es perfecto y tiene sus limitaciones. Por ejemplo, depende en gran medida del modelo Inception para sus cálculos, lo que significa que su precisión está limitada por qué tan bien se haya entrenado el modelo Inception.

El Inception Score evalúa la calidad y la diversidad de las imágenes generadas. Utiliza una red preentrenada Inception v3 para calcular la distribución de etiquetas condicional $p(y|x)$ para cada imagen generada $x$ y la distribución de etiquetas marginal $p(y)$. El puntaje se da por:

IS(G)=exp(Ex[DKL(p(y∣x)∣∣p(y))])

Un Inception Score alto indica que las imágenes generadas son tanto diversas como de alta calidad.

2. Fréchet Inception Distance (FID):

La métrica FID calcula la similitud entre dos conjuntos de datos de imágenes. En este caso, se usa para comparar la distribución de las imágenes generadas con la distribución de las imágenes reales.

El cálculo del FID implica el uso de un modelo preentrenado Inception v3, un modelo que originalmente fue diseñado y entrenado para tareas de clasificación de imágenes. Este modelo se usa para extraer características tanto de las imágenes reales como de las generadas. Las características extraídas luego se representan como una distribución Gaussiana multivariante, caracterizada por una media y una covarianza.

Luego se calcula la distancia de Fréchet entre estas dos Gaussianas. Esta distancia proporciona una medida de la similitud entre los dos conjuntos de imágenes. Cuanto menor sea el puntaje FID, más cercanas serán las imágenes generadas a las imágenes reales en términos de las distribuciones de características. Por lo tanto, un FID más bajo indica que el modelo generativo ha realizado mejor la producción de imágenes más realistas.

En el contexto de las GANs, el puntaje FID se utiliza a menudo como una medida de evaluación para comparar el rendimiento de diferentes modelos o diferentes configuraciones del mismo modelo. Proporciona una evaluación más confiable y robusta que algunas otras métricas, como el Inception Score, ya que toma en cuenta la distribución completa de características multidimensionales, en lugar de solo observar distribuciones marginales y condicionales.

El puntaje FID mide la distancia entre las distribuciones de las imágenes reales y generadas en el espacio de características de una red preentrenada Inception v3. Puntajes FID más bajos indican que las imágenes generadas son más similares a las imágenes reales.

FID=∣∣μr−μg∣∣2+Tr(Σr+Σg−2(ΣrΣg)1/2)

donde (μr​,Σr​) and (μg,Σg) son la media y la covarianza de los vectores de características de las imágenes reales y generadas, respectivamente.

3. Precision y Recall para Distribuciones:

La Precisión y Recall para Distribuciones son medidas estadísticas utilizadas para evaluar el rendimiento de las Redes Generativas Adversariales (GANs), particularmente en términos de la calidad y diversidad de los datos que generan. Estas métricas se toman del campo de la recuperación de información y también se usan comúnmente para evaluar tareas de clasificación en el aprendizaje automático.

La precisión mide la calidad de las muestras generadas. En el contexto de las GANs, evalúa cuántas de las muestras generadas son 'reales' o están cerca de la distribución de datos real. Un puntaje alto en precisión implica que la mayoría de las muestras generadas son de alta calidad, asemejándose estrechamente a los datos reales. Indica que la GAN está haciendo un buen trabajo generando muestras que son casi indistinguibles de las muestras reales.

El recall, por otro lado, mide la cobertura de la distribución de datos reales por las muestras generadas. Evalúa si la GAN es capaz de generar muestras que cubran toda la gama de la distribución de datos reales. Un puntaje alto en recall implica que la GAN tiene una buena comprensión de la distribución de datos real y es capaz de generar muestras diversas que cubren diferentes aspectos de los datos reales.

Juntas, la precisión y el recall proporcionan una evaluación integral de las GANs. Valores altos de precisión y recall indican que la GAN está generando muestras de alta calidad que cubren la diversidad de los datos reales. Sin embargo, a menudo hay una compensación entre precisión y recall. Un modelo que se centra demasiado en obtener muestras de alta calidad podría perder la diversidad de los datos (alta precisión, bajo recall), mientras que un modelo que se centra en cubrir toda la distribución de datos podría generar más muestras de baja calidad (baja precisión, alto recall).

Para obtener una visión equilibrada del rendimiento del modelo, es común combinar la precisión y el recall en una sola métrica llamada puntaje F1. El puntaje F1 es la media armónica de precisión y recall, y da el mismo peso a ambas medidas. Un puntaje F1 alto indica que la GAN está funcionando bien en ambos aspectos, generando muestras diversas y de alta calidad.

La precisión mide la calidad de las muestras generadas, mientras que el recall mide la cobertura de la distribución de datos reales por las muestras generadas. Valores altos de precisión y recall indican que la GAN está generando muestras de alta calidad que cubren la diversidad de los datos reales.

Ejemplo: Calcular Inception Score y FID

A continuación, se muestra cómo puede calcular el Inception Score y el FID utilizando TensorFlow y modelos preentrenados:

import tensorflow as tf
import numpy as np
from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input
from scipy.linalg import sqrtm

# Function to calculate Inception Score
def calculate_inception_score(images, num_splits=10):
    model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))
    images = tf.image.resize(images, (299, 299))
    images = preprocess_input(images)
    preds = model.predict(images)

    scores = []
    for i in range(num_splits):
        part = preds[i * len(preds) // num_splits: (i + 1) * len(preds) // num_splits]
        py = np.mean(part, axis=0)
        scores.append(np.exp(np.mean([np.sum(p * np.log(p / py)) for p in part])))
    return np.mean(scores), np.std(scores)

# Function to calculate FID score
def calculate_fid(real_images, generated_images):
    model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))
    real_images = tf.image.resize(real_images, (299, 299))
    real_images = preprocess_input(real_images)
    gen_images = tf.image.resize(generated_images, (299, 299))
    gen_images = preprocess_input(gen_images)

    act1 = model.predict(real_images)
    act2 = model.predict(gen_images)

    mu1, sigma1 = act1.mean(axis=0), np.cov(act1, rowvar=False)
    mu2, sigma2 = act2.mean(axis=0), np.cov(act2, rowvar=False)

    ssdiff = np.sum((mu1 - mu2) ** 2.0)
    covmean = sqrtm(sigma1.dot(sigma2))

    if np.iscomplexobj(covmean):
        covmean = covmean.real

    fid = ssdiff + np.trace(sigma1 + sigma2 - 2.0 * covmean)
    return fid

# Generate some fake images using the trained GAN generator
noise = np.random.normal(0, 1, (1000, 100))
generated_images = generator.predict(noise)

# Calculate Inception Score
is_mean, is_std = calculate_inception_score(generated_images)
print(f"Inception Score: {is_mean} ± {is_std}")

# Calculate FID Score
real_images = x_train[np.random.choice(x_train.shape[0], 1000, replace=False)]
fid_score = calculate_fid(real_images, generated_images)
print(f"FID Score: {fid_score}")

Este ejemplo utiliza la biblioteca TensorFlow para calcular dos métricas clave para evaluar Redes Generativas Adversariales (GANs): el Inception Score (IS) y la Fréchet Inception Distance (FID). Estas métricas son esenciales para evaluar la calidad y diversidad de las imágenes sintéticas producidas por las GANs.

La primera función, calculate_inception_score, está diseñada para calcular el Inception Score. El Inception Score es una métrica que evalúa la calidad y diversidad de las imágenes producidas por una GAN. Lo hace utilizando un modelo preentrenado, específicamente el modelo InceptionV3, para hacer predicciones sobre las imágenes generadas. La función redimensiona las imágenes para que coincidan con la forma de entrada esperada por el modelo InceptionV3, las preprocesa para que coincidan con el formato que el modelo espera, y luego las pasa al modelo para obtener predicciones. Luego, calcula el puntaje basado en estas predicciones.

El cálculo del puntaje implica dividir las predicciones en varios subconjuntos (el número de los cuales está determinado por el parámetro num_splits), calcular la media de cada subconjunto y luego usar estas medias para calcular la divergencia KL entre la distribución de etiquetas predichas y la distribución uniforme. La divergencia KL mide cuánto difiere una distribución de probabilidad de una segunda distribución esperada. El Inception Score final es el exponencial de la media de la divergencia KL en todos los subconjuntos.

La segunda función, calculate_fid, se utiliza para calcular la Fréchet Inception Distance. La Fréchet Inception Distance es otra métrica para evaluar GANs, pero mide específicamente la similitud entre dos conjuntos de imágenes. En el contexto de las GANs, estos dos conjuntos son típicamente las imágenes reales del conjunto de entrenamiento y las imágenes sintéticas generadas por la GAN.

El cálculo del FID implica utilizar el mismo modelo InceptionV3 para extraer características tanto de las imágenes reales como de las generadas. Estas características se utilizan luego para crear una distribución Gaussiana multivariante, caracterizada por una media y una covarianza. Luego se calcula la distancia de Fréchet entre estas dos distribuciones Gaussianas. La distancia de Fréchet es una medida de similitud entre dos distribuciones, por lo que un puntaje FID más bajo indica que las imágenes generadas son más similares a las imágenes reales.

Después de definir estas dos funciones, el código procede a generar algunas imágenes falsas utilizando un generador de GAN. El generador se alimenta con ruido aleatorio, siguiendo una distribución normal, para generar estas imágenes sintéticas. El Inception Score y el FID para estas imágenes generadas se calculan utilizando las funciones definidas anteriormente. Finalmente, se imprimen los resultados de estos cálculos.

En resumen, este ejemplo proporciona una demostración práctica de cómo evaluar el rendimiento de una Red Generativa Adversarial (GAN) utilizando dos métricas comúnmente utilizadas: el Inception Score y la Fréchet Inception Distance. Ambas métricas proporcionan información valiosa sobre la calidad y diversidad de las imágenes generadas por la GAN, lo cual es crucial para evaluar la efectividad de la GAN.

Ejemplo de Fréchet Inception Distance (FID) para la Evaluación de GANs con TensorFlow

Aquí tienes un ejemplo completo de cómo calcular el FID para la evaluación de GANs utilizando TensorFlow:

  1. Dependencias:
import tensorflow as tf
from tensorflow.keras.applications import inception_v3
from tensorflow.keras.preprocessing import image
from scipy import linalg
import numpy as np

2. Modelo InceptionV3 para Extracción de Características:

def inception_model():
  """
  Loads the pre-trained InceptionV3 model for feature extraction.
  Removes the final classification layer.
  """
  model = inception_v3.InceptionV3(include_top=False, weights='imagenet')
  model.output = model.layers[-1].output
  return model

Esta función define inception_model que carga el modelo preentrenado InceptionV3 excluyendo la capa de clasificación final. Esta capa no es necesaria para el cálculo del FID, y solo queremos la representación de características aprendida por el modelo.

  1. Función de Preprocesamiento:
def preprocess_image(img_path):
  """
  Preprocesses an image for InceptionV3 input.
  """
  target_size = (299, 299)
  img = image.load_img(img_path, target_size=target_size)
  img = image.img_to_array(img)
  img = img / 255.0
  img = np.expand_dims(img, axis=0)
  return img

Esta función define preprocess_image, la cual toma una ruta de imagen y la preprocesa para la entrada de InceptionV3. Esto incluye redimensionar la imagen al tamaño objetivo (299x299 para InceptionV3) y normalización.

  1. Función de Extracción de Características:
def extract_features(model, img_paths):
  """
  Extracts features from a list of images using the InceptionV3 model.
  """
  features = []
  for img_path in img_paths:
    img = preprocess_image(img_path)
    feature = model.predict(img)
    features.append(feature)
  return np.array(features)

Esta función define extract_features, la cual toma el modelo InceptionV3 y una lista de rutas de imágenes. Itera a través de cada ruta, preprocesa la imagen, la alimenta al modelo y almacena las características extraídas en un array de NumPy.

  1. Función de Cálculo del FID:
def calculate_fid(real_imgs, generated_imgs):
  """
  Calculates the Fréchet Inception Distance (FID) between two sets of images.
  """
  # Load InceptionV3 model
  model = inception_model()

  # Extract features for real and generated images
  real_features = extract_features(model, real_imgs)
  generated_features = extract_features(model, generated_imgs)

  # Calculate statistics for real and generated features
  real_mean = np.mean(real_features, axis=0)
  real_cov = np.cov(real_features.reshape(real_features.shape[0], -1), rowvar=False)
  generated_mean = np.mean(generated_features, axis=0)
  generated_cov = np.cov(generated_features.reshape(generated_features.shape[0], -1), rowvar=False)

  # Calculate squared mean difference
  ssdiff = np.sum((real_mean - generated_mean)**2)

  # Calculate FID
  covmean = linalg.sqrtm(np.dot(real_cov, generated_cov))
  if np.iscomplexobj(covmean):
    covmean = covmean.real
  fid = ssdiff + np.trace(real_cov + generated_cov - 2.0 * covmean)
  return fid

Esta función define calculate_fid, la cual toma dos listas de rutas de imágenes (reales y generadas). Utiliza las funciones definidas previamente para extraer características de ambos conjuntos y luego calcula el FID. Aquí hay un desglose de los pasos clave:

  • Extrae características para las imágenes reales y generadas utilizando el modelo InceptionV3.
  • Calcula la media y la matriz de covarianza para ambos conjuntos de características.
  • Calcula la diferencia de medias al cuadrado entre las medias reales y generadas.
  • Calcula la raíz cuadrada del producto de las covarianzas.
  • Maneja posibles problemas de números complejos que surgen de la raíz cuadrada del producto.
  • El FID se define como la suma de las diferencias de medias al cuadrado.

Ejemplo de Precisión y Recall para Modelos Generativos con TensorFlow

Aunque no hay una implementación estándar utilizando TensorFlow para Precisión y Recall (PR) específicamente diseñados para modelos generativos, podemos explorar un enfoque similar aprovechando las características de Inception como se propone en el artículo "Assessing Generative Models via Precision and Recall". Aquí hay un desglose del concepto y un ejemplo de implementación:

  1. Comprendiendo PR para Modelos Generativos:
  • Precisión: Mide la calidad de las muestras generadas por el modelo. Una alta precisión indica que un mayor porcentaje de muestras generadas se asemejan a la distribución de datos reales.
  • Recall: Mide la capacidad del modelo para capturar la diversidad de la distribución de datos reales. Un alto recall indica que las muestras generadas cubren una gama más amplia de variaciones presentes en los datos reales.
  1. Emparejamiento de Características de Inception:

Este enfoque utiliza el modelo preentrenado InceptionV3 para extraer características tanto de los datos reales como de los generados. La idea es comparar estas características para evaluar qué tan bien se alinean los datos generados con la distribución de datos reales.

  1. Ejemplo de Implementación:
import tensorflow as tf
from tensorflow.keras.applications import inception_v3
from tensorflow.keras.preprocessing import image
import numpy as np

def inception_model():
  """
  Loads the pre-trained InceptionV3 model for feature extraction.
  """
  model = inception_v3.InceptionV3(include_top=False, weights='imagenet')
  model.output = model.layers[-1].output
  return model

def preprocess_image(img_path):
  """
  Preprocesses an image for InceptionV3 input.
  """
  target_size = (299, 299)
  img = image.load_img(img_path, target_size=target_size)
  img = image.img_to_array(img)
  img = img / 255.0
  img = np.expand_dims(img, axis=0)
  return img

def extract_features(model, img_paths):
  """
  Extracts features from a list of images using the InceptionV3 model.
  """
  features = []
  for img_path in img_paths:
    img = preprocess_image(img_path)
    feature = model.predict(img)
    features.append(feature)
  return np.array(features)

def compute_pr(real_features, generated_features):
  """
  Estimates precision and recall based on Inception feature distances.
  **Note:** This is a simplified approach and may not capture the full 
  complexity of PR for generative models.

  Parameters:
      real_features: NumPy array of features from real data.
      generated_features: NumPy array of features from generated data.

  Returns:
      precision: Estimated precision value.
      recall: Estimated recall value.
  """
  # Calculate pairwise distances between real and generated features
  real_distances = np.linalg.norm(real_features[:, np.newaxis] - generated_features, axis=2)

  # Threshold for considering a generated sample close to real data (hyperparameter)
  threshold = 0.5

  # Count samples within the threshold distance
  close_samples = np.sum(real_distances < threshold, axis=1)

  # Precision: Ratio of close generated samples to total generated samples
  precision = np.mean(close_samples / generated_features.shape[0])

  # Recall: Ratio of generated samples close to at least one real sample
  recall = np.mean(close_samples > 0)

  return precision, recall

# Example usage
model = inception_model()
real_imgs = ["path/to/real/image1.jpg", "path/to/real/image2.png"]
generated_imgs = ["path/to/generated/image1.jpg", "path/to/generated/image2.png"]

real_features = extract_features(model, real_imgs)
generated_features = extract_features(model, generated_imgs)

precision, recall = compute_pr(real_features, generated_features)

print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")

4. Nota Importante:

Este ejemplo proporciona un enfoque simplificado para estimar la Precisión y Recall (PR) para modelos generativos utilizando características de Inception. Utiliza un umbral de distancia para categorizar las muestras generadas como "cercanas" a los datos reales. Para una evaluación más completa, considere técnicas del artículo original que involucran la estimación de densidad del kernel y el cálculo de curvas PR en un rango de umbrales.

Evaluación de Modelos Generativos mediante Precisión y Recall: https://proceedings.neurips.cc/paper_files/paper/2018/file/f7696a9b362ac5a51c3dc8f098b73923-Paper.pdf

3.4.2 Evaluación Cualitativa

La evaluación cualitativa implica la inspección visual de las muestras generadas para evaluar su calidad. Este enfoque es subjetivo pero proporciona información valiosa sobre el realismo y la diversidad de los datos generados.

En el contexto de las Redes Generativas Adversariales (GANs), la evaluación cualitativa implica examinar de cerca las muestras generadas para evaluar su nivel de realismo y la diversidad que presentan. Esto puede implicar buscar cualquier artefacto visual, evaluar la claridad o el desenfoque de las muestras y verificar qué tan bien representan las muestras generadas la diversidad de los datos reales.

Por ejemplo, si la GAN está diseñada para generar imágenes de rostros, una evaluación cualitativa podría involucrar observar los rostros generados para ver qué tan bien se parecen a los rostros humanos reales y qué tan diversos son en términos de edad, género, etnia y otras características.

Aunque la evaluación cualitativa no proporciona una métrica concreta y numérica para evaluar el rendimiento como lo hace la evaluación cuantitativa, proporciona información valiosa que puede ayudar a mejorar el modelo. Por ejemplo, si el observador nota que las imágenes generadas son principalmente borrosas, esto podría indicar que el generador de la GAN no es lo suficientemente potente y necesita ser ajustado.

Además de la inspección visual, la evaluación cualitativa también puede involucrar la comparación con datos reales. Esto implica comparar las muestras generadas lado a lado con muestras de datos reales para evaluar qué tan similares son. Este método, aunque sigue siendo subjetivo, podría proporcionar una comparación más objetiva que la inspección visual por sí sola.

En general, la evaluación cualitativa juega un papel esencial en la evaluación del rendimiento de las Redes Generativas Adversariales. Si bien idealmente debería usarse junto con métodos cuantitativos para una evaluación más completa, puede proporcionar información valiosa que pueda guiar el ajuste fino del modelo.

Ejemplo: Inspección Visual de Imágenes Generadas

import matplotlib.pyplot as plt

# Generate new samples
noise = np.random.normal(0, 1, (10, 100))
generated_images = generator.predict(noise)

# Plot generated images
fig, axs = plt.subplots(1, 10, figsize=(20, 2))
for i, img in enumerate(generated_images):
    axs[i].imshow(img.squeeze(), cmap='gray')
    axs[i].axis('off')
plt.show()

En este ejemplo:

Este fragmento de código se centra en la visualización de los datos generados por la GAN. Comienza importando la biblioteca Matplotlib, que se usa extensamente en Python para crear visualizaciones estáticas, animadas e interactivas.

La primera parte del análisis implica la generación de nuevas muestras de datos. Esto se hace creando 'ruido', que son números aleatorios que siguen una distribución normal (en este caso, centrada en 0 con una desviación estándar de 1). Se crea un array de tamaño 10x100, donde cada fila es una muestra de ruido separada. Estas muestras de ruido sirven como entradas para el generador de la GAN, que las utiliza para crear nuevas muestras de datos. En este caso, se espera que el generador devuelva imágenes, de ahí el nombre 'generated_images'.

La segunda parte del análisis implica la visualización de estas imágenes generadas. Se crea una figura con una cuadrícula de 1 fila y 10 columnas, y un tamaño de 20x2. Cada celda en esta cuadrícula contendrá una de las imágenes generadas. Las imágenes se trazan una por una en cada celda. Las imágenes se comprimen (para eliminar las entradas de dimensión única de sus formas) y se convierten a escala de grises para mayor claridad visual. Los ejes también se desactivan para cada imagen, para que las imágenes mismas sean el foco de la visualización.

Una vez que todas las imágenes se han trazado, la figura se muestra usando plt.show(). Este comando revela toda la figura y sus subgráficos como una sola salida. Esta visualización proporcionaría una mirada a la diversidad y calidad de las imágenes generadas por la GAN, basándose en las entradas de ruido aleatorias iniciales.

Este tipo de visualización es extremadamente útil para evaluar qué tan bien ha aprendido la GAN a generar nuevos datos. Al inspeccionar visualmente las imágenes generadas, podemos tener una idea de cuán realistas se ven y cómo imitan los datos de entrenamiento. Esta evaluación cualitativa, aunque subjetiva, es una parte importante de la evaluación de la efectividad de las GANs.

3.4.3 Estudios de Usuario

El proceso de realizar estudios de usuario es una parte esencial para evaluar la calidad de los datos generados. Este método implica obtener valiosos comentarios de los participantes humanos que interactúan con los datos. El propósito principal de estos estudios es medir la calidad y realismo percibidos de las imágenes generadas por el sistema.

A los participantes en estos estudios se les suele pedir que proporcionen sus calificaciones sobre una variedad de criterios. Algunos de estos criterios pueden incluir aspectos como el realismo de las imágenes, la diversidad de las imágenes producidas y el atractivo visual general de las salidas generadas. Al solicitar comentarios sobre estos aspectos específicos, los investigadores pueden obtener una comprensión integral de qué tan bien se desempeña el sistema en términos de generación de datos.

Es importante tener en cuenta que los estudios de usuario ofrecen una ventaja significativa sobre otras formas de evaluación. A diferencia de confiar únicamente en la inspección visual, donde la evaluación puede ser algo subjetiva y propensa a sesgos, los estudios de usuario proporcionan una evaluación más objetiva y robusta del rendimiento del sistema.

Esto se debe al hecho de que incorporan una amplia gama de perspectivas de múltiples participantes, lo que mejora la fiabilidad y credibilidad de los resultados de la evaluación.

Ejemplo: Realización de un Estudio de Usuario

# Generate new samples for the user study
noise = np.random.normal(0, 1, (20, 100))
generated_images = generator.predict(noise)

# Save generated images to disk for user study
for i, img in enumerate(generated_images):
    plt.imsave(f'generated_image_{i}.png', img.squeeze(), cmap='gray')

# Instructions for the user study:
# 1. Show participants the saved generated images.
# 2. Ask participants to rate each image on a scale of 1 to 5 for realism and visual appeal.
# 3. Collect the ratings and analyze the results to assess the quality of the GAN.

Este ejemplo de código genera nuevas muestras de imágenes para un estudio de usuario. Crea ruido aleatorio y lo usa como entrada para un modelo generativo (el generador) para producir imágenes. Estas imágenes se guardan en el disco. El resto de los comentarios describen instrucciones para un estudio de usuario.

A los usuarios se les mostrarán las imágenes generadas y se les pedirá que las califiquen en una escala del 1 al 5 en términos de realismo y atractivo visual. Las calificaciones recopiladas se analizan luego para evaluar la calidad de la Red Generativa Adversarial (GAN) que produjo las imágenes.

3.4.4 Evaluación de Aplicaciones Específicas

Los criterios para evaluar las Redes Generativas Adversariales (GANs) pueden diferir significativamente según la aplicación particular para la cual se estén utilizando. Es esencial adaptar las métricas de evaluación para que se ajusten al propósito específico y las demandas de la aplicación en cuestión. Aquí hay algunos ejemplos:

  • Superresolución de Imágenes: En este caso, el objetivo es evaluar la calidad de las imágenes que han sido aumentadas de resolución. La evaluación debe centrarse en determinar la nitidez y claridad de las imágenes mejoradas, para lo cual se emplean típicamente métricas como la Relación Señal-Ruido Pico (PSNR) y el Índice de Similitud Estructural (SSIM). Estas son medidas cuantitativas que proporcionan una indicación clara del éxito del proceso de superresolución.
  • Generación de Texto: Cuando las GANs se utilizan para la generación de texto, el enfoque cambia a evaluar la fluidez y coherencia del texto que se ha generado. Este puede ser un proceso algo subjetivo, pero existen algunas métricas establecidas, como las puntuaciones BLEU o ROUGE, que proporcionan una medida objetiva de la calidad del texto generado.
  • Transferencia de Estilo: Para aplicaciones que implican transferencia de estilo, la evaluación debe centrarse en la consistencia y calidad artística de los estilos que se han transferido a las imágenes objetivo. Esto implica comparar las imágenes de salida con imágenes de referencia para determinar qué tan bien se ha capturado y transferido el estilo. La calidad de la transferencia de estilo a menudo puede ser una medida más subjetiva, ya que puede depender de las percepciones individuales de la calidad artística.

Ejemplo: Evaluación de Superresolución de Imágenes

Aquí se muestra un ejemplo de cómo evaluar una aplicación de superresolución de imágenes utilizando métricas como PSNR y SSIM:

from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.metrics import structural_similarity as ssim

# Low-resolution and high-resolution images
low_res_images = ...  # Load low-resolution images
high_res_images = ...  # Load corresponding high-resolution images

# Generate super-resolved images using the GAN generator
super_res_images = generator.predict(low_res_images)

# Calculate PSNR and SSIM for each image
psnr_values = [psnr(hr, sr) for hr, sr in zip(high_res_images, super_res_images)]
ssim_values = [ssim(hr, sr, multichannel=True) for hr, sr in zip(high_res_images, super_res_images)]

# Print average PSNR and SSIM
print(f"Average PSNR: {np.mean(psnr_values)}")
print(f"Average SSIM: {np.mean(ssim_values)}")

Este ejemplo de código calcula efectivamente el PSNR (Relación Señal-Ruido Pico) y el SSIM (Índice de Similitud Estructural) entre imágenes de alta resolución (HR) y sus correspondientes imágenes de superresolución (SR) generadas por una GAN.

Aquí hay un desglose de los pasos:

Importar Métricas:

  • peak_signal_noise_ratio (psnr) y structural_similarity (ssim) se importan desde skimage.metrics. Estas funciones se utilizan para calcular las métricas respectivas.

Cargar Imágenes:

  • low_res_images: Esta variable probablemente contiene las imágenes de baja resolución precargadas que deseas usar para la superresolución.
  • high_res_images: Esta variable contiene las imágenes de alta resolución correspondientes para comparación.

Generar Imágenes de Superresolución:

  • super_res_images = generator.predict(low_res_images): Esta línea asume que tienes un modelo GAN entrenado con una función generator que toma imágenes de baja resolución como entrada y predice imágenes de superresolución.

Calcular PSNR y SSIM:

  • El código itera a través de pares de imágenes HR y SR correspondientes usando zip.
  • psnr_values: Para cada par, calcula el PSNR entre las imágenes HR y SR usando la función psnr y añade el valor a una lista llamada psnr_values.
  • ssim_values: De manera similar, calcula el SSIM entre cada par de imágenes HR y SR usando la función ssim con multichannel=True (asumiendo imágenes RGB) y añade el valor a una lista llamada ssim_values.

Imprimir Valores Promedio:

  • np.mean(psnr_values) calcula el PSNR promedio en todos los pares de imágenes.
  • np.mean(ssim_values) calcula el SSIM promedio en todos los pares de imágenes.
  • Finalmente, el código imprime los valores promedio de PSNR y SSIM.

En general, este ejemplo de código evalúa efectivamente la calidad de las imágenes de superresolución generadas comparándolas con las imágenes de alta resolución originales utilizando las métricas PSNR y SSIM.

3.4 Evaluación de GANs

Es fundamental para comprender la efectividad de las Redes Generativas Adversariales (GANs) realizar una evaluación adecuada. Este proceso de evaluación asegura que los datos generados por estas redes cumplan con los estándares de calidad previstos.

Esto no es una tarea sencilla, ya que, a diferencia de los modelos de aprendizaje automático tradicionales, las GANs no tienen una métrica de evaluación directa y sencilla. Esto se debe en gran medida a su objetivo principal: generar datos que sean, en su complejidad y detalle, lo más realistas posible.

En esta sección, exploraremos de manera exhaustiva los diversos métodos disponibles para la evaluación de las GANs. Examinaremos tanto los enfoques cuantitativos como cualitativos, analizando sus respectivos méritos y posibles desventajas. Además, exploraremos algunas de las métricas más comúnmente utilizadas en este campo de estudio. Para complementar esta discusión teórica, también proporcionaremos ejemplos prácticos para iluminar mejor los conceptos y técnicas discutidos.

3.4.1 Métricas de Evaluación Cuantitativa

Las métricas de evaluación cuantitativa ofrecen una gama de medidas objetivas que son cruciales para evaluar el rendimiento de las Redes Generativas Adversariales (GANs). Estas métricas sirven para proporcionar una evaluación clara, definitiva e imparcial de la efectividad de estas redes, y por lo tanto, son esenciales para comprender el rendimiento general y las posibles mejoras que podrían mejorar el funcionamiento de las GANs.

Algunas métricas comúnmente utilizadas incluyen:

1. Inception Score (IS):

El Inception Score (IS) es una métrica cuantitativa significativa utilizada para evaluar el rendimiento de las Redes Generativas Adversariales (GANs), particularmente en la calidad de las imágenes que generan. Se introdujo como un medio para cuantificar y calificar las imágenes generadas en función de dos factores principales: diversidad y calidad.

La diversidad se refiere a la gama de diferentes imágenes que la GAN puede producir. Un modelo que genera una variedad de imágenes, en lugar de producir repetidamente imágenes similares o idénticas, se consideraría que tiene una alta diversidad. Un puntaje más alto en diversidad refleja la capacidad de la GAN para capturar una amplia representación del conjunto de datos en el que se entrenó.

La calidad, por otro lado, se refiere a cuán 'reales' son las imágenes generadas o cuán cerca están de las imágenes reales en el conjunto de datos de entrenamiento. Las imágenes de alta calidad deben ser indistinguibles de las fotos reales, lo que demuestra que la GAN ha aprendido con precisión la distribución de datos del conjunto de entrenamiento.

El Inception Score utiliza una red preentrenada Inception v3 para calcular estos factores. Cada imagen generada se pasa a través de la red Inception, que produce una distribución de etiquetas condicional. Luego, el puntaje se calcula utilizando estas distribuciones, con la suposición de que los buenos modelos producirán imágenes diversas (alta entropía de la distribución marginal) pero también estarán seguros en sus predicciones para imágenes individuales (baja entropía de la distribución condicional).

Un Inception Score alto generalmente indica que la GAN está produciendo imágenes diversas y de alta calidad que son similares a los datos reales. Sin embargo, es importante tener en cuenta que, aunque el Inception Score puede ser una herramienta útil para evaluar y comparar GANs, no es perfecto y tiene sus limitaciones. Por ejemplo, depende en gran medida del modelo Inception para sus cálculos, lo que significa que su precisión está limitada por qué tan bien se haya entrenado el modelo Inception.

El Inception Score evalúa la calidad y la diversidad de las imágenes generadas. Utiliza una red preentrenada Inception v3 para calcular la distribución de etiquetas condicional $p(y|x)$ para cada imagen generada $x$ y la distribución de etiquetas marginal $p(y)$. El puntaje se da por:

IS(G)=exp(Ex[DKL(p(y∣x)∣∣p(y))])

Un Inception Score alto indica que las imágenes generadas son tanto diversas como de alta calidad.

2. Fréchet Inception Distance (FID):

La métrica FID calcula la similitud entre dos conjuntos de datos de imágenes. En este caso, se usa para comparar la distribución de las imágenes generadas con la distribución de las imágenes reales.

El cálculo del FID implica el uso de un modelo preentrenado Inception v3, un modelo que originalmente fue diseñado y entrenado para tareas de clasificación de imágenes. Este modelo se usa para extraer características tanto de las imágenes reales como de las generadas. Las características extraídas luego se representan como una distribución Gaussiana multivariante, caracterizada por una media y una covarianza.

Luego se calcula la distancia de Fréchet entre estas dos Gaussianas. Esta distancia proporciona una medida de la similitud entre los dos conjuntos de imágenes. Cuanto menor sea el puntaje FID, más cercanas serán las imágenes generadas a las imágenes reales en términos de las distribuciones de características. Por lo tanto, un FID más bajo indica que el modelo generativo ha realizado mejor la producción de imágenes más realistas.

En el contexto de las GANs, el puntaje FID se utiliza a menudo como una medida de evaluación para comparar el rendimiento de diferentes modelos o diferentes configuraciones del mismo modelo. Proporciona una evaluación más confiable y robusta que algunas otras métricas, como el Inception Score, ya que toma en cuenta la distribución completa de características multidimensionales, en lugar de solo observar distribuciones marginales y condicionales.

El puntaje FID mide la distancia entre las distribuciones de las imágenes reales y generadas en el espacio de características de una red preentrenada Inception v3. Puntajes FID más bajos indican que las imágenes generadas son más similares a las imágenes reales.

FID=∣∣μr−μg∣∣2+Tr(Σr+Σg−2(ΣrΣg)1/2)

donde (μr​,Σr​) and (μg,Σg) son la media y la covarianza de los vectores de características de las imágenes reales y generadas, respectivamente.

3. Precision y Recall para Distribuciones:

La Precisión y Recall para Distribuciones son medidas estadísticas utilizadas para evaluar el rendimiento de las Redes Generativas Adversariales (GANs), particularmente en términos de la calidad y diversidad de los datos que generan. Estas métricas se toman del campo de la recuperación de información y también se usan comúnmente para evaluar tareas de clasificación en el aprendizaje automático.

La precisión mide la calidad de las muestras generadas. En el contexto de las GANs, evalúa cuántas de las muestras generadas son 'reales' o están cerca de la distribución de datos real. Un puntaje alto en precisión implica que la mayoría de las muestras generadas son de alta calidad, asemejándose estrechamente a los datos reales. Indica que la GAN está haciendo un buen trabajo generando muestras que son casi indistinguibles de las muestras reales.

El recall, por otro lado, mide la cobertura de la distribución de datos reales por las muestras generadas. Evalúa si la GAN es capaz de generar muestras que cubran toda la gama de la distribución de datos reales. Un puntaje alto en recall implica que la GAN tiene una buena comprensión de la distribución de datos real y es capaz de generar muestras diversas que cubren diferentes aspectos de los datos reales.

Juntas, la precisión y el recall proporcionan una evaluación integral de las GANs. Valores altos de precisión y recall indican que la GAN está generando muestras de alta calidad que cubren la diversidad de los datos reales. Sin embargo, a menudo hay una compensación entre precisión y recall. Un modelo que se centra demasiado en obtener muestras de alta calidad podría perder la diversidad de los datos (alta precisión, bajo recall), mientras que un modelo que se centra en cubrir toda la distribución de datos podría generar más muestras de baja calidad (baja precisión, alto recall).

Para obtener una visión equilibrada del rendimiento del modelo, es común combinar la precisión y el recall en una sola métrica llamada puntaje F1. El puntaje F1 es la media armónica de precisión y recall, y da el mismo peso a ambas medidas. Un puntaje F1 alto indica que la GAN está funcionando bien en ambos aspectos, generando muestras diversas y de alta calidad.

La precisión mide la calidad de las muestras generadas, mientras que el recall mide la cobertura de la distribución de datos reales por las muestras generadas. Valores altos de precisión y recall indican que la GAN está generando muestras de alta calidad que cubren la diversidad de los datos reales.

Ejemplo: Calcular Inception Score y FID

A continuación, se muestra cómo puede calcular el Inception Score y el FID utilizando TensorFlow y modelos preentrenados:

import tensorflow as tf
import numpy as np
from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input
from scipy.linalg import sqrtm

# Function to calculate Inception Score
def calculate_inception_score(images, num_splits=10):
    model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))
    images = tf.image.resize(images, (299, 299))
    images = preprocess_input(images)
    preds = model.predict(images)

    scores = []
    for i in range(num_splits):
        part = preds[i * len(preds) // num_splits: (i + 1) * len(preds) // num_splits]
        py = np.mean(part, axis=0)
        scores.append(np.exp(np.mean([np.sum(p * np.log(p / py)) for p in part])))
    return np.mean(scores), np.std(scores)

# Function to calculate FID score
def calculate_fid(real_images, generated_images):
    model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))
    real_images = tf.image.resize(real_images, (299, 299))
    real_images = preprocess_input(real_images)
    gen_images = tf.image.resize(generated_images, (299, 299))
    gen_images = preprocess_input(gen_images)

    act1 = model.predict(real_images)
    act2 = model.predict(gen_images)

    mu1, sigma1 = act1.mean(axis=0), np.cov(act1, rowvar=False)
    mu2, sigma2 = act2.mean(axis=0), np.cov(act2, rowvar=False)

    ssdiff = np.sum((mu1 - mu2) ** 2.0)
    covmean = sqrtm(sigma1.dot(sigma2))

    if np.iscomplexobj(covmean):
        covmean = covmean.real

    fid = ssdiff + np.trace(sigma1 + sigma2 - 2.0 * covmean)
    return fid

# Generate some fake images using the trained GAN generator
noise = np.random.normal(0, 1, (1000, 100))
generated_images = generator.predict(noise)

# Calculate Inception Score
is_mean, is_std = calculate_inception_score(generated_images)
print(f"Inception Score: {is_mean} ± {is_std}")

# Calculate FID Score
real_images = x_train[np.random.choice(x_train.shape[0], 1000, replace=False)]
fid_score = calculate_fid(real_images, generated_images)
print(f"FID Score: {fid_score}")

Este ejemplo utiliza la biblioteca TensorFlow para calcular dos métricas clave para evaluar Redes Generativas Adversariales (GANs): el Inception Score (IS) y la Fréchet Inception Distance (FID). Estas métricas son esenciales para evaluar la calidad y diversidad de las imágenes sintéticas producidas por las GANs.

La primera función, calculate_inception_score, está diseñada para calcular el Inception Score. El Inception Score es una métrica que evalúa la calidad y diversidad de las imágenes producidas por una GAN. Lo hace utilizando un modelo preentrenado, específicamente el modelo InceptionV3, para hacer predicciones sobre las imágenes generadas. La función redimensiona las imágenes para que coincidan con la forma de entrada esperada por el modelo InceptionV3, las preprocesa para que coincidan con el formato que el modelo espera, y luego las pasa al modelo para obtener predicciones. Luego, calcula el puntaje basado en estas predicciones.

El cálculo del puntaje implica dividir las predicciones en varios subconjuntos (el número de los cuales está determinado por el parámetro num_splits), calcular la media de cada subconjunto y luego usar estas medias para calcular la divergencia KL entre la distribución de etiquetas predichas y la distribución uniforme. La divergencia KL mide cuánto difiere una distribución de probabilidad de una segunda distribución esperada. El Inception Score final es el exponencial de la media de la divergencia KL en todos los subconjuntos.

La segunda función, calculate_fid, se utiliza para calcular la Fréchet Inception Distance. La Fréchet Inception Distance es otra métrica para evaluar GANs, pero mide específicamente la similitud entre dos conjuntos de imágenes. En el contexto de las GANs, estos dos conjuntos son típicamente las imágenes reales del conjunto de entrenamiento y las imágenes sintéticas generadas por la GAN.

El cálculo del FID implica utilizar el mismo modelo InceptionV3 para extraer características tanto de las imágenes reales como de las generadas. Estas características se utilizan luego para crear una distribución Gaussiana multivariante, caracterizada por una media y una covarianza. Luego se calcula la distancia de Fréchet entre estas dos distribuciones Gaussianas. La distancia de Fréchet es una medida de similitud entre dos distribuciones, por lo que un puntaje FID más bajo indica que las imágenes generadas son más similares a las imágenes reales.

Después de definir estas dos funciones, el código procede a generar algunas imágenes falsas utilizando un generador de GAN. El generador se alimenta con ruido aleatorio, siguiendo una distribución normal, para generar estas imágenes sintéticas. El Inception Score y el FID para estas imágenes generadas se calculan utilizando las funciones definidas anteriormente. Finalmente, se imprimen los resultados de estos cálculos.

En resumen, este ejemplo proporciona una demostración práctica de cómo evaluar el rendimiento de una Red Generativa Adversarial (GAN) utilizando dos métricas comúnmente utilizadas: el Inception Score y la Fréchet Inception Distance. Ambas métricas proporcionan información valiosa sobre la calidad y diversidad de las imágenes generadas por la GAN, lo cual es crucial para evaluar la efectividad de la GAN.

Ejemplo de Fréchet Inception Distance (FID) para la Evaluación de GANs con TensorFlow

Aquí tienes un ejemplo completo de cómo calcular el FID para la evaluación de GANs utilizando TensorFlow:

  1. Dependencias:
import tensorflow as tf
from tensorflow.keras.applications import inception_v3
from tensorflow.keras.preprocessing import image
from scipy import linalg
import numpy as np

2. Modelo InceptionV3 para Extracción de Características:

def inception_model():
  """
  Loads the pre-trained InceptionV3 model for feature extraction.
  Removes the final classification layer.
  """
  model = inception_v3.InceptionV3(include_top=False, weights='imagenet')
  model.output = model.layers[-1].output
  return model

Esta función define inception_model que carga el modelo preentrenado InceptionV3 excluyendo la capa de clasificación final. Esta capa no es necesaria para el cálculo del FID, y solo queremos la representación de características aprendida por el modelo.

  1. Función de Preprocesamiento:
def preprocess_image(img_path):
  """
  Preprocesses an image for InceptionV3 input.
  """
  target_size = (299, 299)
  img = image.load_img(img_path, target_size=target_size)
  img = image.img_to_array(img)
  img = img / 255.0
  img = np.expand_dims(img, axis=0)
  return img

Esta función define preprocess_image, la cual toma una ruta de imagen y la preprocesa para la entrada de InceptionV3. Esto incluye redimensionar la imagen al tamaño objetivo (299x299 para InceptionV3) y normalización.

  1. Función de Extracción de Características:
def extract_features(model, img_paths):
  """
  Extracts features from a list of images using the InceptionV3 model.
  """
  features = []
  for img_path in img_paths:
    img = preprocess_image(img_path)
    feature = model.predict(img)
    features.append(feature)
  return np.array(features)

Esta función define extract_features, la cual toma el modelo InceptionV3 y una lista de rutas de imágenes. Itera a través de cada ruta, preprocesa la imagen, la alimenta al modelo y almacena las características extraídas en un array de NumPy.

  1. Función de Cálculo del FID:
def calculate_fid(real_imgs, generated_imgs):
  """
  Calculates the Fréchet Inception Distance (FID) between two sets of images.
  """
  # Load InceptionV3 model
  model = inception_model()

  # Extract features for real and generated images
  real_features = extract_features(model, real_imgs)
  generated_features = extract_features(model, generated_imgs)

  # Calculate statistics for real and generated features
  real_mean = np.mean(real_features, axis=0)
  real_cov = np.cov(real_features.reshape(real_features.shape[0], -1), rowvar=False)
  generated_mean = np.mean(generated_features, axis=0)
  generated_cov = np.cov(generated_features.reshape(generated_features.shape[0], -1), rowvar=False)

  # Calculate squared mean difference
  ssdiff = np.sum((real_mean - generated_mean)**2)

  # Calculate FID
  covmean = linalg.sqrtm(np.dot(real_cov, generated_cov))
  if np.iscomplexobj(covmean):
    covmean = covmean.real
  fid = ssdiff + np.trace(real_cov + generated_cov - 2.0 * covmean)
  return fid

Esta función define calculate_fid, la cual toma dos listas de rutas de imágenes (reales y generadas). Utiliza las funciones definidas previamente para extraer características de ambos conjuntos y luego calcula el FID. Aquí hay un desglose de los pasos clave:

  • Extrae características para las imágenes reales y generadas utilizando el modelo InceptionV3.
  • Calcula la media y la matriz de covarianza para ambos conjuntos de características.
  • Calcula la diferencia de medias al cuadrado entre las medias reales y generadas.
  • Calcula la raíz cuadrada del producto de las covarianzas.
  • Maneja posibles problemas de números complejos que surgen de la raíz cuadrada del producto.
  • El FID se define como la suma de las diferencias de medias al cuadrado.

Ejemplo de Precisión y Recall para Modelos Generativos con TensorFlow

Aunque no hay una implementación estándar utilizando TensorFlow para Precisión y Recall (PR) específicamente diseñados para modelos generativos, podemos explorar un enfoque similar aprovechando las características de Inception como se propone en el artículo "Assessing Generative Models via Precision and Recall". Aquí hay un desglose del concepto y un ejemplo de implementación:

  1. Comprendiendo PR para Modelos Generativos:
  • Precisión: Mide la calidad de las muestras generadas por el modelo. Una alta precisión indica que un mayor porcentaje de muestras generadas se asemejan a la distribución de datos reales.
  • Recall: Mide la capacidad del modelo para capturar la diversidad de la distribución de datos reales. Un alto recall indica que las muestras generadas cubren una gama más amplia de variaciones presentes en los datos reales.
  1. Emparejamiento de Características de Inception:

Este enfoque utiliza el modelo preentrenado InceptionV3 para extraer características tanto de los datos reales como de los generados. La idea es comparar estas características para evaluar qué tan bien se alinean los datos generados con la distribución de datos reales.

  1. Ejemplo de Implementación:
import tensorflow as tf
from tensorflow.keras.applications import inception_v3
from tensorflow.keras.preprocessing import image
import numpy as np

def inception_model():
  """
  Loads the pre-trained InceptionV3 model for feature extraction.
  """
  model = inception_v3.InceptionV3(include_top=False, weights='imagenet')
  model.output = model.layers[-1].output
  return model

def preprocess_image(img_path):
  """
  Preprocesses an image for InceptionV3 input.
  """
  target_size = (299, 299)
  img = image.load_img(img_path, target_size=target_size)
  img = image.img_to_array(img)
  img = img / 255.0
  img = np.expand_dims(img, axis=0)
  return img

def extract_features(model, img_paths):
  """
  Extracts features from a list of images using the InceptionV3 model.
  """
  features = []
  for img_path in img_paths:
    img = preprocess_image(img_path)
    feature = model.predict(img)
    features.append(feature)
  return np.array(features)

def compute_pr(real_features, generated_features):
  """
  Estimates precision and recall based on Inception feature distances.
  **Note:** This is a simplified approach and may not capture the full 
  complexity of PR for generative models.

  Parameters:
      real_features: NumPy array of features from real data.
      generated_features: NumPy array of features from generated data.

  Returns:
      precision: Estimated precision value.
      recall: Estimated recall value.
  """
  # Calculate pairwise distances between real and generated features
  real_distances = np.linalg.norm(real_features[:, np.newaxis] - generated_features, axis=2)

  # Threshold for considering a generated sample close to real data (hyperparameter)
  threshold = 0.5

  # Count samples within the threshold distance
  close_samples = np.sum(real_distances < threshold, axis=1)

  # Precision: Ratio of close generated samples to total generated samples
  precision = np.mean(close_samples / generated_features.shape[0])

  # Recall: Ratio of generated samples close to at least one real sample
  recall = np.mean(close_samples > 0)

  return precision, recall

# Example usage
model = inception_model()
real_imgs = ["path/to/real/image1.jpg", "path/to/real/image2.png"]
generated_imgs = ["path/to/generated/image1.jpg", "path/to/generated/image2.png"]

real_features = extract_features(model, real_imgs)
generated_features = extract_features(model, generated_imgs)

precision, recall = compute_pr(real_features, generated_features)

print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")

4. Nota Importante:

Este ejemplo proporciona un enfoque simplificado para estimar la Precisión y Recall (PR) para modelos generativos utilizando características de Inception. Utiliza un umbral de distancia para categorizar las muestras generadas como "cercanas" a los datos reales. Para una evaluación más completa, considere técnicas del artículo original que involucran la estimación de densidad del kernel y el cálculo de curvas PR en un rango de umbrales.

Evaluación de Modelos Generativos mediante Precisión y Recall: https://proceedings.neurips.cc/paper_files/paper/2018/file/f7696a9b362ac5a51c3dc8f098b73923-Paper.pdf

3.4.2 Evaluación Cualitativa

La evaluación cualitativa implica la inspección visual de las muestras generadas para evaluar su calidad. Este enfoque es subjetivo pero proporciona información valiosa sobre el realismo y la diversidad de los datos generados.

En el contexto de las Redes Generativas Adversariales (GANs), la evaluación cualitativa implica examinar de cerca las muestras generadas para evaluar su nivel de realismo y la diversidad que presentan. Esto puede implicar buscar cualquier artefacto visual, evaluar la claridad o el desenfoque de las muestras y verificar qué tan bien representan las muestras generadas la diversidad de los datos reales.

Por ejemplo, si la GAN está diseñada para generar imágenes de rostros, una evaluación cualitativa podría involucrar observar los rostros generados para ver qué tan bien se parecen a los rostros humanos reales y qué tan diversos son en términos de edad, género, etnia y otras características.

Aunque la evaluación cualitativa no proporciona una métrica concreta y numérica para evaluar el rendimiento como lo hace la evaluación cuantitativa, proporciona información valiosa que puede ayudar a mejorar el modelo. Por ejemplo, si el observador nota que las imágenes generadas son principalmente borrosas, esto podría indicar que el generador de la GAN no es lo suficientemente potente y necesita ser ajustado.

Además de la inspección visual, la evaluación cualitativa también puede involucrar la comparación con datos reales. Esto implica comparar las muestras generadas lado a lado con muestras de datos reales para evaluar qué tan similares son. Este método, aunque sigue siendo subjetivo, podría proporcionar una comparación más objetiva que la inspección visual por sí sola.

En general, la evaluación cualitativa juega un papel esencial en la evaluación del rendimiento de las Redes Generativas Adversariales. Si bien idealmente debería usarse junto con métodos cuantitativos para una evaluación más completa, puede proporcionar información valiosa que pueda guiar el ajuste fino del modelo.

Ejemplo: Inspección Visual de Imágenes Generadas

import matplotlib.pyplot as plt

# Generate new samples
noise = np.random.normal(0, 1, (10, 100))
generated_images = generator.predict(noise)

# Plot generated images
fig, axs = plt.subplots(1, 10, figsize=(20, 2))
for i, img in enumerate(generated_images):
    axs[i].imshow(img.squeeze(), cmap='gray')
    axs[i].axis('off')
plt.show()

En este ejemplo:

Este fragmento de código se centra en la visualización de los datos generados por la GAN. Comienza importando la biblioteca Matplotlib, que se usa extensamente en Python para crear visualizaciones estáticas, animadas e interactivas.

La primera parte del análisis implica la generación de nuevas muestras de datos. Esto se hace creando 'ruido', que son números aleatorios que siguen una distribución normal (en este caso, centrada en 0 con una desviación estándar de 1). Se crea un array de tamaño 10x100, donde cada fila es una muestra de ruido separada. Estas muestras de ruido sirven como entradas para el generador de la GAN, que las utiliza para crear nuevas muestras de datos. En este caso, se espera que el generador devuelva imágenes, de ahí el nombre 'generated_images'.

La segunda parte del análisis implica la visualización de estas imágenes generadas. Se crea una figura con una cuadrícula de 1 fila y 10 columnas, y un tamaño de 20x2. Cada celda en esta cuadrícula contendrá una de las imágenes generadas. Las imágenes se trazan una por una en cada celda. Las imágenes se comprimen (para eliminar las entradas de dimensión única de sus formas) y se convierten a escala de grises para mayor claridad visual. Los ejes también se desactivan para cada imagen, para que las imágenes mismas sean el foco de la visualización.

Una vez que todas las imágenes se han trazado, la figura se muestra usando plt.show(). Este comando revela toda la figura y sus subgráficos como una sola salida. Esta visualización proporcionaría una mirada a la diversidad y calidad de las imágenes generadas por la GAN, basándose en las entradas de ruido aleatorias iniciales.

Este tipo de visualización es extremadamente útil para evaluar qué tan bien ha aprendido la GAN a generar nuevos datos. Al inspeccionar visualmente las imágenes generadas, podemos tener una idea de cuán realistas se ven y cómo imitan los datos de entrenamiento. Esta evaluación cualitativa, aunque subjetiva, es una parte importante de la evaluación de la efectividad de las GANs.

3.4.3 Estudios de Usuario

El proceso de realizar estudios de usuario es una parte esencial para evaluar la calidad de los datos generados. Este método implica obtener valiosos comentarios de los participantes humanos que interactúan con los datos. El propósito principal de estos estudios es medir la calidad y realismo percibidos de las imágenes generadas por el sistema.

A los participantes en estos estudios se les suele pedir que proporcionen sus calificaciones sobre una variedad de criterios. Algunos de estos criterios pueden incluir aspectos como el realismo de las imágenes, la diversidad de las imágenes producidas y el atractivo visual general de las salidas generadas. Al solicitar comentarios sobre estos aspectos específicos, los investigadores pueden obtener una comprensión integral de qué tan bien se desempeña el sistema en términos de generación de datos.

Es importante tener en cuenta que los estudios de usuario ofrecen una ventaja significativa sobre otras formas de evaluación. A diferencia de confiar únicamente en la inspección visual, donde la evaluación puede ser algo subjetiva y propensa a sesgos, los estudios de usuario proporcionan una evaluación más objetiva y robusta del rendimiento del sistema.

Esto se debe al hecho de que incorporan una amplia gama de perspectivas de múltiples participantes, lo que mejora la fiabilidad y credibilidad de los resultados de la evaluación.

Ejemplo: Realización de un Estudio de Usuario

# Generate new samples for the user study
noise = np.random.normal(0, 1, (20, 100))
generated_images = generator.predict(noise)

# Save generated images to disk for user study
for i, img in enumerate(generated_images):
    plt.imsave(f'generated_image_{i}.png', img.squeeze(), cmap='gray')

# Instructions for the user study:
# 1. Show participants the saved generated images.
# 2. Ask participants to rate each image on a scale of 1 to 5 for realism and visual appeal.
# 3. Collect the ratings and analyze the results to assess the quality of the GAN.

Este ejemplo de código genera nuevas muestras de imágenes para un estudio de usuario. Crea ruido aleatorio y lo usa como entrada para un modelo generativo (el generador) para producir imágenes. Estas imágenes se guardan en el disco. El resto de los comentarios describen instrucciones para un estudio de usuario.

A los usuarios se les mostrarán las imágenes generadas y se les pedirá que las califiquen en una escala del 1 al 5 en términos de realismo y atractivo visual. Las calificaciones recopiladas se analizan luego para evaluar la calidad de la Red Generativa Adversarial (GAN) que produjo las imágenes.

3.4.4 Evaluación de Aplicaciones Específicas

Los criterios para evaluar las Redes Generativas Adversariales (GANs) pueden diferir significativamente según la aplicación particular para la cual se estén utilizando. Es esencial adaptar las métricas de evaluación para que se ajusten al propósito específico y las demandas de la aplicación en cuestión. Aquí hay algunos ejemplos:

  • Superresolución de Imágenes: En este caso, el objetivo es evaluar la calidad de las imágenes que han sido aumentadas de resolución. La evaluación debe centrarse en determinar la nitidez y claridad de las imágenes mejoradas, para lo cual se emplean típicamente métricas como la Relación Señal-Ruido Pico (PSNR) y el Índice de Similitud Estructural (SSIM). Estas son medidas cuantitativas que proporcionan una indicación clara del éxito del proceso de superresolución.
  • Generación de Texto: Cuando las GANs se utilizan para la generación de texto, el enfoque cambia a evaluar la fluidez y coherencia del texto que se ha generado. Este puede ser un proceso algo subjetivo, pero existen algunas métricas establecidas, como las puntuaciones BLEU o ROUGE, que proporcionan una medida objetiva de la calidad del texto generado.
  • Transferencia de Estilo: Para aplicaciones que implican transferencia de estilo, la evaluación debe centrarse en la consistencia y calidad artística de los estilos que se han transferido a las imágenes objetivo. Esto implica comparar las imágenes de salida con imágenes de referencia para determinar qué tan bien se ha capturado y transferido el estilo. La calidad de la transferencia de estilo a menudo puede ser una medida más subjetiva, ya que puede depender de las percepciones individuales de la calidad artística.

Ejemplo: Evaluación de Superresolución de Imágenes

Aquí se muestra un ejemplo de cómo evaluar una aplicación de superresolución de imágenes utilizando métricas como PSNR y SSIM:

from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.metrics import structural_similarity as ssim

# Low-resolution and high-resolution images
low_res_images = ...  # Load low-resolution images
high_res_images = ...  # Load corresponding high-resolution images

# Generate super-resolved images using the GAN generator
super_res_images = generator.predict(low_res_images)

# Calculate PSNR and SSIM for each image
psnr_values = [psnr(hr, sr) for hr, sr in zip(high_res_images, super_res_images)]
ssim_values = [ssim(hr, sr, multichannel=True) for hr, sr in zip(high_res_images, super_res_images)]

# Print average PSNR and SSIM
print(f"Average PSNR: {np.mean(psnr_values)}")
print(f"Average SSIM: {np.mean(ssim_values)}")

Este ejemplo de código calcula efectivamente el PSNR (Relación Señal-Ruido Pico) y el SSIM (Índice de Similitud Estructural) entre imágenes de alta resolución (HR) y sus correspondientes imágenes de superresolución (SR) generadas por una GAN.

Aquí hay un desglose de los pasos:

Importar Métricas:

  • peak_signal_noise_ratio (psnr) y structural_similarity (ssim) se importan desde skimage.metrics. Estas funciones se utilizan para calcular las métricas respectivas.

Cargar Imágenes:

  • low_res_images: Esta variable probablemente contiene las imágenes de baja resolución precargadas que deseas usar para la superresolución.
  • high_res_images: Esta variable contiene las imágenes de alta resolución correspondientes para comparación.

Generar Imágenes de Superresolución:

  • super_res_images = generator.predict(low_res_images): Esta línea asume que tienes un modelo GAN entrenado con una función generator que toma imágenes de baja resolución como entrada y predice imágenes de superresolución.

Calcular PSNR y SSIM:

  • El código itera a través de pares de imágenes HR y SR correspondientes usando zip.
  • psnr_values: Para cada par, calcula el PSNR entre las imágenes HR y SR usando la función psnr y añade el valor a una lista llamada psnr_values.
  • ssim_values: De manera similar, calcula el SSIM entre cada par de imágenes HR y SR usando la función ssim con multichannel=True (asumiendo imágenes RGB) y añade el valor a una lista llamada ssim_values.

Imprimir Valores Promedio:

  • np.mean(psnr_values) calcula el PSNR promedio en todos los pares de imágenes.
  • np.mean(ssim_values) calcula el SSIM promedio en todos los pares de imágenes.
  • Finalmente, el código imprime los valores promedio de PSNR y SSIM.

En general, este ejemplo de código evalúa efectivamente la calidad de las imágenes de superresolución generadas comparándolas con las imágenes de alta resolución originales utilizando las métricas PSNR y SSIM.

3.4 Evaluación de GANs

Es fundamental para comprender la efectividad de las Redes Generativas Adversariales (GANs) realizar una evaluación adecuada. Este proceso de evaluación asegura que los datos generados por estas redes cumplan con los estándares de calidad previstos.

Esto no es una tarea sencilla, ya que, a diferencia de los modelos de aprendizaje automático tradicionales, las GANs no tienen una métrica de evaluación directa y sencilla. Esto se debe en gran medida a su objetivo principal: generar datos que sean, en su complejidad y detalle, lo más realistas posible.

En esta sección, exploraremos de manera exhaustiva los diversos métodos disponibles para la evaluación de las GANs. Examinaremos tanto los enfoques cuantitativos como cualitativos, analizando sus respectivos méritos y posibles desventajas. Además, exploraremos algunas de las métricas más comúnmente utilizadas en este campo de estudio. Para complementar esta discusión teórica, también proporcionaremos ejemplos prácticos para iluminar mejor los conceptos y técnicas discutidos.

3.4.1 Métricas de Evaluación Cuantitativa

Las métricas de evaluación cuantitativa ofrecen una gama de medidas objetivas que son cruciales para evaluar el rendimiento de las Redes Generativas Adversariales (GANs). Estas métricas sirven para proporcionar una evaluación clara, definitiva e imparcial de la efectividad de estas redes, y por lo tanto, son esenciales para comprender el rendimiento general y las posibles mejoras que podrían mejorar el funcionamiento de las GANs.

Algunas métricas comúnmente utilizadas incluyen:

1. Inception Score (IS):

El Inception Score (IS) es una métrica cuantitativa significativa utilizada para evaluar el rendimiento de las Redes Generativas Adversariales (GANs), particularmente en la calidad de las imágenes que generan. Se introdujo como un medio para cuantificar y calificar las imágenes generadas en función de dos factores principales: diversidad y calidad.

La diversidad se refiere a la gama de diferentes imágenes que la GAN puede producir. Un modelo que genera una variedad de imágenes, en lugar de producir repetidamente imágenes similares o idénticas, se consideraría que tiene una alta diversidad. Un puntaje más alto en diversidad refleja la capacidad de la GAN para capturar una amplia representación del conjunto de datos en el que se entrenó.

La calidad, por otro lado, se refiere a cuán 'reales' son las imágenes generadas o cuán cerca están de las imágenes reales en el conjunto de datos de entrenamiento. Las imágenes de alta calidad deben ser indistinguibles de las fotos reales, lo que demuestra que la GAN ha aprendido con precisión la distribución de datos del conjunto de entrenamiento.

El Inception Score utiliza una red preentrenada Inception v3 para calcular estos factores. Cada imagen generada se pasa a través de la red Inception, que produce una distribución de etiquetas condicional. Luego, el puntaje se calcula utilizando estas distribuciones, con la suposición de que los buenos modelos producirán imágenes diversas (alta entropía de la distribución marginal) pero también estarán seguros en sus predicciones para imágenes individuales (baja entropía de la distribución condicional).

Un Inception Score alto generalmente indica que la GAN está produciendo imágenes diversas y de alta calidad que son similares a los datos reales. Sin embargo, es importante tener en cuenta que, aunque el Inception Score puede ser una herramienta útil para evaluar y comparar GANs, no es perfecto y tiene sus limitaciones. Por ejemplo, depende en gran medida del modelo Inception para sus cálculos, lo que significa que su precisión está limitada por qué tan bien se haya entrenado el modelo Inception.

El Inception Score evalúa la calidad y la diversidad de las imágenes generadas. Utiliza una red preentrenada Inception v3 para calcular la distribución de etiquetas condicional $p(y|x)$ para cada imagen generada $x$ y la distribución de etiquetas marginal $p(y)$. El puntaje se da por:

IS(G)=exp(Ex[DKL(p(y∣x)∣∣p(y))])

Un Inception Score alto indica que las imágenes generadas son tanto diversas como de alta calidad.

2. Fréchet Inception Distance (FID):

La métrica FID calcula la similitud entre dos conjuntos de datos de imágenes. En este caso, se usa para comparar la distribución de las imágenes generadas con la distribución de las imágenes reales.

El cálculo del FID implica el uso de un modelo preentrenado Inception v3, un modelo que originalmente fue diseñado y entrenado para tareas de clasificación de imágenes. Este modelo se usa para extraer características tanto de las imágenes reales como de las generadas. Las características extraídas luego se representan como una distribución Gaussiana multivariante, caracterizada por una media y una covarianza.

Luego se calcula la distancia de Fréchet entre estas dos Gaussianas. Esta distancia proporciona una medida de la similitud entre los dos conjuntos de imágenes. Cuanto menor sea el puntaje FID, más cercanas serán las imágenes generadas a las imágenes reales en términos de las distribuciones de características. Por lo tanto, un FID más bajo indica que el modelo generativo ha realizado mejor la producción de imágenes más realistas.

En el contexto de las GANs, el puntaje FID se utiliza a menudo como una medida de evaluación para comparar el rendimiento de diferentes modelos o diferentes configuraciones del mismo modelo. Proporciona una evaluación más confiable y robusta que algunas otras métricas, como el Inception Score, ya que toma en cuenta la distribución completa de características multidimensionales, en lugar de solo observar distribuciones marginales y condicionales.

El puntaje FID mide la distancia entre las distribuciones de las imágenes reales y generadas en el espacio de características de una red preentrenada Inception v3. Puntajes FID más bajos indican que las imágenes generadas son más similares a las imágenes reales.

FID=∣∣μr−μg∣∣2+Tr(Σr+Σg−2(ΣrΣg)1/2)

donde (μr​,Σr​) and (μg,Σg) son la media y la covarianza de los vectores de características de las imágenes reales y generadas, respectivamente.

3. Precision y Recall para Distribuciones:

La Precisión y Recall para Distribuciones son medidas estadísticas utilizadas para evaluar el rendimiento de las Redes Generativas Adversariales (GANs), particularmente en términos de la calidad y diversidad de los datos que generan. Estas métricas se toman del campo de la recuperación de información y también se usan comúnmente para evaluar tareas de clasificación en el aprendizaje automático.

La precisión mide la calidad de las muestras generadas. En el contexto de las GANs, evalúa cuántas de las muestras generadas son 'reales' o están cerca de la distribución de datos real. Un puntaje alto en precisión implica que la mayoría de las muestras generadas son de alta calidad, asemejándose estrechamente a los datos reales. Indica que la GAN está haciendo un buen trabajo generando muestras que son casi indistinguibles de las muestras reales.

El recall, por otro lado, mide la cobertura de la distribución de datos reales por las muestras generadas. Evalúa si la GAN es capaz de generar muestras que cubran toda la gama de la distribución de datos reales. Un puntaje alto en recall implica que la GAN tiene una buena comprensión de la distribución de datos real y es capaz de generar muestras diversas que cubren diferentes aspectos de los datos reales.

Juntas, la precisión y el recall proporcionan una evaluación integral de las GANs. Valores altos de precisión y recall indican que la GAN está generando muestras de alta calidad que cubren la diversidad de los datos reales. Sin embargo, a menudo hay una compensación entre precisión y recall. Un modelo que se centra demasiado en obtener muestras de alta calidad podría perder la diversidad de los datos (alta precisión, bajo recall), mientras que un modelo que se centra en cubrir toda la distribución de datos podría generar más muestras de baja calidad (baja precisión, alto recall).

Para obtener una visión equilibrada del rendimiento del modelo, es común combinar la precisión y el recall en una sola métrica llamada puntaje F1. El puntaje F1 es la media armónica de precisión y recall, y da el mismo peso a ambas medidas. Un puntaje F1 alto indica que la GAN está funcionando bien en ambos aspectos, generando muestras diversas y de alta calidad.

La precisión mide la calidad de las muestras generadas, mientras que el recall mide la cobertura de la distribución de datos reales por las muestras generadas. Valores altos de precisión y recall indican que la GAN está generando muestras de alta calidad que cubren la diversidad de los datos reales.

Ejemplo: Calcular Inception Score y FID

A continuación, se muestra cómo puede calcular el Inception Score y el FID utilizando TensorFlow y modelos preentrenados:

import tensorflow as tf
import numpy as np
from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input
from scipy.linalg import sqrtm

# Function to calculate Inception Score
def calculate_inception_score(images, num_splits=10):
    model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))
    images = tf.image.resize(images, (299, 299))
    images = preprocess_input(images)
    preds = model.predict(images)

    scores = []
    for i in range(num_splits):
        part = preds[i * len(preds) // num_splits: (i + 1) * len(preds) // num_splits]
        py = np.mean(part, axis=0)
        scores.append(np.exp(np.mean([np.sum(p * np.log(p / py)) for p in part])))
    return np.mean(scores), np.std(scores)

# Function to calculate FID score
def calculate_fid(real_images, generated_images):
    model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))
    real_images = tf.image.resize(real_images, (299, 299))
    real_images = preprocess_input(real_images)
    gen_images = tf.image.resize(generated_images, (299, 299))
    gen_images = preprocess_input(gen_images)

    act1 = model.predict(real_images)
    act2 = model.predict(gen_images)

    mu1, sigma1 = act1.mean(axis=0), np.cov(act1, rowvar=False)
    mu2, sigma2 = act2.mean(axis=0), np.cov(act2, rowvar=False)

    ssdiff = np.sum((mu1 - mu2) ** 2.0)
    covmean = sqrtm(sigma1.dot(sigma2))

    if np.iscomplexobj(covmean):
        covmean = covmean.real

    fid = ssdiff + np.trace(sigma1 + sigma2 - 2.0 * covmean)
    return fid

# Generate some fake images using the trained GAN generator
noise = np.random.normal(0, 1, (1000, 100))
generated_images = generator.predict(noise)

# Calculate Inception Score
is_mean, is_std = calculate_inception_score(generated_images)
print(f"Inception Score: {is_mean} ± {is_std}")

# Calculate FID Score
real_images = x_train[np.random.choice(x_train.shape[0], 1000, replace=False)]
fid_score = calculate_fid(real_images, generated_images)
print(f"FID Score: {fid_score}")

Este ejemplo utiliza la biblioteca TensorFlow para calcular dos métricas clave para evaluar Redes Generativas Adversariales (GANs): el Inception Score (IS) y la Fréchet Inception Distance (FID). Estas métricas son esenciales para evaluar la calidad y diversidad de las imágenes sintéticas producidas por las GANs.

La primera función, calculate_inception_score, está diseñada para calcular el Inception Score. El Inception Score es una métrica que evalúa la calidad y diversidad de las imágenes producidas por una GAN. Lo hace utilizando un modelo preentrenado, específicamente el modelo InceptionV3, para hacer predicciones sobre las imágenes generadas. La función redimensiona las imágenes para que coincidan con la forma de entrada esperada por el modelo InceptionV3, las preprocesa para que coincidan con el formato que el modelo espera, y luego las pasa al modelo para obtener predicciones. Luego, calcula el puntaje basado en estas predicciones.

El cálculo del puntaje implica dividir las predicciones en varios subconjuntos (el número de los cuales está determinado por el parámetro num_splits), calcular la media de cada subconjunto y luego usar estas medias para calcular la divergencia KL entre la distribución de etiquetas predichas y la distribución uniforme. La divergencia KL mide cuánto difiere una distribución de probabilidad de una segunda distribución esperada. El Inception Score final es el exponencial de la media de la divergencia KL en todos los subconjuntos.

La segunda función, calculate_fid, se utiliza para calcular la Fréchet Inception Distance. La Fréchet Inception Distance es otra métrica para evaluar GANs, pero mide específicamente la similitud entre dos conjuntos de imágenes. En el contexto de las GANs, estos dos conjuntos son típicamente las imágenes reales del conjunto de entrenamiento y las imágenes sintéticas generadas por la GAN.

El cálculo del FID implica utilizar el mismo modelo InceptionV3 para extraer características tanto de las imágenes reales como de las generadas. Estas características se utilizan luego para crear una distribución Gaussiana multivariante, caracterizada por una media y una covarianza. Luego se calcula la distancia de Fréchet entre estas dos distribuciones Gaussianas. La distancia de Fréchet es una medida de similitud entre dos distribuciones, por lo que un puntaje FID más bajo indica que las imágenes generadas son más similares a las imágenes reales.

Después de definir estas dos funciones, el código procede a generar algunas imágenes falsas utilizando un generador de GAN. El generador se alimenta con ruido aleatorio, siguiendo una distribución normal, para generar estas imágenes sintéticas. El Inception Score y el FID para estas imágenes generadas se calculan utilizando las funciones definidas anteriormente. Finalmente, se imprimen los resultados de estos cálculos.

En resumen, este ejemplo proporciona una demostración práctica de cómo evaluar el rendimiento de una Red Generativa Adversarial (GAN) utilizando dos métricas comúnmente utilizadas: el Inception Score y la Fréchet Inception Distance. Ambas métricas proporcionan información valiosa sobre la calidad y diversidad de las imágenes generadas por la GAN, lo cual es crucial para evaluar la efectividad de la GAN.

Ejemplo de Fréchet Inception Distance (FID) para la Evaluación de GANs con TensorFlow

Aquí tienes un ejemplo completo de cómo calcular el FID para la evaluación de GANs utilizando TensorFlow:

  1. Dependencias:
import tensorflow as tf
from tensorflow.keras.applications import inception_v3
from tensorflow.keras.preprocessing import image
from scipy import linalg
import numpy as np

2. Modelo InceptionV3 para Extracción de Características:

def inception_model():
  """
  Loads the pre-trained InceptionV3 model for feature extraction.
  Removes the final classification layer.
  """
  model = inception_v3.InceptionV3(include_top=False, weights='imagenet')
  model.output = model.layers[-1].output
  return model

Esta función define inception_model que carga el modelo preentrenado InceptionV3 excluyendo la capa de clasificación final. Esta capa no es necesaria para el cálculo del FID, y solo queremos la representación de características aprendida por el modelo.

  1. Función de Preprocesamiento:
def preprocess_image(img_path):
  """
  Preprocesses an image for InceptionV3 input.
  """
  target_size = (299, 299)
  img = image.load_img(img_path, target_size=target_size)
  img = image.img_to_array(img)
  img = img / 255.0
  img = np.expand_dims(img, axis=0)
  return img

Esta función define preprocess_image, la cual toma una ruta de imagen y la preprocesa para la entrada de InceptionV3. Esto incluye redimensionar la imagen al tamaño objetivo (299x299 para InceptionV3) y normalización.

  1. Función de Extracción de Características:
def extract_features(model, img_paths):
  """
  Extracts features from a list of images using the InceptionV3 model.
  """
  features = []
  for img_path in img_paths:
    img = preprocess_image(img_path)
    feature = model.predict(img)
    features.append(feature)
  return np.array(features)

Esta función define extract_features, la cual toma el modelo InceptionV3 y una lista de rutas de imágenes. Itera a través de cada ruta, preprocesa la imagen, la alimenta al modelo y almacena las características extraídas en un array de NumPy.

  1. Función de Cálculo del FID:
def calculate_fid(real_imgs, generated_imgs):
  """
  Calculates the Fréchet Inception Distance (FID) between two sets of images.
  """
  # Load InceptionV3 model
  model = inception_model()

  # Extract features for real and generated images
  real_features = extract_features(model, real_imgs)
  generated_features = extract_features(model, generated_imgs)

  # Calculate statistics for real and generated features
  real_mean = np.mean(real_features, axis=0)
  real_cov = np.cov(real_features.reshape(real_features.shape[0], -1), rowvar=False)
  generated_mean = np.mean(generated_features, axis=0)
  generated_cov = np.cov(generated_features.reshape(generated_features.shape[0], -1), rowvar=False)

  # Calculate squared mean difference
  ssdiff = np.sum((real_mean - generated_mean)**2)

  # Calculate FID
  covmean = linalg.sqrtm(np.dot(real_cov, generated_cov))
  if np.iscomplexobj(covmean):
    covmean = covmean.real
  fid = ssdiff + np.trace(real_cov + generated_cov - 2.0 * covmean)
  return fid

Esta función define calculate_fid, la cual toma dos listas de rutas de imágenes (reales y generadas). Utiliza las funciones definidas previamente para extraer características de ambos conjuntos y luego calcula el FID. Aquí hay un desglose de los pasos clave:

  • Extrae características para las imágenes reales y generadas utilizando el modelo InceptionV3.
  • Calcula la media y la matriz de covarianza para ambos conjuntos de características.
  • Calcula la diferencia de medias al cuadrado entre las medias reales y generadas.
  • Calcula la raíz cuadrada del producto de las covarianzas.
  • Maneja posibles problemas de números complejos que surgen de la raíz cuadrada del producto.
  • El FID se define como la suma de las diferencias de medias al cuadrado.

Ejemplo de Precisión y Recall para Modelos Generativos con TensorFlow

Aunque no hay una implementación estándar utilizando TensorFlow para Precisión y Recall (PR) específicamente diseñados para modelos generativos, podemos explorar un enfoque similar aprovechando las características de Inception como se propone en el artículo "Assessing Generative Models via Precision and Recall". Aquí hay un desglose del concepto y un ejemplo de implementación:

  1. Comprendiendo PR para Modelos Generativos:
  • Precisión: Mide la calidad de las muestras generadas por el modelo. Una alta precisión indica que un mayor porcentaje de muestras generadas se asemejan a la distribución de datos reales.
  • Recall: Mide la capacidad del modelo para capturar la diversidad de la distribución de datos reales. Un alto recall indica que las muestras generadas cubren una gama más amplia de variaciones presentes en los datos reales.
  1. Emparejamiento de Características de Inception:

Este enfoque utiliza el modelo preentrenado InceptionV3 para extraer características tanto de los datos reales como de los generados. La idea es comparar estas características para evaluar qué tan bien se alinean los datos generados con la distribución de datos reales.

  1. Ejemplo de Implementación:
import tensorflow as tf
from tensorflow.keras.applications import inception_v3
from tensorflow.keras.preprocessing import image
import numpy as np

def inception_model():
  """
  Loads the pre-trained InceptionV3 model for feature extraction.
  """
  model = inception_v3.InceptionV3(include_top=False, weights='imagenet')
  model.output = model.layers[-1].output
  return model

def preprocess_image(img_path):
  """
  Preprocesses an image for InceptionV3 input.
  """
  target_size = (299, 299)
  img = image.load_img(img_path, target_size=target_size)
  img = image.img_to_array(img)
  img = img / 255.0
  img = np.expand_dims(img, axis=0)
  return img

def extract_features(model, img_paths):
  """
  Extracts features from a list of images using the InceptionV3 model.
  """
  features = []
  for img_path in img_paths:
    img = preprocess_image(img_path)
    feature = model.predict(img)
    features.append(feature)
  return np.array(features)

def compute_pr(real_features, generated_features):
  """
  Estimates precision and recall based on Inception feature distances.
  **Note:** This is a simplified approach and may not capture the full 
  complexity of PR for generative models.

  Parameters:
      real_features: NumPy array of features from real data.
      generated_features: NumPy array of features from generated data.

  Returns:
      precision: Estimated precision value.
      recall: Estimated recall value.
  """
  # Calculate pairwise distances between real and generated features
  real_distances = np.linalg.norm(real_features[:, np.newaxis] - generated_features, axis=2)

  # Threshold for considering a generated sample close to real data (hyperparameter)
  threshold = 0.5

  # Count samples within the threshold distance
  close_samples = np.sum(real_distances < threshold, axis=1)

  # Precision: Ratio of close generated samples to total generated samples
  precision = np.mean(close_samples / generated_features.shape[0])

  # Recall: Ratio of generated samples close to at least one real sample
  recall = np.mean(close_samples > 0)

  return precision, recall

# Example usage
model = inception_model()
real_imgs = ["path/to/real/image1.jpg", "path/to/real/image2.png"]
generated_imgs = ["path/to/generated/image1.jpg", "path/to/generated/image2.png"]

real_features = extract_features(model, real_imgs)
generated_features = extract_features(model, generated_imgs)

precision, recall = compute_pr(real_features, generated_features)

print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")

4. Nota Importante:

Este ejemplo proporciona un enfoque simplificado para estimar la Precisión y Recall (PR) para modelos generativos utilizando características de Inception. Utiliza un umbral de distancia para categorizar las muestras generadas como "cercanas" a los datos reales. Para una evaluación más completa, considere técnicas del artículo original que involucran la estimación de densidad del kernel y el cálculo de curvas PR en un rango de umbrales.

Evaluación de Modelos Generativos mediante Precisión y Recall: https://proceedings.neurips.cc/paper_files/paper/2018/file/f7696a9b362ac5a51c3dc8f098b73923-Paper.pdf

3.4.2 Evaluación Cualitativa

La evaluación cualitativa implica la inspección visual de las muestras generadas para evaluar su calidad. Este enfoque es subjetivo pero proporciona información valiosa sobre el realismo y la diversidad de los datos generados.

En el contexto de las Redes Generativas Adversariales (GANs), la evaluación cualitativa implica examinar de cerca las muestras generadas para evaluar su nivel de realismo y la diversidad que presentan. Esto puede implicar buscar cualquier artefacto visual, evaluar la claridad o el desenfoque de las muestras y verificar qué tan bien representan las muestras generadas la diversidad de los datos reales.

Por ejemplo, si la GAN está diseñada para generar imágenes de rostros, una evaluación cualitativa podría involucrar observar los rostros generados para ver qué tan bien se parecen a los rostros humanos reales y qué tan diversos son en términos de edad, género, etnia y otras características.

Aunque la evaluación cualitativa no proporciona una métrica concreta y numérica para evaluar el rendimiento como lo hace la evaluación cuantitativa, proporciona información valiosa que puede ayudar a mejorar el modelo. Por ejemplo, si el observador nota que las imágenes generadas son principalmente borrosas, esto podría indicar que el generador de la GAN no es lo suficientemente potente y necesita ser ajustado.

Además de la inspección visual, la evaluación cualitativa también puede involucrar la comparación con datos reales. Esto implica comparar las muestras generadas lado a lado con muestras de datos reales para evaluar qué tan similares son. Este método, aunque sigue siendo subjetivo, podría proporcionar una comparación más objetiva que la inspección visual por sí sola.

En general, la evaluación cualitativa juega un papel esencial en la evaluación del rendimiento de las Redes Generativas Adversariales. Si bien idealmente debería usarse junto con métodos cuantitativos para una evaluación más completa, puede proporcionar información valiosa que pueda guiar el ajuste fino del modelo.

Ejemplo: Inspección Visual de Imágenes Generadas

import matplotlib.pyplot as plt

# Generate new samples
noise = np.random.normal(0, 1, (10, 100))
generated_images = generator.predict(noise)

# Plot generated images
fig, axs = plt.subplots(1, 10, figsize=(20, 2))
for i, img in enumerate(generated_images):
    axs[i].imshow(img.squeeze(), cmap='gray')
    axs[i].axis('off')
plt.show()

En este ejemplo:

Este fragmento de código se centra en la visualización de los datos generados por la GAN. Comienza importando la biblioteca Matplotlib, que se usa extensamente en Python para crear visualizaciones estáticas, animadas e interactivas.

La primera parte del análisis implica la generación de nuevas muestras de datos. Esto se hace creando 'ruido', que son números aleatorios que siguen una distribución normal (en este caso, centrada en 0 con una desviación estándar de 1). Se crea un array de tamaño 10x100, donde cada fila es una muestra de ruido separada. Estas muestras de ruido sirven como entradas para el generador de la GAN, que las utiliza para crear nuevas muestras de datos. En este caso, se espera que el generador devuelva imágenes, de ahí el nombre 'generated_images'.

La segunda parte del análisis implica la visualización de estas imágenes generadas. Se crea una figura con una cuadrícula de 1 fila y 10 columnas, y un tamaño de 20x2. Cada celda en esta cuadrícula contendrá una de las imágenes generadas. Las imágenes se trazan una por una en cada celda. Las imágenes se comprimen (para eliminar las entradas de dimensión única de sus formas) y se convierten a escala de grises para mayor claridad visual. Los ejes también se desactivan para cada imagen, para que las imágenes mismas sean el foco de la visualización.

Una vez que todas las imágenes se han trazado, la figura se muestra usando plt.show(). Este comando revela toda la figura y sus subgráficos como una sola salida. Esta visualización proporcionaría una mirada a la diversidad y calidad de las imágenes generadas por la GAN, basándose en las entradas de ruido aleatorias iniciales.

Este tipo de visualización es extremadamente útil para evaluar qué tan bien ha aprendido la GAN a generar nuevos datos. Al inspeccionar visualmente las imágenes generadas, podemos tener una idea de cuán realistas se ven y cómo imitan los datos de entrenamiento. Esta evaluación cualitativa, aunque subjetiva, es una parte importante de la evaluación de la efectividad de las GANs.

3.4.3 Estudios de Usuario

El proceso de realizar estudios de usuario es una parte esencial para evaluar la calidad de los datos generados. Este método implica obtener valiosos comentarios de los participantes humanos que interactúan con los datos. El propósito principal de estos estudios es medir la calidad y realismo percibidos de las imágenes generadas por el sistema.

A los participantes en estos estudios se les suele pedir que proporcionen sus calificaciones sobre una variedad de criterios. Algunos de estos criterios pueden incluir aspectos como el realismo de las imágenes, la diversidad de las imágenes producidas y el atractivo visual general de las salidas generadas. Al solicitar comentarios sobre estos aspectos específicos, los investigadores pueden obtener una comprensión integral de qué tan bien se desempeña el sistema en términos de generación de datos.

Es importante tener en cuenta que los estudios de usuario ofrecen una ventaja significativa sobre otras formas de evaluación. A diferencia de confiar únicamente en la inspección visual, donde la evaluación puede ser algo subjetiva y propensa a sesgos, los estudios de usuario proporcionan una evaluación más objetiva y robusta del rendimiento del sistema.

Esto se debe al hecho de que incorporan una amplia gama de perspectivas de múltiples participantes, lo que mejora la fiabilidad y credibilidad de los resultados de la evaluación.

Ejemplo: Realización de un Estudio de Usuario

# Generate new samples for the user study
noise = np.random.normal(0, 1, (20, 100))
generated_images = generator.predict(noise)

# Save generated images to disk for user study
for i, img in enumerate(generated_images):
    plt.imsave(f'generated_image_{i}.png', img.squeeze(), cmap='gray')

# Instructions for the user study:
# 1. Show participants the saved generated images.
# 2. Ask participants to rate each image on a scale of 1 to 5 for realism and visual appeal.
# 3. Collect the ratings and analyze the results to assess the quality of the GAN.

Este ejemplo de código genera nuevas muestras de imágenes para un estudio de usuario. Crea ruido aleatorio y lo usa como entrada para un modelo generativo (el generador) para producir imágenes. Estas imágenes se guardan en el disco. El resto de los comentarios describen instrucciones para un estudio de usuario.

A los usuarios se les mostrarán las imágenes generadas y se les pedirá que las califiquen en una escala del 1 al 5 en términos de realismo y atractivo visual. Las calificaciones recopiladas se analizan luego para evaluar la calidad de la Red Generativa Adversarial (GAN) que produjo las imágenes.

3.4.4 Evaluación de Aplicaciones Específicas

Los criterios para evaluar las Redes Generativas Adversariales (GANs) pueden diferir significativamente según la aplicación particular para la cual se estén utilizando. Es esencial adaptar las métricas de evaluación para que se ajusten al propósito específico y las demandas de la aplicación en cuestión. Aquí hay algunos ejemplos:

  • Superresolución de Imágenes: En este caso, el objetivo es evaluar la calidad de las imágenes que han sido aumentadas de resolución. La evaluación debe centrarse en determinar la nitidez y claridad de las imágenes mejoradas, para lo cual se emplean típicamente métricas como la Relación Señal-Ruido Pico (PSNR) y el Índice de Similitud Estructural (SSIM). Estas son medidas cuantitativas que proporcionan una indicación clara del éxito del proceso de superresolución.
  • Generación de Texto: Cuando las GANs se utilizan para la generación de texto, el enfoque cambia a evaluar la fluidez y coherencia del texto que se ha generado. Este puede ser un proceso algo subjetivo, pero existen algunas métricas establecidas, como las puntuaciones BLEU o ROUGE, que proporcionan una medida objetiva de la calidad del texto generado.
  • Transferencia de Estilo: Para aplicaciones que implican transferencia de estilo, la evaluación debe centrarse en la consistencia y calidad artística de los estilos que se han transferido a las imágenes objetivo. Esto implica comparar las imágenes de salida con imágenes de referencia para determinar qué tan bien se ha capturado y transferido el estilo. La calidad de la transferencia de estilo a menudo puede ser una medida más subjetiva, ya que puede depender de las percepciones individuales de la calidad artística.

Ejemplo: Evaluación de Superresolución de Imágenes

Aquí se muestra un ejemplo de cómo evaluar una aplicación de superresolución de imágenes utilizando métricas como PSNR y SSIM:

from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.metrics import structural_similarity as ssim

# Low-resolution and high-resolution images
low_res_images = ...  # Load low-resolution images
high_res_images = ...  # Load corresponding high-resolution images

# Generate super-resolved images using the GAN generator
super_res_images = generator.predict(low_res_images)

# Calculate PSNR and SSIM for each image
psnr_values = [psnr(hr, sr) for hr, sr in zip(high_res_images, super_res_images)]
ssim_values = [ssim(hr, sr, multichannel=True) for hr, sr in zip(high_res_images, super_res_images)]

# Print average PSNR and SSIM
print(f"Average PSNR: {np.mean(psnr_values)}")
print(f"Average SSIM: {np.mean(ssim_values)}")

Este ejemplo de código calcula efectivamente el PSNR (Relación Señal-Ruido Pico) y el SSIM (Índice de Similitud Estructural) entre imágenes de alta resolución (HR) y sus correspondientes imágenes de superresolución (SR) generadas por una GAN.

Aquí hay un desglose de los pasos:

Importar Métricas:

  • peak_signal_noise_ratio (psnr) y structural_similarity (ssim) se importan desde skimage.metrics. Estas funciones se utilizan para calcular las métricas respectivas.

Cargar Imágenes:

  • low_res_images: Esta variable probablemente contiene las imágenes de baja resolución precargadas que deseas usar para la superresolución.
  • high_res_images: Esta variable contiene las imágenes de alta resolución correspondientes para comparación.

Generar Imágenes de Superresolución:

  • super_res_images = generator.predict(low_res_images): Esta línea asume que tienes un modelo GAN entrenado con una función generator que toma imágenes de baja resolución como entrada y predice imágenes de superresolución.

Calcular PSNR y SSIM:

  • El código itera a través de pares de imágenes HR y SR correspondientes usando zip.
  • psnr_values: Para cada par, calcula el PSNR entre las imágenes HR y SR usando la función psnr y añade el valor a una lista llamada psnr_values.
  • ssim_values: De manera similar, calcula el SSIM entre cada par de imágenes HR y SR usando la función ssim con multichannel=True (asumiendo imágenes RGB) y añade el valor a una lista llamada ssim_values.

Imprimir Valores Promedio:

  • np.mean(psnr_values) calcula el PSNR promedio en todos los pares de imágenes.
  • np.mean(ssim_values) calcula el SSIM promedio en todos los pares de imágenes.
  • Finalmente, el código imprime los valores promedio de PSNR y SSIM.

En general, este ejemplo de código evalúa efectivamente la calidad de las imágenes de superresolución generadas comparándolas con las imágenes de alta resolución originales utilizando las métricas PSNR y SSIM.