Path: blob/master/site/pt-br/tutorials/generative/cyclegan.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
CycleGAN
Este notebook demonstra a conversão desemparelhada imagem-para-imagem usando uma GAN condicional, conforme descrito no artigo Conversão desemparelhada imagem-para-imagem usando Redes Adversárias com Ciclo Consistente, também conhecida como CycleGAN. O artigo propõe um método que consegue capturar as características de um domínio de imagem e descobrir se essas características podem ser convertidas em outro domínio de imagem, tudo sem qualquer exemplo de treinamento emparelhado.
Este notebook pressupõe que você conheça o Pix2Pix. Saiba mais no tutorial do Pix2Pix. O código para a CycleGAN é similar. A principal diferença é uma função de perda adicional e o uso de dados de treinamento desemparelhados.
A CycleGAN usa uma perda de consistência do ciclo para que o treinamento possa ser feito sem a necessidade de se ter dados emparelhados. Em outras palavras, ela pode converter um domínio em outro sem um mapeamento um-para-um entre o domínio fonte e alvo.
Isso abre a possibilidade de se fazer diversas tarefas interessantes, como aprimoramento de fotos, colorização de imagens, transferência de estilos, etc. Você só precisa do dataset fonte e alvo (que é simplesmente um diretório de imagens).
Configuração do pipeline de entrada
Instale o pacote tensorflow_examples, que permite a importação do gerador e do discriminador.
Pipeline de entrada
Este tutorial treina um modelo para converter imagens de cavalos em imagens de zebras. Este dataset e outros parecidos estão disponíveis aqui.
Conforme mencionado no artigo, aplique jitter e espelhamento aleatórios ao dataset de treinamento. Há algumas técnicas de ampliação de imagens que evitam o overfitting.
Isso é similar ao que foi feito no Pix2Pix
Com jitter aleatório, a imagem é redimensionada para
286x286
e depois cortada aleatoriamente para256x256
.Com espelhamento aleatório, a imagem é invertida horizontalmente de forma aleatória, por exemplo, da esquerda para a direita.
Importar e reutilizar os modelos do Pix2Pix
Importe o gerador e o discriminador usados no Pix2Pix do pacote tensorflow_examples instalado.
A arquitetura do modelo usada neste tutorial é muito similar à usada no Pix2Pix. Veja algumas diferenças:
A CycleGAN usa normalização de instância em vez de normalização de lote.
O artigo da CycleGAN usa um gerador baseado em
restnet
. Este tutorial utiliza um geradorunet
modificado por questões de simplicidade.
Há dois geradores (G e F) e dois discriminadores (X e Y) sendo treinados.
O Gerador
G
aprende a transformar a imagemX
na imagemY
.O Gerador
F
aprende a transformar a imagemY
na imagemX
.O discriminador
D_X
aprende a diferenciar entre a imagemX
e a imagem geradaX
((F(Y))
).O discriminador
D_Y
aprende a diferenciar entre a imagemY
e a imagem geradaY
((G(X))
).
Funções de perda
Na CycleGAN, não há dados emparelhados para fazer o treinamento e, portanto, não há garantia de que o par de entrada x
e alvo y
seja significativo durante o treinamento. Dessa forma, para forçar a rede a aprender o mapeamento correto, os autores propõem a perda de consistência do ciclo.
A perda do discriminador e a perda do gerador são similares às usadas no Pix2Pix.
Consistência do ciclo significa que o resultado deve ficar próximo da entrada original. Por exemplo, se uma frase for traduzida do inglês para o francês e depois traduzida de volta do francês para o inglês, a frase resultante deve ser a mesma que a original.
Na perda de consistência do ciclo:
A imagem é passada pelo gerador , que gera a imagem gerada .
A imagem gerada é passada pelo gerador , que gera a imagem que passou pelo ciclo .
O erro absoluto médio é calculado entre e .
Conforme mostrado acima, o gerador é responsável por transformar a imagem na imagem . A perda de identidade diz que, se você alimentar a imagem no gerador , ele deve gerar a imagem real ou algo próximo da imagem .
Se você executar o modelo “zebra para cabalo” em um cavalo ou o modelo “cavalo para zebra” em uma zebra, ele não deve modificar a imagem muito, já que ela já contém a classe alvo.
Inicialize os otimizadores para todos os geradores e discriminadores.
Checkpoints
Treinamento
Observação: o modelo deste exemplo é treinado com menos épocas (10) do que o artigo (200) para manter o tempo de treinamento razoável para este tutorial. As imagens geradas terão uma qualidade muito inferior.
Embora o loop de treinamento pareça complicado, ele consiste de quatro passos básicos:
Obter as previsões.
Calcular a perda.
Calcular os gradientes usando retropropagação.
Aplicar os gradientes ao otimizador.
Gerar usando o dataset de teste
Próximos passos
Este tutorial mostrou como implementar uma CycleGAN começando pelo gerador e discriminador implementados no tutorial do Pix2Pix. Agora, você pode tentar usar um dataset diferente disponível nos TensorFlow Datasets.
Além disso, você pode fazer o treinamento usando um número maior de épocas para melhorar os resultados ou pode implementar o gerador ResNet modificado usado no artigo em vez do gerador U-Net usado aqui.