Ano 08 nº 090/2020 – Modelo de Animação de Imagens em Tempo Real
Imagem:https://aliaksandrsiarohin.github.io/first-order-model-website/
Por Daniel Gaio
Introdução
Você já ouviu falar de deepfakes, aqueles vídeos com um rosto falso? Bem, nos últimos dois a três anos eles tem se tornado mais comuns, isso porque as técnicas usadas para criar estes vídeos tem evoluído. A principal ferramenta utilizada para criação das deepfakes são as redes neurais, deve ser daí também que saiu o nome, já que na área de redes neurais há uma classe chamada redes neurais de aprendizado profundo (deep neural networks), que são muito utilizadas em cenários que envolvem imagens.
E aí, deu curiosidade de ter uma noção mais aprofundada de como esses videos são criados? Então continue a leitura deste texto, onde apresento e comento um projeto gratuito utilizado para criar deepfakes em tempo real.
Um pouco de contexto
Este modelo se trata de um artigo escrito por Aliaksandr Siarohin, Stéphane Lathuilière, Sergey Tulyakov, Elisa Ricci e Nicu Sebe, onde eles criaram um sistema que tem como entradas um vídeo e uma foto e a partir disso transpõe o que havia na foto para o vídeo, mantendo os movimentos do vídeo. Em outras palavras, mais simplificadamente, pode ser dito que se trata de um DeepFace AI Generator.
Aqui tem um uma página com um resumo geral de todas as partes do sistema.
https://aliaksandrsiarohin.github.io/first-order-model-website/
Já nesse link abaixo você consegue baixar o paper, é só clicar onde está escrito “PDF” para baixar neste formato.
http://papers.nips.cc/paper/8935-first-order-motion-model-for-image-animation
O sistema se utiliza de redes neurais e o código esta no github, se você quiser dar uma olhada, o link é esse aqui:
https://github.com/AliaksandrSiarohin/first-order-model
E também existe uma demo prontinha na plataforma do google colab:
https://colab.research.google.com/github/AliaksandrSiarohin/first-order-model/blob/master/demo.ipynb
Por se tratar de um trabalho cujos resultados são muito curiosos e visuais, esse artigo rapidamente se tornou muito popular e já tem até variantes baseadas nele como mostra esta notícia aqui do Olhar Digital que mostra a variante Avatary:
E aqui no site Vice tem a versão original na notícia do olhar digital:
Funcionamento
O projeto foi feito em python e aparentemente o autor usou o jupyter notebook sendo essas ferramentas muito usadas em projetos de inteligência artificial e do python em geral.
A primeira coisa a ser feita é adequar os tamanhos da foto e do vídeo e então carregar a imagem modelo e o vídeo base (Esse fluxo pode ser acompanhado no projeto do Google Colab).
Em seguida é criado um modelo com a identificação dos keypoints da imagem, aqueles pontos principais que serão rastreados e se moverão de acordo com os movimentos do vídeo base. Aí a idéia é que esses pontos são identificados tanto no vídeo quanto na imagem, para posteriormente ser feita uma espécie de sobreposição da imagem com o vídeo, onde esses pontos ficarão um sobre o outro. Mas além disso eles criaram um modo de pareamento relativo das características, para que a foto que está sendo animada não tenha suas características alteradas para se igualar as características do vídeo base, então com keypoints relativos a foto animada vai manter suas características originais.
Depois é feita a animação, tendo como estrada a foto, o vídeo e os demais dados produzidos anteriormente. Então é gerado um novo vídeo animado, com por exemplo o rosto da pessoa em uma foto no lugar do rosto da pessoa do vídeo. Esse processo também pode ser aplicado ao corpo todo e ainda figuras de animais (veja mais nos vídeos e animações dos links acima).
Também é mostrado como você mesmo pode criar suas animações. Primeiro você precisa de um recorte de uma foto de um rosto e também de um recorte de um rosto em um vídeo, similar ao recorte da foto. E então seguir um processo similar ao descrito anteriormente só que agora com os seus próprios dados.
A verdade é que executar o fluxo de treinamento de novos dados no projeto do artigo original é um tanto complexo e exige um aprofundamento na leitura do artigo e análise do projeto. Ao invés disso, aqueles que não são especialistas mas nem por isso deixam de ser curiosos, podem fazer seus testes com o Avatary, que faz a animação em tempo real e também é mais amigável de se usar.
Conclusões sobre o artigo
Fazer suas animações caseiras não é tão simples pois é necessário fazer todo um treinamento da rede para novos dados, sendo também necessária a criação e configuração de vários outros artefatos necessários para o processo da animação em si.
Mesmo para rodar um dos exemplos é necessário fazer toda a configuração com o download de todos os pacotes necessários, alguns pacotes até requerem versões específicas, o que muitas vezes pode ser um processo complicado pois podem ocorrer imprevistos que acabam tornando a execução difícil.
Para rodar um Demo é preciso baixar o arquivo com os keypoints treinados (tem um arquivo para cada exemplo), na descrição do github tem o link pra download, o arquivo é consideravelmente grande cerca de 700 mb, então aparentemente essa etapa de treinamento dos checkpoints deve ser bem custosa computacionalmente. Mas o projeto é fantástico sendo provável que dentro de certo tempo surjam apps de fácil uso que implementam as técnicas apresentadas no artigo. Avatary é bem mais fácil de usar.
Para realmente usar essa tecnologia é mais fácil usar o Avatary, que não precisa de treinamento prévio, e é baseado no algoritmo descrito no artigo acima. O Avatary foi criado pela comunidade do github sendo portanto de código aberto e inclusive o link do projeto é esse:
https://github.com/alievk/avatarify
Ali no git tem todos os passos para fazer a instalação e rodar, mas vou descrever aqui o processo que eu segui, pois lá está em inglês, então talvez isso seja útil. Esses passos foram executados no sistema linux Ubuntu.
Download e instalação
Primeiro baixe a rede de pesos “Network Weights”.
https://drive.google.com/file/d/1coUCdyRXDbpWnEkA99NLNY60mb9dQ_n3/view?usp=sharing
Depois a versão com python 3.7 do miniconda.
https://docs.conda.io/en/latest/miniconda.html#linux-installers
Para instalar é só abrir um terminal dentro da pasta onde está o miniconda e rodar:
bash Miniconda3-latest-Linux-x86_64.sh
Com privilégios de administrador “sudo”, clone o projeto:
git clone https://github.com/alievk/avatarify.git
cd avatarify
bash scripts/install.sh
Coloque o arquivo da rede de pesos baixada anteriormente, dentro do diretório do Avatary. OK, é isso, esta pronto para uso.
Agora para rodar:
No diretório do avatary tem uma pasta chamada “avatars”, lá dentro tem algumas fotos de personagens famosos, se você quiser pode adicionar novos avatares, bastando copiar dentro dessa pasta a foto que você quiser usar como avatar. Na descrição do projeto no git eles dão essas dicas para que tudo funciona bem.
- Faça um recorte quadrado da foto de seu avatar.
- O recorte do rosto não deve estar nem muito aproximado nem muito distante, busque um meio termo.
- Opte por imagens que tenham um plano de fundo homogêneo.
Agora sim, rodando…
Só rode o aplicativo de conferência após o Avatary estar em execução:
Com um terminal dentro da pasta Avatary, execute o comando:
bash run.sh
Isso vai criar uma webcam virtual, que depois lá no app de vídeo deve ser selecionada para uso.
Possíveis problemas
Esse projeto do Avatary se utiliza de um outro projeto chamado v4l2loopback, para a etapa de criação da câmera virtual sobre a qual o algoritmo de animação vai agir. Este outro projeto por sua vez aparentemente precisa agir no nível do kernel e em sistemas mais recentes isso pode gerar o problema de que o v4l2loopback não terá permissão de executar.
No meu caso o que fiz foi desativar a opção Secure Boot, pois as soluções para execução sem a desativação do Secure Boot não funcionaram para mim. Porém você pode tentar, caso tenha este problema, basta googlar a mensagem de erro.
Daniel Gaio é estudante de Engenharia de Computação e está sempre buscando aprender novas tecnologias. Valoriza a disciplina e organização juntamente com uma comunicação aberta para o desenvolvimento de projetos. Curioso e gosta de entender o porquê das coisas em detalhes.