Visão computacional como alternativa aos passes de escritório



Hoje vou lhe contar como fizemos um sistema de controle de acesso no escritório com base no serviço de reconhecimento facial Vision . Primeiro, um pouco de fundo. Como em qualquer serviço de email, criamos um sistema anti-spam. Agora, esses sistemas estão sendo criados com base no aprendizado de máquina. Temos uma equipe poderosa encarregada disso. E onde há aprendizado de máquina, há visão por computador. Portanto, o serviço Vision surgiu de maneira bastante natural e natural.

Paralelamente, lançamos, há alguns anos, o Cloud, um armazenamento confiável de arquivos com distribuição geográfica para data centers, que pode ser usado tanto por indivíduos quanto por empresas. Com o tempo, obtivemos um "Cloud for Business", que não apenas armazena arquivos, mas também permite que você encomende máquinas virtuais. Gradualmente, isso se transformou no MCS - Mail.ru Cloud Solutions, onde o Vision se encaixava organicamente em um dos serviços.

Cloud


Nossas redes neurais são capazes de reconhecer não apenas rostos, mas também vários objetos, objetos e cenas , incluindo vistas . Agora eles podem reconhecer cerca de 10 mil categorias, e a visão de máquina às vezes funciona melhor que a humana.



Esta é minha filha em 2012, em 2015 e 2018. Se eu não a conhecia pessoalmente, provavelmente não entendi imediatamente que essa é a mesma pessoa. E a rede neural foi capaz de combinar e entender.



Aqui a garota se virou e apertou os olhos, e o garoto em geral de boné com uma sombra na metade do rosto. Mas, ao mesmo tempo, a rede neural os reconheceu com precisão, apesar das condições tão difíceis. Naturalmente, a tecnologia que está sendo desenvolvida dentro da empresa não pôde deixar de encontrar suporte em serviços internos.

Nossa intranet


Nossa intranet é chamada sys. Este é um tipo de rede social (temos alguns deles). Nele, os funcionários enviam fotos de vários eventos.



Quando várias centenas de fotos são tiradas do evento, é bastante difícil encontrar-se lá. Portanto, temos visão de máquina conectada a esses álbuns, que na intranet, em um único local, mostram as fotografias nas quais eu estou representado. Aqui o sistema me viu em uma das festas corporativas de verão.



A rede neural me reconheceu mesmo no crepúsculo de perfil, e há muito mais pessoas na foto.

Rack de conferência


Mais tarde, fizemos prateleiras para conferências. Escrevi software para o iPad, instalado dentro do rack, mas em geral sou desenvolvedor iOS e não tenho nada a ver com visão computacional, apenas ajudo de maneira amigável.



Qual é a essência desse rack? Durante o evento - uma reunião, conferência, festa corporativa ou pelo menos um aniversário - você é fotografado por um fotógrafo. De tempos em tempos, lança imagens acumuladas na nuvem. Você pode ir ao balcão a qualquer momento, tirar uma foto e clicar no botão "Find Me". E o rack exibirá imediatamente todas as fotografias nas quais você foi capturado ou dirá que nada foi encontrado até o momento, se o sistema ainda não conseguiu indexar as fotos, e solicitará que você digite um e-mail. E após o evento, você receberá um link no e-mail da pasta na nuvem com todas as fotos em que está. Esse é um dos aplicativos do serviço Vision.

Sistema de acesso


Naturalmente, eu queria usar esses recursos de reconhecimento facial não apenas para procurar minha fisionomia em imagens corporativas, mas também para algo mais prático. Por exemplo, para um sistema de taxa de transferência automática. A aplicação de um passe em cada entrada do seu andar não é muito conveniente: muitas vezes você esquece o passe e, para as meninas com roupas leves no verão, não há lugar para consertá-lo.

Portanto, decidimos experimentar. Temos todas as condições para isso: não precisamos pedir permissão a ninguém, um departamento administrativo muito responsivo, que diz com um suspiro: “Tudo bem. Anexe suas câmeras. Só não na porta. As portas estão relacionadas à segurança contra incêndio. Nós somos: “Bem, então. Vamos nos apegar ao lado. " Também temos colegas pacientes, eles sofreram conosco.

Arquitetura


À primeira vista, a arquitetura do sistema de acesso parece muito simples: a câmera tira fotos, envia para a Vision e a Vision abre a porta. Mas quando começamos a pintar com os colegas como realmente fazer isso, obtivemos esse esquema:



O bloco à direita chamamos de “câmera” - este é o módulo que fica pendurado na porta. Consiste em três partes. O Raspberry Pi recebe vídeo de uma câmera USB, codifica com FFmpeg e envia. Testamos várias câmeras IP com uma faixa de preço razoável e todos tiveram um atraso notável de cerca de 0,5 s. E como temos atrasos em outros estágios, quando uma pessoa aparece, olha para a câmera e, por alguns segundos, nada acontece, ele já quer passar. Portanto, reduzimos os atrasos sempre que possível, e o Raspberry Pi com uma câmera USB acabou sendo mais rápido do que muitas câmeras IP comerciais. Também conectado ao Raspberry está um pequeno Arduino com um LED multicolorido e um squeaker. O LED padrão é vermelho. Quando uma pessoa aparece e é reconhecida, o verde acende.

Portanto, o Raspberry Pi transmite o fluxo de vídeo, que via Ethernet com fio entra no servidor. Temos uma sala de servidores em cada andar, na qual existem comutadores, conectando cabos às mesas dos funcionários e um sistema de controle de acesso em tempo integral - um sistema de controle e gerenciamento de acesso.

Colocamos outro Raspberry Pi na sala do servidor, que recebe o fluxo de vídeo em tempo real e o executa no OpenCV. Por que precisamos do OpenCV? Precisamos determinar se há um rosto na imagem. Uma rede neural que define uma pessoa em uma fotografia trabalha um pouco mais e é muito caro alimentar um fluxo de vídeo constantemente. Portanto, através do OpenCV, determinamos a presença de um rosto e, se ele aparecer, enviamos para o Vision. O serviço responde que não encontrou esse funcionário ou envia o identificador do funcionário no banco de dados de RH. Com esse identificador de funcionário, vamos para a intranet associada ao ACS e ela nos retorna o identificador de senha. Além disso, lançamos esse identificador de passagem no Arduino, que o passa para o ACS. Para um sistema de controle de acesso, isso é equivalente a uma pessoa que aplica um passe. Ou seja, não alteramos o ACS de forma alguma, ele ainda registra a entrada e saída dos funcionários.

Como integramos nosso sistema ao ACS? Em nosso escritório, são utilizados dispositivos Bolid C2000-2.



Este é um sistema de controle de acesso doméstico. Provavelmente, você pode conectar-se a esses dispositivos através da 485ª interface, mas nós nos conectamos através do protocolo Wiegand.



Conectamos o Arduino, que funciona como um proxy, ao leitor de senha instalado perto da porta.



A foto mostra a conexão de energia e duas linhas de dados do leitor de passagem. A almofada é usada para uma conexão mais conveniente.

O Arduino recebe o número do passe do leitor ou do Raspberry Pi via USB e o entrega ao ACS. O ACS nem sabe de onde é o número do passe.

Wiegand


Este é um protocolo padrão para sistemas de controle de acesso, é suportado pela maioria dos leitores. O protocolo é muito simples: duas linhas de dados, uma linha de zeros e uma linha de unidades. Assim que você conecta a linha zero ao terra, o leitor entende que o zero é transmitido, o mesmo com as unidades. Ou seja, o protocolo não possui horários padronizados e o número de pulos é fácil de ler através de uma interrupção no Arduino; é fácil representá-lo como uma sequência de dados. E como a gravação requer algum tipo de tempo, eu me concentrei nesses valores:



Já existe uma biblioteca pronta para o Arduino. Ela pode ler diferentes formatos Wiegand, mas seus recursos são limitados a isso. E eu ainda tinha que transmitir. Portanto, escrevi minha biblioteca, que funciona apenas com o formato Wiegand-26. 26 é o número de bits: 3 bytes do número de salto e 2 bits de paridade. Além disso, em toda a documentação e artigos, está escrito que, provavelmente, seu controlador moderno ignorará os bits de paridade, por isso sou preguiçoso e não os conto, mas sempre envio zero. O ACS percebe isso normalmente.

Tivemos outro problema: se alguém apareceu pela primeira vez na frente da câmera e, sem aguardar a operação, aplicou um passe, ocorreu uma situação de corrida: ao mesmo tempo, o número do passe veio do leitor e do reconhecimento. A ACS não conseguiu lidar com isso e não deixou as pessoas entrarem. Portanto, tive que adicionar um buffer de anel com 4 códigos à biblioteca. Independentemente da origem dos códigos, eles são colocados no buffer e, em seguida, com um tempo limite de 0,5 s são transmitidos ao ACS. Desde então, os colegas deixaram de reclamar que não são permitidos.

Suporte de teste




O primeiro protótipo foi montado a partir de qualquer coisa horrível. Raspberry Pi pendurado em uma caixa em algum rack ridículo, e uma câmera foi colada em cima de uma fita dupla face. O Arduino está pendurado nas mesas laterais. Em geral, tudo o que amamos é muito DIY.

Certamente, desta forma era impossível partir, era necessário organizar lindamente. Conversamos com vários empreiteiros, eles prometeram pedir amostras na China, mas todos os prazos acordados passaram e ninguém nos ofereceu nada.

Os produtos personalizados têm um problema - todas as soluções são altamente especializadas, elas seriam feitas especificamente para nós. Primeiro, nos tornamos dependentes do fornecedor. Em segundo lugar, resulta um projeto de circuito exclusivo com uma pequena circulação, o que significa que o custo de uma peça será alto. Em terceiro lugar, o tempo de produção é longo o suficiente e, se uma cópia falhar, não poderemos comprar rapidamente uma substituição na loja, teremos que aguardar a próxima impressão e, se fizermos isso imediatamente, as cópias restantes serão espanadas no armazém.

Depois que todos os possíveis parceiros nos decepcionaram, fui a um colega da Vision e disse: "Volodya, deixe-me imprimir um estojo na sua impressora 3D para torná-la bonita". Ele suspirou e disse: “Vamos lá. O que fazer? "

Camera V 1




No Fusion, desenhei um monstro tão Frankenstein. No canto deveria ser um Raspberry Pi com uma entrada para um cabo Ethernet. Entrada lateral para poder. O "segundo andar" era uma câmera. O resultado foi uma estrutura grande, e eu até a imprimi com uma camada fina para não gastar muito plástico. Parecia terrível, e pendurar era ainda mais embaraçoso.



Além disso, um colega me enviou essa referência, dizem eles, gostaríamos disso. Respondi que não podia fazer isso, mas decidi projetar outro prédio.



O novo estojo tinha 11 cm de diâmetro, menor que o CD. A colocação do preenchimento também é de duas camadas. Depois de imprimir a primeira versão, percebi que não faz sentido colocar a câmera USB inteiramente em seu estojo nativo. Desmontei-o com cuidado e constatou-se que ele possui 4 orifícios de aterrissagem no painel frontal. Combinei este painel com uma câmera em uma montagem comum com um tweeter e um LED.



Primeiro, tentamos gerar um chiado no Raspberry Pi via gpio. Acabou extremamente mal. Portanto, decidimos usar essa função separadamente do Raspberry Pi, conectando um pequeno arduino (na verdade, o Iskra mini), ao qual o squeaker e o LED foram soldados, através do TTL diretamente no bloco.

Era assim que parecia em batalha:


Penduramos o dispositivo no chão. Nesta forma, ele viveu o suficiente. Gritando, lindamente brilhante, abrindo a porta, no entanto, nem sempre. Os colegas, no entanto, reclamaram que o LED está muito brilhante. Eu tive que enfraquecer 4 vezes.

Camera V 2


Então eles fizeram esta opção:



Foi inspirado no design do hub Xiaomi, com um anel luminoso ao redor do perímetro. Parece muito bonito. O logotipo Vision é fabricado por peças individuais impressas em plásticos de cores diferentes. Aqui está o modelo:





Dessa vez, coloquei o squeaker na parede traseira, montei o LED em um anel transparente ao redor do perímetro, impresso a partir de um PLA transparente. A decoração quase imediatamente desmoronou por dentro, porque era originalmente simplesmente inserida no atrito, e eu tive que colocá-la na cola.

Problemas com a câmera


Tivemos a ideia de replicar essa decisão em todo o edifício. Mas há um problema: quase todos os andares têm duas portas e cada um deve ter duas câmeras, apenas 96 câmeras para apenas uma de nossas torres, e agora a segunda está sendo desenvolvida ativamente. Imprimir tantos casos é possível, mas já parece complicado. Além disso, temos alguns componentes no dispositivo, o que significa muitos pontos de falha. Se escalarmos a solução para todo o edifício, manteremos constantemente essas câmeras. Mais uma vez, a complexidade da substituição rápida, porque cada câmera é um dispositivo móvel. E você precisa imprimir muitos deles, com uma margem, ou, se algo aconteceu, imediatamente executar, imprimir e coletar um novo. Percebemos que as soluções de bricolage são legais, mas você precisa de algo mais conveniente na replicação. E surgiu a ideia de transferir tudo para o iPad.

IPad


IPad tem várias vantagens. O primeiro é a tela. Os colegas queixaram-se da falta de feedback, são adequados e não entendem se o reconhecimento começou ou não, para esperar ou não.

Em segundo lugar, o iOS possui um recurso interno de reconhecimento de rosto. A função que o OpenCV executou foi passada para o iPad. Um quadro é exibido na tela e a pessoa deve chegar tão longe que o rosto se encaixe nesse quadro. Depois disso, o sistema começa a reconhecê-lo automaticamente, você não precisa pressionar nada.

Em terceiro lugar, o iPad é um produto de massa. Se falhar, definimos outro. Embora o tablet em si custe cerca de 20 mil rublos, ainda é mais barato que as câmeras personalizadas que os parceiros nos ofereceram. Além disso, mais rápido e mais confiável.

Nova arquitetura




O iPad assumiu a maioria dos recursos. No Raspberry Pi, que fica na sala do servidor, na verdade, existe apenas um host HTTP que aceita uma solicitação GET com um ID de passe. Ele imediatamente procura o código no Arduino e ela procura no ACS.

Na primeira versão, o Raspberry Pi estava muito carregado, porque o OpenCV estava constantemente trabalhando nele. Não era mais possível conectar uma segunda câmera a ela; não haveria poder computacional suficiente. Nós já pensamos em colocar um computador honesto lá, que analisaria 4 threads de duas portas. Mas não chegou a isso. Agora, a pesquisa de rostos na imagem é realizada independentemente em cada iPad. Na cruz, existem dois Arduino, um para cada porta. Ambas as placas trabalham com passes de entrada e saída. Por que é importante trabalhar com passes de entrada e saída? Primeiro, quando o rosto é reconhecido e a porta se abre, a luz verde no leitor de cartões acende e os colegas entendem que você pode sair. Em segundo lugar, o ACS registra entradas e saídas. Emulando a entrada e a saída separadamente, não interrompemos o esquema de operação do ACS.

Naturalmente, os designers se uniram e criaram uma interface bonita. É assim que fica agora em um dos andares do nosso escritório:



Trabalhe com visão


Apesar do MCS ser um produto comercial, os amadores também podem usá-lo. O serviço oferece a todos 5 mil transações gratuitas por mês, ou seja, 166 por dia. Portanto, você pode solicitar suas necessidades domésticas, se você se encaixar no limite, é claro. Como isso pode ser feito?

python examples/python/smarty.py \ -u "https://smarty.mail.ru/api/v1/persons/recognize ?oauth_provider=mcs&oauth_token=e50b000614a371ce 99c01a80a4558d8ed93b313737363830" \ -p friends1.jpg \ --meta '{"space":"1", "create_new":true}' \ -v 

Tire uma foto e envie-a para a Vision junto com nosso token de acesso. Indicamos que estamos trabalhando com o primeiro espaço e configuramos create_new - então o sistema criará um novo identificador para cada pessoa desconhecida. Aqui está o que obtemos em resposta:

 { "status":200, "body":{ "objects": [ { "status":0, "name":"file_0", "persons":[ {"tag":"person1","coord":[102,30,184,134],"confidence":0.99999,"awesomeness":0.5025}, {"tag":"person2","coord":[393,74,461,166],"confidence":0.99987,"awesomeness":0.548}, {"tag":"person3","coord":[458,48,535,149],"confidence":0.99976,"awesomeness":0.4766}, {"tag":"person4","coord":[273,45,352,147],"confidence":0.99963,"awesomeness":0.504}, {"tag":"person5","coord":[525,81,600,184],"confidence":0.99954,"awesomeness":0.4849}, {"tag":"person6","coord":[194,76,258,167],"confidence":0.9984,"awesomeness":0.5725} ] } ], "aliases_changed":false }, "htmlencoded":false, "last_modified":0 } 

Formatei um pouco o JSON. A resposta contém o identificador da pessoa, as coordenadas do rosto na foto e dois parâmetros: quão bem o rosto é reconhecido e quanto essa pessoa corresponde ao padrão. Você pode enviar uma solicitação POST com uma imagem em sua linguagem de programação, obter JSON e analisar a resposta.

Se você tiver uma cruz grande e precisar determinar apenas uma dúzia de pessoas, poderá configurá-las manualmente. Em seguida, o sistema fornecerá identificadores para pessoas familiares e indefinidos para pessoas desconhecidas. As pessoas também podem ser removidas seletivamente, por exemplo, se um funcionário sair.

Idéias


Em quais projetos você pode usar o reconhecimento facial? Se você deseja implementar um sistema de largura de banda, precisa se preocupar com anti-spoofing. Por exemplo, adicionando uma câmera infravermelha para determinar se é uma fotografia ou uma pessoa viva. Ou colocando duas câmeras para determinar a profundidade do objeto, isso pode ser feito usando o OpenCV.

Você pode organizar o reconhecimento de pessoas na entrada. Se esses são seus vizinhos, tudo está em ordem e, se alguém for de fora, você pode enviar um alerta. Temos um problema em nossa casa, os estrangeiros periodicamente vêm e deixam muito lixo depois de pousarem no patamar.

Se você criar um “espelho inteligente”, poderá equipá-lo com o reconhecimento dos membros da família, para que todos possam mostrar o que é interessante para ele. Digamos que o espelho me mostre o horário das reuniões de hoje e, com minha filha, ela me cumprimentará alegremente e oferecerá escovar os dentes, e não rapidamente, como sempre, por dois minutos.

Outra idéia é o reconhecimento de uma placa por um portão automático no país. Para não sair ou pressionar o comando, você pode colocar uma câmera que removerá seu número e o portão abrirá automaticamente.

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


All Articles