Open vitalwarley opened 1 year ago
Pode haver, entre outras, diferenças na arquitetura do modelo do script original vs modelo que usei (insightface), apesar de ambos serem ResNet101.
Apenas registrada. Será iniciada após outros experimentos serem realizados.
Finalizada parcialmente. Falta sintetizar as anotações.
Explorar separação das features dos pares positivos e negativos com t-SNE. Similar à #27 e #29.
Sprint 15 (s. 20/10)
39
Objetivos
Reproduzir SOTA2021 com PyTorch (meu código)
- ResNet101 sem pré-treino em reconhecimento facial, mas treinada diretamente em verificação de parentesco com perda contrastiva
Resultados
- Objetivo 2 não foi alcançado. Consegui apenas 0.6674 de AUC em vez de 0.864550.
Na verdade há um engano aqui. No paper, temos
We use ArcFace (pre-trained ResNet101) [3] as the feature extraction network, which was also used by Vuvko [18] and won the first place in task I of the RFIW 2020 Data Challenge.
o que implica que de fato pré-treinaram o modelo no mesmo dataset que o SOTA2021 (MS1MV3). Não consegui o mesmo resultado que o SOTA2021 (0.865), mas cheguei perto (0.852). Dessa forma, vou continuar o #46 nos meus scritps (hybrid
) com as ideias da semana: adicionar entropia cruzada (já fiz alguns experimentos e relato lá na 46) e t-SNE durante o treinamento.
A partir de hoje vou criar revisões / logs por dia em vez de por issue. Assim teremos mais coerência no andamento dos experimentos, coisa que por vezes acaba me atrapalhando. Em breve começo a criticar mais à fundo os resultados encontrados.
Avaliei a geometria das embeddings provindas do SOTA2021 para os pares positivos e negativos.
Terminei estudos do A Multi-Task Comparator Framework for Kinship Verification
Resgatei o melhor modelo treinado no esquema do SOTA2020 (classificação de famílias) e o usei em alguns experimentos variando tamanho do batch e taxa de aprendizado.
train-kv
) e realizei alguns experimentos. Não houve sucesso nos experimentos com batch menor, todavia vi que usei valores exagerados para beta
, então outros experimentos foram realizados -- ainda assim sem sucesso. Paralelamente, tentei realizar experimentos com atualizações na taxa de aprendizado como feito no SOTA2020, mas sem êxito.
Agreguei minhas anotações do trabalho Supervised Contrastive Learning for Pre-trained Language Model Fine-tuning.
Resolvi adicionar SCL à estratégia do SOTA2020, porque fazia mais sentido dado a proposta original em Supervised Contrastive Learning for Pre-trained Language Model Fine-tuning. Nenhum experimento conseguiu ultrapassar o SOTA2020.
Criei a issue para replicar o trabalho A Multi-Task Comparator Framework for Kinship Verification. Enquanto procurava códigos associados, achei outros trabalhos interessantes
Houve uma reunião com Matheus Levi para priorizar o estudo do SwinFace: A Multi-task Transformer for Face Recognition, Expression Recognition, Age Estimation and Attribute Estimation, pois creio que pode ser útil como backbone para lidar com viéses presente na verificação de parentesco.
Semana passada, dia 07, explorei uns artigos ao pesquisar "contrastive learning" no scholar
Debiased Contrastive Learning
The paper discusses a new approach to self-supervised representation learning called debiased contrastive learning. This method corrects for the bias in traditional contrastive learning, which samples negative data points uniformly from the training data, and instead samples from truly different labels. The proposed objective consistently outperforms the state-of-the-art for representation learning in vision, language, and reinforcement learning benchmarks, and the authors provide a theoretical analysis of the debiased contrastive representation with generalization guarantees for a resulting classifier. The paper includes experiments on CIFAR10, STL10, ImageNet-100, and sentence embeddings.
What Makes for Good Views for Contrastive Learning?
The paper discusses the importance of view selection in contrastive learning, which has achieved state-of-the-art performance in self-supervised representation learning. The paper argues that reducing the mutual information between views while keeping task-relevant information intact is key to effective sparring. The authors introduce a semi-supervised method to learn effective views for a given task and demonstrate optimal views for contrastive representation learning are task-dependent. They examine the relationship between mutual information and representation quality in various settings and find a U-shaped relationship between the two.
Contrastive Learning Inverts the Data Generating Process
The article discusses the success of contrastive learning in self-supervised learning and its connection to generative modeling and nonlinear independent component analysis. Despite certain statistical assumptions, the theory shows that the success of contrastive learning lies in its ability to invert the data generating process, leading to useful learned representations. The article presents experimental evidence and theoretical foundations for more effective contrastive losses. The work is the first to analyze the circumstances under which representation learning methods used in practice represent the data in terms of its underlying factors of variation.
Estavam na primeira página da pesquisa e minha intuição é de que valem a penar ler com calma futuramente, especialmente porque temos trabalhos usando aprendizado contrastivo para solucionar a tarefa de KV (#26 e #50). Entendi que o primeiro mostra como criar uma função de perda que remova um tipo viés dos atributos aprendidos; o segundo sugere um princípio de minimização de informação (no contexto de informação mutual) para aprender representações que descartem informações sobre variáveis "inconvenientes" tal que melhore a generalização do modelo; o terceiro, por fim, eu só li o abstract (acima é o resumo do GPT3.5).
Nos últimos dias (13-23), atuei somente na #49.
Semana passada fiz um relatório bem simples.
Hoje comecei #50. Ao longo da semana vou revisando as demais issues que estão abertas há um tempo.
Semana passada fiz um relatório bem simples.
Hoje comecei #50. Ao longo da semana vou revisando as demais issues que estão abertas há um tempo.
Por diferentes razões, não consegui voltar ao ritmo de antes. Retomando hoje.
Ainda estudando #50.
Além disso, há uma ablação para qualidade de imagem, algo que nunca vi nos poucos papers de KV que li. Isso me deixa curioso em saber como adaptar a proposta do trabalho Recognizability Embedding Enhancement for Very Low-Resolution Face Recognition and Quality Estimation para o contexto de verificação de parentesco, se é que é possível (qual seria o equivalente de UIs aqui?).
Criei #53 para ir mais a fundo na mecânica da perda, dado que os últimos SOTAs usam.
Criei #53 para ir mais a fundo na mecânica da perda, dado que os últimos SOTAs usam.
Adicione #54 com mesmo objetivo.
Iniciei #53.
Interessante, mas inacessível: Face recognition challenges due to aging: a review
Pausei #53. Vou estudar #51 para apresentar ao grupo próxima semana.
Enquanto isso, neste momento estou colhendo os resultados de #52, que estão na RIG2.
https://github.com/vitalwarley/research/issues/51#issuecomment-1946939366
Comentando progresso incremental via leituras incrementais -- apenas li abstract, figures, tables, e conclusion até o momento.
Creio que a #52 está finalizada porque consegui reproduzir o código, embora os resultados aparentem ser diferentes -- tanto localmente quanto na RIG2.
Importante entender MixFair e a justificativa do debias term. Também investigar sobre mutual information. Ver https://github.com/vitalwarley/research/issues/38#issuecomment-1856482051. Também, considerando substituto da camada debias.
Resumo do mês de janeiro até agora
No entanto, na reunião de ontem, ficou definido focar nos três itens abaixo
Enquanto atuava #65, lembrei do meu interesse na #51 e criei a #66.
Dentre as tarefas que ficaram definidas no resumo anterior, eu realizei parcialmente a #65. As tarefas #63 e #64 não foram devidamente iniciadas.
Na última reunião de pesquisa (08/03/2024), eu tratei especialmente da minha análise do #51, em especial do método proposto vs. o que foi implementado, como podemos ver em https://github.com/vitalwarley/research/issues/67#issuecomment-1975381986. Nesse contexto, eu havia definido dois passos posteriores: 1) reorganizar o código para meu esquema próprio (fiz para outras tarefas, vide #49 e #46), pois facilita os experimentos e discussões; 2) reproduzir os resultados dos autores. Nenhum desses passos foi realizado ainda.
Essa reunião também trouxe novas atividades
Pretendo explorar essa primeira estratégia usando o trabalho #50 como base, pois já possui anotações de raça e identidade. Pretendo também adicionar pseudo-labels de idade e gênero (e possivelmente outras provindas de #42). Como farei isso tudo ainda é uma questão em aberto.
Outra ideia discutida na reunião foi multi-task learning. Penso que seja mais fácil explorá-la antes de algo na linha de feature disentanglement.
Na última reunião (22/03/2024), apresentei os avanços recentes
HeadKin
para classificação de parentesco, todavia não houve ganho em AUC ou acurácia de verificação -- o melhor resultado até agora foi a reprodução, com AUC = 0.8747. É o que devemos conseguir superar.bb
que talvez valha investigar.sibs
e ss
.O planejamento atual é continuar experimentando. Abaixo as linhas de possibilidades.
Penso que a mais interessante é a 2a, mas preciso avaliar como implementar.
Em detalhes, além das issues anteriores, relembro aqui outras possibilidades
Essa semana decidi focar primeiro em experimentar com classificação de família junto à FaCoRNet a partir do que fiz na #71. Todavia, não resisti à vontade (e necessidade) de usar PyTorch Lightning. Já consegui realizar a implementação junto ao guildai, mas falta algo no módulo Lightning. Abaixo segue o treinamento com meu código original, onde incluí a perda de validação para comparar com meu código em PyTorch Lightnining. Ainda não entendi porque a perda de treino desce, mas a de validação não. Estranho também que a AUC difere em ambos os casos, mas não a acurácia. Na verdade, a acurácia é até maior no código com PyTorch Lightning (0.8738 vs 0.8061). Em todos os casos, computei as métricas apenas ao fim da época -- considerando todas as (bs * step_per_epoch) predições na época.
Em rosa, o código original. Acurácia de treinamento faz sentido ser 0, dado que no treinamento só há amostra positivas; possivelmente problema de arrendondamento.
Em rosa, o código original.
Original
PyTorch Lightning
Tentei as seguintes mudanças
shuffle=True
no train_dataloader
e break
quando se chegava em trainer.limit_train_batches
).Nada mudou. A perda de treino continua caindo, enquanto a perda de validação continua subindo.
Isolei o treinamento em um novo código e consegui reproduzir o mesmo problema (apenas a perda de validação manteve-se igual). A questão é: por quê? Caso não consiga responder amanhã, vou desistir do Lightning e voltar pro código raw.
import torch
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
from tqdm import tqdm
from models.facornet import FaCoRNetLightning
from datasets.facornet import FaCoRNetDataModule
from lightning import seed_everything
seed_everything(100)
num_epochs = 5
batch_size = 20
steps_per_epoch = 100
# Step 1: Initialization
model = FaCoRNetLightning()
model.cuda()
# Step 2: Data Preparation
data_module = FaCoRNetDataModule(batch_size=batch_size, root_dir="../datasets/facornet")
data_module.setup('fit')
train_loader = data_module.train_dataloader()
val_loader = data_module.val_dataloader()
# Step 3: Training Loop
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4, momentum=0.9)
for epoch in range(num_epochs):
model.train()
epoch_train_loss = 0
for idx, batch in enumerate(tqdm(train_loader, total=steps_per_epoch)):
optimizer.zero_grad()
loss = model.training_step(batch, idx)
loss.backward()
optimizer.step()
# Log training loss
epoch_train_loss += loss.item()
if idx >= steps_per_epoch:
break
# Step 4: Validation Loop
model.eval()
with torch.no_grad():
epoch_val_loss = 0
for batch in tqdm(val_loader):
val_loss = model.validation_step(batch, ...)
# Log validation loss
epoch_val_loss += val_loss.item()
epoch_val_loss /= len(val_loader)
epoch_train_loss /= len(train_loader)
print(f"Epoch: {epoch} | Loss: {epoch_train_loss} | Val Loss: {epoch_val_loss}")
use_sample = (epoch + 1) * batch_size * steps_per_epoch
train_loader.dataset.set_bias(use_sample)
# ... training_step / validation_step in the FaCoRNetLightning
def forward(self, inputs):
return self.model(inputs)
def _step(self, batch, stage="train"):
img1, img2, labels = batch
kin_relation, is_kin = labels
# Move img1 and img2 to the same device as the model
img1, img2 = img1.to(self.device), img2.to(self.device)
f1, f2, att = self((img1, img2))
loss = self.loss_fn(f1, f2, beta=att)
sim = torch.cosine_similarity(f1, f2)
# datasets and dataloaders in the datamodule
if stage == "fit" or stage is None:
self.train_dataset = FIW(
root_dir=self.root_dir,
sample_path=Path(FIWFaCoRNet.TRAIN_PAIRS),
batch_size=self.batch_size,
biased=True,
transform=self.transform,
)
self.val_dataset = FIW(
root_dir=self.root_dir,
sample_path=Path(FIWFaCoRNet.VAL_PAIRS_MODEL_SEL),
batch_size=self.batch_size,
transform=self.transform,
)
def train_dataloader(self):
return DataLoader(self.train_dataset, batch_size=self.batch_size, shuffle=False, num_workers=4, pin_memory=True)
def val_dataloader(self):
return DataLoader(self.val_dataset, batch_size=self.batch_size, shuffle=False, num_workers=4, pin_memory=True)
🤔
O problema era no código original. Esqueci a agregação das perdas de validação. Eu retornava apenas a perda do último batch. Segue abaixo as métricas do novo treinamento.
AUC e ACC são avaliadas no conjunto de validação e continuam subindo, mesmo com o notável sobreajuste.
mas falta algo no módulo Lightning... Ainda não entendi porque a perda de treino desce, mas a de validação não. Estranho também que a AUC difere em ambos os casos, mas não a acurácia.
Bom, acredito que resolvi os problemas restantes relativo às métricas. Dropei as métricas de treino, dado que não há amostras negativas ali. Também preferi o uso das métricas funcionais, pois não preciso acumulá-las ao longo da validação -- tenho minha própria forma de fazê-lo para obtenção do melhor limiar.
Segue abaixo as métricas e afins. Aproveitei para adicionar precisão e cobertura. O modelo atinge um teto porque é incapaz de melhorar a discriminabilidade das amostras positivas. Isso é, a maior parte dos pares negativos são corretamente verificados, todavia grande parte dos pares positivos não -- note o limiar usado e a distribuição dos limiares positivos e negativos. Ainda assim, eu esperava uma menor cobertura, não? Há o que entender aqui. De qualquer forma, é um ótimo achado. Penso que essa seja a real contribuição da perda contrastiva, que foi tunada pelo mapa de atenção.
Da última reunião até hoje, apenas tratei de atuar na #71. A ideia era deixar o Lightning de lado, mas ao tentar continuar as atividades no código raw (sem framework), percebi que seria desgastante e improdutivo. Portanto, decidi voltar. Abaixo os milestones.
torchmetrics.functional.roc
representam probabilidades
Novos baselines considerando o código atual
run operation auc accuracy precision recall threshold
9ae929af facornet:test 0.896797 0.818005 0.813028 0.826395 0.101611
605fc9ef facornet:val 0.875998 0.802175 0.804439 0.798456 0.101611
68644994 facornet:train 0.874000 0.802999 0.814999 0.828000 0.090199
Comparando ao baseline com código anterior
Aqui temos [as métricas de validação para seleção do modelo:] AUC = 0.8747 e ACC = 0.8029.
Quanto à validação para obtenção do limiar e teste posterior.
AUC acc threshold acc_md acc_ms acc_sibs acc_ss acc_bb acc_fd acc_fs acc_gfgd acc_gfgs acc_gmgd acc_gmgs Val 0.8748 0.8013 0.5248 0.8172 0.7631 0.8587 0.9067 0.9295 0.7732 0.8087 0.3465 0.2412 0.3627 0.3495 Test 0.8953 0.8171 0.5248 0.7999 0.7519 0.8190 0.8471 0.8615 0.7489 0.8420 0.6694 0.4792 0.4225 0.2262
batch_size=50
.
Abaixo os resultados reportados pelos autores mais uma vez, bem como meus resultados por tipo de parentesco também. Podemos ver que meus resultados são equivalentes aqueles reportados pelos autores.
run auc accuracy accuracy/bb accuracy/ss accuracy/sibs accuracy/fd accuracy/md accuracy/fs accuracy/ms accuracy/gfgs accuracy/gmgs accuracy/gfgd accuracy/gmgd
9ae929af 0.896797 0.818005 0.826169 0.838524 0.816051 0.793792 0.820931 0.840610 0.798957 0.702040 0.575419 0.787810 0.765799
A diferença em accuracy/gmgs
entre os experimentos é notável: 0.2262 ⇒ 0.5754. Por quê?
Não ajuda muito. Talvez um plot assim para cada tipo de parentesco seja melhor?
- O tamanho do batch apenas define em que ponto do treinamento a validação ocorre, porque a forma que o treinamento vem sendo feito desde Reproduzir "Supervised Contrastive Learning for Facial Kinship Recognition" #26 é dar apenas um passe em todo dataset.
- Logo, um batch maior significa usar um modelo mais maduro, digamos assim.
- Na RIG, foram 50 (passos por época) * 50 (tamanho do batch) batches por época. Total 2500.
- No meu experimento, foram 50 * 20 = 1000.
- O número de épocas não importa: há um sobreajuste logo após o começo do treinamento. A validação vai subir. As métricas ainda melhoram, mas estabilizam em seguida.
Isso aqui é importante porque indica que o dataset é utilizado ineficazmente.
Discussão sobre os experimento sem https://github.com/vitalwarley/research/discussions/74 para que essa issue de log permaneça enxuta.
Discussão sobre os experimento sem #74 para que essa issue de log permaneça enxuta.
De lá pra cá, realizei mais experimentos, e todos sem sucesso. Alguns aprendizados ficaram, no entanto. Ver discussão para mais detalhes. Penso que a estratégia de multi-task só funcionou no #50 por conta da tamanho do novo dataset (+44227 pares). Minha próxima tarefa é usá-lo, mas sem esquema de multi-task.
É importante notar que multi-task learning possui várias estratégias de implementação.
De sábado até ontem, foquei em Comparativo entre os módulos de atenção: FaCoR vs KFC. Dediquei mais tempo do que esperava, e acredito que por que não planejei adequadamente como realizar esse comparativo. De qualquer forma, podemos ver que, segundo meus experimentos, aparentemente o mecanismo de atenção proposto pelo #50 não é melhor do que o proposto em #51, mesmo que o do KFC seja uma suposta "melhoria".
Seguem algumas ideias
One core question for kinship recognition is: How to properly extract and compute the relation between face components in a face image pair?
Não lembro a intuição de chegar em co-atenção, mas estava lendo algo sobre gated fusion, se não me engano.
Ontem não houve reunião, mas apresentei os resultados atuais ao grupo soios. Dia 19/04 houve reunião, no entanto, e o que ficou definido foi
Adicionalmente, estudar os diferentes mecanismos de atenção é também importante, todavia no experimento https://github.com/vitalwarley/research/discussions/74#discussioncomment-9229886 não há diferença aparente com ou sem atenção...
Adicionei mais detalhes https://github.com/vitalwarley/research/discussions/74#discussioncomment-9247283 sobre o comparativo entre os módulos. Dado a dificuldade de discernir ganhos de performance na track 1 (kinship verification), comecei a implementar a validação para a track 3 (search and retrieval). Todavia, encontrei alguns obstáculos
Essa semana trabalhei na #75. Minha razão para isso foi de fato avaliar minha ablação dos componentes da FaCoRNet realmente atestam para ineficácia do módulo de atenção. A partir daí, um caminho seria um estudo aprofundado da perda contrastiva ou do mecanismo de atenção.
Em resumo, acredito que consegui reproduzir a Track 3 do SOTA2021 (#26) e atualmente estou tentando reproduzir os resultados #51 na mesma trilha. O problema é que está bem lento e, aparentemente, não há nada o que possa ser feito, exceto usar as features do backbone em vez daquelas do mecanismo de atenção...
Resumo do meu resumo das duas últimas semanas com ChatGPT
Resumo dos meus registros do último mês com ChatGPT
Categorias:
Documentei meus experimentos do dia 09/06 aqui. Interessante que durante #69, eu encontrei o artigo Supervised Contrastive Learning and Feature Fusion for Improved Kinship Verification, cujo esquema é em dois estágios:
Os experimentos que documentei adicionam a perda entropia cruzada binária, mas em um estágio só e não em um esquema de classificação. Outra diferença é o uso de uma camada de projeção. Eu uso o backbone (encoder) sem projeção. Em outros casos eu já tinha usado a camada de projeção, mas não nos últimos experimentos.
Realizei #81 e documentei em https://github.com/vitalwarley/research/discussions/74#discussioncomment-9809115. Sem sucesso. Difícil demais? O dataset de treino foi oriundo do train.csv, onde eu resgatei todas as amostras de cada tipo de parentesco e criei 10k combinações para serem usadas no treinamento -- par_i e par_j, onde cada par era do mesmo tipo de parentesco. Acontece que no treinamento em si mantive 100 passos por época, mas acho que não mudaria o resultado se isso fosse aumentado.
Próximos passos
Próximos passos
Não reproduzi #80, mas tratei de iniciar experimentos associados. Documentei em https://github.com/vitalwarley/research/discussions/74#discussioncomment-9817777.
- Adicionar insight do mecanismo de atenção para fusão de atributos
Deu ruim. Ver experimentos 8 e 9.
- Experimentar SOTA2021-like com AdaFace usando camada de projeção no treinamento
Ver esses experimentos. Em resumo, tal camada parece não dar bons resultados isolados, isso é, melhorar o baseline (o estágio 1 do #80), todavia, em conjunto estágio 2 de classificação, talvez haja uma sinergia.
Novos experimentos relativo ao dia 20 e 25 registrados aqui. Em resumo, no Estágio 1 dos experimentos, a adição de um sampler ao baseline FaCoRNet com backbone AdaFace resultou em um claro ganho de performance (AUC = 0.8708 vs 0.8671 e ACC = 0.8037 vs 0.7973). No entanto, a inclusão de uma camada de projeção apresentou resultados inferiores. O autor de #80 revelou que a arquitetura utilizada inclui um encoder ArcFace100 e cabeçalhos de projeção e classificador MLP, com embeddings contrastivas de 128D e métricas nas embeddings de 512D do backbone. Como citei, usei AdaFace101 -- provindo do FaCoRNet. No Estágio 2, experimentos com classificação de parentesco não mostraram melhorias significativas, como reportado pelo autor. Possivelmente errei algo, mas não investigarei por agora. A adição de aumento de base será o foco dos próximos experimentos, utilizando técnicas como jitter de cor, escala de cinza aleatória e inversão horizontal para melhorar a generalização do modelo.
Últimos experimentos
Esses dois últimos tiveram resultados insatisfatórios, especialmente o referente à #82. Avaliar-os-ei assim que oportuno.
Próximos experimentos imediatos
alpha
localPróximos estudos/experimentos posteriores
Adjust the temperature parameter $\tau$ dynamically to balance between uniformity and tolerance, as highlighted in #53. This helps in handling the uniformity-tolerance dilemma by controlling the strength of penalties on hard negative samples.
Incorporate a mechanism to adjust the temperature $\tau$ dynamically based on the training stage or batch difficulty.
def adjust_temperature(initial_tau, epoch, max_epoch, min_tau=0.07):
return max(min_tau, initial_tau * (1 - epoch / max_epoch))
# Example usage
current_tau = adjust_temperature(initial_tau=0.5, epoch=10, max_epoch=100)
Por exemplo, ajustar a temperatura a depender a dificuldade do par (baseando-se nesses dados demográficos).
Próximos experimentos imediatos
- Corrigir HC Loss 1.1 Não filtrar amostras positivas
Não há filtragem das amostras positivas. As positivas vem de pos_sim_ij
e pos_sim_ji
. exp_cosine_sim_masked
é usado apenas para obter as negativas; as positivas ali são definidas como zero, logo não contribuiriam mesmo assim.
1.2 Usar
alpha
local
Não há alpha
local. Eu entendi errado. Todavia, posso experimentar isso em breve...
- Remover aumento de base
- Filtrar positivas (corretamente)
Não funcionou. Posso ter errado a implementação, mas não focarei nisso agora.
Enquanto não penso em outro meio mais apropriado para o relatório abaixo, tratarei de inserir o log de tudo que foi feito na pesquisa desde julho.
Sprint 1
24
Basicamente revisei o que tínhamos até então baseado nos progressos de 2022, quando tentei reproduzir SOTA 2020 no FIW para o TCC. Não consegui reproduzir alguns resultados, logo desisti.
Sprint 2
25
Fui em busca de potenciais novos SOTAs e encontrei alguns surveys e trabalhos interessantes. Especificamente, em um desses trabalhos, encontrei o novo SOTA no RFIW 2021. Encontrei também o trabalho do desafio em si.
Após criar a issue sobre a leitura e reprodução do novo SOTA, fui em busca de outros surveys e trabalhos interessantes. Até o momento eu só terminei a leitura de A survey on kinship verification (Wang et al, 2023), mas não "Facial Kinship Verification: A Comprehensive Review and Outlook" (ainda em curso, pois comecei recentemente; seção 3).
26
Tratei de clonar o repositório e tentar reproduzir o trabalho. Obtive resultados equivalentes.
Reunião semanal
Acredito que apresentei os slides, onde explorei perguntas de pesquisa relacionadas com alguns trabalhos prévios no contexto de reconhecimento facial e com o tema machine unlearning.
Pouco depois, criei outra apresentação sobre o SOTA de 2021, mas não cheguei a apresentá-lo. Apenas em setembro, dia 15, que o apresentei para o pessoal do ZOIOZ, todavia noutra versão.
Sprint 3
27
Basicamente busquei reproduzir a análise visual via t-SNE das features aprendidas com o método proposto na #26. O processo está em tsne.ipynb, enquanto que em tsne_pairs.ipynb fui um pouco além (#29).
Sprint 4
28
Continuei a reprodução da análise visual com t-SNE.
29
É o que o nome diz: tentei fundir as featuers dos pares para visualizá-los. Os resultados são interessantes e creio valer retomar a análise em busca de insights (e.g. por que a fusão leva pares negativos de diferentes parentescos ao "mesmo lugar"?).
Sprint 5
32
@matheuslevi11 avaliou com objetivo de familiarizar-se com reconhecimento facial e transformers, bem como por curiosidade nossa sobre o trabalho em questão.
31
Obtive um SOTA para estimação de idade e gênero e apliquei no dataset. Os resultados estão no notebook rfiw_age_gender_analysis.ipynb. Mais detalhes na própria issue, mas conseguimos ali evidências para discrepâncias significativas nas diferenças de idade entre os diferentes tipos de parentesco ao compararmos pares positivos e negativos.
Sprint 6
33
Comecei um experimento para identificação de parentesco usando o mesmo backbone de #26, mas com uma camada de classificação. Os resultados não foram bons e ainda não retomei a issue; possivelmente farei com alguns ideias que surgiram ao longo do caminho.
Sprint 8
34
Criei, mas ainda não li.
35
Em um dado momento, nós pretendíamos adicionar informações de idade/gênero diretamente na perda contrastiva. Concluímos que isso não era possível, dado que necessitava criar tipos de parentescos arbitrários.
36
@matheuslevi11 analisou a acurácia do modelo de estimação de idade e gênero da #31. A ideia era validar a análise de idade que fizemos. Fica a questão: os erros encontrados nessa #36 (e.g. 33% de erro no test set são decorrentes da idade ou gênero)?.
Sprint 9
37
@matheuslevi11 iniciou uma análise dos erros do #26. Mais uma vez queríamos validar a hipótese da #31.
TODO