Verificação de fotos no varejo com visão computacional

Entrada


Como parte do programa de empréstimos, o banco coopera com muitas lojas de varejo.
Um dos elementos principais de um pedido de empréstimo é uma fotografia do mutuário - um agente da loja parceira fotografa o comprador; essa fotografia cai no “arquivo pessoal” do cliente e é usada no futuro como uma das maneiras de confirmar sua presença no momento da solicitação de um empréstimo.

Infelizmente, sempre existe o risco de comportamento desonesto de um agente que pode transferir fotos imprecisas para o banco - por exemplo, fotos de clientes de redes sociais ou passaportes.

Normalmente, os bancos resolvem esse problema verificando se os funcionários do escritório de fotografia veem as fotos e tentam identificar imagens imprecisas.
Queríamos tentar automatizar o processo e resolver o problema usando redes neurais.

Formalização de tarefas


Examinamos apenas fotografias nas quais existem pessoas. As imagens sem rosto podem ser cortadas usando a biblioteca Dlib aberta.

Para maior clareza, damos exemplos de fotografias (os funcionários do banco são retratados):

imagem
Fig 1. Fotos do ponto de venda

imagem
Fig 2. Fotos de redes sociais

imagem
Fig 3. Foto do passaporte

Então, precisamos escrever um modelo analisando o fundo da fotografia. O resultado de seu trabalho foi determinar a probabilidade de a foto ser tirada em um dos pontos de venda de nossos parceiros. Identificamos três maneiras de solucionar esse problema: segmentação, comparação com outras fotos no mesmo ponto de venda, classificação. Vamos considerar cada um deles com mais detalhes.

A) Segmentação


A primeira coisa que veio à mente foi resolver esse problema, segmentando a imagem, identificando áreas com o histórico de lojas parceiras.

Contras:

  • A preparação da amostra de treinamento leva muito tempo.
  • Um serviço criado nesse modelo não funcionará rapidamente.

Decidiu-se retornar a esse método apenas em caso de abandono de opções alternativas. Spoiler: não retornou.

B) Comparação com outras fotos no mesmo ponto de venda


Juntamente com a foto, recebemos informações sobre em que loja de varejo específica ela foi criada. Ou seja, temos grupos de fotos tiradas nos mesmos pontos de venda. O número total de fotos em cada grupo varia de algumas unidades a vários milhares.

Outra idéia surgiu: construir um modelo que compare duas fotografias e preveja a probabilidade de serem tiradas em um ponto de venda. Em seguida, podemos comparar a foto recém-recebida com as fotos existentes na mesma loja. Se for semelhante a eles, então a imagem é definitivamente confiável. Se a imagem for nocauteada, também a enviaremos para verificação manual.

Contras:

  • Amostragem desequilibrada.
  • O serviço funcionará por muito tempo se houver muitas fotos no ponto de venda.
  • Quando um novo ponto de venda aparecer, você precisará treinar novamente o modelo.

Apesar das desvantagens, implementamos o modelo do artigo usando os blocos das redes neurais VGG-16 e ResNet-50. E ... eles receberam uma porcentagem de respostas corretas não muito superiores a 50% nos dois casos :(

B) Classificação!


A idéia mais tentadora foi criar um classificador simples que dividisse as fotos em três grupos: fotos de pontos de venda, passaportes e redes sociais. Resta apenas verificar se essa abordagem funciona. Bem, também gaste algum tempo preparando os dados para o treinamento.

Preparação de dados


No conjunto de dados de imagens de redes sociais que usam a biblioteca Dlib, foram selecionadas apenas as fotos que possuem pessoas.

As fotografias de passaporte tiveram que ser cortadas de maneira diferente, deixando apenas o rosto. Aqui, novamente, Dlib veio em socorro. O princípio do trabalho resultou assim: usando a biblioteca encontrou as coordenadas do rosto -> cortou a foto do passaporte, deixando o rosto.

Em cada uma das três classes, deixou 40.000 fotos. Não se esqueça do aumento de dados

Modelo


ResNet-50 usado. Eles resolveram o problema como um problema de classificação de várias classes com classes desunidas. Ou seja, acreditava-se que uma foto pode pertencer a apenas uma classe.

model = keras.applications.resnet50.ResNet50() model.layers.pop() for layer in model.layers: layer.trainable=True last = model.layers[-1].output x = Dense(3, activation="softmax")(last) resnet50_1 = Model(model.input, x) resnet50_1.compile(optimizer=Adam(lr=0.00001), loss='categorical_crossentropy', metrics=[ 'accuracy']) 

Resultados


Na amostra de teste, 24.000 fotos foram deixadas, ou seja, 20%. A matriz de erros foi a seguinte:

imagem
rede social - redes sociais;
passaporte - passaportes;
pos-credit - pontos de venda, parceiros que concedem empréstimos.

A porcentagem total de erros é de 1,6%, para fotos nos pontos de venda - 1,2%. A maioria das imagens definidas erroneamente são semelhantes a duas classes ao mesmo tempo. Por exemplo, quase todas as fotos definidas incorretamente da classe pós-crédito foram tiradas de ângulos sem êxito (contra a parede branca, apenas o rosto é visível). Portanto, eles também eram semelhantes às fotos da classe da rede social. Tais fotografias tinham uma probabilidade máxima baixa.
Adicionamos um limite para a probabilidade máxima. Se o valor final for maior - confiamos no classificador, menor - enviamos a imagem para verificação manual.

Como resultado, o resultado do serviço de fotografia

imagem

é assim:

imagem

Sumário


Assim, usando um modelo simples, aprendemos a determinar automaticamente que uma fotografia foi tirada em um dos pontos de venda de nossos parceiros. Isso nos permitiu automatizar parte do grande processo de aprovação de um pedido de empréstimo.

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


All Articles