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