Visão computacional. Agora eles falam muito sobre isso, onde é aplicado e implementado muito. E de alguma forma, há algum tempo, não havia artigos de revisão sobre Habré no CV, com exemplos de arquiteturas e tarefas modernas. Mas existem muitos, e eles são muito legais! Se você está interessado no que está acontecendo no Computer Vision agora, não apenas do ponto de vista de
pesquisas e artigos , mas também do ponto de vista dos problemas aplicados, então você é bem-vindo ao gato. Além disso, o artigo pode ser uma boa introdução para aqueles que há muito desejam começar a entender tudo isso, mas algo está no caminho;)

Hoje, na PhysTech, há uma colaboração ativa da "Academia" e dos parceiros industriais. Em particular, existem muitos
laboratórios interessantes de empresas como Sberbank, Biocad, 1C, Tinkoff, MTS, Huawei na
Escola de Matemática Aplicada e Ciência da Computação da
PhysTech .
Fui inspirado a escrever este artigo trabalhando no Laboratório de
Sistemas Inteligentes Híbridos , aberto pela
VkusVill . O laboratório tem uma tarefa ambiciosa - construir uma loja que funcione sem caixas eletrônicos, principalmente com a ajuda da visão computacional. Durante quase um ano de trabalho, tive a oportunidade de trabalhar em muitas tarefas de visão, que serão discutidas nessas duas partes.
Comprar sem mesas de dinheiro? Em algum lugar eu já ouvi isso ..Provavelmente, caro leitor, você pensou no
Amazon Go . Em certo sentido, a tarefa é repetir o sucesso deles, mas nossa decisão é mais sobre implementação do que construir uma loja desse tipo do zero por
muito dinheiro .
Vamos nos mover de acordo com o plano:
- Motivação e o que está acontecendo
- Classificação como estilo de vida
- Arquiteturas de redes neurais convolucionais: 1000 maneiras de atingir um objetivo
- Visualização de redes neurais convolucionais: mostre-me paixão
- Eu próprio sou uma espécie de cirurgião: extraímos recursos de redes neurais
- Fique perto: aprendizado de representação para pessoas e indivíduos
- Parte 2:
detectando, avaliando a postura e reconhecendo ações sem spoilers
Motivação e o que está acontecendo
Para quem é o artigo?O artigo se concentra mais em pessoas que já estão familiarizadas com aprendizado de máquina e redes neurais. No entanto, aconselho a ler pelo menos as duas primeiras seções - de repente tudo ficará claro :)
Em 2019, todo mundo está falando sobre inteligência artificial, a
quarta revolução industrial e a
abordagem da humanidade para uma singularidade . Legal, legal, mas eu quero detalhes. Afinal, somos técnicos curiosos que não acreditam em contos de fadas sobre IA, acreditamos em tarefas formais, matemática e programação. Neste artigo, falaremos sobre casos específicos de uso da IA muito moderna - o uso de aprendizado profundo (redes neurais convolucionais) em várias tarefas de visão computacional.
Sim, falaremos especificamente sobre grades, às vezes mencionando algumas idéias de uma visão "clássica" (chamaremos o conjunto de métodos em visão que foram usados antes das redes neurais, mas isso não significa que eles não sejam usados agora).
Na minha opinião, a primeira aplicação realmente interessante de redes neurais na visão, abordada na mídia em 1993, é
o reconhecimento de manuscrito por Jan LeCun . Agora ele é um dos principais IA na
pesquisa de IA do Facebook , a equipe deles já lançou
muitas coisas úteis de código aberto .
Hoje, a visão é usada em muitas áreas. Vou dar apenas alguns exemplos impressionantes:
Veículos não tripulados Tesla e YandexAnálise de imagens médicas e previsão de câncerConsoles de jogos: Kinect 2.0 (embora também use informações detalhadas, ou seja, imagens RGB-D)Reconhecimento de rosto: Apple FaceID (usando vários sensores)Classificação do ponto de cara: máscaras do SnapchatBiometria dos movimentos da face e dos olhos (um exemplo do projeto do FPMI MIPT )Pesquisa por imagem: Yandex e GoogleReconhecimento do texto na imagem ( reconhecimento óptico de caracteres )Drones e robôs: recebendo e processando informações através da visãoOdometria : construção de um mapa e planejamento ao mover robôsMelhorando gráficos e texturas em videogamesTradução de imagens: Yandex e GoogleRealidade Aumentada: Leap Motion (Projeto North Star) e Microsoft HololensTransferência de estilo e textura: Prisma , PicsArtSem mencionar as inúmeras aplicações em várias tarefas internas das empresas. O Facebook, por exemplo, também usa a visão para filtrar o conteúdo da mídia. Métodos de visão computacional também são usados
em testes de qualidade / danos na indústria .
A realidade aumentada aqui deve, de fato, receber atenção especial, uma vez
que não funciona em um futuro próximo, e pode se tornar uma das principais áreas de aplicação da visão.
Motivado. Cobrado. Vamos lá:
Classificação como estilo de vida

Como eu disse, nos anos 90, as redes foram disparadas à vista. E eles filmaram uma tarefa específica - a tarefa de classificar imagens de números manuscritos (o famoso
conjunto de dados MNIST ). Historicamente, foi a tarefa de classificar imagens que se tornou a base para resolver quase todas as tarefas subseqüentes em visão. Considere um exemplo específico:
Tarefa : Uma pasta com fotos é dada na entrada, cada foto tem um objeto específico: um gato, um cachorro ou uma pessoa (mesmo que não haja fotos de "lixo", é uma tarefa super-não-vital, mas você precisa começar em algum lugar). Você precisa decompor as imagens em três pastas:
/cats
,
/dogs
e
/leather_bags
/humans
, colocando apenas fotos com os objetos correspondentes em cada pasta.
O que é uma foto / foto?
Em quase todos os lugares da visão, é comum trabalhar com imagens no formato RGB. Cada imagem possui uma altura (H), uma largura (W) e uma profundidade de 3 (cores). Assim, uma imagem pode ser representada como um tensor da dimensão HxWx3 (cada pixel é um conjunto de três números - valores de intensidade nos canais).
Imagine que ainda não estamos familiarizados com a visão computacional, mas sabemos que o aprendizado de máquina. As imagens são simplesmente tensores numéricos na memória do computador. Formalizamos a tarefa em termos de aprendizado de máquina: objetos são figuras, seus sinais são valores em pixels, a resposta para cada um dos objetos é um rótulo de classe (gato, cachorro ou pessoa). Esta é uma
tarefa de classificação pura.
Você pode usar alguns métodos da visão "clássica" ou do aprendizado de máquina "clássico", ou seja, não de uma rede neural. Basicamente, esses métodos consistem em destacar as imagens de determinados recursos (pontos especiais) ou regiões locais que caracterizarão a imagem ("conjunto
de palavras visuais "). Geralmente tudo se resume a algo como
SVM sobre
HOG /
SIFT .
Mas nos reunimos aqui para falar sobre redes neurais, por isso não queremos usar os sinais que inventamos, mas queremos que a rede faça tudo por nós. Nosso classificador pegará os sinais de um objeto como uma entrada e retornará uma previsão (rótulo de classe). Aqui, os valores de intensidade em pixels atuam como sinais (veja o modelo da imagem em
spoiler acima). Lembre-se de que uma imagem é um tensor de tamanho (Altura, Largura, 3) (se for colorida). Ao aprender a entrar na grade, tudo isso geralmente é servido não por uma imagem e não por um conjunto de dados inteiro, mas por lotes, ou seja, em pequenas porções de objetos (por exemplo, 64 imagens no lote).
Assim, a rede recebe um tensor de entrada de tamanho (BATCH_SIZE, H, W, 3). Você pode "expandir" cada figura em uma linha vetorial de números H * W * 3 e trabalhar com os valores em pixels, assim como os sinais no aprendizado de máquina, um
Multilayer Perceptron (MLP) comum faria exatamente isso, mas, francamente, é assim linha de base, já que trabalhar com pixels como uma linha de vetor não leva em conta, por exemplo, a invariância translacional dos objetos na imagem. O mesmo gato pode estar no meio da foto e, no canto, o MLP não aprenderá esse padrão.
Então, você precisa de algo mais inteligente, por exemplo, uma operação de convolução. E isso é sobre visão moderna, sobre
redes neurais convolucionais :
O código de treinamento da rede de convolução pode se parecer com isso (na estrutura do PyTorch) Como agora estamos falando sobre o
treinamento com um professor , precisamos de vários componentes para treinar uma rede neural:
- Dados (já existe)
- Arquitetura de rede (destaque)
- Uma função de perda que informa como a rede neural deve aprender (aqui será entropia cruzada )
- Método de otimização (alterará o peso da rede na direção certa)
- Defina os parâmetros da arquitetura e do otimizador (por exemplo, tamanho da etapa do otimizador, número de neurônios em camadas, coeficientes de regularização)
É exatamente isso que é implementado no código: a própria rede neural convolucional é descrita na classe Net ().
Se você quiser aprender lentamente e desde o início sobre pacotes e redes de convolução, recomendo uma
palestra na Deep Learning School (MIPT MIPT) (em russo) sobre esse tópico e, é claro,
o curso de Stanford cs231n (em inglês) .
Em resumo, a operação de convolução permite encontrar padrões nas imagens com base em sua variabilidade. Quando treinamos redes neurais convolucionais (por: Redes Neurais Convolucionais), na verdade, encontramos filtros de convolução (pesos de neurônios) que descrevem bem as imagens e tão bem que podemos determinar com precisão a classe a partir delas. Muitas maneiras foram inventadas para construir essa rede. Mais do que você pensa ...
Arquiteturas de redes neurais convolucionais: 1000 maneiras de atingir um objetivo
Sim, sim,
outra revisão arquitetônica . Mas aqui vou tentar torná-lo o mais relevante possível!
Primeiro, houve o
LeNet , que ajudou Jan LeCun a reconhecer números em 1998. Esta foi a primeira rede neural convolucional para classificação. Sua principal característica era que ela basicamente começou a usar operações de
convolução e pool .

Depois, houve uma pausa no desenvolvimento de grades, mas o hardware não parou; foram desenvolvidos cálculos eficazes em GPU e
XLA . Em 2012, a AlexNet apareceu, ela participou da competição ILSVRC (
Desafio de reconhecimento visual em grande escala do ImageNet ).
Uma pequena digressão sobre o ILSVRCO ImageNet foi montado em 2012 e um subconjunto de milhares de fotos e 1000 classes foi usado para a competição ILSVRC. Atualmente, a ImageNet possui ~ 14 milhões de fotos e 21.841 aulas (tiradas do site oficial), mas para a competição geralmente costumam selecionar apenas um subconjunto. O ILSVRC se tornou a maior competição anual de classificação de imagens. A propósito, recentemente descobrimos como
treinar no ImageNet em questão de minutos .
Foi no ImageNet (no ILSVRC) de 2010 a 2018 que eles receberam redes
SOTA na classificação de imagens. É verdade que, desde 2016, as competições de localização, detecção e compreensão da cena, em vez de classificação, são mais relevantes.
Normalmente, várias
revisões de arquitetura lançam luz sobre as primeiras no ILSVRC de 2010 a 2016 e em algumas redes individuais. Para não confundir a história, coloquei-os no spoiler abaixo, tentando enfatizar as idéias principais:
Arquitetura de 2012 a 2015 
As idéias de todas essas arquiteturas (exceto a ZFNet, geralmente é mencionada pouco) ao mesmo tempo eram uma nova palavra em redes neurais para visão. No entanto, após 2015, houve muitas melhorias mais importantes, por exemplo, Inception-ResNet, Xception, DenseNet, SENet. Abaixo, tentei colecioná-los em um só lugar.
Arquitetura de 2015 a 2019 A maioria desses modelos de PyTorch pode ser encontrada
aqui , e existe
uma coisa muito legal .
Você deve ter notado que a coisa toda pesa bastante (eu gostaria de 20 MB no máximo, ou até menos), enquanto hoje em dia eles usam dispositivos móveis em todos os lugares e a
IoT está ganhando popularidade, o que significa que você também deseja usar grades lá.
Relação entre peso e velocidade do modeloComo as redes neurais em si mesmas apenas multiplicam os tensores, o número de operações de multiplicação (leia-se: o número de pesos) afeta diretamente a velocidade do trabalho (se não for utilizado pós-processamento ou pré-processamento intensivo em mão-de-obra). A velocidade da rede em si depende da implementação (estrutura), do hardware no qual está sendo executada e do tamanho da imagem de entrada.
Os autores de muitos artigos seguiram o caminho de inventar arquiteturas rápidas, colecionei seus métodos sob o spoiler abaixo:
Os números em todas as tabelas
são retirados do teto dos repositórios, da
tabela Aplicativos Keras e
deste artigo .
Você pergunta: “Por que você escreveu sobre todo esse“ zoológico ”de modelos? E por que a tarefa da classificação? Mas queremos ensinar as máquinas a ver, e a classificação é apenas um tipo de tarefa restrita ... ”. O fato é que as redes neurais para detectar objetos, avaliar posturas / pontos, re-identificar e pesquisar em uma imagem usam exatamente os modelos de classificação como
espinha dorsal , e 80% do sucesso depende deles.
Mas, de alguma forma, quero confiar mais na CNN, ou eles pensaram em caixas pretas, mas o que está "dentro" não é óbvio. Para entender melhor o mecanismo de funcionamento das redes convolucionais, os pesquisadores propuseram o uso da visualização.
Visualização de redes neurais convolucionais: mostre-me paixão
Um passo importante para entender o que está acontecendo nas redes convolucionais é o artigo
“Visualizando e compreendendo redes convolucionais” . Nele, os autores propuseram várias maneiras de visualizar exatamente o que (em quais partes da imagem) os neurônios respondem às diferentes camadas da CNN (eu também recomendo assistir a
uma palestra de Stanford sobre esse tópico ). Os resultados foram impressionantes: os autores mostraram que as primeiras camadas da rede convolucional respondem a algumas “coisas de baixo nível” pelo tipo de arestas / ângulos / linhas, e as últimas camadas já respondem a partes inteiras das imagens (veja a figura abaixo), ou seja, elas já carregam em si alguma semântica.
Além disso, o
projeto de visualização profunda da Cornell University e da empresa avançou ainda mais na visualização, enquanto o
famoso DeepDream aprendeu a distorcer em um estilo interessante e
viciante (abaixo está uma foto do
deepdreamgenerator.com ).
Em 2017, um
artigo muito bom foi publicado no Distill , no qual eles realizaram uma análise detalhada do que cada camada “vê” e, mais recentemente (em março de 2019), o Google inventou
atlas de ativação : mapas exclusivos que podem ser construídos para cada camada de rede, o que nos aproxima da compreensão do quadro geral do trabalho da CNN.
Se você quiser brincar com a visualização, eu recomendaria o
Lucid e o
TensorSpace .
Ok, a CNN parece ser verdadeira até certo ponto. Precisamos aprender como usar isso em outras tarefas, e não apenas na classificação. Isso nos ajudará a extrair fotos do Embedding'ov e o Transfer Learning.
Eu próprio sou uma espécie de cirurgião: extraímos recursos de redes neurais
Imagine que existe uma imagem e queremos encontrar imagens com aparência visual (esta é, por exemplo, a pesquisa em uma imagem no Yandex.Pictures). Anteriormente (antes das redes neurais), os engenheiros costumavam extrair recursos para isso, por exemplo, inventando algo que descreve bem a imagem e permite que ela seja comparada com outras. Basicamente, esses métodos (
HOG ,
SIFT ) operam com
gradientes de imagem , geralmente esses itens são chamados de descritores de imagem "clássicos". De particular interesse, refiro-me ao
artigo e ao
curso de Anton Konushin (isto não é publicidade, apenas um bom curso :)
Usando redes neurais, não podemos inventar esses recursos e heurísticas, mas treinamos adequadamente o modelo e, em seguida,
consideramos a saída de uma ou mais camadas da rede como sinais da imagem .
Uma análise mais detalhada de todas as arquiteturas deixa claro que há duas etapas para classificação na CNN:
1) Camadas
extratoras de recursos para extrair recursos informativos de imagens usando camadas convolucionais
2) Aprendendo sobre esses recursos Camadas classificadoras
totalmente conectadas (FC)A incorporação de imagens (recursos) é apenas sobre o fato de que você pode pegar seus sinais após o extrator de recursos de uma rede neural convolucional (embora eles possam ser agregados de maneiras diferentes) como uma descrição informativa das imagens. Ou seja, treinamos a rede para classificação e, em seguida, apenas saímos na frente das camadas de classificação. Esses sinais são chamados de
recursos ,
descritores de redes neurais ou
incorporação de figuras (embora sejam geralmente aceitos na PNL, já que essa é uma visão, falarei sobre
características com frequência). Geralmente, esse é um tipo de vetor numérico, por exemplo, 128 números, com os quais você já pode trabalhar.
Mas e os codificadores automáticos?Sim, de fato, os recursos podem ser obtidos pelos
codificadores automáticos . Na minha prática, eles fizeram isso de maneiras diferentes, mas, por exemplo, em artigos sobre re-identificação (que serão discutidos mais adiante), mais frequentemente eles ainda usam recursos após o extrator, em vez de treinar o codificador automático para isso. Parece-me que vale a pena realizar experimentos em ambas as direções, se a questão é o que funciona melhor.
Assim, o pipeline para resolver o
problema de busca por imagem pode ser organizado de maneira simples: executamos as imagens pela CNN, pegamos sinais nas camadas desejadas e comparamos esses recursos entre si a partir de imagens diferentes. Por exemplo, simplesmente consideramos a distância euclidiana desses vetores.
O Transfer Learning é uma técnica bem conhecida para o treinamento eficaz de redes neurais que já são treinadas em um conjunto de dados específico para sua tarefa. Freqüentemente, eles também dizem Ajuste fino em vez de Transfer Learning, nas
notas do curso de Stanford, cs231. Esses conceitos são compartilhados, eles dizem: Transfer Learning é uma ideia geral e o Ajuste fino é uma das implementações da técnica. Isso não é tão importante para nós no futuro, o principal é entender que podemos apenas treinar a rede para prever bem o novo conjunto de dados, começando não com pesos aleatórios, mas com aqueles treinados em algum tipo ImageNet grande. Isso é especialmente verdade quando há poucos dados e você deseja resolver o problema qualitativamente.
Saiba mais sobre o Transfer Learning No entanto, simplesmente pegar os recursos necessários e fazer um treinamento adicional do conjunto de dados para o conjunto de dados pode não ser suficiente, por exemplo, para tarefas de pesquisa de pessoas / pessoas semelhantes / algo específico. Fotos da mesma pessoa visualmente às vezes podem ser ainda mais diferentes do que fotografias de pessoas diferentes. É necessário fazer a rede destacar exatamente os sinais que são inerentes a uma pessoa / objeto, mesmo que seja difícil para nós fazer isso com nossos olhos. Bem-vindo ao mundo do
aprendizado de
representação .
Fique perto: aprendizado de representação para pessoas e indivíduos
Nota de terminologiaSe você lê artigos científicos, às vezes parece que alguns autores entendem a frase aprendizado de métricas de maneira diferente, e não há consenso sobre quais métodos chamar de aprendizado de métricas e quais não são. Por isso, neste artigo, decidi evitar essa frase em particular e usei um aprendizado de representação mais lógica, alguns leitores podem não concordar com isso - terei prazer em discutir nos comentários.
Definimos as tarefas:
- Tarefa 1 : existe uma galeria (conjunto) de fotografias dos rostos das pessoas, queremos que a rede seja capaz de responder de acordo com uma nova foto com o nome de uma pessoa da galeria (supostamente é essa) ou disse que não existe essa pessoa na galeria (e, talvez, acrescentemos pessoa nova)
- Tarefa 2 : a mesma coisa, mas não estamos trabalhando com fotografias de rostos, mas com pessoas de tamanho completo
A primeira tarefa é geralmente chamada de
reconhecimento facial , a segunda -
re-identificação (abreviada como
Reid ). Combinei-os em um bloco, porque suas soluções usam idéias semelhantes hoje: para aprender a incorporar imagens efetivas que podem lidar com situações bastante difíceis, hoje eles usam diferentes tipos de perdas, como, por exemplo,
perda de trigêmeos ,
perda de quádruplos ,
perda do centro contrastivo, perda de cosseno .
Ainda existem
redes siamesas maravilhosas, mas eu sinceramente não as usei. A propósito, não apenas a perda em si “decide”, mas como provar pares de pontos positivos e negativos para ela, enfatizam os autores do artigo
Amostragem na aprendizagem de incorporação profunda .
A essência de todas essas perdas e redes siamesas é simples - queremos que as imagens de uma classe (pessoa) no espaço latente de recursos (casamentos) sejam "próximas" e de diferentes classes (pessoas) sejam "distantes". A proximidade é geralmente medida da seguinte forma: capturas de imagens de uma rede neural são realizadas (por exemplo, um vetor de 128 números) e consideramos a
distância euclidiana usual entre esses vetores ou a
proximidade do
cosseno. Como medir, é melhor escolher em seu conjunto de dados / tarefa.
Uma representação esquemática de um pipeline de solução de problemas no aprendizado de representação é mais ou menos assim:
Mas para ser mais preciso, assim: (Softmax + CrossEntropy), (Triplet, Contrastive, etc.). positive' negative'
: - , — . , — - , (,
). .
:
- ( MUST READ! ) ,
FaceNet ,
ArcFace ,
CosFace .
:
dlib ,
OpenFace ,
FaceNet repo ,
. , ArcFace CosFace ( , - , - ).
,
, ?
,
- , , , - , - .

Reid :
, , 10 , 5 ( ), 50 . (), , , ID. , : , , ,
, , , ( / ..).
,
Reid — . , - , - negative' positive'.
Reid
2016 . , , — representation learning. , -, ,
Aligned Re-Id (,
, ),
Generative Adversarial Networks (GAN) .
OpenReid TorchReid . — , ,
. PyTorch, Readme Person Re-identification, .
face- reid- (
, ). ? …
, . , , ? ( ) :
float64, , , float32 .
low-precision training . , , Google
MorphNet , ( ) .
?
DL CV: , , , . : , , . ,
, , . .
Stay tuned!