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:
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.

Vamos agora dar uma olhada na camada do meio:

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:
- Cada imagem na classe forma uma imagem de solicitação.
- 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
- 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:

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:
- Implementação de três redes neurais paralelas multiescala
- Implementação da função de perda
- 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)
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