Open matheuslevi11 opened 4 months ago
HRFAE disponibiliza uma versão pré-treinada no FFHQ que produz imagens 1024x1024, contudo, as imagens de bases de dados como FIW e Kinface são de baixa resolução. Dessa forma, o primeiro experimento realizado foi o treinamento do modelo em 256x256 utilizando uma versão do FFHQ neste formato. Apenas esta troca foi capaz de melhorar os resultados do modelo, nas imagens abaixo é possível observar que a imagem gerada pelo modelo original 1024x1024 realiza mudanças mais bruscas, enquanto que o modelo em 256x256 é capaz de produzir imagens mais naturais.
Uma observação importante é que no paper original, os autores utilizam StyleGene para gerar imagens de diversas idades:
We observe that FFHQ contains much more samples of young faces than of old ones. This data imbalance is challenging since the aging and deaging tasks would not be treated equally during training: most of faces being young, the age transformer would be trained to perform aging much more often than de-aging, failing to yield satisfying de-aging results. To compensate this imbalance in the age distribution, we propose to perform data augmentation using StyleGAN - a state-of-the-art high resolution image generation model [16]. We use the StyleGAN model pretrained on FFHQ to generate 300, 000 synthetic images. A quick visual inspection shows that most of the generated images have no significant artifacts and are nearly indistinguishable from real images by a human. Therefore, we use them for data augmentation to obtain a quasiuniform age distribution over Q: for any age bin with less than 1, 000 samples in the original FFHQ dataset, we complete this bin with some of the generated synthetic face images; for any age bin with more than 1, 000 samples, we select randomly 1, 000 face images from the original FFHQ dataset. The age-equalized dataset contains 47, 990 images over the range Q = {20, . . . , 69}.
No caso do treinamento com o FFHQ 256x256, apenas a base de dados original foi utilizada. O próximo passo é testar o treinamento usando B3FD, que é um dataset derivado do IMBD-WIKI e do CACD ( utlizado em #59 ), pretendo realizar uma análise da sua distribuição de idade em breve e iniciar o treinamento
B3FD é um dataset com aproximadamente 376,000 imagens no total, mas considerando apenas o intervalo de idade que será utilizado ( 20-70 anos ), tem-se 350,000. Consideravelmente maior que o FFHQ (70k). Observando a distribuição das idades, temos o seguinte histograma, que mostra o desbalanceamento dos dados com:
Como temos bastante dados, uma possibilidade seria reduzir a base de dados para diminuir o desbalanceamento, exemplo: Se nos limitarmos a 2000 images por idade, teremos no total 93,325 imagens com a seguinte distribuição:
Lembrando que o approach do artigo é o seguinte:
for any age bin with less than 1, 000 samples in the original FFHQ dataset, we complete this bin with some of the generated synthetic face images; for any age bin with more than 1, 000 samples, we select randomly 1, 000 face images from the original FFHQ dataset. The age-equalized dataset contains 47, 990 images over the range Q = {20, . . . , 69}.
Portanto, mesmo com essa redução teríamos consideravelmente mais dados para treinar, mesmo que as idades entre 67 e 70 tenham menos de mil amostras, com 864, 857, 711 e 699 amostras, respectivamente. Dito isto, vou iniciar um treinamento com o B3FD balanceado desta forma, com a expectativa de ter os melhores resultados de transformação de idade até então.
O treinamento do modelo de idade com B3FD foi concluído e me parece que os resultados são bons, após uma inspeção visual. Aqui está uma imagem minha transformada ( pelo visto vou ficar acabado )
Contudo, algo importante que eu notei observando as imagens geradas de perto, que são 5 (20, 30, 40, 50 e 60 anos), é que as imagens de 20 anos costumam ser diferente das demais, com mais artefatos, apesar de que olhando para as imagens num geral, como no exemplo abaixo, não dá pra notar. De qualquer forma, pode ser que não utilizar as imagens de 20 anos funcione melhor.
Resumo
Iniciei a implementação dos experimentos visando reproduzir #59, mas estava encontrado dificuldades em fazer o código do zero, com muitas informações vagas do artigo. Contudo, descobri que a arquitetura que eles utilizam para o modelo de transformação de idade é praticamente igual ao HRFAE, que eles utilizam no artigo anterior. Então dediquei meu tempo a ler o artigo de HRFAE e estudar seu código, o que melhorou muito a situação. Dito isto, acredito que seja justo utilizar o HRFAE com o extrator de features do artigo como um baseline.
Próximos Passos
Após a obtenção do baseline, estes são os próximos passos:
Realizar testes com um classificador de idade melhor do que o DeX
Aqui o principal candidato é MiVOLO, com o único problema sendo que o modelo utiliza um vetor de probabilidade de idades para o cálculo da perda e MiVOLO utiliza uma abordagem regressiva. Possível sugestão sugerida pelo GPT: def age_to_probabilities(age_pred, age_bins, sigma=1.0): """ Convert a continuous age prediction to probabilities for each age bin. Args: - age_pred (torch.Tensor): Predicted continuous ages (batch_size,). - age_bins (torch.Tensor): Age bin centers (num_bins,). - sigma (float): Standard deviation for the Gaussian distribution. Returns: - torch.Tensor: Probabilities for each age bin (batch_size, num_bins). """ # Compute the Gaussian probabilities for each bin age_pred = age_pred.unsqueeze(1) # (batch_size, 1) age_bins = age_bins.unsqueeze(0) # (1, num_bins) prob = torch.exp(-0.5 * ((age_pred - age_bins) / sigma) ** 2) # Normalize to get probabilities prob = prob / prob.sum(dim=1, keepdim=True) return prob
Utilizar diferentes bases de dados para treinamento do HRFAE, junto de alguns outros possíveis ajustes
HRFAE é treinado no FFHQ, que possui imagens 1024x1024 de alta resolução, no artigo #59, o modelo deles é treinado no CACD, acredito que o motivo seja por um melhor desempenho em imagens de baixa resolução, então estas mudanças devem se mostrar relevantes
Explorar diferentes estratégias para o classificador, como a troca da triplet loss pela contrastive loss.