Meu artigo anterior tem quase o mesmo título, com a única diferença que criei lentes para o Snapchat usando algoritmos dlib e openCV, e hoje quero mostrar como você pode obter o resultado usando o aprendizado de máquina. Essa abordagem permitirá não se envolver no projeto manual do algoritmo, mas obter a imagem final diretamente da rede neural.
Aqui está o que temos:
O que é pix2pix?
Essa é uma maneira de converter uma imagem em uma imagem usando redes de contenção (geralmente conhecidas como pix2pix).
O nome "pix2pix" significa que a rede é treinada para converter a imagem de entrada em sua imagem de saída correspondente. Aqui estão exemplos de tais transformações:
O recurso mais interessante do pix2pix é sua versatilidade . Em vez de criar um novo algoritmo ou um novo modelo para cada uma das tarefas acima, basta usar diferentes conjuntos de dados para treinar a rede.
Diferentemente das abordagens usadas anteriormente, o pix2pix aprende a resolver problemas muito mais rapidamente e com um conjunto de treinamento menor. Por exemplo, os resultados abaixo foram obtidos ao treinar usando a GPU Pascal Titan X em um conjunto de dados de 400 pares de imagens e em menos de duas horas.
Como o pix2pix funciona?
O pix2pix usa duas redes neurais aprendendo em paralelo:
- Gerador
- Discriminador
O gerador tenta gerar uma imagem de saída a partir dos dados de treinamento de entrada e o discriminador tenta determinar se o resultado é real ou gerado.
Quando o gerador produz imagens indistinguíveis (discriminadoras) das reais, começamos a treinar o discriminador nelas e nas imagens reais. Quando o discriminador consegue distinguir imagens reais das geradas, novamente começamos a treinar o gerador para que ele aprenda novamente a enganar o discriminador.
Tal "corrida armamentista" leva ao fato de que fica difícil para uma pessoa distinguir imagens reais das geradas.
Prática
Treinaremos nosso gerador de filtro para o Snapchat em imagens de 256x256 (tamanhos grandes exigirão mais memória de vídeo). Para criar um conjunto de dados, use o código do tutorial anterior .
Baixei muitas imagens de rosto e apliquei um filtro “Thug Life Glasses” em cada uma delas. Acontecerá algo como estes pares:
Para criar o modelo, use o repositório pix2pix baseado no TensorFlow. Clone e instale o Tensorflow.
O comando para iniciar o treinamento será o seguinte:
python pix2pix.py --mode train --output_dir dir_to_save_checkpoint --max_epochs 200 --input_dir dir_with_training_data --which_direction AtoB
O parâmetro which_direction define a direção do treinamento. AtoB significa que queremos transformar a imagem A (esquerda, sem óculos) na imagem B (direita, com óculos). A propósito, observe que o pix2pix pode aprender com êxito como restaurar a imagem original de uma imagem com um filtro, basta alterar a direção do treinamento.
Você pode monitorar o progresso do treinamento usando o tensorboard, para o qual você precisa executar o comando:
tensorboard --logdir=dir_to_save_checkpoint
Assim que você perceber que os resultados nos dados de treinamento se tornaram muito bons, você poderá interromper o treinamento e testar o modelo em dados arbitrários. Você pode continuar o treinamento a partir do último ponto de controle da seguinte maneira:
python pix2pix.py --mode train --output_dir dir_to_save_checkpoint --max_epochs 200 --input_dir dir_with_training_data --which_direction AtoB --checkpoint dir_of_saved_checkpoint
Conclusão
O advento das redes generativas do tipo pix2pix abre grandes perspectivas de uma solução universal e simples para todos os tipos de tarefas de processamento de imagem.