Menu iconMenu icon
Aprendizaje Profundo Generativo Edición Actualizada

Capítulo 10: Proyecto: Generación de Imágenes con Modelos de Difusión

10.5 Evaluación del Modelo

Evaluar el rendimiento del modelo de difusión es esencial para garantizar que las imágenes generadas sean de alta calidad, coherentes y contextualmente apropiadas. Esta sección cubrirá varios métodos para evaluar el modelo, incluyendo métricas cuantitativas y evaluaciones cualitativas. Proporcionaremos explicaciones detalladas y ejemplos de código para cada método de evaluación.

10.5.1 Métricas de Evaluación Cuantitativa

Las métricas cuantitativas proporcionan medidas objetivas del rendimiento del modelo. Las métricas comunes para evaluar modelos de generación de imágenes incluyen el Error Cuadrático Medio (MSE), la Distancia de Fréchet Inception (FID) y el Inception Score (IS). Estas métricas ayudan a evaluar la calidad, diversidad y realismo de las imágenes generadas.

Error Cuadrático Medio (MSE)

El MSE mide la diferencia cuadrática promedio entre las imágenes originales y las generadas. Valores más bajos de MSE indican un mejor rendimiento, ya que implican que las imágenes generadas se asemejan estrechamente a las imágenes originales.

Ejemplo: Cálculo del MSE

import numpy as np
from sklearn.metrics import mean_squared_error

# Generate synthetic test data
test_data = generate_synthetic_data(100, noise_shape[0], noise_shape[1], noise_shape[2])
noisy_test_data = [noise_layer(data, training=True) for data in test_data]
X_test = np.array([noisy[-1] for noisy in noisy_test_data])
y_test = np.array([data for data in test_data])

# Predict denoised data
denoised_data = diffusion_model.predict(X_test)

# Calculate MSE
mse = mean_squared_error(y_test.flatten(), denoised_data.flatten())
print(f"MSE: {mse}")

Este script utiliza las bibliotecas NumPy y sklearn para crear datos de prueba sintéticos, agregar ruido a estos datos y luego intentar eliminarlos utilizando un modelo llamado 'diffusion_model'. Después, calcula el Error Cuadrático Medio (MSE) entre los datos originales y los datos sin ruido, que es una métrica común para evaluar el rendimiento de un modelo de regresión. Cuanto más bajo sea el MSE, mejor será el rendimiento del modelo.

Distancia de Fréchet Inception (FID)

El FID mide la distancia entre las distribuciones de las imágenes originales y las generadas, capturando tanto la calidad como la diversidad de las imágenes generadas. Puntajes FID más bajos indican un mejor rendimiento.

Ejemplo: Cálculo del FID

from scipy.linalg import sqrtm
from numpy import cov, trace, iscomplexobj

def calculate_fid(real_images, generated_images):
    # Calculate the mean and covariance of real and generated images
    mu1, sigma1 = real_images.mean(axis=0), cov(real_images, rowvar=False)
    mu2, sigma2 = generated_images.mean(axis=0), cov(generated_images, rowvar=False)

    # Calculate the sum of squared differences between means
    ssdiff = np.sum((mu1 - mu2) ** 2.0)

    # Calculate the square root of the product of covariances
    covmean = sqrtm(sigma1.dot(sigma2))
    if iscomplexobj(covmean):
        covmean = covmean.real

    # Calculate the FID score
    fid = ssdiff + trace(sigma1 + sigma2 - 2.0 * covmean)
    return fid

# Assume denoised_data and y_test are the denoised and original data, respectively
fid_score = calculate_fid(y_test.reshape(100, -1), denoised_data.reshape(100, -1))
print(f"FID Score: {fid_score}")

El código define una función, calculate_fid, para calcular la Distancia de Fréchet Inception (FID) entre imágenes reales y generadas. El FID es una medida de similitud entre dos conjuntos de imágenes, utilizada comúnmente para evaluar la calidad de las imágenes generadas por Redes Generativas Antagónicas (GANs).

La función calcula la media y la covarianza de ambas imágenes, reales y generadas. Luego, computa la suma de las diferencias cuadráticas entre las medias y la raíz cuadrada del producto de las covarianzas. Si el resultado es complejo, solo toma la parte real. La puntuación FID se calcula como la suma de la diferencia cuadrada de las medias y la traza de la suma de las covarianzas menos dos veces el producto de las covarianzas.

La última parte del código utiliza la función definida para calcular la puntuación FID entre y_test y denoised_data (presumiblemente los datos originales y los datos sin ruido), reestructurándolos antes de pasarlos a la función. Luego, se imprime la puntuación FID.

Puntuación Inception (IS)

IS evalúa la calidad y la diversidad de las imágenes generadas basándose en las predicciones de una red Inception preentrenada. Valores más altos de IS indican un mejor rendimiento.

Ejemplo: Cálculo de la Puntuación Inception

import tensorflow as tf
from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input
from scipy.stats import entropy

# Load the pre-trained InceptionV3 model
inception_model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))

def calculate_inception_score(images, n_split=10, eps=1E-16):
    # Resize and preprocess images for InceptionV3 model
    images_resized = tf.image.resize(images, (299, 299))
    images_preprocessed = preprocess_input(images_resized)

    # Predict using the InceptionV3 model
    preds = inception_model.predict(images_preprocessed)

    # Calculate Inception Score
    split_scores = []
    for i in range(n_split):
        part = preds[i * preds.shape[0] // n_split: (i + 1) * preds.shape[0] // n_split]
        py = np.mean(part, axis=0)
        scores = []
        for p in part:
            scores.append(entropy(p, py))
        split_scores.append(np.exp(np.mean(scores)))
    return np.mean(split_scores), np.std(split_scores)

# Assume denoised_data are the generated images
is_mean, is_std = calculate_inception_score(denoised_data)
print(f"Inception Score: {is_mean} ± {is_std}")

Este código utiliza la biblioteca TensorFlow y su modelo InceptionV3, una red neuronal preentrenada para la clasificación de imágenes, para calcular la Puntuación Inception de un conjunto de imágenes.

La Puntuación Inception es una medida utilizada para evaluar la calidad de las imágenes generadas por Redes Generativas Antagónicas (GANs). Evalúa tanto la variedad de imágenes producidas (utilizando la entropía) como lo realistas que son (qué tan bien son clasificadas por el modelo Inception).

El script primero carga el modelo InceptionV3. Luego, define una función para calcular la Puntuación Inception. Las imágenes son redimensionadas y preprocesadas para cumplir con los requisitos de entrada del modelo InceptionV3. El modelo se utiliza para hacer predicciones sobre las imágenes preprocesadas. Estas predicciones se usan para calcular la Puntuación Inception. La función devuelve la media y la desviación estándar de las puntuaciones.

Finalmente, asume que denoised_data son las imágenes generadas, y calcula su Puntuación Inception, imprimiendo la media y la desviación estándar.

10.5.2 Evaluación Cualitativa

La evaluación cualitativa implica inspeccionar visualmente las imágenes generadas para evaluar su calidad, coherencia y realismo. Este método es subjetivo, pero proporciona información valiosa sobre el rendimiento del modelo.

Inspección Visual

La inspección visual implica generar un conjunto de imágenes y examinarlas para verificar su calidad y coherencia. Esto ayuda a identificar problemas obvios como artefactos, borrosidad o características poco realistas.

Ejemplo: Inspección Visual

import matplotlib.pyplot as plt

# Generate a sample for visual inspection
plt.figure(figsize=(12, 4))
for i in range(batch_size):
    plt.subplot(2, 5, i + 1)
    plt.imshow((generated_images[i] * 0.5) + 0.5)
    plt.axis('off')
plt.suptitle('Generated Images')
plt.show()

Este script utiliza la biblioteca matplotlib para generar y mostrar un conjunto de imágenes. Después de importar la biblioteca, abre una nueva figura con un tamaño especificado. Luego, genera una cantidad de imágenes igual a 'batch_size' (que no está definido en el texto seleccionado).

Para cada imagen, crea un subgráfico, genera la imagen (aparentemente a partir de algún tipo de datos de imagen, tampoco definidos en el texto seleccionado), ajusta el rango de color de la imagen y elimina el eje. Una vez que todas las imágenes han sido generadas, añade un título ('Generated Images') a la figura y la muestra.

Evaluación Humana

La evaluación humana implica pedir a un grupo de personas que califiquen la calidad de las imágenes generadas en base a criterios como realismo, coherencia y calidad general. Este método proporciona una evaluación robusta del rendimiento del modelo, pero puede ser lento y requerir muchos recursos.

Ejemplo: Criterios de Evaluación Humana

  • Realismo: ¿La imagen generada parece realista?
  • Coherencia: ¿La imagen generada es coherente y está libre de artefactos?
  • Calidad General: ¿Cómo se compara la imagen generada con las imágenes reales?

10.5.3 Evaluación de la Diversidad y Creatividad

Para evaluar la diversidad y creatividad de las imágenes generadas, podemos analizar la variación en las salidas dadas diferentes entradas o ligeras variaciones de la misma entrada. Esto ayuda a asegurar que el modelo produce salidas diversas e interesantes.

Ejemplo: Evaluación de la Diversidad

# Define a set of inputs with slight variations
inputs = [
    random_noise[0],
    random_noise[1],
    random_noise[2],
]

# Generate and plot outputs for each input
plt.figure(figsize=(12, 4))
for i, input_data in enumerate(inputs):
    step_encodings = create_step_encodings(1, d_model)
    output = diffusion_model.predict([np.expand_dims(input_data, axis=0), step_encodings])[0]
    plt.subplot(1, 3, i + 1)
    plt.imshow((output * 0.5) + 0.5)
    plt.axis('off')
    plt.title(f'Generated Image {i+1}')
plt.show()

Este script genera y grafica las imágenes usando un modelo predictivo. Comienza definiendo un conjunto de entradas que son variantes de 'random_noise'. Luego, para cada entrada, crea codificaciones de pasos, predice la salida usando el 'diffusion_model', y grafica la imagen generada. Las imágenes se grafican en una cuadrícula de 1 fila por 3 columnas y se etiquetan como 'Generated Image 1', 'Generated Image 2' y 'Generated Image 3'. La última línea de código muestra las imágenes graficadas.

Resumen

En esta sección, discutimos varios métodos para evaluar el rendimiento del modelo de difusión, incluyendo tanto métricas cuantitativas como evaluaciones cualitativas. Las métricas cuantitativas como el Error Cuadrático Medio (MSE), la Distancia de Incepción de Fréchet (FID) y el Puntaje de Incepción (IS) proporcionan medidas objetivas del rendimiento del modelo, evaluando la calidad, diversidad y realismo de las imágenes generadas.

También exploramos métodos de evaluación cualitativa, incluyendo la inspección visual y la evaluación humana, que ofrecen valiosos conocimientos sobre el rendimiento del modelo desde una perspectiva subjetiva. Evaluar la diversidad y creatividad de las imágenes generadas asegura que el modelo produzca salidas variadas e interesantes.

Al combinar estas técnicas de evaluación, puedes obtener una comprensión integral de las fortalezas del modelo y las áreas de mejora, mejorando en última instancia su capacidad para generar imágenes de alta calidad.

10.5 Evaluación del Modelo

Evaluar el rendimiento del modelo de difusión es esencial para garantizar que las imágenes generadas sean de alta calidad, coherentes y contextualmente apropiadas. Esta sección cubrirá varios métodos para evaluar el modelo, incluyendo métricas cuantitativas y evaluaciones cualitativas. Proporcionaremos explicaciones detalladas y ejemplos de código para cada método de evaluación.

10.5.1 Métricas de Evaluación Cuantitativa

Las métricas cuantitativas proporcionan medidas objetivas del rendimiento del modelo. Las métricas comunes para evaluar modelos de generación de imágenes incluyen el Error Cuadrático Medio (MSE), la Distancia de Fréchet Inception (FID) y el Inception Score (IS). Estas métricas ayudan a evaluar la calidad, diversidad y realismo de las imágenes generadas.

Error Cuadrático Medio (MSE)

El MSE mide la diferencia cuadrática promedio entre las imágenes originales y las generadas. Valores más bajos de MSE indican un mejor rendimiento, ya que implican que las imágenes generadas se asemejan estrechamente a las imágenes originales.

Ejemplo: Cálculo del MSE

import numpy as np
from sklearn.metrics import mean_squared_error

# Generate synthetic test data
test_data = generate_synthetic_data(100, noise_shape[0], noise_shape[1], noise_shape[2])
noisy_test_data = [noise_layer(data, training=True) for data in test_data]
X_test = np.array([noisy[-1] for noisy in noisy_test_data])
y_test = np.array([data for data in test_data])

# Predict denoised data
denoised_data = diffusion_model.predict(X_test)

# Calculate MSE
mse = mean_squared_error(y_test.flatten(), denoised_data.flatten())
print(f"MSE: {mse}")

Este script utiliza las bibliotecas NumPy y sklearn para crear datos de prueba sintéticos, agregar ruido a estos datos y luego intentar eliminarlos utilizando un modelo llamado 'diffusion_model'. Después, calcula el Error Cuadrático Medio (MSE) entre los datos originales y los datos sin ruido, que es una métrica común para evaluar el rendimiento de un modelo de regresión. Cuanto más bajo sea el MSE, mejor será el rendimiento del modelo.

Distancia de Fréchet Inception (FID)

El FID mide la distancia entre las distribuciones de las imágenes originales y las generadas, capturando tanto la calidad como la diversidad de las imágenes generadas. Puntajes FID más bajos indican un mejor rendimiento.

Ejemplo: Cálculo del FID

from scipy.linalg import sqrtm
from numpy import cov, trace, iscomplexobj

def calculate_fid(real_images, generated_images):
    # Calculate the mean and covariance of real and generated images
    mu1, sigma1 = real_images.mean(axis=0), cov(real_images, rowvar=False)
    mu2, sigma2 = generated_images.mean(axis=0), cov(generated_images, rowvar=False)

    # Calculate the sum of squared differences between means
    ssdiff = np.sum((mu1 - mu2) ** 2.0)

    # Calculate the square root of the product of covariances
    covmean = sqrtm(sigma1.dot(sigma2))
    if iscomplexobj(covmean):
        covmean = covmean.real

    # Calculate the FID score
    fid = ssdiff + trace(sigma1 + sigma2 - 2.0 * covmean)
    return fid

# Assume denoised_data and y_test are the denoised and original data, respectively
fid_score = calculate_fid(y_test.reshape(100, -1), denoised_data.reshape(100, -1))
print(f"FID Score: {fid_score}")

El código define una función, calculate_fid, para calcular la Distancia de Fréchet Inception (FID) entre imágenes reales y generadas. El FID es una medida de similitud entre dos conjuntos de imágenes, utilizada comúnmente para evaluar la calidad de las imágenes generadas por Redes Generativas Antagónicas (GANs).

La función calcula la media y la covarianza de ambas imágenes, reales y generadas. Luego, computa la suma de las diferencias cuadráticas entre las medias y la raíz cuadrada del producto de las covarianzas. Si el resultado es complejo, solo toma la parte real. La puntuación FID se calcula como la suma de la diferencia cuadrada de las medias y la traza de la suma de las covarianzas menos dos veces el producto de las covarianzas.

La última parte del código utiliza la función definida para calcular la puntuación FID entre y_test y denoised_data (presumiblemente los datos originales y los datos sin ruido), reestructurándolos antes de pasarlos a la función. Luego, se imprime la puntuación FID.

Puntuación Inception (IS)

IS evalúa la calidad y la diversidad de las imágenes generadas basándose en las predicciones de una red Inception preentrenada. Valores más altos de IS indican un mejor rendimiento.

Ejemplo: Cálculo de la Puntuación Inception

import tensorflow as tf
from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input
from scipy.stats import entropy

# Load the pre-trained InceptionV3 model
inception_model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))

def calculate_inception_score(images, n_split=10, eps=1E-16):
    # Resize and preprocess images for InceptionV3 model
    images_resized = tf.image.resize(images, (299, 299))
    images_preprocessed = preprocess_input(images_resized)

    # Predict using the InceptionV3 model
    preds = inception_model.predict(images_preprocessed)

    # Calculate Inception Score
    split_scores = []
    for i in range(n_split):
        part = preds[i * preds.shape[0] // n_split: (i + 1) * preds.shape[0] // n_split]
        py = np.mean(part, axis=0)
        scores = []
        for p in part:
            scores.append(entropy(p, py))
        split_scores.append(np.exp(np.mean(scores)))
    return np.mean(split_scores), np.std(split_scores)

# Assume denoised_data are the generated images
is_mean, is_std = calculate_inception_score(denoised_data)
print(f"Inception Score: {is_mean} ± {is_std}")

Este código utiliza la biblioteca TensorFlow y su modelo InceptionV3, una red neuronal preentrenada para la clasificación de imágenes, para calcular la Puntuación Inception de un conjunto de imágenes.

La Puntuación Inception es una medida utilizada para evaluar la calidad de las imágenes generadas por Redes Generativas Antagónicas (GANs). Evalúa tanto la variedad de imágenes producidas (utilizando la entropía) como lo realistas que son (qué tan bien son clasificadas por el modelo Inception).

El script primero carga el modelo InceptionV3. Luego, define una función para calcular la Puntuación Inception. Las imágenes son redimensionadas y preprocesadas para cumplir con los requisitos de entrada del modelo InceptionV3. El modelo se utiliza para hacer predicciones sobre las imágenes preprocesadas. Estas predicciones se usan para calcular la Puntuación Inception. La función devuelve la media y la desviación estándar de las puntuaciones.

Finalmente, asume que denoised_data son las imágenes generadas, y calcula su Puntuación Inception, imprimiendo la media y la desviación estándar.

10.5.2 Evaluación Cualitativa

La evaluación cualitativa implica inspeccionar visualmente las imágenes generadas para evaluar su calidad, coherencia y realismo. Este método es subjetivo, pero proporciona información valiosa sobre el rendimiento del modelo.

Inspección Visual

La inspección visual implica generar un conjunto de imágenes y examinarlas para verificar su calidad y coherencia. Esto ayuda a identificar problemas obvios como artefactos, borrosidad o características poco realistas.

Ejemplo: Inspección Visual

import matplotlib.pyplot as plt

# Generate a sample for visual inspection
plt.figure(figsize=(12, 4))
for i in range(batch_size):
    plt.subplot(2, 5, i + 1)
    plt.imshow((generated_images[i] * 0.5) + 0.5)
    plt.axis('off')
plt.suptitle('Generated Images')
plt.show()

Este script utiliza la biblioteca matplotlib para generar y mostrar un conjunto de imágenes. Después de importar la biblioteca, abre una nueva figura con un tamaño especificado. Luego, genera una cantidad de imágenes igual a 'batch_size' (que no está definido en el texto seleccionado).

Para cada imagen, crea un subgráfico, genera la imagen (aparentemente a partir de algún tipo de datos de imagen, tampoco definidos en el texto seleccionado), ajusta el rango de color de la imagen y elimina el eje. Una vez que todas las imágenes han sido generadas, añade un título ('Generated Images') a la figura y la muestra.

Evaluación Humana

La evaluación humana implica pedir a un grupo de personas que califiquen la calidad de las imágenes generadas en base a criterios como realismo, coherencia y calidad general. Este método proporciona una evaluación robusta del rendimiento del modelo, pero puede ser lento y requerir muchos recursos.

Ejemplo: Criterios de Evaluación Humana

  • Realismo: ¿La imagen generada parece realista?
  • Coherencia: ¿La imagen generada es coherente y está libre de artefactos?
  • Calidad General: ¿Cómo se compara la imagen generada con las imágenes reales?

10.5.3 Evaluación de la Diversidad y Creatividad

Para evaluar la diversidad y creatividad de las imágenes generadas, podemos analizar la variación en las salidas dadas diferentes entradas o ligeras variaciones de la misma entrada. Esto ayuda a asegurar que el modelo produce salidas diversas e interesantes.

Ejemplo: Evaluación de la Diversidad

# Define a set of inputs with slight variations
inputs = [
    random_noise[0],
    random_noise[1],
    random_noise[2],
]

# Generate and plot outputs for each input
plt.figure(figsize=(12, 4))
for i, input_data in enumerate(inputs):
    step_encodings = create_step_encodings(1, d_model)
    output = diffusion_model.predict([np.expand_dims(input_data, axis=0), step_encodings])[0]
    plt.subplot(1, 3, i + 1)
    plt.imshow((output * 0.5) + 0.5)
    plt.axis('off')
    plt.title(f'Generated Image {i+1}')
plt.show()

Este script genera y grafica las imágenes usando un modelo predictivo. Comienza definiendo un conjunto de entradas que son variantes de 'random_noise'. Luego, para cada entrada, crea codificaciones de pasos, predice la salida usando el 'diffusion_model', y grafica la imagen generada. Las imágenes se grafican en una cuadrícula de 1 fila por 3 columnas y se etiquetan como 'Generated Image 1', 'Generated Image 2' y 'Generated Image 3'. La última línea de código muestra las imágenes graficadas.

Resumen

En esta sección, discutimos varios métodos para evaluar el rendimiento del modelo de difusión, incluyendo tanto métricas cuantitativas como evaluaciones cualitativas. Las métricas cuantitativas como el Error Cuadrático Medio (MSE), la Distancia de Incepción de Fréchet (FID) y el Puntaje de Incepción (IS) proporcionan medidas objetivas del rendimiento del modelo, evaluando la calidad, diversidad y realismo de las imágenes generadas.

También exploramos métodos de evaluación cualitativa, incluyendo la inspección visual y la evaluación humana, que ofrecen valiosos conocimientos sobre el rendimiento del modelo desde una perspectiva subjetiva. Evaluar la diversidad y creatividad de las imágenes generadas asegura que el modelo produzca salidas variadas e interesantes.

Al combinar estas técnicas de evaluación, puedes obtener una comprensión integral de las fortalezas del modelo y las áreas de mejora, mejorando en última instancia su capacidad para generar imágenes de alta calidad.

10.5 Evaluación del Modelo

Evaluar el rendimiento del modelo de difusión es esencial para garantizar que las imágenes generadas sean de alta calidad, coherentes y contextualmente apropiadas. Esta sección cubrirá varios métodos para evaluar el modelo, incluyendo métricas cuantitativas y evaluaciones cualitativas. Proporcionaremos explicaciones detalladas y ejemplos de código para cada método de evaluación.

10.5.1 Métricas de Evaluación Cuantitativa

Las métricas cuantitativas proporcionan medidas objetivas del rendimiento del modelo. Las métricas comunes para evaluar modelos de generación de imágenes incluyen el Error Cuadrático Medio (MSE), la Distancia de Fréchet Inception (FID) y el Inception Score (IS). Estas métricas ayudan a evaluar la calidad, diversidad y realismo de las imágenes generadas.

Error Cuadrático Medio (MSE)

El MSE mide la diferencia cuadrática promedio entre las imágenes originales y las generadas. Valores más bajos de MSE indican un mejor rendimiento, ya que implican que las imágenes generadas se asemejan estrechamente a las imágenes originales.

Ejemplo: Cálculo del MSE

import numpy as np
from sklearn.metrics import mean_squared_error

# Generate synthetic test data
test_data = generate_synthetic_data(100, noise_shape[0], noise_shape[1], noise_shape[2])
noisy_test_data = [noise_layer(data, training=True) for data in test_data]
X_test = np.array([noisy[-1] for noisy in noisy_test_data])
y_test = np.array([data for data in test_data])

# Predict denoised data
denoised_data = diffusion_model.predict(X_test)

# Calculate MSE
mse = mean_squared_error(y_test.flatten(), denoised_data.flatten())
print(f"MSE: {mse}")

Este script utiliza las bibliotecas NumPy y sklearn para crear datos de prueba sintéticos, agregar ruido a estos datos y luego intentar eliminarlos utilizando un modelo llamado 'diffusion_model'. Después, calcula el Error Cuadrático Medio (MSE) entre los datos originales y los datos sin ruido, que es una métrica común para evaluar el rendimiento de un modelo de regresión. Cuanto más bajo sea el MSE, mejor será el rendimiento del modelo.

Distancia de Fréchet Inception (FID)

El FID mide la distancia entre las distribuciones de las imágenes originales y las generadas, capturando tanto la calidad como la diversidad de las imágenes generadas. Puntajes FID más bajos indican un mejor rendimiento.

Ejemplo: Cálculo del FID

from scipy.linalg import sqrtm
from numpy import cov, trace, iscomplexobj

def calculate_fid(real_images, generated_images):
    # Calculate the mean and covariance of real and generated images
    mu1, sigma1 = real_images.mean(axis=0), cov(real_images, rowvar=False)
    mu2, sigma2 = generated_images.mean(axis=0), cov(generated_images, rowvar=False)

    # Calculate the sum of squared differences between means
    ssdiff = np.sum((mu1 - mu2) ** 2.0)

    # Calculate the square root of the product of covariances
    covmean = sqrtm(sigma1.dot(sigma2))
    if iscomplexobj(covmean):
        covmean = covmean.real

    # Calculate the FID score
    fid = ssdiff + trace(sigma1 + sigma2 - 2.0 * covmean)
    return fid

# Assume denoised_data and y_test are the denoised and original data, respectively
fid_score = calculate_fid(y_test.reshape(100, -1), denoised_data.reshape(100, -1))
print(f"FID Score: {fid_score}")

El código define una función, calculate_fid, para calcular la Distancia de Fréchet Inception (FID) entre imágenes reales y generadas. El FID es una medida de similitud entre dos conjuntos de imágenes, utilizada comúnmente para evaluar la calidad de las imágenes generadas por Redes Generativas Antagónicas (GANs).

La función calcula la media y la covarianza de ambas imágenes, reales y generadas. Luego, computa la suma de las diferencias cuadráticas entre las medias y la raíz cuadrada del producto de las covarianzas. Si el resultado es complejo, solo toma la parte real. La puntuación FID se calcula como la suma de la diferencia cuadrada de las medias y la traza de la suma de las covarianzas menos dos veces el producto de las covarianzas.

La última parte del código utiliza la función definida para calcular la puntuación FID entre y_test y denoised_data (presumiblemente los datos originales y los datos sin ruido), reestructurándolos antes de pasarlos a la función. Luego, se imprime la puntuación FID.

Puntuación Inception (IS)

IS evalúa la calidad y la diversidad de las imágenes generadas basándose en las predicciones de una red Inception preentrenada. Valores más altos de IS indican un mejor rendimiento.

Ejemplo: Cálculo de la Puntuación Inception

import tensorflow as tf
from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input
from scipy.stats import entropy

# Load the pre-trained InceptionV3 model
inception_model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))

def calculate_inception_score(images, n_split=10, eps=1E-16):
    # Resize and preprocess images for InceptionV3 model
    images_resized = tf.image.resize(images, (299, 299))
    images_preprocessed = preprocess_input(images_resized)

    # Predict using the InceptionV3 model
    preds = inception_model.predict(images_preprocessed)

    # Calculate Inception Score
    split_scores = []
    for i in range(n_split):
        part = preds[i * preds.shape[0] // n_split: (i + 1) * preds.shape[0] // n_split]
        py = np.mean(part, axis=0)
        scores = []
        for p in part:
            scores.append(entropy(p, py))
        split_scores.append(np.exp(np.mean(scores)))
    return np.mean(split_scores), np.std(split_scores)

# Assume denoised_data are the generated images
is_mean, is_std = calculate_inception_score(denoised_data)
print(f"Inception Score: {is_mean} ± {is_std}")

Este código utiliza la biblioteca TensorFlow y su modelo InceptionV3, una red neuronal preentrenada para la clasificación de imágenes, para calcular la Puntuación Inception de un conjunto de imágenes.

La Puntuación Inception es una medida utilizada para evaluar la calidad de las imágenes generadas por Redes Generativas Antagónicas (GANs). Evalúa tanto la variedad de imágenes producidas (utilizando la entropía) como lo realistas que son (qué tan bien son clasificadas por el modelo Inception).

El script primero carga el modelo InceptionV3. Luego, define una función para calcular la Puntuación Inception. Las imágenes son redimensionadas y preprocesadas para cumplir con los requisitos de entrada del modelo InceptionV3. El modelo se utiliza para hacer predicciones sobre las imágenes preprocesadas. Estas predicciones se usan para calcular la Puntuación Inception. La función devuelve la media y la desviación estándar de las puntuaciones.

Finalmente, asume que denoised_data son las imágenes generadas, y calcula su Puntuación Inception, imprimiendo la media y la desviación estándar.

10.5.2 Evaluación Cualitativa

La evaluación cualitativa implica inspeccionar visualmente las imágenes generadas para evaluar su calidad, coherencia y realismo. Este método es subjetivo, pero proporciona información valiosa sobre el rendimiento del modelo.

Inspección Visual

La inspección visual implica generar un conjunto de imágenes y examinarlas para verificar su calidad y coherencia. Esto ayuda a identificar problemas obvios como artefactos, borrosidad o características poco realistas.

Ejemplo: Inspección Visual

import matplotlib.pyplot as plt

# Generate a sample for visual inspection
plt.figure(figsize=(12, 4))
for i in range(batch_size):
    plt.subplot(2, 5, i + 1)
    plt.imshow((generated_images[i] * 0.5) + 0.5)
    plt.axis('off')
plt.suptitle('Generated Images')
plt.show()

Este script utiliza la biblioteca matplotlib para generar y mostrar un conjunto de imágenes. Después de importar la biblioteca, abre una nueva figura con un tamaño especificado. Luego, genera una cantidad de imágenes igual a 'batch_size' (que no está definido en el texto seleccionado).

Para cada imagen, crea un subgráfico, genera la imagen (aparentemente a partir de algún tipo de datos de imagen, tampoco definidos en el texto seleccionado), ajusta el rango de color de la imagen y elimina el eje. Una vez que todas las imágenes han sido generadas, añade un título ('Generated Images') a la figura y la muestra.

Evaluación Humana

La evaluación humana implica pedir a un grupo de personas que califiquen la calidad de las imágenes generadas en base a criterios como realismo, coherencia y calidad general. Este método proporciona una evaluación robusta del rendimiento del modelo, pero puede ser lento y requerir muchos recursos.

Ejemplo: Criterios de Evaluación Humana

  • Realismo: ¿La imagen generada parece realista?
  • Coherencia: ¿La imagen generada es coherente y está libre de artefactos?
  • Calidad General: ¿Cómo se compara la imagen generada con las imágenes reales?

10.5.3 Evaluación de la Diversidad y Creatividad

Para evaluar la diversidad y creatividad de las imágenes generadas, podemos analizar la variación en las salidas dadas diferentes entradas o ligeras variaciones de la misma entrada. Esto ayuda a asegurar que el modelo produce salidas diversas e interesantes.

Ejemplo: Evaluación de la Diversidad

# Define a set of inputs with slight variations
inputs = [
    random_noise[0],
    random_noise[1],
    random_noise[2],
]

# Generate and plot outputs for each input
plt.figure(figsize=(12, 4))
for i, input_data in enumerate(inputs):
    step_encodings = create_step_encodings(1, d_model)
    output = diffusion_model.predict([np.expand_dims(input_data, axis=0), step_encodings])[0]
    plt.subplot(1, 3, i + 1)
    plt.imshow((output * 0.5) + 0.5)
    plt.axis('off')
    plt.title(f'Generated Image {i+1}')
plt.show()

Este script genera y grafica las imágenes usando un modelo predictivo. Comienza definiendo un conjunto de entradas que son variantes de 'random_noise'. Luego, para cada entrada, crea codificaciones de pasos, predice la salida usando el 'diffusion_model', y grafica la imagen generada. Las imágenes se grafican en una cuadrícula de 1 fila por 3 columnas y se etiquetan como 'Generated Image 1', 'Generated Image 2' y 'Generated Image 3'. La última línea de código muestra las imágenes graficadas.

Resumen

En esta sección, discutimos varios métodos para evaluar el rendimiento del modelo de difusión, incluyendo tanto métricas cuantitativas como evaluaciones cualitativas. Las métricas cuantitativas como el Error Cuadrático Medio (MSE), la Distancia de Incepción de Fréchet (FID) y el Puntaje de Incepción (IS) proporcionan medidas objetivas del rendimiento del modelo, evaluando la calidad, diversidad y realismo de las imágenes generadas.

También exploramos métodos de evaluación cualitativa, incluyendo la inspección visual y la evaluación humana, que ofrecen valiosos conocimientos sobre el rendimiento del modelo desde una perspectiva subjetiva. Evaluar la diversidad y creatividad de las imágenes generadas asegura que el modelo produzca salidas variadas e interesantes.

Al combinar estas técnicas de evaluación, puedes obtener una comprensión integral de las fortalezas del modelo y las áreas de mejora, mejorando en última instancia su capacidad para generar imágenes de alta calidad.

10.5 Evaluación del Modelo

Evaluar el rendimiento del modelo de difusión es esencial para garantizar que las imágenes generadas sean de alta calidad, coherentes y contextualmente apropiadas. Esta sección cubrirá varios métodos para evaluar el modelo, incluyendo métricas cuantitativas y evaluaciones cualitativas. Proporcionaremos explicaciones detalladas y ejemplos de código para cada método de evaluación.

10.5.1 Métricas de Evaluación Cuantitativa

Las métricas cuantitativas proporcionan medidas objetivas del rendimiento del modelo. Las métricas comunes para evaluar modelos de generación de imágenes incluyen el Error Cuadrático Medio (MSE), la Distancia de Fréchet Inception (FID) y el Inception Score (IS). Estas métricas ayudan a evaluar la calidad, diversidad y realismo de las imágenes generadas.

Error Cuadrático Medio (MSE)

El MSE mide la diferencia cuadrática promedio entre las imágenes originales y las generadas. Valores más bajos de MSE indican un mejor rendimiento, ya que implican que las imágenes generadas se asemejan estrechamente a las imágenes originales.

Ejemplo: Cálculo del MSE

import numpy as np
from sklearn.metrics import mean_squared_error

# Generate synthetic test data
test_data = generate_synthetic_data(100, noise_shape[0], noise_shape[1], noise_shape[2])
noisy_test_data = [noise_layer(data, training=True) for data in test_data]
X_test = np.array([noisy[-1] for noisy in noisy_test_data])
y_test = np.array([data for data in test_data])

# Predict denoised data
denoised_data = diffusion_model.predict(X_test)

# Calculate MSE
mse = mean_squared_error(y_test.flatten(), denoised_data.flatten())
print(f"MSE: {mse}")

Este script utiliza las bibliotecas NumPy y sklearn para crear datos de prueba sintéticos, agregar ruido a estos datos y luego intentar eliminarlos utilizando un modelo llamado 'diffusion_model'. Después, calcula el Error Cuadrático Medio (MSE) entre los datos originales y los datos sin ruido, que es una métrica común para evaluar el rendimiento de un modelo de regresión. Cuanto más bajo sea el MSE, mejor será el rendimiento del modelo.

Distancia de Fréchet Inception (FID)

El FID mide la distancia entre las distribuciones de las imágenes originales y las generadas, capturando tanto la calidad como la diversidad de las imágenes generadas. Puntajes FID más bajos indican un mejor rendimiento.

Ejemplo: Cálculo del FID

from scipy.linalg import sqrtm
from numpy import cov, trace, iscomplexobj

def calculate_fid(real_images, generated_images):
    # Calculate the mean and covariance of real and generated images
    mu1, sigma1 = real_images.mean(axis=0), cov(real_images, rowvar=False)
    mu2, sigma2 = generated_images.mean(axis=0), cov(generated_images, rowvar=False)

    # Calculate the sum of squared differences between means
    ssdiff = np.sum((mu1 - mu2) ** 2.0)

    # Calculate the square root of the product of covariances
    covmean = sqrtm(sigma1.dot(sigma2))
    if iscomplexobj(covmean):
        covmean = covmean.real

    # Calculate the FID score
    fid = ssdiff + trace(sigma1 + sigma2 - 2.0 * covmean)
    return fid

# Assume denoised_data and y_test are the denoised and original data, respectively
fid_score = calculate_fid(y_test.reshape(100, -1), denoised_data.reshape(100, -1))
print(f"FID Score: {fid_score}")

El código define una función, calculate_fid, para calcular la Distancia de Fréchet Inception (FID) entre imágenes reales y generadas. El FID es una medida de similitud entre dos conjuntos de imágenes, utilizada comúnmente para evaluar la calidad de las imágenes generadas por Redes Generativas Antagónicas (GANs).

La función calcula la media y la covarianza de ambas imágenes, reales y generadas. Luego, computa la suma de las diferencias cuadráticas entre las medias y la raíz cuadrada del producto de las covarianzas. Si el resultado es complejo, solo toma la parte real. La puntuación FID se calcula como la suma de la diferencia cuadrada de las medias y la traza de la suma de las covarianzas menos dos veces el producto de las covarianzas.

La última parte del código utiliza la función definida para calcular la puntuación FID entre y_test y denoised_data (presumiblemente los datos originales y los datos sin ruido), reestructurándolos antes de pasarlos a la función. Luego, se imprime la puntuación FID.

Puntuación Inception (IS)

IS evalúa la calidad y la diversidad de las imágenes generadas basándose en las predicciones de una red Inception preentrenada. Valores más altos de IS indican un mejor rendimiento.

Ejemplo: Cálculo de la Puntuación Inception

import tensorflow as tf
from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input
from scipy.stats import entropy

# Load the pre-trained InceptionV3 model
inception_model = InceptionV3(include_top=False, pooling='avg', input_shape=(299, 299, 3))

def calculate_inception_score(images, n_split=10, eps=1E-16):
    # Resize and preprocess images for InceptionV3 model
    images_resized = tf.image.resize(images, (299, 299))
    images_preprocessed = preprocess_input(images_resized)

    # Predict using the InceptionV3 model
    preds = inception_model.predict(images_preprocessed)

    # Calculate Inception Score
    split_scores = []
    for i in range(n_split):
        part = preds[i * preds.shape[0] // n_split: (i + 1) * preds.shape[0] // n_split]
        py = np.mean(part, axis=0)
        scores = []
        for p in part:
            scores.append(entropy(p, py))
        split_scores.append(np.exp(np.mean(scores)))
    return np.mean(split_scores), np.std(split_scores)

# Assume denoised_data are the generated images
is_mean, is_std = calculate_inception_score(denoised_data)
print(f"Inception Score: {is_mean} ± {is_std}")

Este código utiliza la biblioteca TensorFlow y su modelo InceptionV3, una red neuronal preentrenada para la clasificación de imágenes, para calcular la Puntuación Inception de un conjunto de imágenes.

La Puntuación Inception es una medida utilizada para evaluar la calidad de las imágenes generadas por Redes Generativas Antagónicas (GANs). Evalúa tanto la variedad de imágenes producidas (utilizando la entropía) como lo realistas que son (qué tan bien son clasificadas por el modelo Inception).

El script primero carga el modelo InceptionV3. Luego, define una función para calcular la Puntuación Inception. Las imágenes son redimensionadas y preprocesadas para cumplir con los requisitos de entrada del modelo InceptionV3. El modelo se utiliza para hacer predicciones sobre las imágenes preprocesadas. Estas predicciones se usan para calcular la Puntuación Inception. La función devuelve la media y la desviación estándar de las puntuaciones.

Finalmente, asume que denoised_data son las imágenes generadas, y calcula su Puntuación Inception, imprimiendo la media y la desviación estándar.

10.5.2 Evaluación Cualitativa

La evaluación cualitativa implica inspeccionar visualmente las imágenes generadas para evaluar su calidad, coherencia y realismo. Este método es subjetivo, pero proporciona información valiosa sobre el rendimiento del modelo.

Inspección Visual

La inspección visual implica generar un conjunto de imágenes y examinarlas para verificar su calidad y coherencia. Esto ayuda a identificar problemas obvios como artefactos, borrosidad o características poco realistas.

Ejemplo: Inspección Visual

import matplotlib.pyplot as plt

# Generate a sample for visual inspection
plt.figure(figsize=(12, 4))
for i in range(batch_size):
    plt.subplot(2, 5, i + 1)
    plt.imshow((generated_images[i] * 0.5) + 0.5)
    plt.axis('off')
plt.suptitle('Generated Images')
plt.show()

Este script utiliza la biblioteca matplotlib para generar y mostrar un conjunto de imágenes. Después de importar la biblioteca, abre una nueva figura con un tamaño especificado. Luego, genera una cantidad de imágenes igual a 'batch_size' (que no está definido en el texto seleccionado).

Para cada imagen, crea un subgráfico, genera la imagen (aparentemente a partir de algún tipo de datos de imagen, tampoco definidos en el texto seleccionado), ajusta el rango de color de la imagen y elimina el eje. Una vez que todas las imágenes han sido generadas, añade un título ('Generated Images') a la figura y la muestra.

Evaluación Humana

La evaluación humana implica pedir a un grupo de personas que califiquen la calidad de las imágenes generadas en base a criterios como realismo, coherencia y calidad general. Este método proporciona una evaluación robusta del rendimiento del modelo, pero puede ser lento y requerir muchos recursos.

Ejemplo: Criterios de Evaluación Humana

  • Realismo: ¿La imagen generada parece realista?
  • Coherencia: ¿La imagen generada es coherente y está libre de artefactos?
  • Calidad General: ¿Cómo se compara la imagen generada con las imágenes reales?

10.5.3 Evaluación de la Diversidad y Creatividad

Para evaluar la diversidad y creatividad de las imágenes generadas, podemos analizar la variación en las salidas dadas diferentes entradas o ligeras variaciones de la misma entrada. Esto ayuda a asegurar que el modelo produce salidas diversas e interesantes.

Ejemplo: Evaluación de la Diversidad

# Define a set of inputs with slight variations
inputs = [
    random_noise[0],
    random_noise[1],
    random_noise[2],
]

# Generate and plot outputs for each input
plt.figure(figsize=(12, 4))
for i, input_data in enumerate(inputs):
    step_encodings = create_step_encodings(1, d_model)
    output = diffusion_model.predict([np.expand_dims(input_data, axis=0), step_encodings])[0]
    plt.subplot(1, 3, i + 1)
    plt.imshow((output * 0.5) + 0.5)
    plt.axis('off')
    plt.title(f'Generated Image {i+1}')
plt.show()

Este script genera y grafica las imágenes usando un modelo predictivo. Comienza definiendo un conjunto de entradas que son variantes de 'random_noise'. Luego, para cada entrada, crea codificaciones de pasos, predice la salida usando el 'diffusion_model', y grafica la imagen generada. Las imágenes se grafican en una cuadrícula de 1 fila por 3 columnas y se etiquetan como 'Generated Image 1', 'Generated Image 2' y 'Generated Image 3'. La última línea de código muestra las imágenes graficadas.

Resumen

En esta sección, discutimos varios métodos para evaluar el rendimiento del modelo de difusión, incluyendo tanto métricas cuantitativas como evaluaciones cualitativas. Las métricas cuantitativas como el Error Cuadrático Medio (MSE), la Distancia de Incepción de Fréchet (FID) y el Puntaje de Incepción (IS) proporcionan medidas objetivas del rendimiento del modelo, evaluando la calidad, diversidad y realismo de las imágenes generadas.

También exploramos métodos de evaluación cualitativa, incluyendo la inspección visual y la evaluación humana, que ofrecen valiosos conocimientos sobre el rendimiento del modelo desde una perspectiva subjetiva. Evaluar la diversidad y creatividad de las imágenes generadas asegura que el modelo produzca salidas variadas e interesantes.

Al combinar estas técnicas de evaluación, puedes obtener una comprensión integral de las fortalezas del modelo y las áreas de mejora, mejorando en última instancia su capacidad para generar imágenes de alta calidad.