
Conversamos sobre os projetos de graduação de graduados de cursos semestrais em desenvolvimento móvel no Technopark (Bauman Moscow State Technical University) (publicações anteriores: " Desenvolvimento de aplicativos para iOS ", " Desenvolvimento de aplicativos para Android "). Hoje estamos compartilhando projetos interessantes de alunos do segundo semestre da Tecnosfera - um projeto educacional conjunto com a Universidade Estadual de Moscou com um programa de treinamento anual na área de análise e trabalho com grandes quantidades de dados. Os alunos fazem cursos de aprendizado de máquina, pesquisa de informações, redes neurais e outras disciplinas. O método do projeto é utilizado no ensino, pelo que se somam os resultados do semestre na defesa dos projetos dos alunos.
As experiências desempenham um papel importante no processo educacional. Os projetos dos alunos não podem prescindir deles: os caras experimentam diferentes abordagens, métodos, arquiteturas e ferramentas. Freqüentemente, após o experimento, os alunos abandonam a escolha da tecnologia e do algoritmo em favor de uma nova abordagem. Essa é uma grande parte da experiência e do aprendizado. A seguir falaremos sobre essas etapas no desenvolvimento de dois projetos de alunos.
- Cartazes de filmes GAN / projeto embed.
- Projeto Cyrclegan em série de desenhos animados.
CycleGAN na série de desenhos animados
Os autores deste projeto decidiram usar a técnica CycleGAN para transferir imagens de um filme de animação para outro. GAN (Generative adversarial network) é um método para treinar modelos imagem a imagem. Duas redes neurais são treinadas: o discriminador e o gerador, que estão em relações adversas. O gerador tenta aumentar o erro de classificação, o discriminador tenta diminuí-lo. E CycleGAN é um método de transferência de aprendizagem imagem a imagem no modo não supervisionado.
Digamos que haja dois domínios de imagem - A e B. Dois geradores e dois discriminadores são criados: gen_A2B, gen_B2A, disc_A, disc_B. É necessário que o gerador gen_A2B crie a mesma imagem a partir da imagem de A, mas para que esteja no domínio B. Para fazer isso, insira a perda de consistência do ciclo:
l1loss(gen_b2a(gen_a2b(a)), a)
Nesse caso, o gerador irá gerar imagens que enganam o discriminador, mas ao mesmo tempo retêm o conteúdo original.
Arquitetura da solução:
Gerador:

Os blocos Resnet permitem que você se lembre da imagem original. Também usamos normalização de instância em vez de normalização em lote, porque esta adiciona ruído de outras imagens.
Discriminador:

Não existia um conjunto pré-fabricado de imagens, por isso escolhemos imagens de fotogramas-chave de filmes completos de anime: para A usamos "Spirited Away" de Hayao Miyazaki e para B - "Your Name" de Makoto Shinkai. Uma vez que CycleGAN não é muito adequado para mudanças drásticas (por exemplo, forma), os autores pegaram ambos os domínios do anime.
Primeiro, LSGAN foi usado como uma função de perda, e depois WGAN GP, porque LSGAN criou artefatos estranhos e perdeu cores durante o treinamento.
Para o treinamento, foi utilizado um modelo pré-treinado em horse2zebra (foram encontrados pesos apenas para geradores). Ela já entendeu que precisa salvar o conteúdo da imagem, então os autores logo no início conseguiram um bom autencoder, que só precisava ser ensinado para enganar o discriminador.
No início do treinamento, definimos um grande valor para perda de identidade de perda de ciclo e recorte de gradiente, mas quando épocas suficientes se passaram, decidimos diminuir gradualmente esses valores para que o gerador começasse a tentar enganar o discriminador um pouco mais.
Também tentamos usar grandes redes pré-treinadas (VGG, RESNET, Inception) como discriminador, mas elas são muito grandes e o treinamento fica muito lento.
Como resultado, o trabalho conseguiu que o estilo seja transferido próximo ao original, mantendo o esquema geral de cores (originais em cima, fotos geradas abaixo):




Código do projeto: https://github.com/IlyasKharunov/Cyclegan_project
Equipe do projeto: Ilyas Kharunov, Oleg Verbin.
Vídeo com proteção do projeto .
Cartazes de filmes GAN / incorporar
O próximo projeto é interessante do ponto de vista do caminho que o aluno percorreu. Ao contrário de outros projetos de alunos, Dmitry fez o trabalho sozinho. Esse caminho acabou sendo mais difícil do que os outros, mas os resultados e as conclusões são interessantes.
O autor decidiu criar uma rede que gerasse cartazes de filmes para os gêneros dados. Por exemplo, ter pôsteres de filmes de terror em cores escuras, de comédias em cores claras e coisas do gênero.
Do site do IMDB, a autora retirou 41 mil pôsteres de filmes de vinte gêneros para o período 1970-2020. Mais tarde, descobriu-se que havia muito poucas imagens para alguns gêneros, então Dmitry equilibrou o conjunto por gênero e, como resultado, restaram 32 mil pôsteres.
Em seguida, o aluno aplicou uma rede neural com arquitetura DCGAN para gerar imagens sem gênero. Ela trabalhou com pôsteres no tamanho 64x128.

Os resultados foram assustadores:

Em seguida, o autor tentou a arquitetura CVAE + DCGAN:

E também VAE sem GAN e GAN com classificador. Chegou à conclusão de que o conjunto montado de cartazes é muito complexo para esses métodos. Em seguida, o autor aplicou GAN condicional: é o mesmo que DCGAN, apenas os gêneros agora são alimentados tanto no gerador quanto no discriminador. O vetor latente z foi obtido com comprimento de 100, gêneros no formato quente com comprimento de 20, resultando em um vetor com comprimento de 120. O gênero foi adicionado à resposta e uma corrida adicional foi realizada sobre uma camada linear.
Consegui alcançar o seguinte resultado:

Como você pode ver, o aluno estava interessado em tentar diferentes abordagens e os resultados foram interessantes. Auto recebeu muita experiência nova, chegou à conclusão de que para implementar tal ideia, é necessário tomar imediatamente uma rede neural mais complexa, por exemplo, StyleGAN.
Processo de aprendizagem em rede:
Equipe do projeto: Dmitry Piterkin.
Vídeo com proteção do projeto .
Em breve iremos falar sobre os projetos de diploma mais interessantes em desenvolvimento C ++ e Go, desenvolvimento front-end e criação de interface. Você pode ler mais sobre nossos projetos educacionais neste link . E com mais frequência, vá ao canal Technostream , regularmente aparecem novos vídeos de treinamento sobre programação, desenvolvimento e outras disciplinas.