Semelhança de imagem usando a perda de tripla

Shibsankar Das Segue 16 de jul · 5 min ler

Você já treinou um modelo de aprendizado de máquina para resolver um problema de classificação? Se sim, qual foi o número de aulas? talvez 10 a 200? ou 1000? O mesmo modelo funciona quando o número de classes é da ordem de milhões? Se a resposta for Não, este artigo é para você.

Diversas aplicações do mundo real na indústria, que vão desde reconhecimento de faces a detecção de objetos, classificação de marcadores de documentos em PNL, são formuladas como um problema de classificação de várias classes. A rede profunda baseada em softmax típica não ajudaria quando o número de classes na camada de saída é muito alto devido à dispersão da rede. Pelo contrário, esse tipo de problema pode ser formulado de maneira diferente. A idéia é aprender a representação de pontos de dados de distribuições distribuídas de maneira que, no espaço vetorial de alta dimensão, pontos de dados contextualmente semelhantes sejam projetados na região próxima, enquanto pontos de dados diferentes são projetados longe um do outro.

A arquitetura da Perda de Tripleto nos ajuda a aprender a incorporação distribuída pela noção de similaridade e dissimilaridade. É um tipo de arquitetura de rede neural onde várias redes paralelas são treinadas e compartilham pesos entre si. Durante o tempo de previsão, os dados de entrada são passados por uma rede para calcular a representação de integrações distribuídas de dados de entrada.

Neste artigo, discutiremos como treinar a perda de tripla e como usar o modelo treinado durante a previsão.

Preparação de dados de treinamento:

Para Triplet Loss, o objetivo é construir triplas <âncora, positiva, negativa> consistindo de uma imagem âncora, uma imagem positiva (que é semelhante à imagem âncora) e uma imagem negativa (que é diferente da imagem âncora). Existem diferentes maneiras de definir imagens semelhantes e diferentes. Se você tiver um conjunto de dados com vários rótulos como a classe de destino, as imagens da mesma classe poderão ser consideradas semelhantes e as imagens de diferentes classes poderão ser consideradas diferentes.

Eu tenho um conjunto de dados de imagens geológicas com 6 classes diferentes. Para gerar trigêmeos, primeiro, duas classes são selecionadas aleatoriamente. Então, duas imagens são selecionadas de uma classe e uma imagem é selecionada da outra. Agora, imagens das mesmas classes são consideradas similares, então uma delas é usada como uma âncora e a outra como positiva, enquanto a imagem da outra classe é considerada uma imagem negativa.

Da mesma forma, para cada lote, um conjunto de n números de trios é selecionado.

Função de perda:

A função de custo para perda de triplete é a seguinte:

L (a, p, n) = max (0, D (a, p) – D (a, n) + margem)

onde D (x, y): a distância entre a representação do vetor aprendido de x e y. Como uma distância métrica de distância L2 ou (semelhança de 1 – cosseno) pode ser usada. O objetivo dessa função é manter a distância entre a âncora e o positivo menor que a distância entre a âncora e o negativo.

Arquitetura modelo:

A ideia é ter 3 redes idênticas com a mesma arquitetura de rede neural e compartilhar pesos. Repito que todas as redes devem compartilhar vetores de peso subjacentes. [Por favor, consulte o repositório do github para saber como compartilhar pesos entre redes na implementação do tensorflow]. A última camada da Deep Network possui o número D de neurônios para aprender representação de vetores D-dimensionais.

As imagens âncora, positiva e negativa são passadas através de sua respectiva rede e durante a retropropagação, os vetores de peso são atualizados usando a arquitetura compartilhada. Durante o tempo de previsão, qualquer rede é usada para calcular a representação vetorial dos dados de entrada.

Arquitetura de Perda de Tripleto

A seguir, a visualização do tensorboard da implementação.

visualização do tensorboard do gráfico de computação

Aprendizagem Modelo:

O modelo não apenas aprendeu a formular clusters para diferentes classes ao mesmo tempo, mas também conseguiu projetar imagens de aparência semelhante em sua região de vizinhança. No caso da arquitetura de classificação, o modelo tenta aprender um limite de decisão entre um par de classes, mas o modelo não cuida da integridade entre imagens similares e dissimilares dentro de uma classe.

Para ter uma noção de quão boa é a aprendizagem do modelo treinado, eu selecionei aleatoriamente 20% das imagens e plotei essas imagens no espaço 2D depois de fazer a redução de dimensionalidade na representação do espaço vetorial de alta dimensionalidade.

Plot de pontos de dados no espaço 2D

Resultados:

A seguir, um instantâneo de como o modelo está funcionando. Eu escolhi aleatoriamente 20 imagens de consulta do corpus de imagens de teste. E para cada imagem de consulta, são plotadas as 10 imagens mais prováveis que são similares em termos de similaridade de cosseno na representação de espaço vetorial de alta dimensionalidade.

Conclusão:

A arquitetura de perda de tripla ajuda-nos a resolver vários problemas com um número muito elevado de classes. Digamos que você queira construir um sistema de reconhecimento facial, no qual você tem um banco de dados de 1 milhão de faces humanas, pré-calcule vetores dimensionais D para cada face. Agora, dada uma imagem de face humana [como imagem de teste] calcule a semelhança de cosseno com todos os 1 milhão de vetores pré-computados e qualquer imagem que tenha a maior similaridade será o candidato selecionado. Se a imagem de teste não for nada além de um ruído, a maior similaridade seria muito baixa e ficará abaixo de um parâmetro de limite.

A semelhança dos cossenos computacionais com todas as imagens no corpus seria muito ineficiente em termos computacionais. Ao mesmo tempo, pode exigir uma grande quantidade de memória física para armazenar a representação vetorial de imagens corpus.

O faiss, um framework de código aberto desenvolvido pelo facebook-research, ajuda a construir um índice de corpus baseado na memória disponível e fornece vários métodos para encontrar imagens similares comparativamente mais rápidas.

Repositório Git:

Clone o repositório git: https://github.com/sanku-lib/triplet_loss.git

Referências:

[1] https://www.cs.cmu.edu/~rsalakhu/papers/oneshot1.pdf

[2] https://arxiv.org/pdf/1503.03832.pdf

[3] https://arxiv.org/pdf/1702.08734.pdf