Visión por computadora. Ahora hablan mucho sobre eso, donde se aplica e implementa mucho. Y de alguna manera hace bastante tiempo no había artículos de revisión sobre Habré en CV, con ejemplos de arquitecturas y tareas modernas. Pero hay muchos, ¡y son realmente geniales! Si está interesado en lo que está sucediendo en Computer Vision ahora, no solo desde el punto de vista de la
investigación y los artículos , sino también desde el punto de vista de los problemas aplicados, entonces es bienvenido a cat. Además, el artículo puede ser una buena introducción para aquellos que siempre han querido comenzar a entender todo esto, pero algo estaba en el camino;)

Hoy en el PhysTech hay una colaboración activa de la "Academia" y socios industriales. En particular, hay muchos
laboratorios interesantes de compañías como Sberbank, Biocad, 1C, Tinkoff, MTS, Huawei en la
Escuela de Matemáticas Aplicadas y Ciencias de la Computación de PhysTech .
Me inspiró para escribir este artículo trabajando en el Laboratorio de
Sistemas Inteligentes Híbridos , inaugurado por
VkusVill . El laboratorio tiene una tarea ambiciosa: construir una tienda que funcione sin cajas, principalmente con la ayuda de la visión por computadora. Durante casi un año de trabajo, tuve la oportunidad de trabajar en muchas tareas de visión, que se discutirán en estas dos partes.
¿Comprar sin mostradores de caja? En algún lugar ya lo escuché ...Probablemente, querido lector, pensaste en
Amazon Go . En cierto sentido, la tarea es repetir su éxito, pero nuestra decisión tiene más que ver con la implementación que con construir una tienda desde cero por un
montón de dinero .
Nos moveremos de acuerdo al plan:
- Motivación y lo que está pasando.
- Clasificación como estilo de vida
- Arquitecturas de redes neuronales convolucionales: 1000 formas de lograr un objetivo
- Visualización de redes neuronales convolucionales: muéstrame pasión
- Yo mismo soy una especie de cirujano: extraemos características de las redes neuronales
- Mantente cerca: aprendizaje de representación para personas y personas
- Parte 2:
detectar, evaluar posturas y reconocer acciones sin spoilers
Motivación y lo que está pasando.
¿Para quién es el artículo?El artículo se centra más en personas que ya están familiarizadas con el aprendizaje automático y las redes neuronales. Sin embargo, le aconsejo que lea al menos las dos primeras secciones, de repente todo estará claro :)
En 2019, todos hablan de inteligencia artificial, la
cuarta revolución industrial y el
enfoque de la humanidad hacia una singularidad . Genial, genial, pero quiero detalles. Después de todo, somos técnicos curiosos que no creen en los cuentos de hadas sobre IA, creemos en el establecimiento de tareas formales, las matemáticas y la programación. En este artículo, hablaremos sobre casos específicos del uso de la IA muy moderna: el uso del aprendizaje profundo (es decir, redes neuronales convolucionales) en una variedad de tareas de visión por computadora.
Sí, hablaremos específicamente sobre las redes, a veces mencionaremos algunas ideas desde una visión "clásica" (llamaremos al conjunto de métodos en visión que se usaron antes de las redes neuronales, pero esto de ninguna manera significa que no se usen ahora).
En mi opinión, la primera aplicación realmente interesante de redes neuronales en visión, que fue cubierta en los medios en 1993, es el
reconocimiento de escritura a mano por Jan LeCun . Ahora es uno de los principales AI en
Facebook AI Research , su equipo ya ha lanzado
muchas cosas útiles de código abierto .
Hoy, la visión se usa en muchas áreas. Daré solo algunos ejemplos sorprendentes:
Vehículos no tripulados Tesla y YandexAnálisis de imágenes médicas y predicción del cáncer.Consolas de juegos: Kinect 2.0 (aunque también usa información de profundidad, es decir, imágenes RGB-D)Reconocimiento facial: Apple FaceID (usando múltiples sensores)Clasificación de puntos faciales: máscaras de SnapchatBiometría de los movimientos de la cara y los ojos (un ejemplo del proyecto de FPMI MIPT )Búsqueda por imagen: Yandex y GoogleReconocimiento del texto en la imagen ( Reconocimiento óptico de caracteres )Drones y robots: recibir y procesar información a través de la visiónOdometría : construcción de un mapa y planificación al mover robotsMejora de gráficos y texturas en videojuegosTraducción de imágenes: Yandex y GoogleRealidad aumentada: Leap Motion (Project North Star) y Microsoft HololensTransferencia de estilo y textura: Prisma , PicsArtSin mencionar las numerosas aplicaciones en diversas tareas internas de las empresas. Facebook, por ejemplo, también usa la visión para filtrar contenido multimedia. Los métodos de visión por computadora también se utilizan
en pruebas de calidad / daños en la industria .
La realidad aumentada aquí necesita, de hecho, recibir una atención especial, ya
que no funciona en el futuro cercano, esta puede convertirse en una de las principales áreas de aplicación de la visión.
Motivado Cargado Vamos:
Clasificación como estilo de vida

Como dije, en los años 90, las redes fueron disparadas a la vista. Y filmaron en una tarea específica: la tarea de clasificar imágenes de números escritos a mano (el famoso
conjunto de datos MNIST ). Históricamente, fue la tarea de clasificar imágenes lo que se convirtió en la base para resolver casi todas las tareas posteriores en visión. Considere un ejemplo específico:
Tarea : se da una carpeta con fotos en la entrada, cada foto tiene un objeto particular: ya sea un gato, un perro o una persona (incluso si no hay fotos de "basura", es una tarea súper no vital, pero debe comenzar en algún lugar).
/leather_bags
descomponer las imágenes en tres carpetas:
/cats
,
/dogs
y
/leather_bags
/humans
, colocando solo fotos con los objetos correspondientes en cada carpeta.
¿Qué es una foto / foto?
Casi en todas partes en visión es habitual trabajar con imágenes en formato RGB. Cada imagen tiene una altura (H), un ancho (W) y una profundidad de 3 (colores). Por lo tanto, una imagen se puede representar como un tensor de dimensión HxWx3 (cada píxel es un conjunto de tres números: valores de intensidad en los canales).
Imagine que todavía no estamos familiarizados con la visión por computadora, pero conocemos el aprendizaje automático. Las imágenes son simplemente tensores numéricos en la memoria de la computadora. Formalizamos el problema en términos de aprendizaje automático: los objetos son imágenes, sus signos son valores en píxeles, la respuesta para cada uno de los objetos es una etiqueta de clase (gato, perro o persona). Esta es una
tarea de clasificación pura.
Puede tomar algunos métodos desde la vista "clásica" o el aprendizaje automático "clásico", es decir, no una red neuronal. Básicamente, estos métodos consisten en resaltar las imágenes de ciertas características (puntos especiales) o regiones locales que caracterizarán la imagen ("
bolsa de palabras visuales "). Por lo general, todo se reduce a algo como
SVM sobre
HOG /
SIFT .
Pero nos reunimos aquí para hablar sobre redes neuronales, por lo que no queremos usar los signos que inventamos, pero queremos que la red haga todo por nosotros. Nuestro clasificador tomará los signos de un objeto como entrada y devolverá una predicción (etiqueta de clase). Aquí, los valores de intensidad en píxeles actúan como signos (vea el modelo de imagen en
spoiler arriba). Recuerde que una imagen es un tensor de tamaño (Altura, Ancho, 3) (si es color). Cuando se aprende a ingresar a la cuadrícula, todo esto generalmente no es servido por una imagen y no por un conjunto de datos completo, sino por lotes, es decir, en pequeñas porciones de objetos (por ejemplo, 64 imágenes en el lote).
Por lo tanto, la red recibe un tensor de entrada de tamaño (BATCH_SIZE, H, W, 3). Puede "expandir" cada imagen en una línea vectorial de números H * W * 3 y trabajar con los valores en píxeles al igual que con los signos en el aprendizaje automático, un
Perceptrón Multicapa (MLP) normal haría exactamente eso, pero honestamente, es así línea de base, ya que trabajar con píxeles como una fila de vectores no tiene en cuenta, por ejemplo, la invariancia traslacional de los objetos en la imagen. El mismo gato puede estar en el medio de la foto, y en la esquina, MLP no aprenderá este patrón.
Entonces necesita algo más inteligente, por ejemplo, una operación de convolución. Y se trata de la visión moderna, de
las redes neuronales convolucionales :
El código de entrenamiento de la red de convolución puede verse más o menos así (en el marco PyTorch) Como ahora estamos hablando de
entrenar con un maestro , necesitamos varios componentes para entrenar una red neuronal:
- Datos (ya existe)
- Arquitectura de red (resaltado)
- Una función de pérdida que dirá cómo debe aprender la red neuronal (aquí será entropía cruzada )
- Método de optimización (cambiará el peso de la red en la dirección correcta)
- Defina la arquitectura y los hiperparámetros del optimizador (por ejemplo, tamaño del paso del optimizador, número de neuronas en capas, coeficientes de regularización)
Esto es exactamente lo que se implementa en el código; la propia red neuronal convolucional se describe en la clase Net ().
Si desea aprender lentamente y desde el principio sobre paquetes y redes de convolución, le recomiendo una
conferencia en la Escuela de Aprendizaje Profundo (MIPT MIPT) (en ruso) sobre este tema y, por supuesto,
el curso cs231n de Stanford (en inglés) .
En resumen, la operación de convolución le permite encontrar patrones en las imágenes en función de su variabilidad. Cuando entrenamos redes neuronales convolucionales (eng: Redes neuronales convolucionales), de hecho, encontramos filtros de convolución (pesos de neuronas) que describen bien las imágenes, y tan bien que puede determinar con precisión la clase a partir de ellas. Se han inventado muchas formas para construir dicha red. Más de lo que piensas ...
Arquitecturas de redes neuronales convolucionales: 1000 formas de lograr un objetivo
Sí, sí,
otra revisión arquitectónica . ¡Pero aquí trataré de hacerlo lo más relevante posible!
Primero fue
LeNet , que ayudó a Jan LeCun a reconocer los números en 1998. Esta fue la primera red neuronal convolucional para la clasificación. Su característica principal era que básicamente comenzó a usar operaciones de
convolución y agrupación .

Luego hubo una pausa en el desarrollo de las redes, pero el hardware no se detuvo; se desarrollaron cálculos efectivos en GPU y
XLA . En 2012, apareció AlexNet, participó en el concurso ILSVRC (
ImageNet Large-Scale Visual Recognition Challenge Challenge ).
Una pequeña digresión sobre ILSVRCImageNet se ensambló en 2012, y se utilizó un subconjunto de miles de imágenes y 1000 clases para la competencia ILSVRC. ImageNet actualmente tiene ~ 14 millones de imágenes y 21.841 clases (tomadas del sitio oficial), pero para la competencia, por lo general, solo seleccionan un subconjunto. ILSVRC se convirtió en la competencia anual de clasificación de imágenes más grande. Por cierto, recientemente descubrimos cómo
entrenar en ImageNet en cuestión de minutos .
Fue en ImageNet (en ILSVRC) de 2010 a 2018 que recibieron redes
SOTA en la clasificación de imágenes. Es cierto que desde 2016, las competencias en localización, detección y comprensión de la escena, en lugar de la clasificación, son más relevantes.
Por lo general, varias
revisiones arquitectónicas arrojan luz sobre las que fueron las primeras en el ILSVRC de 2010 a 2016, y en algunas redes individuales. Para no saturar la historia, los coloqué debajo del spoiler a continuación, tratando de enfatizar las ideas principales:
Arquitectura de 2012 a 2015 
Las ideas de todas estas arquitecturas (a excepción de ZFNet, generalmente se menciona poco) en un momento fueron una nueva palabra en las redes neuronales para la visión. Sin embargo, después de 2015 hubo muchas mejoras más importantes, por ejemplo, Inception-ResNet, Xception, DenseNet, SENet. A continuación intenté recogerlos en un solo lugar.
Arquitectura de 2015 a 2019 La mayoría de estos modelos para PyTorch se pueden encontrar
aquí , y hay
algo genial .
Es posible que haya notado que todo pesa bastante (me gustaría un máximo de 20 MB, o incluso menos), mientras que hoy en día usan dispositivos móviles en todas partes y
IoT está ganando popularidad, lo que significa que también desea usar redes allí.
Relación entre peso y velocidad del modelo.Dado que las redes neuronales dentro de sí mismas solo multiplican los tensores, el número de operaciones de multiplicación (léase: el número de pesos) afecta directamente la velocidad del trabajo (si no se usa el procesamiento o preprocesamiento intensivo en mano de obra). La velocidad de la red en sí depende de la implementación (marco), el hardware en el que se ejecuta y el tamaño de la imagen de entrada.
Los autores de muchos artículos tomaron el camino de inventar arquitecturas rápidas, reuní sus métodos en el siguiente spoiler:
Arquitectura ligera de CNN Los números en todas las tablas
se toman del techo de los repositorios, de
la tabla de aplicaciones de Keras y de
este artículo .
Usted pregunta: "¿Por qué escribiste sobre todo este" zoológico "de modelos? ¿Y por qué es la tarea de clasificación? Pero queremos enseñar a las máquinas a ver, y la clasificación es solo una especie de tarea estrecha ... ". El hecho es que las redes neuronales para detectar objetos, evaluar posturas / puntos, volver a identificar y buscar en una imagen usan modelos precisos para la clasificación como
columna vertebral , y el 80% del éxito depende de ellos.
Pero de alguna manera quiero confiar más en CNN, o pensaron en cajas negras, pero lo que está "adentro" no es obvio. Para comprender mejor el mecanismo de funcionamiento de las redes convolucionales, a los investigadores se les ocurrió el uso de la visualización.
Visualización de redes neuronales convolucionales: muéstrame pasión
Un paso importante para comprender lo que está sucediendo dentro de las redes convolucionales es el artículo
"Visualizar y comprender las redes convolucionales" . En él, los autores propusieron varias formas de visualizar exactamente a qué (en qué partes de la imagen) reaccionan las neuronas en diferentes capas de CNN (también recomiendo ver
una conferencia de Stanford sobre este tema ). Los resultados fueron muy impresionantes: los autores mostraron que las primeras capas de la red convolucional responden a algunas "cosas de bajo nivel" por el tipo de bordes / ángulos / líneas, y las últimas capas ya responden a partes enteras de las imágenes (ver la imagen a continuación), es decir, ya llevan en sí misma semántica.
Además, el
proyecto de visualización profunda de la Universidad de Cornell y la compañía avanzaron aún más la visualización, mientras que el
famoso DeepDream aprendió a distorsionar en un estilo interesante y
adictivo (a continuación se muestra una imagen de
deepdreamgenerator.com ).
En 2017,
se publicó un
muy buen artículo en Distill , en el que realizaron un análisis detallado de lo que "ve" cada capa, y más recientemente (en marzo de 2019) Google inventó
atlas de activación : mapas únicos que se pueden construir para cada capa de red, lo que nos acerca a comprender la imagen general del trabajo de CNN.
Si quieres jugar con la visualización tú mismo, recomendaría
Lucid y
TensorSpace .
De acuerdo, CNN parece ser cierto hasta cierto punto. Necesitamos aprender a usar esto en otras tareas, y no solo en la clasificación. Esto nos ayudará a extraer imágenes de Embedding'ov y Transfer Learning.
Yo mismo soy una especie de cirujano: extraemos características de las redes neuronales
Imagine que hay una imagen y queremos encontrar una que se vea visualmente (esto es, por ejemplo, la búsqueda en una imagen en Yandex.Pictures). Anteriormente (antes de las redes neuronales), los ingenieros solían extraer características manualmente para esto, por ejemplo, inventando algo que describe bien la imagen y permite compararla con otras. Básicamente, estos métodos (
HOG ,
SIFT ) funcionan con
gradientes de imagen , por lo general, estos elementos se denominan descriptores de imagen "clásicos". De particular interés, me refiero al
artículo y al
curso de Anton Konushin (esto no es publicidad, solo un buen curso :)
Usando redes neuronales, no podemos inventar estas características y heurísticas nosotros mismos, sino entrenar adecuadamente el modelo y luego
tomar la salida de una o más capas de la red como signos de la imagen .
Una mirada más cercana a todas las arquitecturas deja en claro que hay dos pasos para la clasificación en CNN:
1) Capas de
extractor de características para extraer características informativas de imágenes usando capas convolucionales
2) Aprendiendo sobre estas características capas de clasificador
totalmente conectadas (FC)La incrustación de imágenes (características) se trata solo del hecho de que puede tomar sus signos después del extractor de características de una red neuronal convolucional (aunque se pueden agregar de diferentes maneras) como una descripción informativa de las imágenes. Es decir, capacitamos a la red para la clasificación, y luego tomamos la salida frente a las capas de clasificación. Estos signos se denominan
características ,
descriptores de redes neuronales o
incrustaciones de imágenes (aunque las incrustaciones generalmente se aceptan en la PNL, ya que esto es visión, a menudo hablaré
características ). Por lo general, este es un tipo de vector numérico, por ejemplo, 128 números, con el que ya puede trabajar.
¿Pero qué pasa con los codificadores automáticos?Sí, de hecho, las características se pueden obtener mediante
codificadores automáticos . En mi práctica, lo hicieron de diferentes maneras, pero, por ejemplo, en artículos sobre reidentificación (que se discutirán más adelante), con mayor frecuencia aún toman características después del extractor, en lugar de entrenar el codificador automático para esto. Me parece que vale la pena realizar experimentos en ambas direcciones, si la pregunta es qué funciona mejor.
Por lo tanto, la tubería para resolver
el problema de búsqueda en una imagen se puede organizar simplemente: ejecutamos las imágenes a través de CNN, tomamos señales de las capas deseadas y comparamos estas características entre sí a partir de diferentes imágenes. Por ejemplo, simplemente consideramos la distancia euclidiana de estos vectores.
Transfer Learning es una técnica bien conocida para el entrenamiento efectivo de redes neuronales que ya están capacitadas en un conjunto de datos específico para su tarea. A menudo también dicen Ajuste fino en lugar de Aprendizaje de transferencia, en las
notas del curso de Stanford cs231n se comparten estos conceptos, dicen, Aprendizaje de transferencia es una idea general, y Ajuste fino es una de las implementaciones de la técnica. Esto no es tan importante para nosotros en el futuro, lo principal es entender que podemos entrenar a la red para predecir bien en el nuevo conjunto de datos, comenzando no por pesos aleatorios, sino por aquellos entrenados en algún tipo grande de ImageNet. Esto es especialmente cierto cuando hay pocos datos y desea resolver el problema cualitativamente.
Aprenda más sobre Transfer Learning Sin embargo, simplemente tomar las características necesarias y realizar capacitación adicional del conjunto de datos al conjunto de datos puede no ser suficiente, por ejemplo, para tareas de búsqueda de personas / personas similares / algo específico. Las fotos de la misma persona visualmente a veces pueden ser aún más diferentes que las fotografías de diferentes personas. Es necesario hacer que la red resalte exactamente los signos inherentes a una persona / objeto, incluso si es difícil para nosotros hacer esto con nuestros ojos. Bienvenido al mundo del
aprendizaje de
representación .
Mantente cerca: aprendizaje de representación para personas y personas
Nota de terminologíaSi lee artículos científicos, a veces parece que algunos autores entienden la frase aprendizaje métrico de manera diferente, y no hay consenso sobre qué métodos llamar aprendizaje métrico y cuáles no. Es por eso que en este artículo decidí evitar esta frase en particular y utilicé un aprendizaje de representación más lógico, algunos lectores pueden no estar de acuerdo con esto; estaré encantado de discutirlo en los comentarios.
Establecemos las tareas:
- Tarea 1 : hay una galería (conjunto) de fotografías de los rostros de las personas, queremos que la red pueda responder de acuerdo con una nueva foto, ya sea con el nombre de una persona de la galería (supuestamente esta es), o dijo que no hay tal persona en la galería (y, tal vez, le agregamos nueva persona)
- Tarea 2 : lo mismo, pero no estamos trabajando con fotografías de rostros, sino con personas de cuerpo entero.
La primera tarea generalmente se llama
reconocimiento facial , la segunda,
reidentificación (abreviada como
Reid ). Los combiné en un bloque, porque sus soluciones usan ideas similares hoy: para aprender incrustaciones de imágenes efectivas que pueden hacer frente a situaciones bastante difíciles, hoy usan diferentes tipos de pérdidas, como, por ejemplo,
pérdida de triplete ,
pérdida de cuádruple ,
pérdida de centro contrastante, pérdida de coseno .
Todavía hay maravillosas
redes siamesas , pero sinceramente no las usé yo mismo. Por cierto, no solo la pérdida en sí misma "decide", sino cómo muestrear pares de aspectos positivos y negativos para ello, enfatizan los autores del artículo
Las cuestiones de muestreo en el aprendizaje de inserción profunda .
La esencia de todas estas pérdidas y redes siamesas es simple: queremos que las imágenes de una clase (persona) en el espacio latente de características (incrustaciones) estén "cercanas", y de diferentes clases (personas) estén "lejos". La proximidad generalmente se mide de la siguiente manera: se toman incrustaciones de imágenes de una red neuronal (por ejemplo, un vector de 128 números) y consideramos la
distancia euclidiana habitual entre estos vectores o la
proximidad del coseno. Cómo medirlo es mejor elegir en su conjunto de datos / tarea.
Una representación esquemática de una tubería de resolución de problemas en el aprendizaje de representación se parece a esto:
Pero para ser más precisos, así: (Softmax + CrossEntropy), (Triplet, Contrastive, etc.). positive' negative'
: - , — . , — - , (,
). .
Hay varios buenos artículos específicamente sobre reconocimiento facial : un artículo de revisión (¡ DEBE LEER! ) , FaceNet , ArcFace , CosFace .También hay muchas implementaciones: dlib , OpenFace , FaceNet repo , y en Habré ya se habló de ello durante mucho tiempo . Parece que solo se han agregado recientemente ArcFace y CosFace (escriba en los comentarios, si me perdí algo aquí, estaré encantado de saber algo más).Sin embargo, ahora está más de moda no reconocer caras, sino generarlas , ¿verdad?,
- , , , - , - .

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!