Redes neurais - Encontre imagens mais semelhantes

11

Estou trabalhando com Python, scikit-learn e keras. Tenho 3000 mil imagens de relógios de frente, como os seguintes: Watch_1 , Watch_2 , Watch_3 .

Quero escrever um programa que receba como entrada uma foto de um relógio real que talvez seja tirada em condições menos ideais do que as fotos acima (cor de fundo diferente, raios mais escuros etc.) e encontre os relógios mais semelhantes entre os 3000. Por semelhança, quero dizer que se eu der como entrada uma foto de um relógio redondo e marrom com rendas finas, espero que, como saída, relógios de formato redondo, de cor escura e com rendas finas.

Qual é o algoritmo de aprendizado de máquina mais eficiente para fazer isso?

Por exemplo, seguindo este link , tenho duas soluções diferentes em mente:

1) Usando um CNN como um extrator de recursos e compare as distâncias entre esses recursos para cada par de imagens com referência à imagem de entrada.

2) Usando duas CNNs em uma rede neural siamesa para comparar as imagens.

Essas duas opções são as melhores para esta tarefa ou você sugeriria outra coisa?

Você conhece alguma rede neural pré-treinada (com hiperparâmetros pré-determinados) para esta tarefa?

Eu encontrei algumas postagens interessantes no StackOverflow sobre isso, mas elas são bem antigas: Post_1 , Post_2 , Post_3 .

Exilado
fonte
Bem vindo ao site! Aprenda uma incorporação (eu recomendo um hash binário para recuperação rápida da ordem de mil bits) e execute a pesquisa de similaridade.
Emre
É um prazer estar aqui ... haha! ... Sim, isso é uma boa idéia e eu já tinha lido este artigo ... #
Outcast Outcast

Respostas:

4

Não acho que uma arquitetura de alto nível seja a mais adequada, mas depende de muitos fatores e detalhes. Pelo que sei da primeira abordagem, é promissor, especialmente quando estendido por etapas adicionais, como foi feito no TiefVision :

  1. Uma rede adicional de caixa delimitadora é usada para discriminar a parte relevante da imagem do resto
  2. Os vetores de características não são simplesmente comparados diretamente, mas usados ​​para treinar uma rede de comparação usando trigêmeos (aprendendo similaridade com base em vetores de características e exemplos para instâncias cada vez menos semelhantes).

Este trabalho é muito mais recente (2016/17) do que o que você postou e vem com um conjunto de ferramentas agradável e um mais detalhado do papel .

Por que usar trigêmeos, também conhecidos como Ranking Profundo?

Como afirmado nos comentários: Por que usar trigêmeos para obter semelhança de imagem em vez de aprender vetores de características e calcular sua distância? Os trigêmeos são uma maneira de formular a questão da similaridade como um problema de aprendizagem, em vez de aprender vetores de características que basicamente não se importam com a similaridade. Essa abordagem faz especialmente sentido nos casos em que a similaridade percebida pelo homem é importante, o que pode diferir da percepção da máquina.

Os trigêmeos funcionam assim: você fornece 3 imagens. Uma para comparar, uma imagem semelhante (próxima) e uma imagem não tão semelhante (distante). Estes são os seus dados de treinamento / teste / validação. Treinar sua rede nessas amostras e prever a ordem correta (classifique imagens semelhantes a partir de não semelhantes) em geral permite que a rede aprenda a solicitar imagens com base em suas semelhanças.

Ao todo, essa abordagem é comparativamente complexa. Pode ser superengenharia, mas você também pediu a melhor maneira de fazer isso e o Deep Ranking atinge valores de precisão muito altos.

Gegenwind
fonte
Obrigado pela sua resposta. Este é um interessante (eu votei). A idéia sobre o trigêmeo é boa, embora eu não saiba exatamente por que usar trigêmeos de imagens é necessariamente melhor do que usar pares de imagens para minha tarefa. Se você quiser, pode explicar mais na sua postagem. Também vou dar uma olhada no TiefVision.
Outcast
@Universalis obrigado pela dica (e pelo voto positivo). Atualizei minha resposta com mais alguns detalhes sobre trigêmeos e o raciocínio. O artigo também foi escrito muito bem, então procure todos os detalhes. Porém, pode haver novas maneiras sofisticadas de fazer isso desde que o TiefVision e o DeepRanking surgiram.
Gegenwind 14/02
Mais uma vez obrigado pela sua resposta. Sim, dei uma olhada no jornal e ficou bem claro o que você adicionou à sua resposta. Nesse sentido, eu já tinha entendido o que você adicionou à sua resposta e minha pergunta mais claramente foi a seguinte: por que não usar 2 imagens (um par) em vez de 3 imagens (um trigêmeo) para classificar as imagens de acordo com a semelhança? Qual é o benefício adicional de usar trigêmeos em vez de pares?
Outcast
Hmm, talvez eu tenha entendido mal sua abordagem. O trigêmeo fornece informações comparativas de que a imagem 1 está mais próxima da imagem 2 do que da imagem 3. Tendo apenas 2 imagens e afirmando "esses 2 são semelhantes", falta um fator comparativo "semelhante a respeito", porque nessa abordagem você assume que a distância simples do vetor de recurso não informa o suficiente. em outras palavras: você aprende semelhança por pedido e não tem isso sem ter pelo menos 2 itens para fazer o pedido.
Gegenwind
Mais uma vez obrigado pela sua resposta. No entanto, mesmo agora e depois de ler um pouco mais cuidadosamente o artigo, não está claro para mim por que você necessariamente precisa de trigêmeos e não pares de imagens para essa abordagem não supervisionada. Ao usar rótulos, fica claro que, usando trigêmeos, você obterá uma classificação completa de similaridade das imagens que não pode obter com pares. Mas nesta (tipo de) abordagem não supervisionada que você propõe, por que não comparar os valores da função de perda para cada par de imagens (sempre uma imagem do par é a imagem de entrada) para encontrar, por exemplo, as 5 mais semelhantes às imagem de entrada?
Pária
2

Eu escolheria um classificador, como o VGG-16, que funcione bem nas classes imagenet. Em seguida, execute as imagens do seu relógio através dele. Com certeza, você pode esperar que a saída seja principalmente "assistida" com alta probabilidade.

No entanto, você obtém recursos extras: o nível de ativação de todas as outras categorias. Isso fornece um vetor de mil valores entre 0 e 1.

Você também pode extrair a ativação em vários pontos da rede. Então, a semelhança dessas ativações e saídas deve ser semelhante entre dois casos apenas se as imagens forem semelhantes.

Jeffrey apoia Monica
fonte
Obrigado pela sua resposta (voto positivo). Sim, eu tinha isso em mente e, em certo sentido, está relacionado à primeira opção que forneci no meu post. Então, eu também estava pensando em usar outros detectores como o SURF ... Vou ver se estes são suficientemente bem-sucedidos ...
Outcast
2

Eu me concentraria no aumento de dados primeiro. Como suas imagens têm fundo branco, você fica um pouco mais fácil. Transforme o fundo branco em um fundo transparente, reduza a imagem, gire-a e coloque-a em fundos semelhantes aos seus dados de destino.

Faça isso várias vezes com combinações diferentes e tenha um rótulo para cada relógio. Então eu sugiro que você use uma rede neural convolucional regular para a classificação. Cada etiqueta terá uma pontuação, escolha aquela com a maior confiança e essa deve ser a mais semelhante .

Por exemplo, digamos que você execute o classificador com uma imagem e obtenha esse resultado:

Watch1: 0.51

Watch2: 0.30

Watch3: 0.25

A CNN está dizendo que tem 51% de confiança de que o Watch1 é o relógio na imagem de entrada. Mas também o que é verdade é que é o que acha mais parecido, o Watch2 seria o próximo mais parecido e assim por diante.

Se você não obtiver bons resultados, faça o habitual. Experimente os parâmetros e / ou adicione mais camadas. Tente descobrir onde está falhando. Depois de ter esse insight, você pode usá-lo para escolher um tipo mais especializado de rede convolucional para o seu problema específico. Procurar isso sem o conhecimento prévio de como seria o desempenho não é a abordagem correta. Eu sugiro que você comece com um modelo convolucional básico e depois trabalhe a partir daí.

zimio
fonte
1
Obrigado pela sua resposta (voto positivo). Sim, eu já tinha o aumento de dados em minha mente. No entanto, sua resposta não é clara. O que você quer dizer com "tem um rótulo para cada relógio"? Você quer dizer rotular cada relógio individualmente ou rotulá-los como um par com outro, dependendo se são semelhantes ou não? (Se for o primeiro, explique por que isso é eficiente, por favor) #
Outcast Outcast
É a sugestão anterior, eu estava assumindo que você já tinha uma maneira útil de rotular todas elas. Essa é basicamente a solução mais básica, portanto não será eficiente. Minha sugestão foi que o modelo básico talvez pudesse fornecer informações suficientes para você perseguir um modelo mais especializado. Olhar para um ranking profundo parece muito promissor, como disse @Gegenwind. Atualizei minha resposta para torná-la um pouco mais clara.
zimio
Hum, sim, agora está mais claro o que você quis dizer .... Essa é certamente uma boa sugestão geral: comece com o básico e vá passo a passo para coisas mais complexas ... Obrigado em qualquer caso ...
Pária