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 .
fonte
Respostas:
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 :
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.
fonte
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.
fonte
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:
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í.
fonte