Classificação profunda para comparar duas imagens

Olá Habr! Apresento a você a tradução do artigo “Similaridade de imagem usando classificação profunda”, de Akarsh Zingade.

Algoritmo de classificação profunda


O conceito de " similaridade de duas imagens " não foi introduzido, portanto, vamos introduzir esse conceito pelo menos na estrutura do artigo.

A semelhança de duas imagens é o resultado da comparação de duas imagens de acordo com determinados critérios. Sua medida quantitativa determina o grau de similaridade entre os diagramas de intensidade de duas imagens. Usando uma medida de similaridade, alguns recursos que descrevem as imagens são comparados. Como medida de semelhança, a distância de Hamming, a distância euclidiana, a distância de Manhattan, etc.

Classificação Profunda - estuda a similaridade de imagem refinada, caracterizando a taxa de similaridade de imagem finamente dividida usando um conjunto de trigêmeos.

O que é um trigêmeo?


O trigêmeo contém a imagem solicitada, a imagem positiva e a negativa. Onde uma imagem positiva é mais uma imagem de solicitação do que uma negativa.

Um exemplo de um conjunto de trigêmeos:

imagem

A primeira, segunda e terceira linha correspondem à imagem da solicitação. A segunda linha (imagens positivas) é mais semelhante à solicitação de imagens do que a terceira (imagens negativas).

Arquitetura de rede de classificação profunda


A rede consiste em 3 partes: amostragem tripla, ConvNet e uma camada de classificação.
A rede aceita trigêmeos de imagens como entrada. Um trigêmeo de imagem contém uma imagem de solicitação $ inline $ p_i $ inline $ imagem positiva $ inline $ p_i ^ + $ inline $ e imagem negativa $ inline $ p_i ^ - $ inline $ transmitidos independentemente para três redes neurais profundas idênticas.

A camada superior de classificação - avalia a função de perda de trigêmeos. Este erro é corrigido nas camadas inferiores para minimizar a função de perda.
imagem

Vamos agora dar uma olhada na camada do meio:

imagem

ConvNet pode ser qualquer rede neural profunda (este artigo discutirá uma das implementações da rede neural convolucional VGG16). ConvNet contém camadas convolucionais, uma camada máxima de pool, camadas de normalização local e camadas totalmente conectadas.
As outras duas partes recebem imagens com uma taxa de amostragem reduzida e realizam o estágio de convolução e o pool máximo. Em seguida, o estágio de normalização das três partes ocorre e no final elas são combinadas com uma camada linear com a normalização subsequente.

Formação de trigêmeos


Existem várias maneiras de criar um arquivo tripleto, por exemplo, usar uma avaliação especializada. Mas este artigo usará o seguinte algoritmo:

  1. Cada imagem na classe forma uma imagem de solicitação.
  2. Cada imagem, exceto a imagem solicitada, formará uma imagem positiva. Mas você pode limitar o número de imagens positivas para cada solicitação de imagem
  3. Uma imagem negativa é selecionada aleatoriamente em qualquer classe que não seja uma classe de imagem solicitada

Função de perda de trigêmeos


O objetivo é treinar uma função que atribua uma pequena distância para as imagens mais semelhantes e uma grande para diferentes. Isso pode ser expresso como:
imagem
Onde l é o coeficiente de perda para trigêmeos, g é o coeficiente de diferença entre a distância entre dois pares de imagens: ( $ inline $ p_i $ inline $ , $ inline $ p_i ^ + $ inline $ ) e ( $ inline $ p_i $ inline $ , $ inline $ p_i ^ - $ inline $ ), f - função de incorporação que exibe a imagem em um vetor, $ inline $ p_i $ inline $ A imagem da solicitação é $ inline $ p_i ^ + $ inline $ É uma imagem positiva, $ inline $ p_i ^ - $ inline $ É uma imagem negativa e D é a distância euclidiana entre dois pontos euclidianos.

Implementação de algoritmo de classificação profunda


Implementação com Keras.

Três redes paralelas são usadas para consulta, imagem positiva e negativa.

Existem três partes principais na implementação, são elas:

  1. Implementação de três redes neurais paralelas multiescala
  2. Implementação da função de perda
  3. Geração de trigêmeos

O aprendizado de três redes profundas paralelas consumirá muitos recursos de memória. Em vez de três redes profundas paralelas que recebem uma imagem solicitada, uma imagem positiva e uma negativa, essas imagens serão alimentadas sequencialmente a uma rede neural profunda na entrada de uma rede neural. O tensor transferido para a camada de perda conterá um anexo de imagem em cada linha. Cada linha corresponde a cada imagem de entrada em um pacote. Como a imagem solicitada, a imagem positiva e a imagem negativa são transmitidas sequencialmente, a primeira linha corresponde à imagem solicitada, a segunda à imagem positiva e a terceira à imagem negativa, e depois repetida até o final do pacote. Assim, a camada de classificação recebe uma incorporação de todas as imagens. Depois disso, a função de perda é calculada.

Para implementar a camada de classificação, precisamos escrever nossa própria função de perda, que calculará a distância euclidiana entre a imagem solicitada e a imagem positiva, bem como a distância euclidiana entre a imagem solicitada e a imagem negativa.

Implementação da função de cálculo de perdas
_EPSILON = K.epsilon() def _loss_tensor(y_true, y_pred): y_pred = K.clip(y_pred, _EPSILON, 1.0-_EPSILON) loss = tf.convert_to_tensor(0,dtype=tf.float32) # initialise the loss variable to zero g = tf.constant(1.0, shape=[1], dtype=tf.float32) # set the value for constant 'g' for i in range(0,batch_size,3): try: q_embedding = y_pred[i+0] # procure the embedding for query image p_embedding = y_pred[i+1] # procure the embedding for positive image n_embedding = y_pred[i+2] # procure the embedding for negative image D_q_p = K.sqrt(K.sum((q_embedding - p_embedding)**2)) # calculate the euclidean distance between query image and positive image D_q_n = K.sqrt(K.sum((q_embedding - n_embedding)**2)) # calculate the euclidean distance between query image and negative image loss = (loss + g + D_q_p - D_q_n ) # accumulate the loss for each triplet except: continue loss = loss/(batch_size/3) # Average out the loss zero = tf.constant(0.0, shape=[1], dtype=tf.float32) return tf.maximum(loss,zero) 


O tamanho do pacote deve sempre ser um múltiplo de 3. Como um trigêmeo contém 3 imagens, e as imagens são transmitidas seqüencialmente (enviamos cada imagem para uma rede neural profunda sequencialmente)

O restante do código está aqui

Referências
[1] Reconhecimento de objetos a partir de recursos invariantes em escala local - www.cs.ubc.ca/~lowe/papers/iccv99.pdf

[2] Histogramas de gradientes orientados para detecção humana- cursos.engr.illinois.edu/ece420/fa2017/hog_for_human_detection.pdf

[3] Aprendendo a similaridade de imagem refinada com a classificação profunda- static.googleusercontent.com/media/research.google.com/en//pubs/archive/42945.pdf

[4] Classificação ImageNet com redes neurais profundas convolucionais- papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

[5] Abandono: uma maneira simples de impedir que redes neurais se adaptem demais - www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf

[6] ImageNet: Um banco de dados hierárquico de imagens em grande escala - www.image-net.org/papers/imagenet_cvpr09.pdf

[7] Querying-grail.cs.washington.edu/projects/query/mrquery.pdf.

[8] Recuperação de imagem em larga escala com vetores compactados de Fisher - citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.401.9140&rep=rep1&type=pdf

[9] Além dos sacos de recursos: correspondência na pirâmide espacial para o reconhecimento de categorias de cenas naturais - ieeexplore.ieee.org/document/1641019

[10] Amostragem consistente aprimorada, esboços ponderados de Minhash e L1- static.googleusercontent.com/media/research.google.com/en//pubs/archive/36928.pdf

[11] Aprendizado on-line em larga escala da semelhança de imagens através do ranking- jmlr.csail.mit.edu/papers/volume11/chechik10a/chechik10a.pdf

[12] Aprendendo a similaridade de imagem refinada com a classificação profunda - users.eecs.northwestern.edu/~jwa368/pdfs/deep_ranking.pdf

[13] Similaridade de imagens usando o Ranking profundo - medium.com/@akarshzingade/image-similarity-using-deep-ranking-c1nst3855978

Source: https://habr.com/ru/post/pt457928/


All Articles