Generación de imágenes - Resumen

Índice de evaluación

Puntaje inicial (IS)

Para calcular esta puntuación, debe utilizar Inception Net-V3. Para evaluar un modelo generativo, debe tener en cuenta dos aspectos del rendimiento:

  • Está limpio.
  • ¿Es diverso?

Las imágenes resultantes no son lo suficientemente claras, lo que indica un desempeño deficiente del modelo generativo. Sin embargo, si las imágenes generadas no son lo suficientemente diversas, solo se puede generar un número limitado de imágenes, es decir, cae en el modo de colapso, lo que también indica que el modelo funciona mal. Solo una de las distribuciones se ha aprendido a continuación. cifra.

El método de evaluación de IS es el siguiente:

Ingrese la imagen generada x en Inception V3 y se generará un vector de dimensión 1000. El valor de cada dimensión del vector corresponde a la probabilidad de que la imagen pertenezca a una determinada clase. Para una imagen clara, la probabilidad de que pertenezca a cierta clase debe ser muy alta, mientras que la probabilidad de pertenecer a otras clases debe ser muy pequeña. Es decir, la entropía de p ( y ∣ x ) debe ser pequeña (nitidez).

Si un modelo puede generar suficientes imágenes diversas, la distribución de las imágenes que genera en cada categoría debe ser promedio Suponiendo que se generan 10,000 imágenes, entonces idealmente, se generan 10 imágenes para cada una de las 1000 categorías. Es decir, la entropía (diversidad) de p ( y ) es grande.

La entropía representa el grado de caos, y el grado de caos en la distribución uniforme es el mayor.

La entropía refleja el grado de caos de un sistema, cuanto más caótico es un sistema, mayor es su entropía, cuanto más ordenado es, menor es su entropía.

DEFENSOR

Fréchet Inception Distance (FID) calcula la distancia entre la imagen real y la imagen generada a nivel de característica.La fórmula es la siguiente:

Los parámetros de izquierda a derecha son: la media de las características de la imagen real, la media de las características de la imagen generada, la matriz de covarianza de las características de la imagen real y la matriz de covarianza de las características de la imagen generada . Tr es la traza de la matriz, la suma de los elementos de la diagonal principal.

FID mide la similitud de dos grupos de imágenes a partir de la similitud estadística de las características de visión artificial de la imagen original, que también se calcula mediante el modelo de clasificación de imágenes Inception v3. Utilizando el valor de salida de la función de activación de la última capa de agrupación de Inception v3 (es decir, la capa de agrupación de espacio global), la salida es un vector de activación de 2048 dimensiones. Por lo tanto, cada imagen se predice como un vector de características de 2048 dimensiones.

Una puntuación más baja significa que los dos conjuntos de imágenes son más similares, o las estadísticas de los dos son más similares, y FID tiene una puntuación de 0,0 en el mejor de los casos, lo que indica que los dos conjuntos de imágenes son iguales.

Para aprender la evaluación cuantitativa del modelo GAN, comience con el dominio de FID

Historial de desarrollo

SIN EMBARGO

Hay dos tipos de modelos de aprendizaje automático, modelos discriminativos y modelos generativos. El primero es juzgar la categoría de un dato de entrada o predecir un valor real, mientras que el segundo se enfoca en cómo generar los datos en sí.

GAN consta de dos partes, la primera parte es el generador (Generator), y la otra es el discriminador (Discriminator), ambas implementadas por MLP.

La tarea del generador es generar instancias de aspecto natural similares a los datos originales para engañar al discriminador. La entrada es un ruido aleatorio y la imagen se genera a partir del ruido.

La tarea del discriminador es juzgar si la instancia generada por el generador es real o falsa. La entrada es una imagen y la salida es la probabilidad de que la imagen de entrada sea una imagen real.

Su función de pérdida es:

Luego explique la confrontación a partir de la fórmula.Sabemos que el entrenamiento de la red G espera que D(G(z)) se acerque a 1, es decir, la clase positiva, por lo que la pérdida de G será la menor.

La red D entrena una categoría 2, el objetivo es distinguir entre datos reales y datos generados. La red D espera que la salida D(x) de los datos reales x sea cercana a 1, y la salida de los datos generados z, es decir, D(G(z)) sea cercana a 0.

Aquí está la idea de confrontación.

La siguiente imagen muestra varias etapas en el entrenamiento GAN:

Los puntos negros en la figura son la distribución de datos reales, la línea verde es la distribución de datos generados y la línea azul es la curva discriminante del discriminador. La figura a muestra que el entrenamiento acaba de comenzar y el discriminador no tiene una capacidad discriminatoria particularmente fuerte. Puede ver los datos reales y la puntuación del discriminador cerca del pico de los datos generados no es muy estable. En la Figura b, el discriminador puede distinguir datos generados y datos reales, y el discriminador cerca del valor máximo de cada dato puede distinguir con precisión. En la Figura c, el generador ha aprendido aproximadamente la distribución de los datos reales y el efecto del discriminador cerca del pico ya es muy malo. La figura d es la situación más ideal. El generador se ajusta completamente a la distribución de los datos reales, y el discriminador ha sido aplanado. Ambos juicios de datos generarán 0.5.

El generador, el discriminador, el optimizador y la función de pérdida se definen de la siguiente manera:

class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()
        def block(in_feat, out_feat, normalize=True):
            layers = [nn.Linear(in_feat, out_feat)]
            if normalize:
                layers.append(nn.BatchNorm1d(out_feat, 0.8))
            layers.append(nn.LeakyReLU(0.2, inplace=True))
            return layers
        self.model = nn.Sequential(
            *block(opt.latent_dim, 128, normalize=False),
            *block(128, 256),
            *block(256, 512),
            *block(512, 1024),
            nn.Linear(1024, int(np.prod(img_shape))),
            nn.Tanh()
        )

    def forward(self, z):
        img = self.model(z)
        img = img.view(img.size(0), *img_shape)
        return img

class Discriminator(nn.Module):
    def __init__(self):
        super(Discriminator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(int(np.prod(img_shape)), 512),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(512, 256),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(256, 1),
            nn.Sigmoid(),
        )

    def forward(self, img):
        img_flat = img.view(img.size(0), -1)
        validity = self.model(img_flat)
        return validity

# 生成器和判别器
generator = Generator()
discriminator = Discriminator()

# 参数分别放进优化器
optimizer_G = torch.optim.Adam(generator.parameters(), lr=opt.lr, betas=(opt.b1, opt.b2))
optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=opt.lr, betas=(opt.b1, opt.b2))

# 损失函数为交叉熵损失
adversarial_loss = torch.nn.BCELoss()

Entrene al generador y actualice los parámetros en cada iteración:

# 训练生成器
z = Variable(Tensor(np.random.normal(0, 1, (imgs.shape[0], opt.latent_dim))))
gen_imgs = generator(z)
g_loss = adversarial_loss(discriminator(gen_imgs), valid)        # valid 是全为1的 gt
# 更新生成器参数
g_loss.backward()
optimizer_G.step()

Luego entrene al discriminador y actualice los parámetros:

# 训练判别器
real_loss = adversarial_loss(discriminator(real_imgs), valid)
fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake)    # fake 是全为0的 gt
d_loss = (real_loss + fake_loss) / 2
# 更新判别器参数
d_loss.backward()
optimizer_D.step()

El entrenamiento GAN alcanzará el equilibrio de Nash al final, es decir, la distribución de las imágenes generadas por el generador es la misma que la de las imágenes reales.

Equilibrio de Nash: Para cada jugador, no puede mejorar su situación mientras los demás no cambien sus estrategias.

Para GAN, la situación es que el modelo generativo G restaura la distribución de los datos de entrenamiento (crea exactamente las mismas muestras que los datos reales), y el modelo discriminante ya no puede distinguir el resultado, con una tasa de precisión del 50%, lo que es aproximadamente igual a adivinar al azar.

Esto es para maximizar los beneficios de ambas redes, y ya no cambiar sus propias estrategias, es decir, ya no actualizar sus propios pesos.

Las variantes comunes de GAN son: DCGAN, CGAN, WGAN, etc.

Generar una red de confrontación (GAN) bzdww

PyTorch-GAN/gan.py en maestro · eriklindernoren/PyTorch-GAN · GitHub

https://arxiv.org/pdf/1406.2661.pdf

DCGAN

Sobre la base de GAN, MLP se reemplaza por una red convolucional.

Mira directamente el código:

class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()
        self.init_size = opt.img_size // 4
        self.l1 = nn.Sequential(nn.Linear(opt.latent_dim, 128 * self.init_size ** 2))
        self.conv_blocks = nn.Sequential(
            nn.BatchNorm2d(128),
            nn.Upsample(scale_factor=2),
            nn.Conv2d(128, 128, 3, stride=1, padding=1),
            nn.BatchNorm2d(128, 0.8),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Upsample(scale_factor=2),
            nn.Conv2d(128, 64, 3, stride=1, padding=1),
            nn.BatchNorm2d(64, 0.8),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Conv2d(64, opt.channels, 3, stride=1, padding=1),
            nn.Tanh(),
        )

    def forward(self, z):
        out = self.l1(z)
        out = out.view(out.shape[0], 128, self.init_size, self.init_size)
        img = self.conv_blocks(out)
        return img

class Discriminator(nn.Module):
    def __init__(self):
        super(Discriminator, self).__init__()
        def discriminator_block(in_filters, out_filters, bn=True):
            block = [nn.Conv2d(in_filters, out_filters, 3, 2, 1), nn.LeakyReLU(0.2, inplace=True), nn.Dropout2d(0.25)]
            if bn:
                block.append(nn.BatchNorm2d(out_filters, 0.8))
            return block
        self.model = nn.Sequential(
            *discriminator_block(opt.channels, 16, bn=False),
            *discriminator_block(16, 32),
            *discriminator_block(32, 64),
            *discriminator_block(64, 128),
        )
        # The height and width of downsampled image
        ds_size = opt.img_size // 2 ** 4
        self.adv_layer = nn.Sequential(nn.Linear(128 * ds_size ** 2, 1), nn.Sigmoid())

    def forward(self, img):
        out = self.model(img)
        out = out.view(out.shape[0], -1)
        validity = self.adv_layer(out)
        return validity

El resto es casi exactamente igual que GAN.

https://mp.weixin.qq.com/s/qvNT_QjQh0NkDl6bgsnfwg

https://arxiv.org/pdf/1511.06434.pdf

CGAN

El nombre completo es GAN condicional. La información de categoría se agrega al entrenamiento de GAN y se espera generar datos de la categoría especificada.

La función de pérdida también agrega información de etiqueta y se convierte en:

Aquí y puede ser una etiqueta u otro tipo de datos. Además, se propone un nuevo método de generación de etiquetas, utilizando el método de este artículo , utilizando las características de los vectores de palabras para aprender expresiones más generales.

Use la similitud del producto punto (similitud del producto punto) combinada con la pérdida de rango de bisagra como la función de pérdida del modelo, lo que puede hacer que la similitud del producto punto entre la salida del modelo de imagen y la representación vectorial de la etiqueta correcta correspondiente a la image , son más similares a la imagen que los vectores de otras etiquetas incorrectas.

La entrada es una imagen y la salida es un conjunto de etiquetas. El proceso específico consiste en utilizar un discriminador de imágenes entrenado (CNN) y un modelo de vector de palabras entrenado (skip-gram) para extraer información de la imagen y etiquetar la vectorización, respectivamente. Esta característica de imagen se alimenta al generador junto con x como información adicional (es decir, la parte verde y en el modelo), y el generador genera el vector de predicción correspondiente. Genere 100 muestras de predicción para cada imagen, y cada muestra selecciona las 20 palabras más cercanas como etiquetas mediante el cálculo de la similitud del coseno, y luego selecciona las 10 más comunes del conjunto de candidatos de 2000 palabras como esta imagen La etiqueta de la imagen.

https://arxiv.org/pdf/1411.1784.pdf

EQUIVOCADO

El nombre completo es Wasserstein GAN El artículo explora las razones de la desaparición del gradiente del generador GAN y las deficiencias de la función de pérdida GAN desde un punto de vista matemático. Resueltos los siguientes problemas en el entrenamiento GAN:

  • Resuelva completamente el problema de la inestabilidad del entrenamiento GAN, ya no es necesario equilibrar cuidadosamente el nivel de entrenamiento del generador y el discriminador.
  • Básicamente resuelve el problema del modo de colapso y asegura la diversidad de muestras generadas.
  • Durante el proceso de entrenamiento, finalmente hay un valor como la entropía cruzada y la precisión para indicar el progreso del entrenamiento. Cuanto menor sea el valor, mejor será el entrenamiento GAN y mayor será la calidad de la imagen producida por el generador.

En comparación con el GAN ​​original, solo se han cambiado cuatro puntos:

  • La última capa del discriminador elimina el sigmoide.
  • La pérdida del generador y discriminador no se lleva registro.
  • Después de cada actualización de los parámetros del discriminador, sus valores absolutos se truncan a no más de una constante fija c.
  • No utilice algoritmos de optimización basados ​​en impulso (incluidos Momentum y Adam), recomiende RMSProp y SGD también está bien.

Usando la distancia de Wasserstein, en comparación con la divergencia KL y la divergencia JS, incluso si las dos distribuciones no se superponen, aún pueden reflejar la distancia entre ellas.

La divergencia KL y la divergencia JS son abruptas, ya sea máxima o mínima, pero la distancia de Wasserstein es suave. Si queremos utilizar el método de descenso de gradientes para optimizar el parámetro θ, los dos primeros no pueden proporcionar gradientes en absoluto, pero la distancia de Wasserstein sí. De manera similar, en un espacio de alta dimensión, si las dos distribuciones no se superponen o la superposición es insignificante, KL y JS no pueden reflejar la distancia ni proporcionar gradientes, pero Wasserstein puede proporcionar gradientes significativos.

https://arxiv.org/pdf/1701.07875.pdf

El impresionante Wasserstein GAN bzdww

InfoGAN

Muchos métodos posteriores a este pueden verse como ejemplos de GAN condicional que utilizan información supervisada para completar la generación de objetivos. Sin embargo, cuando faltan datos de etiquetas, cómo usar GAN para generarlos es que InfoGAN brinda una mejor solución. Es decir, a la entrada de GAN, a excepción del ruido aleatorio z, en lugar de ingresar una imagen real, se ingresa un código latente, que debería implicar la información que queremos generar.

Por lo tanto, para ser útil, un algoritmo de aprendizaje no supervisado debe adivinar correctamente el conjunto probable de tareas de clasificación posteriores sin exponerse directamente a ellas.

El artículo menciona que cada dominio puede ser generado por la acción conjunta de muchas variables. El dominio aquí puede entenderse como un tipo de target a generar:

Por ejemplo, al generar imágenes a partir del conjunto de datos del MNIST, sería ideal que el modelo optara automáticamente por asignar una variable aleatoria discreta para representar la identidad numérica del dígito (0-9), y optara por tener dos variables continuas adicionales que representen el ángulo del dígito y el grosor del trazo del dígito.

De esta forma, cada número corresponde al código latente de algunas características y no se necesita información de supervisión para generar estos números.

Este artículo introduce información mutua en el entrenamiento de GAN y   permite que el modelo aprenda más características semánticas y significativas al maximizar la información mutua del código latente c y las imágenes generadas:

donde V es la función de pérdida original de GAN:

La información mutua es una medida del grado de dependencia de dos variables aleatorias, que se puede expresar como:

Para hacer frente al problema de los códigos triviales, proponemos una regularización de la teoría de la información: debe haber mucha información mutua entre los códigos latentes c y la distribución del generador G(z, c). Por lo tanto, I(c; G(z, c)) debería ser alto.

En la implementación se utiliza la idea de inferencia variacional.

https://arxiv.org/pdf/1606.03657v1.pdf

infoGAN: separando el orden del caos: se busca programador

InfoGAN: un método de generación no supervisado | Reproducción de documentos clásicos | Corazón de máquina

Texto a imagen

El objetivo de esta tarea es generar imágenes de acuerdo con la descripción del texto. Este es el método del documento "Síntesis generativa de texto antagónico a imagen" . Hay dos dificultades principales:

  • primero, aprenda una representación de características de texto que capture los detalles visuales importantes.
  • en segundo lugar, use estas características para sintetizar una imagen convincente que un humano podría confundir con real.

Primero presentó el método en otro artículo , usando CNN o LSTM para codificar características de texto. La función de pérdida durante el entrenamiento es:

 Entre ellos, vn, tn e yn son imágenes, descripciones de texto y etiquetas de categoría a su vez, y el triángulo es pérdida 0-1:

F es el puntaje de compatibilidad, y el puntaje de compatibilidad de imágenes y textos coincidentes es más alto que el de la falta de coincidencia:

en:

Use la siguiente fórmula durante el razonamiento para obtener el puntaje de compatibilidad:

φ en el clasificador es el codificador de texto y ф es el codificador de imagen.

Y este artículo utiliza el codificador de texto y DCGAN del artículo anterior, señalando un problema en la práctica de GAN condicional para tareas de texto a imagen:

Este tipo de condicionamiento es ingenuo en el sentido de que el discriminador no tiene una noción explícita de si las imágenes reales de entrenamiento coinciden con el contexto de incrustación del texto.

Las características del texto se añaden como condiciones ante el generador y el discriminador. Después de que fc comprima las características del texto a 128 dimensiones, se unen con las características de la imagen y se envían al generador. En el generador, las características empalmadas se utilizan para generar una imagen, que se envía al discriminador para obtener la puntuación final.

El proceso de formación de la red en este trabajo es:

Discriminador consciente de coincidencias (GAN-CLS)

La entrada de su discriminador tiene solo dos tipos: imagen real y texto coincidente, imagen generada y texto arbitrario. Para permitir que el modelo aprenda mejor la correspondencia entre las descripciones de texto y el contenido de la imagen, se agrega una tercera entrada al discriminador: imágenes reales y texto de error. Las respectivas funciones de pérdida del discriminador y del generador son:

donde s es la salida del discriminador.

Aprendizaje con interpolación múltiple (GAN-INT)

Posteriormente, se realiza una operación de interpolación múltiple (GAN-INT) y se diferencian las características de los dos textos para obtener características de texto más ricas para que el generador las aprenda, lo que equivale a cambiar ligeramente la función de pérdida del generador:

z es ruido aleatorio y el otro son características de texto después de la diferencia. Puede considerarse como un truco de entrenamiento.

Invertir el generador para la transferencia de estilo

Se argumenta que si se usa φ para capturar el contenido de la imagen, entonces el ruido aleatorio z debe usarse para capturar el estilo. Para probar esta conjetura, el autor entrenó una CNN y usó la imagen generada por el generador para predecir el estilo.La función de pérdida es la siguiente:

Independiente del entrenamiento del GAN, previo a su entrenamiento. Se usa para entrenar la entrada de ruido aleatorio z en el generador, de modo que z contenga la información de estilo, que se ingresa en el generador GAN junto con la función de texto φ:

Esto también puede verse como un truco de entrenamiento.

GitHub - aelnouby/Síntesis de texto a imagen en f6d47e4da06defa974390ce813f734dbee75c885

"Texto antagónico generativo a síntesis de imagen" Notas de lectura-Conocimiento

Pobre GAN

Similar al enfoque de "Síntesis generativa de texto contradictorio a imagen" , la red DCGAN anterior generaba imágenes con una resolución relativamente baja:

Las muestras generadas por los enfoques existentes de texto a imagen pueden reflejar aproximadamente el significado de las descripciones dadas, pero no contienen los detalles necesarios ni las partes vívidas de los objetos.

StackGAN consta de dos GAN de dos etapas. La red de generación de confrontación de la primera etapa utiliza descripciones de texto para delinear aproximadamente la forma y el color principales de los objetos, y genera imágenes de baja resolución. La segunda etapa de la red generativa adversaria toma los resultados de la primera etapa y la descripción del texto como entrada, y genera imágenes de alta resolución con detalles ricos.

Aumento de acondicionamiento

El autor cree que el uso directo de las características del texto como una variable latente no puede representar bien todo el espacio latente, por lo que el aumento condicionado se utiliza para procesar las características del texto con el fin de cubrir mejor el espacio latente:

En la fórmula anterior, N es una distribución gaussiana y el parámetro de N es una función de las características del texto. Para evitar un sobreajuste o una varianza demasiado grande, a la pérdida del generador se le suma la regularización de este N:

Etapa-I GAN

En la primera etapa de GAN, se ingresan al generador las características muestreadas de N y el ruido aleatorio z. La entrada del discriminador es la imagen real o la imagen generada en la primera etapa y las características del texto antes de la entrada a N, y la se emite la puntuación discriminante. La función de pérdida es:

La resolución de la imagen de salida no es alta, es 64*64.

Etapa-II VERANO

En la segunda etapa de GAN, la imagen de salida de la primera etapa (la imagen en este momento contiene la información en el ruido aleatorio z, por lo que z se reemplaza aquí) y las características muestreadas de N nuevamente se ingresan en el generador. La entrada del discriminador es la imagen real o la imagen de salida del generador y las características del texto antes de la entrada a N, y la salida es la puntuación discriminativa. Su función de pérdida es:

La imagen de salida de la segunda etapa es una imagen de alta resolución de 256*256.

https://openaccess.thecvf.com/content_ICCV_2017/papers/Zhang_StackGAN_Text_to_ICCV_2017_paper.pdf

[Lectura en papel] StackGAN: Síntesis de texto a imagen fotorrealista con bazyd GAN apilado

Imagen a imagen(Transferencia de estilo)

La tarea es generar imágenes basadas en imágenes. Aquí presentamos principalmente el método (pix2pix) del artículo "Traducción de imagen a imagen con redes adversarias condicionales" . Se puede resumir en la categoría de transferencia de estilo:

El artículo incluye las siguientes tareas:

Usando Conditional GAN ​​en su conjunto, la entrada de la red son imágenes emparejadas y ruido aleatorio z (pero en el código, la entrada de la red solo está emparejada con dos estilos de imágenes), y se cambia la función objetivo:

La función objetivo del generador se cambia a pérdida L1 (cálculo píxel por píxel por píxel), lo que significa que el generador no solo necesita engañar al discriminador, sino que también necesita normalizar la imagen de salida a gt tanto como sea posible. .

Generador con saltos

El generador usa U-net para reemplazar el codificador (MLP/convolución). El artículo explica que hay mucha información de bajo nivel (como la información de borde de la imagen de entrada cuando la imagen está coloreada) que necesita pasar toda la red.

Para muchos problemas de traducción de imágenes, hay una gran cantidad de información de bajo nivel compartida entre la entrada y la salida, y sería deseable transportar esta información directamente a través de la red.

Discriminador markoviano (PatchGAN)

El artículo concluye a través de experimentos que el uso de la pérdida L1/L2 por parte del generador puede conducir a resultados borrosos, pero aún puede retener suficiente información de baja frecuencia. Tal discriminador puede enfocarse en esa información de alta frecuencia, y en base a esto, se propone un nuevo discriminador-PatchGAN.

Para problemas en los que este es el caso, no necesitamos un marco completamente nuevo para hacer cumplir la corrección en las bajas frecuencias. L1 ya lo hará.

PatchGAN divide la imagen en N*N bloques de imágenes, calcula una puntuación discriminadora en cada bloque y finalmente calcula el promedio para obtener la puntuación final. Esto tiene la ventaja añadida de que se ejecuta más rápido en imágenes de mayor resolución con menos parámetros.

​​​​​https://openaccess.thecvf.com/content_cvpr_2017/papers/Isola_Image-To-Image_Translation_With_CVPR_2017_paper.pdf

GitHub - junyanz/pytorch-CycleGAN-and-pix2pix en 003efc4c8819de47ff11b5a0af7ba09aee7f5fc1

[Notas de papel] Traducción de imagen a imagen con redes adversarias condicionales bazyd

CicloGAN

Al igual que el método pix2pix presentado anteriormente, pertenece a la categoría de transferencia de estilo, pero el entrenamiento de pix2pix requiere imágenes emparejadas de dos estilos, lo cual es difícil de obtener. La entrada del generador CycleGAN solo necesita dos imágenes de estilo sin una relación estricta por pares, lo que tiene un mejor valor práctico.

Sin embargo, obtener datos de entrenamiento emparejados puede ser difícil y costoso.

Lo que CycleGAN aprende es el mapeo entre dos dominios (estilos), en lugar de ingresar datos emparejados para asignar el estilo de una imagen al contenido de otra imagen, la entrada del generador son dos imágenes reales. La función de pérdida global es:

Pérdida por adversario

El modelo incluye un generador G y un generador F, y dos discriminadores DX y DY:

El generador G completa el mapeo del dominio X al dominio Y, y el discriminador DY completa la discriminación entre X y G(X). Su función de pérdida es:

El generador F completa el mapeo de Y a X, y el discriminador DX completa la discriminación entre Y y F(Y). De manera similar, su función de pérdida es:

Pérdida de consistencia del ciclo

Sin embargo, si solo se utiliza la pérdida adversarial, existen las siguientes deficiencias:

Sin embargo, con una capacidad lo suficientemente grande, una red puede asignar el mismo conjunto de imágenes de entrada a cualquier permutación aleatoria de imágenes en el dominio de destino, donde cualquiera de las asignaciones aprendidas puede inducir una distribución de salida que coincida con la distribución de destino.

Por lo tanto, las pérdidas adversarias por sí solas no pueden garantizar que la función aprendida pueda asignar una entrada individual xi a una salida deseada yi.

Si queremos que el generador transforme el estilo de nuestra foto de entrada en un estilo de Van Gogh, entonces el generador podría elegir una imagen del trabajo de Van Gogh y hacerlo por nosotros.

Para reducir esta posibilidad, el mapeo aquí debería poder volver a la imagen original tanto como sea posible a través de la transformación mutua de F y G, que se muestra en la siguiente figura:

El artículo llama a esta operación consistencia del ciclo directo y espera generar el yi que queremos. La función de pérdida es:

Como se puede ver en la figura a continuación, el efecto del método CycleGAN se ha acercado al efecto de pix2pix utilizando datos emparejados para la supervisión.

https://export.arxiv.org/pdf/1703.10593.pdf

Interpretación detallada de CycleGAN-Knowledge

https://github.com/mit-han-lab/gan-compression/blob/master/models/cycle_gan_model.py

PROGAN

Si queremos usar StackGAN para generar imágenes de mayor resolución (1024*1024), necesitamos apilar más estructuras GAN, lo que conducirá a una gran profundidad de red. Y ProGAN es para resolver este problema. La idea central es Pro: progresivo, aumentando gradualmente el número de capas de generador y discriminador de 4 * 4, 8 * 8 a 1024 * 1024. La entrada del modelo es solo ruido aleatorio z y etiquetas.

Para las capas recién agregadas, debemos agregarlas al entrenamiento poco a poco para asegurarnos de que las capas ya entrenadas no se vean afectadas. El enfoque en el artículo es usar un peso α:

Este α aumenta gradualmente de 0 a 1, estabilizando el entrenamiento.

Este enfoque progresivo permite que el modelo preste atención a la estructura general de la imagen en la etapa inicial y, luego, refina gradualmente los detalles, mientras acelera el entrenamiento.

ProGAN:Paso a paso, mejor que mejor - 知乎

GitHub - akanimax/pro_gan_pytorch: implementación no oficial de PyTorch del documento titulado "Crecimiento progresivo de GAN para mejorar la calidad, la estabilidad y la variación"

https://arxiv.org/abs/1710.10196

EstiloGAN

Sobre la base de ProGAN, se cambia el generador y el resto de la estructura permanece sin cambios:

A diferencia de ProGAN, el código latente debe atravesar la red de mapeo para obtener la entrada w del generador. La capa convolucional de cada escala requiere w. La entrada de la capa convolucional de escala más pequeña es un tensor de aprendizaje de 4*4*512. El propósito de la red de mapeo es mantener la linealidad en el espacio de características y desacoplar las características en el espacio de características Consulte los siguientes estudios de desenredado .

ALA

La operación IN puede completar la transferencia de estilo en el mapa de funciones controlando la media y la varianza, de modo que otras partes de la red puedan concentrarse en completar la transformación del contenido sin tener en cuenta el estilo. AdaIN no tiene parámetros de aprendizaje y puede transformar de forma adaptativa la entrada en cualquier estilo. Su entrada es una imagen y un estilo y :

Reemplace los parámetros de aprendizaje en IN con la media y la desviación estándar del estilo para lograr una conversión de estilo adaptable.

Se sabe que las estadísticas de características en capas convolucionales de una red neuronal profunda codifican la información de estilo de una imagen.

https://openreview.net/pdf?id=B1fUVMzKg

Al mismo tiempo, cada escala también necesita ingresar una imagen de ruido de un solo canal (por píxel) para generar esos detalles estocásticos en la imagen.

Mezcla de estilos

Para cada capa convolucional, podemos ingresar dos códigos latentes mapeados, lo que reduce la correlación de estilo de las capas convolucionales de escala adyacentes y es más propicio para optimizar el desacoplamiento de las características del espacio de características. Agregar un segundo código latente a diferentes escalas también tiene un impacto en la imagen final generada, y cuanto antes se agregue, más afectará los aspectos de alto nivel de la imagen.

Variación estocástica

Explica la razón por la que se debe ingresar el ruido por píxel. Para generar una imagen más realista, el generador a menudo no funciona bien al generar detalles en la imagen generada (como la dirección de la punta del cabello) (la salida se repite imágenes similares). El generador necesita encontrar una forma de sintetizar una variable pseudoaleatoria para generar estas "mutaciones" aleatorias, lo que también aumenta la carga del generador.

El enfoque de StyleGAN es agregar un ruido por píxel adicional al generador para controlar estos detalles y reducir la carga del generador. El experimento del artículo también prueba que el ruido de entrada por píxel solo afectará los detalles de la imagen:

Separación de los efectos globales de la estocasticidad

Después de analizar las dos entradas de StyleGAN, la función asignada w controla el efecto de estilo general y el ruido por píxel controla la variación aleatoria de los detalles.

las estadísticas espacialmente invariantes (matriz de Gram, media por canal, varianza, etc.) codifican de manera confiable el estilo de una imagen, mientras que las características espacialmente variables codifican una instancia específica.

Si la red intentara controlar, por ejemplo, posar usando el ruido, eso conduciría a decisiones espacialmente inconsistentes que luego serían penalizadas por el discriminador. Así, la red aprende a utilizar los canales globales y locales de forma adecuada, sin una guía explícita.

Estudios de desenredo

La visión previamente aceptada del desenredo es que el espacio latente contiene muchos subespacios lineales, cada uno de los cuales es independiente entre sí y controla sus propios factores de variación. Pero si falta la combinación de algunos subespacios en el conjunto de datos, el espacio latente distorsionará su propio subespacio lineal para tratar de cubrir todas las combinaciones para cubrir tantas combinaciones como sea posible, lo que hará que el subespacio en el espacio latente se convierta en It. tiene que hacerse no lineal, por lo que el desenredo falla.

debería ser más fácil generar imágenes realistas basadas en una representación desenredada que en una representación enredada.

Por lo tanto, el papel de la red de mapeo es "deshacer" el subespacio en el espacio latente tanto como sea posible para mantenerlo lineal. También se proponen dos métodos para medir el desenredado:

  • Longitud del camino perceptual

Por ejemplo, las entidades que están ausentes en cualquiera de los extremos pueden aparecer en medio de una ruta de interpolación lineal. Esta es una señal de que el espacio latente está entrelazado y los factores de variación no están debidamente separados.

Si un efecto de desacoplamiento del espacio latente es bueno, entonces muestree dos códigos latentes e interpole los dos códigos latentes para cubrir todos los puntos.Las imágenes generadas por estas interpolaciones deben tener una pequeña distancia perceptiva.

  • separabilidad lineal

Desde cero para comenzar stylegan~stylegan3 detalles técnicos_Blog de Ericam_-CSDN blog_stylegan

Códice de generación de imágenes: StyleGAN y StyleGAN2 Papers & Code Conocimiento intensivo de lectura

GitHub - tomguluson92/StyleGAN_PyTorch: La implementación de StyleGAN en PyTorch 1.0.1

GitHub - NVlabs/stylegan: StyleGAN - Implementación oficial de TensorFlow

Una arquitectura generadora basada en estilos para redes adversarias generativas

CONTINUARÁ

Supongo que te gusta

Origin blog.csdn.net/AmbitionalH/article/details/124456869
Recomendado
Clasificación