Como treinamos uma rede neural para classificar parafusos

Uma rede neural pode identificar um gato em uma fotografia, encontrar um sofá, melhorar a gravação de vídeo, desenhar uma imagem de filhotes ou um esboço simples. Já estamos acostumados. As notícias sobre redes neurais aparecem quase todos os dias e se tornaram comuns. As empresas da Grid Dynamics definem a tarefa não comum, mas difícil - ensinar a rede neural a encontrar um parafuso ou um parafuso específico em um enorme catálogo de uma loja online de uma fotografia. A tarefa é mais difícil do que encontrar um gato.



O problema da loja online de parafusos está em estoque. Milhares ou dezenas de milhares de modelos. Cada parafuso tem sua própria descrição e características, portanto, não há esperança para filtros. O que fazer Pesquise manualmente ou pesquise no hipermercado nas prateleiras? Nos dois casos, é uma perda de tempo. Como resultado, o cliente se cansa e vai martelar um prego. Para ajudá-lo, usaremos uma rede neural. Se ela puder encontrar selos ou sofás, deixe-a fazer algo útil - aparafusa parafusos. Como ensinar uma rede neural a selecionar parafusos de maneira rápida e precisa para um usuário, contaremos na transcrição do relatório de Maria Matskevichus , que na Grid Dynamics está envolvida em análise de dados e aprendizado de máquina.

Uma breve demonstração do que aconteceu

Problemas do comprador


Imagine - compramos uma mesa, mas um pequeno parafuso foi perdido e uma mesa não pode ser montada sem ela. Vamos à loja online em busca e vemos 15.000 posições únicas, cada uma das quais é possivelmente o nosso parafuso.

Vamos aos filtros - existem cerca de 10 deles, cada um com 5 a 100 atributos. Escolha o tipo de chapéu e cor: chapéu chato - cobre liso e amarelo - latão. Recebemos o problema.



O que é isso Não estávamos procurando por isso. Demita a pessoa responsável pela extradição!

Depois de um tempo, selecionamos 2 parafusos de mesa adequados.



A coisa mais simples que resta é decifrar a descrição e as características. Cada fabricante descreve os parafusos à sua maneira. Não há requisitos específicos para descrever os parâmetros de um modelo específico.

Tudo o que cria dificuldades para o cliente. Perda de tempo, nervos e mão de obra do suporte técnico, o que ajuda o cliente a encontrar o modelo desejado. Tendo percebido esses problemas do comprador, nosso cliente - uma grande empresa americana - decidiu fornecer ao cliente uma pesquisa rápida, precisa e simples por foto, em vez de uma pesquisa semântica lenta e nem sempre bem-sucedida.



Dificuldades de implementação


Nós assumimos a tarefa e percebemos que existem vários problemas.

Os parafusos são parecidos. Olhe as fotos.



Estes são parafusos diferentes. Se você virar as fotos, poderá ver que a característica importante é diferente - cabeça.



E nessa foto?



Aqui os modelos são os mesmos. A iluminação é diferente, mas nas duas fotos há um modelo de parafuso.

Existem espécies raras que requerem classificação. Por exemplo, com "orelhas" ou um anel.



Requisitos mínimos para usar o aplicativo. O usuário pode fazer upload de uma foto com qualquer plano de fundo, objetos estranhos, sombras, pouca iluminação e o aplicativo deve fornecer o resultado. Um parafuso em um fundo branco é uma raridade.



O aplicativo deve funcionar em tempo real. O usuário está aguardando o resultado aqui e agora.

Concorrentes. Recentemente, a Amazon - uma concorrente de nosso cliente - lançou seu Part Finder . Esta é uma aplicação que procura por parafusos e porcas de uma fotografia.



Além da Amazona, tínhamos dois concorrentes iniciantes com suas próprias soluções para o cliente. Precisávamos vencer não apenas a Amazon, mas também as startups, o que não foi difícil. Um dos concorrentes sugeriu a idéia de levar os 20 parafusos mais populares e treinar a detecção de objetos neles. Mas para a questão do que acontecerá quando as redes neurais derem 100, 1000 ou todos os 15.000 parafusos do site do cliente, como a detecção de objetos funcionará e onde obter tantos dados, o concorrente não encontrou o que responder.

Solução


Deve ser escalável e não depender do número de variedades de parafusos e do tamanho do catálogo. Para resolver o problema, decidimos considerar um parafuso como um conjunto de características ou atributos. Cada atributo é um conjunto de atributos.



Selecionou as seguintes características:

  • chapéu - cabeça (32 atributos);
  • revestimento externo - acabamento (15 atributos);
  • ponta de ponta (12 atributos);
  • cobertura de threads - cobertura de threads (4 atributos).

Examinamos o mapa de todos os sinais e percebemos que para descrever 15.000 parafusos diferentes, eles precisam apenas de 50. Eles formarão uma combinação de sinais diferentes com atributos diferentes. São necessários 50 parafusos e uma moeda para medir a escala do parafuso na foto.

Então eles decidiram. Decidimos sobre a ideia. Dados adicionais são necessários.

Dados


Recebemos dados do cliente e ficamos um pouco chateados. Dados do catálogo - fotografias de objetos em um fundo branco.



Mas eles não correspondem exatamente aos dados que o aplicativo processará. O usuário vai querer usar fundos, tirar fotos na palma da mão ou segurar um parafuso com os dedos. Os dados nos quais a rede é treinada não coincidem com a imagem real.

Então decidimos seguir o conselho de Richard Soker .

Em vez de aprender um método de ensino sem professor por um mês, é mais fácil levar uma semana, marcar os dados e treinar o classificador.

Imprimimos muitos fundos coloridos na impressora, compramos esses 50 parafusos e fotografamos os dados de treinamento nos fundos. Então, temos todas as opções possíveis para a superfície de mesas e tapetes.



Depois de coletar os dados, o próximo passo é entender onde, na figura, o parafuso está localizado.

Localização


Examinamos duas abordagens para localização: detecção de objetos e segmentação semântica .



A detecção de objeto retorna a caixa da área mínima ao redor do objeto. A segmentação semântica retorna a máscara. No nosso caso, a máscara é mais adequada. Ele mantém sua forma, remove o fundo, o excesso de sombras e permite classificar os parafusos melhor do que a detecção de objetos.



A tarefa da segmentação semântica é retornar a probabilidade de pertencer a uma classe para cada pixel. Para treinar esse modelo, dados rotulados são necessários. Utilizamos o aplicativo “labelme” , com o qual marcamos a amostra. Temos cerca de mil máscaras com uma moeda e um parafuso.



Modelo


Pegamos a U-Net . Esta rede gosta muito de Kaggle, e nós também somos agora.



U-Net é uma implementação bem-sucedida do codificador-decodificador.

  • Um caminho de construção ou codificador . Essa é a parte do U-Net, que está tentando representar todo o conjunto de dados, presente como uma representação vetorial em um espaço mais compactado. Ela aprende esses sinais e encontra o mais significativo.
  • Um caminho de expansão ou decodificador . Tenta decodificar um mapa de recursos e entender onde o objeto está na imagem.

Decidimos sobre o modelo. Agora, selecionamos a função de perda, cujo valor minimizaremos no processo de aprendizado.

Função de perda


A opção clássica para segmentação é o coeficiente de dados :

D(P,G)= frac2|P cdotG||P|+|G|



Essa é a média harmônica entre precisão e recuperação. A média harmônica significa que pesamos igualmente o erro do primeiro tipo e o erro do segundo tipo. Nossos dados não são equilibrados e isso não é muito adequado para nós.



Sempre há muito background, e o próprio objeto não é suficiente. Portanto, o modelo sempre fornecerá precisão muito alta e recall muito baixo. Para ponderar os erros do primeiro e do segundo tipo de maneiras diferentes, decidimos usar o índice de Tversky :

$$ display $$ S (P, G, α, β) = \ frac {| P \ cdot G |} {| P \ cdot G | + α | P / G | + β | G / P |} $$ exibir $$



O índice de Tversky possui dois coeficientes, α e β, pesando os dois erros de maneira diferente. Se tomarmos α = β = 0,5, obtemos o mesmo coeficiente de dados. Se selecionarmos outros parâmetros, obteremos o índice Jaccard - uma das medidas de similaridade de objetos. Para α = β = 1 - o índice de Tversky é igual ao índice de Jaccard.

Você também pode obter a pontuação Fβ. Para α + β = 1, o índice de Tversky corresponde ao escore Fβ.

Para selecionar α e β, realizamos várias experiências. Eles levantaram a hipótese de que o modelo seria multado mais fortemente por erros do segundo tipo . Não é tão ruim quando um modelo classifica um pixel de segundo plano como um pixel de objeto. Se houver um pequeno quadro de fundo ao redor do objeto, isso é normal. Porém, quando o modelo classifica um pixel de parafuso como um pixel de fundo - os furos aparecem no parafuso, ele se torna desigual e isso interfere em nossa classificação.

Portanto, decidimos aumentar o parâmetro β e aproximá-lo de 1, e o parâmetro α para 0.



A figura mostra que a melhor máscara foi obtida com β = 0,7 e α = 0,3. Decidimos parar com isso e treinar o modelo em todos os nossos dados.

Treinamento


A estratégia de aprendizado é bastante complicada. Como marcamos manualmente os dados em tempo pessoal, decidimos usar um recurso do U-Net. Ele segmenta cada nova classe em um novo canal - adiciona um novo canal e um objeto é localizado nele.

Portanto, em nosso treinamento, não havia uma única figura que contenha uma moeda e um parafuso. Todas as imagens continham uma classe: 10% - moedas, 90% - parafusos.



Isso tornou possível distribuir corretamente os esforços e economizar tempo em uma moeda - é uma, mas o formulário é simples. Aprendemos facilmente a segmentá-lo, o que nos permitiu transferir 90% de nossos esforços para parafusos. Eles têm formas e cores diferentes, e é importante aprender a segmentá-los.

Nossa rede aprendeu a segmentar até as instâncias que não estavam em nossa amostra. Por exemplo, parafusos de uma forma incomum estavam ausentes, mas o modelo também os segmentava bem. Ela aprendeu a generalizar os sinais de parafusos e utilizá-los para novos dados, o que é ótimo.



Classificação


Este é o próximo estágio após a localização do objeto. Poucas pessoas treinam redes neurais convolucionais para classificar objetos; elas costumam usar o aprendizado por transferência . Vamos dar uma olhada na arquitetura de uma rede neural convolucional e depois relembrar brevemente o que é o aprendizado por transferência.



Nas camadas iniciais, a rede aprende a reconhecer limites e ângulos. Mais tarde, reconhece formas simples: retângulos, círculos, quadrados. Quanto mais próximo do topo, mais ele reconhece os recursos característicos dos dados nos quais é treinado. No topo, o modelo reconhece classes.

A maioria dos objetos do mundo consiste em formas simples e possui características comuns. Você pode fazer parte de uma rede treinada em uma enorme quantidade de dados e usar esses atributos para nossa classificação. A rede será treinada em um pequeno conjunto de dados sem o grande gasto de recursos. Foi o que fizemos.



Depois de ter decidido sobre a tecnologia geral do Transfer learning, você precisa selecionar um modelo pré-treinado.

Seleção de modelo


Nossa aplicação funciona em tempo real. O modelo deve ser leve e móvel - tem poucos parâmetros, mas é preciso. Para explicar esses dois fatores, sacrificamos um pouco de precisão em favor da leveza. Portanto, escolhemos não o modelo mais preciso, mas leve - o Xception .



No Xception, em vez da convolução usual - Convolução - Convolução separável é usada. Portanto, o Xception é mais leve que outras redes, por exemplo, com o VGG.



A convolução ordinária faz convolução intercanal e interdimensional. Ações de Convolução Separável : primeira convolução interdimensional - Profundamente e depois intercanal . Os resultados combinam.

Xception executa Convolução separável, enquanto produz o mesmo bom resultado que a Convolução comum, mas há menos parâmetros.



Substituímos os valores nas fórmulas para calcular os parâmetros, por exemplo, 16 filtros. Para Convolução comum, você precisa calcular os parâmetros 7 vezes mais que para Convolução Separável. Devido a isso, o Xception é mais preciso e menos.



Treinamento


Primeiro, decidimos construir uma linha de base e treinamos o modelo na imagem original. Tínhamos quatro classificadores e cada um era responsável por um atributo específico. O resultado foi insatisfatório.



Em seguida, eles treinaram o modelo na caixa, que retornou a detecção do objeto. Obteve um bom aumento na precisão da cobertura do segmento. Mas para o restante dos classificadores, o resultado também é insatisfatório.



Então eles decidiram dar aos classificadores apenas a parte do parafuso que eles querem e irão classificar. Cabeça dê apenas chapéus, Dica - apenas uma ponta de lança. Para fazer isso, pegamos máscaras, obtivemos um contorno em torno do qual um retângulo da área mínima era circulado e calculamos o ângulo de rotação.



Neste momento, ainda não sabemos de que lado a cabeça e a ponta do parafuso. Para descobrir, eles cortaram a caixa ao meio e olharam para a praça.



A área que contém a cabeça é sempre maior que a área que contém a ponta. Comparando a área, determinamos em qual parte, qual parte do parafuso. Funcionou, mas não para todos os casos.



Quando o comprimento do parafuso é comparável ao diâmetro da tampa, em vez de um retângulo, um quadrado é obtido. Quando giramos, obtemos uma imagem, como no número 3. O modelo não classifica bem essa opção.

Em seguida, pegamos todos os parafusos longos, calculamos os ângulos de rotação para eles e construímos a rede neural rasa da Rotation Net , que pega o parafuso e prevê o ângulo de rotação.



Então este modelo auxiliar foi usado para pequenos parafusos e cavilhas. Obtivemos um bom resultado - tudo funciona, pequenos parafusos também giram. Nesta fase, o erro é praticamente reduzido a zero. Pegamos esses dados, treinamos os classificadores e vimos que, para cada um dos classificadores, exceto Concluir, a precisão aumentou significativamente. Isso é ótimo - trabalhamos mais.



Mas, por alguma razão, Finish não decolou. Estudamos os erros e vimos a foto.



O mesmo par de parafusos em diferentes condições de iluminação e diferentes configurações da câmera diferem em cores. Isso pode confundir não apenas o modelo, mas também a pessoa. Cinza pode ficar rosa, amarelo pode ficar laranja. Lembre-se do vestido azul-dourado - a mesma história. A superfície reflexiva do parafuso é enganosa.

Estudamos casos semelhantes na Internet e encontramos cientistas chineses que tentaram classificar os carros por cores e enfrentaram o mesmo problema.



Como solução, os cientistas chineses criaram uma rede superficial. Seu recurso está em dois ramos que são concatenados no final. Essa arquitetura é chamada ColorNet .



Implementamos uma solução para nossa tarefa e obtivemos um aumento na precisão em quase duas vezes. Com esses resultados e modelos, você pode trabalhar e procurar o próprio parafuso da tabela no catálogo da loja online.



Tínhamos apenas 4 classificadores para 4 atributos, e existem muitos outros. Portanto, você precisa criar algum tipo de filtro que pegue os dados do catálogo e os filtre de uma certa maneira.

Filtragem


Cada classificador retorna um rótulo e uma classe programáveis. Pegamos os valores das tags eletrônicas e nosso banco de dados, contamos algumas pontuações - multiplicando todas as tags de cada recurso.



A pontuação mostra a confiança de todos os classificadores de que essa combinação de recursos provavelmente aparecerá. Quanto maior a pontuação, maior a probabilidade de o parafuso do catálogo e o parafuso na imagem serem semelhantes.

Pipeline


Acabou por esse pedido.



  • Entrada : comece com uma imagem não processada.
  • Localização : determine onde o parafuso ou parafuso está localizado e onde está a moeda.
  • Transformação e rotação .
  • Classificação : cortamos tudo cuidadosamente, classificamos e determinamos o tamanho.
  • Filtragem .
  • Saia para uma posição específica do SKU.

Como implementar um projeto complexo


Coma o elefante em partes . Divida o grande problema em partes.

Rotule os dados que refletirão a realidade. Não tenha medo da marcação de dados - esta é a maneira mais segura, que garantirá a qualidade máxima do modelo rapidamente. Os métodos de síntese de dados geralmente produzem resultados piores do que o uso de dados reais.

Teste . Antes de construir muitos modelos, pegamos pequenos pedaços de dados, os rotulamos com as mãos e testamos a operação de cada hipótese. Somente depois disso eles treinaram U-Net, classificadores, Rotação.

Não reinvente a roda . Muitas vezes, o problema que você está enfrentando já tem uma solução. Procure na Internet, leia artigos - encontre algo!

A história sobre o nosso aplicativo Visual Search não é apenas sobre a classificação dos parafusos. É sobre como criar um projeto complexo, que não tem análogos, mas mesmo que existam, eles não atendem aos requisitos que definimos para o aplicativo.

Para obter mais informações sobre projetos de dinâmica de grade e outros desafios enfrentados pela equipe de ciência de dados, consulte o blog de tecnologia da empresa.

Relatórios com esse viés - o uso de algoritmos de aprendizado de máquina em projetos reais não padronizados - estamos apenas procurando o UseData Conf . Aqui está mais sobre as áreas em que estamos mais interessados.

Envie aplicativos se você souber brincar com os modelos para que eles voem. Se você sabe que a convergência não garante velocidade e está pronto para lhe dizer o que é mais importante prestar atenção, estamos esperando por você em 16 de setembro.

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


All Articles