Recomendação de Produto por Semelhança de Imagem


(Luccas Perone) #1

Olá pessoal.

Estou aqui para compartilhar um post que escrevi sobre recomendações de produtos.
Ficou bem básico e prático de entender, os resultados foram muito bons para esse pequeno projeto.

A aplicação tem como princípio básico extrair features de imagens, treinar uma rede neural com essas features extraídas, e assim, categorizar outras imagens para que seja feita a inferência (diferença entre treino e inferência).

Clique aqui para ver o post na íntegra.

Abaixo vou resumir o que você irá encontrar no post.

O ciclo desse posto consiste em:

Treinar modelo

  • Extração de features das imagens
  • Treino meu modelo de categorização
  • Predições utilizando esse modelo categórico
  • Save das predições

Inferência

  • Extração de feature da imagem em questão
  • Carrego o modelo treinado e seus pesos
  • Predição dessa feature extraída
  • Recomendação por similaridade (distância entre features)

Foi utilizado o dataset chamado Fashion MNIST, que é separado em 60k imagens para treino e 10k imagens para testes. destas imagens, foi utilizado 15k imagens do set de treino para realizar a extração de features e o treino do modelo categórico e utilizado 5k imagens do set de teste para criar as recomendações.

A extração de features das imagens é realizada através da utilização de um modelo que utiliza a ResNet50 que, por sua vez, utiliza a rede pré-treinada ImageNet. Foi realizado testes com outros e os resultados não foram tão assertivos, como por exemplo VGG16 e VGG19.

Um passo importante é a normalização dos dados. Tive um problemas em testar as distâncias (iremos ver a seguir) entre as features categorizadas.

Utilizei One Hot Enconding para gerar minhas classes binárias (tem um exemplo do processo no post).

Tratei o caso de utilização de dataset desbalanceados, que foi feito através de calculo de pesos das proporções das minhas classes do meu dataset.

Criei um modelo para categorizar minhas features extraídas das imagens de treino do dataset, utilizando o layer do meio para salvar minhas informações de features classificadas, sendo que, possuo um input de um tensor com 2048 features (geradas da extração da ResNet50), o meu output é a categoria desejada dessa minha rede treinada, e por isso, utilizado o layer do meio, que nada mais é que um tensor com 512 features (já dimensionalmente reduzido do input).

Se seguir o passo a passo dos fatos no post, não haverá muito problema.
Não tive muito tempo pra escrever todo o post em português, mas pretendo.

Se tiverem alguma dúvida é só pedir pessoal.
Quero poder contribuir com informações de uma maneira prática e eficaz.

Abraços pessoal, espero que gostem do post.
Até logo.