Interpolação de estilo de imagem em tempo real

Joseph Early em Tornando-se Humano: Revista de Inteligência Artificial Seguir Jul 5 · 9 min ler A interpolação de estilo de imagem em tempo real pode criar estilos exclusivos que podem ser aplicados a qualquer imagem.

No módulo de aprendizagem profunda no meu último ano na Universidade de Southampton, o curso principal foi baseada na ICLR Reprodutibilidade Desafio – uma missão para replicar as experiências e resultados de trabalhos ICLR recentemente publicados. Minha equipe escolheu reimplementar Uma Representação Aprendida por Estilo Artístico (Dumoulin et al., 2016) . O artigo desenvolve a transferência de estilo (o processo de aplicar o estilo de uma imagem a outra imagem) para permitir que uma única rede aprenda vários estilos em vez de apenas um. Este artigo resume nossa reimplementação do documento original e também descreve uma extensão que desenvolvi para permitir a interpolação em tempo real de estilos de imagem por meio de um aplicativo da Web. Todo o código-fonte deste projeto está disponível no GitHub , e um relatório mais técnico pode ser encontrado aqui .

Uma visão geral da transferência de estilo e interpolação

O conceito de transferência de estilo é simples: com uma imagem de estilo e uma imagem de conteúdo, extraia o estilo da imagem de estilo e aplique-o à imagem de conteúdo. O objetivo é ajustar a imagem do conteúdo de tal forma que ainda mostre o mesmo conteúdo, mas agora no novo estilo. Exemplos deste trabalho de execução da transferência de estilo usando diferentes estilos podem ser encontrados aqui .

Estilizando uma foto de Veneza (Getty Images / iStockphoto) com Edith de Schiele com vestido listrado, sentado (1915).

Trending AI Articles:

1. Noções básicas de rede neural

2. Estourando as bolhas do jargão – Aprendizado Profundo

3. Como podemos melhorar a qualidade de nossos dados?

4. Aprendizado de Máquina usando Regressão Logística em Python com Código

A transferência de estilo pode ser desenvolvida em Interpolação de estilo – a capacidade de fazer a transição entre diferentes estilos para produzir uma imagem estilizada com uma ponderação de dois (ou mais) estilos. Desenvolver um sistema capaz de interpolação de estilo tem vários benefícios em relação aos sistemas de transferência de estilo, principalmente quando eles aprendem novos estilos e exigem menos espaço de armazenamento devido ao compartilhamento entre as diferentes representações de estilo.

Um exemplo de interpolação de estilo bidirecional e de quatro vias.

Como funciona a transferência de estilo

Por que significa que duas imagens sejam estilisticamente semelhantes ou transmitam o mesmo conteúdo? Uma interpretação faz uso das características das imagens; eles têm características em algum nível semelhantes? Por exemplo, uma imagem de um rosto terá recursos de conteúdo muito diferentes dos de um barco, no entanto, eles poderão ter recursos de estilo semelhantes se tiverem cores de compartilhamento, texturas, padrões etc.

Felizmente, a extração de recursos já é um elemento significativo da visão computacional e dos sistemas de aprendizagem profunda. Em particular, Convolutional Neural Networks (CNNs) podem ser usadas como extratores de características para classificação de imagens. Uma técnica comum é usar uma rede pré-treinada (uma que tenha sido sujeita a muitas horas de treinamento em um conjunto de dados diferente), cortar as camadas finais totalmente conectadas que são usadas para classificação e treinar um novo classificador usando os recursos fornecidos pela rede pré-treinada truncada. Em nosso trabalho, usamos a rede VGG-16 como nosso extrator de recursos CNN escolhido.

No caso do Style Transfer, os recursos de conteúdo e os recursos de estilo são extraídos de diferentes níveis da rede pré-treinada, com cada um deles visando capturar algo diferente sobre a natureza da imagem. Por exemplo, com os recursos de estilo, as camadas anteriores da rede capturam cor e textura básicas e as camadas posteriores capturam motivos mais significativos, como objetos que ocorrem novamente. É possível reconstruir e visualizar as características estilísticas em níveis variados, realizando gradiente descendente em uma imagem ruidosa e minimizando as perdas de estilo relativas a uma imagem de estilo.

Recursos de estilo reconstruído em diferentes profundidades de rede para a Noite Estrelada de Van Gogh

Ao comparar o estilo extraído e os recursos de conteúdo entre duas imagens, uma noção de estilo e perda de conteúdo pode ser calculada. Eu não vou entrar em detalhes sobre a matemática, mas se você estiver interessado, veja aqui uma visão de como as perdas de estilo e conteúdo são computadas. Por que isso é útil? Se quisermos avaliar qual das duas imagens é mais estilisticamente semelhante a uma imagem de referência de estilo, podemos agora computar as perdas de estilo de ambas as imagens relativas à imagem de referência e determinar qual é a mais próxima (avaliação de conteúdo pode ser feita em uma imagem de referência). maneira similar).

A capacidade de avaliar o estilo e a perda de conteúdo das imagens significa que agora podemos treinar nossa primeira rede – uma rede de transferência de estilo único. Essa rede é treinada com um único estilo arbitrário em mente, por exemplo, a Noite Estrelada de Van Gogh. A rede é treinada de tal forma que aceita qualquer imagem de conteúdo e a transforma estilisticamente para combinar com o estilo de destino, mantendo o conteúdo da imagem. Isso é feito treinando a rede para minimizar simultaneamente as perdas de conteúdo e estilo de muitas imagens de entrada – no nosso caso, usamos o conjunto de dados COCO. Após o treinamento, a rede é independente do conteúdo (não importa qual seja a imagem do conteúdo), no entanto, ela só é capaz de produzir imagens em um estilo (o estilo com o qual foi treinado).

Desenvolvendo redes de estilo n

A progressão desenvolvida por Dumoulin et al. permitiu redes de transferência de estilo para aprender vários estilos de uma só vez; essas redes são conhecidas como redes de transferência n-Style (em oposição a redes de transferência de estilo único). Ao invés de ter que treinar n redes distintas (uma por estilo), uma rede condicional pode ser treinada que aprende todos os n estilos de uma só vez. A rede condicional recebe a identidade do estilo que deve aplicar, e troca parte da rede por um 'bloco' que é exclusivo para esse estilo (isso está simplificando um pouco as coisas, na realidade existem muitos blocos menores ao longo do tempo). a rede que é alterada, no entanto, o sentimento é o mesmo). Esses blocos únicos codificam as especificidades de cada estilo em particular, ou seja, para alterar o estilo que a rede produz, tudo o que se tem a fazer é cair no bloco que corresponde a esse estilo e voila. Acontece que a maioria dos parâmetros da rede são compartilhados – apenas 0,2% são exclusivos para cada estilo (ou seja, os 'blocos de estilo' são muito pequenos).

Nós treinamos nossas redes de estilo n de uma maneira round robin: o estilo que estava 'ativo' foi constantemente alterado de forma que a rede aprendeu todos os estilos ao mesmo tempo (em oposição a sequencialmente), ou seja, aprendendo cada bloco de estilo 'ao mesmo tempo, bem como treinar o resto da rede. Isso proporcionou uma curva de aprendizado suave para cada um dos estilos, já que o procedimento de treinamento em rede minimizou a perda de conteúdo e a perda de estilo com base nos recursos extraídos da rede VGG-16.

O conteúdo e a perda de estilo de uma rede de estilo n. Cada linha colorida diferente representa um estilo diferente que está sendo aprendido em paralelo. (n = 10)

A principal vantagem de uma rede de estilo n é que ela usa muito menos espaço para representar n estilos quando comparada a redes de estilo único. Isso se deve às representações de estilo compartilhado – a grande maioria dos parâmetros de rede é compartilhada entre cada estilo. Isso significa que adicionar um novo estilo (isto é, n + 1) requer muito menos tempo (e espaço) do que treinar uma nova rede de estilo único.

Então, há alguma desvantagem de usar uma rede n-Style? Comparamos o conteúdo final e as perdas de estilo entre uma rede de estilo n e redes de estilo único treinadas separadamente e descobrimos que a rede de estilo n tem uma perda de estilo ligeiramente maior para cada um dos estilos, ou seja, usando a representação de estilo compartilhado a eficácia da transferência de estilo. Curiosamente, isso também destacou que alguns estilos são fundamentalmente mais difíceis de aprender (maiores valores de perda após a mesma quantidade de treinamento), independentemente de uma rede de estilo único ou n estar em uso.

Uma comparação das perdas de conteúdo e estilo para redes de estilo único e n em vários estilos.

Passando para a Interpolação de Estilo

Agora que o material de fundo está fora do caminho, podemos ver como as redes de estilo n podem ser usadas para executar a interpolação de estilo – o processo de mesclar dois ou mais estilos para produzir um estilo novo e exclusivo.

A magia da interpolação de estilo vem dos 'blocos de estilo' usados em redes de estilo n. Estes podem essencialmente ser pensados como um vetor de cerca de 3000 parâmetros que capturam a representação única de cada estilo particular. O processo de interpolação consiste simplesmente em passar de um vetor para outro, uma técnica que é frequentemente usada para fazer a transição de uma cor para outra de uma maneira suave . No caso da interpolação de estilo, imagine um controle deslizante que leva você de um estilo para outro, fazendo a transição gradual entre os dois à medida que você o move (mais em controles deslizantes depois!).

Com relação às matemáticas reais por trás da interpolação, uma interpolação de estilo n generalizada pode ser criada usando um vetor de pesagem normalizado w , onde os valores em w representam quanto de cada estilo deve estar presente. O vetor de estilo interpolado é então a soma ponderada de cada um dos vetores de estilo existentes; isso pode ser enviado de volta para a rede de transferência de estilo n como um novo bloco de estilo e usado para produzir imagens estilizadas usando o estilo interpolado.

Embrulhando-o em um aplicativo da Web

Uma captura de tela do aplicativo da web concluído em ação.

Então, neste ponto, nós implementamos com sucesso as redes de estilo único e n, qualquer um conseguiu fazer a interpolação de estilo, de acordo com o trabalho que estávamos reimplementando e de acordo com a especificação do curso. Recentemente, levei este trabalho um pouco mais adiante para produzir um aplicativo da Web interativo que pode executar a interpolação de estilo em tempo real usando os princípios descritos acima.

Quando produzimos as imagens interpoladas mostradas acima, calculamos os valores de ajuste para os vetores de peso para produzir os gráficos requeridos. Embora pudéssemos escolher qualquer vetor de peso desejado, tivemos que executar novamente nosso software para ver o resultado concluído, ou seja, não era um processo interativo em tempo real. Então, como pequena extensão eu queria ver se eu poderia envolver o software de interpolação em um aplicativo da web, permitindo interação em tempo real. Agora eu raramente faço desenvolvimento de front-end (o que é outra razão para tentar isso!), Então não espere muito…

O elemento-chave da aplicação web foi a integração dos modelos de aprendizado de máquina com o front-end. O ONNX.js é uma biblioteca JavaScript que pode executar modelos de aprendizado de máquina no navegador do cliente, o que parecia ideal para o que eu queria realizar. ONNX significa Open Neural Network eXchange – “um formato aberto para representar modelos de aprendizagem profunda” – permite que modelos de aprendizagem profunda sejam compartilhados entre frameworks (por exemplo, trocando modelos entre PyTorch e Keras).

Os elementos de aprendizado de máquina deste trabalho foram desenvolvidos em PyTorch, então o suporte a ONNX não foi um problema. No entanto, o exportador ONNX é um exportador baseado em rastreio, o que significa que ele executa o modelo uma vez e exporta as operações que encontra nessa execução. Isso funciona bem para modelos estáticos (parâmetros de modelo fixo após o treinamento), mas para as redes de transferência de estilo n, alguns dos parâmetros do modelo são dinâmicos (os 'blocos de estilo' usados para alternar estilos e para interpolação). Isso significa que o ONNX não é uma solução viável para este caso de uso.

Em vez de usar o ONNX (fiquei um pouco ofendido, não funcionaria), optei por um back-end do Flask que pudesse receber um vetor de peso do front-end e retornar uma imagem de conteúdo estilizada usando o vetor de peso. Nesse caso, o modelo de aprendizado de máquina permanece no back-end, e a imagem de conteúdo e o vetor de ponderação são fornecidos pelo front-end. Depois de criar alguns sliders de estilo e um formulário de upload com HTML e CSS de 'hello world', a interpolação em tempo real agora era possível. O único pequeno problema foi o fato de o back-end ter recebido muitos pedidos de interpolação (ele tentava executar o modelo várias vezes em paralelo). Eu adicionei um mecanismo de bloqueio simples para que apenas uma interpolação pudesse acontecer de uma vez, o que produz um pouco de latência, mas é mais interativo do que o que tínhamos antes!

E em conclusão …

O núcleo deste trabalho foi a reimplementação da transferência e interpolação de estilo, mas a aplicação web é uma boa adição para juntar tudo. Há muito mais que pode ser feito com isso, como produzir as grades de imagem mostrando a transição entre os estilos ou adicionar mais estilos, mas estou muito feliz em deixá-lo onde está. Infelizmente, o aplicativo da web não está hospedado em nenhum lugar, mas existem algumas instruções breves no repositório do GitHub sobre como executá-lo você mesmo! Obrigado pela leitura!

Não se esqueça de nos dar o seu ?!