Capítulo 4. Detección de objetos y segmentación de imágenes
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
Hasta ahora en este libro, hemos examinado diversas arquitecturas de aprendizaje automático, pero las hemos utilizado para resolver un solo tipo de problema: el de clasificar (o regresionar) una imagen entera. En este capítulo, tratamos tres nuevos problemas de visión de: la detección de objetos, la segmentación de instancias y la segmentación semántica de escenas completas(Figura 4-1). Otros problemas de visión más avanzados, como la generación de imágenes, el recuento, la estimación de poses y los modelos generativos, se tratan en los Capítulos 11 y 12.
Consejo
El código de este capítulo está en la carpeta 04_detectar_segmento del repositorio GitHub del libro. Proporcionaremos los nombres de archivo de los ejemplos de código y de los cuadernos cuando proceda.
Detección de objetos
Para la mayoría de nosotros, ver es tan fácil que, cuando vemos una mariposa por el rabillo del ojo y giramos la cabeza para disfrutar de su belleza, ni siquiera pensamos en los millones de células visuales y neuronas que están en juego, captando la luz, descodificando las señales y procesándolas en niveles de abstracción cada vez más altos.
En el Capítulo 3 vimos cómo funciona el reconocimiento de imágenes en ML. Sin embargo, los modelos presentados en ese capítulo se construyeron para clasificar una imagen en su conjunto: no podían decirnos en qué parte de la imagen estaba una flor. En este apartado, veremos cómo construir modelos de ML que puedan proporcionar esta información de localización. Se trata de una tarea conocida como detección de objetos(Figura 4-2).
De hecho, las capas convolucionales identifican y localizan las cosas que detectan. Las redes convolucionales del Capítulo 3 ya extraen cierta información de localización. Pero en los problemas de clasificación, las redes no utilizan esta información. Se entrenan con un objetivo en el que la ubicación no importa. Una imagen de una mariposa se clasifica como tal siempre que la mariposa aparezca en la imagen. Por el contrario, para la detección de objetos, añadiremos elementos a la pila convolucional para extraer y refinar la información de localización y entrenaremos a la red para que lo haga con la máxima precisión.
El enfoque más sencillo consiste en añadir algo al final de una columna vertebral convolucional para predecir recuadros delimitadores alrededor de los objetos detectados. Ése es el enfoque YOLO (You Only Look Once), y empezaremos por ahí. Sin embargo, también hay mucha información importante en los niveles intermedios de la columna vertebral convolucional. Para extraerla, construiremos arquitecturas más complejas llamadas redes piramidales de características (FPN) e ilustraremos su uso con RetinaNet.
En esta sección, utilizará el conjunto de datos de Detección de Objetos de Órdenes Taxonómicas de Artrópodos (abreviado Artrópodos), que está disponible gratuitamente en Kaggle.com. El conjunto de datos contiene siete categorías -Coleoptera (escarabajos), Aranea (arañas), Hemiptera (bichos verdaderos), Diptera (moscas), Lepidoptera (mariposas), Hymenoptera (abejas, avispas y hormigas) y Odonata (libélulas)-, así como cuadros delimitadores. En la Figura 4-3 se muestran algunos ejemplos.
Además de YOLO, este capítulo también abordará las arquitecturas RetinaNet y Mask R-CNN. Sus implementaciones se pueden encontrar en el repositorio oficial de visión de TensorFlow Model Garden. Utilizaremos las nuevas implementaciones ubicadas, en el momento de escribir este artículo, en la carpeta "beta" del repositorio.
En 04_detect_segment de GitHub, en la carpeta correspondiente al Capítulo 4, encontrarás un código de ejemplo que muestra cómo aplicar estos modelos de detección a un conjunto de datos personalizado, como Arthropods.
Además del Jardín de Modelos TensorFlow, también hay una excelente implementación paso a paso de RetinaNet en el sitio web keras.io.
YOLO
YOLO (sólo se mira una vez) es la arquitectura de detección de objetos más sencilla. No es la más precisa, pero es una de las más rápidas en cuanto a tiempos de predicción. Por eso, se utiliza en muchos sistemas en tiempo real, como las cámaras de seguridad. La arquitectura puede basarse en cualquier columna vertebral convolucional del Capítulo 3. Las imágenes se procesan a través de la pila convolucional como en el caso de la clasificación de imágenes, pero el cabezal de clasificación se sustituye por un cabezal de detección y clasificación de objetos.
Existen variaciones más recientes de la arquitectura YOLO(YOLOv2, YOLOv3, YOLOv4), pero no las trataremos aquí. Utilizaremos YOLOv1 como primer paso en las arquitecturas de detección de objetos, porque es la más sencilla de entender.
Rejilla YOLO
YOLOv1 (en adelante "YOLO" para simplificar) divide una imagen en una cuadrícula de celdas NxM, por ejemplo, 7x5(Figura 4-4). Para cada celda, intenta predecir un cuadro delimitador para un objeto que estaría centrado en esa celda. El cuadro delimitador predicho puede ser mayor que la celda de la que procede; la única restricción es que el centro del cuadro esté en algún lugar dentro de la celda.
Cabezal de detección de objetos
Predecir un cuadro delimitador equivale a predecir seis números: las cuatro coordenadas del cuadro delimitador (en este caso, las coordenadas x e y del centro, y la anchura y la altura), un factor de confianza que nos dice si se ha detectado o no un objeto y, por último, la clase del objeto (por ejemplo, "mariposa"). La arquitectura YOLO hace esto directamente sobre el último mapa de características, generado por la columna vertebral convolucional que utiliza.
En la Figura 4-5, los cálculos de las coordenadas x e y utilizan una activación de la tangente hiperbólica (tanh) para que las coordenadas caigan en el intervalo [-1, 1]. Serán las coordenadas del centro de la caja de detección, relativas al centro de la celda de la rejilla a la que pertenecen.
Los cálculos de anchura y altura(w, h) utilizan una activación sigmoidea para que caigan en el intervalo [0, 1]. Representarán el tamaño de la caja de detección en relación con toda la imagen. Esto permite que las cajas de detección sean mayores que la celda de la cuadrícula en la que se originan. El factor de confianza, C, también está en el intervalo [0, 1]. Por último, se utiliza una activación softmax para predecir la clase del objeto detectado. Las funciones tanh y sigmoidea se representan en la Figura 4-6.
Una cuestión práctica interesante es cómo obtener un mapa de características de las dimensiones exactas. En el ejemplo de la Figura 4-4, debe contener exactamente 7 * 5 * (5 + 7) valores. El 7 * 5 se debe a que elegimos una cuadrícula YOLO de 7 x 5. Luego, para cada celda de la cuadrícula, se necesitan cinco valores para predecir una casilla(x, y, w, h, C), y siete valores adicionales porque, en este ejemplo, queremos clasificar los artrópodos en siete categorías (Coleópteros, Aranea, Hemípteros, Dípteros, Lepidópteros, Himenópteros, Odonatos).
Si controlas la pila convolucional, podrías intentar afinarla para obtener exactamente 7 * 5 * 12 (420) salidas al final. Sin embargo, hay una forma más fácil: aplana el mapa de características que devuelva la columna vertebral convolucional y hazlo pasar por una capa totalmente conectada con exactamente ese número de salidas. A continuación, puedes remodelar los 420 valores en una cuadrícula de 7x5x12, y aplicar las activaciones adecuadas, como en la Figura 4-5. Los autores del artículo sobre YOLO sostienen que la capa totalmente conectada en realidad aumenta la precisión del sistema.
Función de pérdida
En la detección de objetos, como en cualquier entorno de aprendizaje supervisado, las respuestas correctas se proporcionan en los datos de entrenamiento: casillas de verdad básica y sus clases. Durante el entrenamiento, la red predice las cajas de detección, y tiene que tener en cuenta los errores en las ubicaciones y dimensiones de las cajas, así como los errores de clasificación, y también penalizar las detecciones de objetos donde no los hay. El primer paso, sin embargo, es emparejar correctamente las casillas reales con las casillas predichas para poder compararlas. En la arquitectura YOLO, si cada celda de la cuadrícula predice una única casilla, esto es sencillo. Una casilla de la verdad sobre el terreno y una casilla predicha están emparejadas si están centradas en la misma celda de la cuadrícula (consulta la Figura 4-4 para entenderlo mejor).
Sin embargo, en la arquitectura YOLO, el número de casillas de detección por celda de la cuadrícula es un parámetro. Puede ser más de uno. Si vuelves a la Figura 4-5, verás que es bastante fácil que cada celda de la cuadrícula prediga 10 ó 15 coordenadas(x, y, w, h, C) en lugar de 5 y genere 2 ó 3 casillas de detección en lugar de 1. Pero emparejar estas predicciones con las casillas de la verdad sobre el terreno requiere más cuidado. Esto se hace en calculando la intersección sobre la unión (IOU; ver Figura 4-7) entre todas las casillas de la verdad sobre el terreno y todas las casillas predichas dentro de una celda de la cuadrícula, y seleccionando los emparejamientos en los que la IOU sea la más alta.
En resumen, las casillas de la verdad sobre el terreno se asignan a las celdas de la cuadrícula por sus centros y a las casillas de predicción dentro de estas celdas de la cuadrícula por IOU. Una vez establecidos los emparejamientos, ya podemos calcular las distintas partes de la pérdida:
- Pérdida de presencia del objeto
-
Cada celda de la cuadrícula que tiene una casilla de verdad sobre el terreno computa:
- Pérdida por ausencia de objeto
-
Cada celda de la cuadrícula que no tenga una casilla de verdad sobre el terreno computa:
- Pérdida de clasificación de objetos
-
Cada celda de la cuadrícula que tiene una casilla de verdad sobre el terreno calcula:
donde p̂ es el vector de probabilidades de clase predichas y p es la clase objetivo codificada con un solo disparo.
- Pérdida del cuadro delimitador
-
Cada emparejamiento casilla predicha/caja de la verdad sobre el terreno contribuye (la coordenada predicha está marcada con un sombrero, la otra coordenada es la verdad sobre el terreno):
Observa aquí que la diferencia de tamaño de las cajas se calcula sobre las raíces cuadradas de las dimensiones. Esto se hace para mitigar el efecto de las cajas grandes, que tienden a abrumar la pérdida.
Por último, se suman todas las contribuciones de pérdidas de las celdas de la cuadrícula, con factores de ponderación. Un problema habitual en las pérdidas por detección de objetos es que las pequeñas pérdidas de numerosas celdas sin objeto en ellas acaban superando a la pérdida de una celda solitaria que predice una caja útil. Ponderar diferentes partes de la pérdida puede aliviar este problema. Los autores del artículo utilizaron las siguientes ponderaciones empíricas:
Limitaciones YOLO
La mayor limitación de es que YOLO predice una sola clase por celda de la cuadrícula y no funcionará bien si en la misma celda hay varios objetos de diferentes clases .
La segunda limitación es la propia cuadrícula: una resolución de cuadrícula fija impone fuertes restricciones espaciales a lo que puede hacer el modelo. Los modelos YOLO no suelen funcionar bien con colecciones de objetos pequeños, como una bandada de pájaros, sin un ajuste cuidadoso de la cuadrícula al conjunto de datos.
Además, YOLO tiende a localizar los objetos con una precisión relativamente baja. La razón principal es que trabaja con el último mapa de características de la pila convolucional, que suele ser el de menor resolución espacial y sólo contiene señales de localización groseras.
A pesar de estas limitaciones, la arquitectura YOLO es muy sencilla de implementar, sobre todo con una sola caja de detección por celda de la cuadrícula, lo que la convierte en una buena opción cuando quieres experimentar con tu propio código.
Ten en cuenta que no todos los objetos se detectan observando la información de una sola casilla de la cuadrícula. En una red neuronal convolucional (CNN) suficientemente profunda, cada valor del último mapa de características, a partir del cual se calculan los cuadros de detección, depende de todos los píxeles de la imagen original.
Si necesitas una mayor precisión, puedes pasar al siguiente nivel: RetinaNet. Incorpora una serie de ideas que mejoran la arquitectura básica YOLO, y se considera, en el momento de escribir estas líneas, el estado del arte de los llamados detectores de disparo único.
RetinaNet
RetinaNet, en comparación con YOLOv1, presenta varias innovaciones en su arquitectura y en el diseño de sus pérdidas. El diseño de la red neuronal incluye redes piramidales de características que combinan la información extraída a múltiples escalas. El cabezal de detección predice las cajas a partir de cajas de anclaje que cambian la representación de la caja delimitadora para facilitar el entrenamiento. Por último, las innovaciones de pérdida incluyen la pérdida focal, una pérdida diseñada específicamente para problemas de detección, una pérdida L1 suave para la regresión de cajas y la supresión no máxima. Veamos cada una de ellas por separado.
Redes piramidales de características
Cuando una imagen es procesada por una CNN, las capas convolucionales iniciales recogen detalles de bajo nivel, como perímetros y texturas. Las capas posteriores los combinan en características con un valor semántico cada vez mayor. Al mismo tiempo, la agrupación de capas en la red reduce la resolución espacial de los mapas de características (ver Figura 4-8).
La arquitectura YOLO sólo utiliza el último mapa de características para la detección. Es capaz de identificar correctamente los objetos, pero su precisión de localización es limitada. Otra idea sería intentar añadir un cabezal de detección en cada etapa. Por desgracia, en este enfoque, los cabezales que trabajan a partir de los primeros mapas de características localizarían bastante bien los objetos, pero tendrían dificultades para etiquetarlos. En esa fase inicial, la imagen sólo ha pasado por un par de capas convolucionales, lo que no basta para clasificarla. La información semántica de nivel superior, como "esto es una rosa", necesita decenas de capas convolucionales para emerger.
Aún así, una arquitectura de detección popular, llamada detector de disparo único (SSD), se basa en esta idea. Los autores del artículo sobre el SSD lo hicieron funcionar conectando sus múltiples cabezales de detección a múltiples mapas de características, todos ellos situados hacia el final de la pila convolucional.
¿Y si pudiéramos combinar todos los mapas de características de forma que aflorara tanto una buena información espacial como una buena información semántica a todas las escalas? Esto puede hacerse con un par de capas adicionales que formen una red piramidal de características. La Figura 4-9 ofrece una vista esquemática de una FPN comparada con los enfoques YOLO y SSD, mientras que la Figura 4-10 presenta el diseño detallado.
Esto es lo que ocurre en la FPN de la Figura 4-10: en la ruta descendente (columna vertebral convolucional), las capas convolucionales refinan gradualmente la información semántica de los mapas de características, mientras que las capas de agrupamiento reducen la escala de los mapas de características en sus dimensiones espaciales (las dimensiones x e y de la imagen). En el camino ascendente, los mapas de características de las capas inferiores que contienen buena información semántica de alto nivel se remuestrean (mediante un simple algoritmo de vecino más próximo) para que puedan añadirse, por elementos, a los mapas de características de las capas superiores. Se utilizan convoluciones 1x1 en las conexiones laterales para llevar todos los mapas de características a la misma profundidad de canal y hacer posibles las adiciones. El documento FPN, por ejemplo, utiliza 256 canales en todas partes. Los mapas de características resultantes contienen ahora información semántica a todas las escalas, que era el objetivo inicial. Además, se procesan mediante una convolución 3x3, sobre todo para suavizar los efectos del aumento de la muestra.
Normalmente no hay no linealidades en las capas FPN. Los autores del documento FPN consideraron que tenían poco impacto.
Ahora, un cabezal de detección puede tomar los mapas de características a cada resolución y producir detecciones y clasificaciones de cajas. El propio cabezal de detección puede tener varios diseños, que trataremos en los dos apartados siguientes. Sin embargo, será compartido por todos los mapas de características a diferentes escalas. Por eso era importante llevar todos los mapas de características a la misma profundidad de canal.
Lo bueno del diseño FPN es que es independiente de la columna vertebral convolucional subyacente. Cualquier pila convolucional del Capítulo 3 servirá, siempre que puedas extraer de ella mapas de características intermedias, normalmente de cuatro a seis, a varias escalas. Incluso puedes utilizar una columna vertebral preentrenada. Las opciones típicas son ResNet o EfficientNet, y puedes encontrar versiones preentrenadas de ellas en TensorFlow Hub.
Hay varios niveles en una pila convolucional en los que se pueden extraer características e introducirlas en la FPN. Para cada escala deseada, muchas capas dan salida a mapas de características de las mismas dimensiones (véase la Figura 3-26 del capítulo anterior). La mejor elección es el último mapa de características de un determinado bloque de capas que emita características de tamaño similar, justo antes de que una capa de agrupación vuelva a reducir la resolución a la mitad. Es probable que este mapa de características contenga las características semánticas más potentes.
También es posible ampliar una columna vertebral preentrenada existente con capas adicionales de pooling y convolucionales, con el único fin de alimentar una FPN. Estos mapas de características adicionales suelen ser pequeños y, por tanto, rápidos de procesar. Corresponden a la resolución espacial más baja (véase la Figura 4-8) y, por tanto, pueden mejorar la detección de objetos grandes. De hecho, el documento SSD utilizaba este truco, y RetinaNet también lo hace, como verás en el diagrama de arquitectura más adelante(Figura 4-15).
Cajas de anclaje
En la arquitectura YOLO, las casillas de detección se calculan como deltas relativos a un conjunto de casillas base (Δx = x - x0, Δy = y - y0, Δw = w - w0, Δh = h - h0 suelen denominarse "deltas" relativos a alguna casilla base x0, y0, w0, h0 debido a la letra griega Δ, elegida normalmente para representar una "diferencia"). En ese caso, las cajas base eran una simple cuadrícula superpuesta a la imagen (ver Figura 4-4).
Arquitecturas más recientes han ampliado esta idea definiendo explícitamente un conjunto de las llamadas "cajas de anclaje" con diversas relaciones de aspecto y escalas (ejemplos en la Figura 4-11). Las predicciones vuelven a ser pequeñas variaciones del tamaño y la posición de los anclajes. El objetivo es ayudar a la red neuronal a predecir valores pequeños en torno a cero, en lugar de valores grandes. De hecho, las redes neuronales son capaces de resolver problemas no lineales complejos porque utilizan funciones de activación no lineales entre sus capas. Sin embargo, la mayoría de las funciones de activación (sigmoide, ReLU) presentan un comportamiento no lineal sólo alrededor de cero. Por eso las redes neuronales dan lo mejor de sí cuando predicen valores pequeños en torno a cero, y por eso es útil predecir las detecciones como deltas pequeños en relación con las cajas de anclaje. Por supuesto, esto sólo funciona si hay suficientes cajas de anclaje de distintos tamaños y relaciones de aspecto para que cualquier caja de detección de objetos pueda emparejarse (por IOU máximo) con una caja de anclaje de posición y dimensiones muy parecidas.
Describiremos en detalle el enfoque adoptado en la arquitectura de RetinaNet, a modo de ejemplo. RetinaNet utiliza nueve tipos de anclas diferentes con:
-
Tres relaciones de aspecto diferentes: 2:1, 1:1, 1:2
-
Tres tamaños diferentes:20, 2⅓,2⅔ (≃ 1, 1,3, 1,6)
Se representan en la Figura 4-12.
Los anclajes, junto con los mapas de características calculados por una FPN, son las entradas a partir de las cuales se calculan las detecciones en RetinaNet. La secuencia de operaciones es la siguiente
-
El FPN reduce la imagen de entrada en cinco mapas de características (ver Figura 4-10).
-
Cada mapa de características se utiliza para predecir cuadros delimitadores relativos a anclajes en ubicaciones espaciadas regularmente por toda la imagen. Por ejemplo, un mapa de características de tamaño 4x6 con 256 canales utilizará 24 (4 * 6) ubicaciones de anclaje en la imagen (ver Figura 4-13).
-
El cabezal de detección utiliza múltiples capas convolucionales para convertir el mapa de características de 256 canales en exactamente 9 * 4 = 36 canales, lo que produce 9 cuadros de detección por ubicación. Los cuatro números por caja de detección representan los deltas relativos al centro(x, y), la anchura y la altura del ancla. La secuencia precisa de las capas que calculan las detecciones a partir de los mapas de características se muestra en la Figura 4-15.
-
Por último, cada mapa de características del FPN, al corresponder a una escala distinta de la imagen, utilizará escalas diferentes de cajas de anclaje.
Los propios anclajes se espacian regularmente por la imagen de entrada y tienen el tamaño adecuado para cada nivel de la pirámide de características. Por ejemplo, en RetinaNet se utilizan los siguientes parámetros:
-
La pirámide de características tiene cinco niveles que corresponden a las escalas P3, P4, P5, P6 y P7 de la columna vertebral. La escala Pn representa un mapa de características 2n veces más pequeño en anchura y altura que la imagen de entrada (ver la vista completa de RetinaNet en la Figura 4-15).
-
Los tamaños de las bases de anclaje son 32x32, 64x64, 128x128, 256x256, 512x512 píxeles, en cada nivel de pirámide de características respectivamente (= 4 * 2n, si n es el nivel de escala).
-
Se consideran cajas de anclaje para cada ubicación espacial de cada mapa de rasgos en la pirámide de rasgos, lo que significa que las cajas están espaciadas cada 8, 16, 32, 64 ó 128 píxeles a través de la imagen de entrada en cada nivel de la pirámide de rasgos, respectivamente (= 2n, si n es el nivel de escala).
Por tanto, el cuadro de anclaje más pequeño es de 32x32 píxeles, mientras que el más grande es de 812x1.624 píxeles.
Nota
Los ajustes de la caja de anclaje deben ajustarse para cada conjunto de datos, de modo que se correspondan con las características de la caja de detección que se encuentran realmente en los datos de entrenamiento. Esto suele hacerse cambiando el tamaño de las imágenes de entrada, en lugar de modificar los parámetros de generación de la caja de anclaje. Sin embargo, en conjuntos de datos específicos con muchas detecciones pequeñas o, por el contrario, con objetos en su mayoría grandes, puede ser necesario ajustar directamente los parámetros de generación de la caja de anclaje.
El último paso es calcular una pérdida de detección. Para ello, hay que emparejar las casillas de detección previstas con las casillas de la verdad sobre el terreno, para poder evaluar los errores de detección.
La asignación de casillas de verdad básica a casillas de anclaje se basa en la métrica IOU calculada entre cada conjunto de casillas de una imagen de entrada. Se calculan todos los IOU por pares y se ordenan en una matriz con N filas y M columnas, siendo N el número de casillas de verdad básica y M el número de casillas de anclaje. A continuación, la matriz se analiza por columnas (véase la Figura 4-14):
-
Se asigna un ancla a la casilla de la verdad sobre el terreno que tenga el mayor IOU en su columna, siempre que sea superior a 0,5.
-
A una caja de anclaje que no tenga ningún IOU mayor que 0,4 en su columna se le asigna detectar nada (es decir, el fondo de la imagen).
-
Cualquier ancla no asignada en este punto se marca para ser ignorada durante el entrenamiento. Son anclas con IOU en las regiones intermedias entre 0,4 y 0,5.
Ahora que cada casilla de verdad básica está emparejada exactamente con una casilla de anclaje, es posible calcular las predicciones de la casilla, las clasificaciones y las pérdidas correspondientes.
Arquitectura
Los cabezales de detección y clasificación transforman los mapas de características del FPN en predicciones de clase y deltas de cuadro delimitador. Los mapas de características son tridimensionales. Dos de sus dimensiones corresponden a las dimensiones x e y de la imagen y se denominan dimensiones espaciales; la tercera dimensión es su número de canales.
En RetinaNet, para cada ubicación espacial de cada mapa de características, se predicen los siguientes parámetros (siendo K = el número de clases y B = el número de tipos de cajas de anclaje, por lo que en nuestro caso B=9):
-
La cabeza de predicción de clase predice B * K probabilidades, un conjunto de probabilidades para cada tipo de ancla. En efecto, esto predice una clase para cada ancla.
-
La cabeza detectora predice B * 4 = 36 deltas de caja Δx, Δy, Δw, Δh. Las cajas delimitadoras siguen estando parametrizadas por su centro(x, y), así como por su anchura y altura(w, h).
Ambas cabezas comparten un diseño similar, aunque con pesos diferentes, y los pesos se comparten en todas las escalas de la pirámide de características.
La Figura 4-15 representa una vista completa de la arquitectura RetinaNet. Utiliza una red troncal ResNet50 (u otra). La FPN extrae características de los niveles P3 a P7 de la red troncal, donde Pn es el nivel en el que el mapa de características se reduce en un factor de 2n en su anchura y altura en comparación con la imagen original. La parte FPN se describe detalladamente en la Figura 4-10. Cada mapa de características de la FPN pasa por un cabezal de clasificación y otro de regresión de cajas.
La RetinaNet FPN aprovecha los tres últimos niveles de escala disponibles en la red troncal. La columna vertebral se amplía con 2 capas adicionales utilizando un paso de 2 para proporcionar 2 niveles de escala adicionales a la FPN. Esta elección arquitectónica permite a RetinaNet evitar el procesamiento de mapas de características muy grandes, que consumirían mucho tiempo. La adición de los dos últimos niveles de escala gruesa también mejora la detección de objetos muy grandes.
Los propios cabezales de clasificación y de regresión de caja están formados por una simple secuencia de convoluciones 3x3. El cabezal de clasificación está diseñado para predecir K clasificaciones binarias para cada ancla, por eso termina en una activación sigmoidea. Parece que estamos permitiendo predecir varias etiquetas para cada ancla, pero en realidad el objetivo es permitir que el cabezal de clasificación produzca todos ceros, que representarán la "clase de fondo" correspondiente a la ausencia de detecciones. Una activación más típica para la clasificación sería softmax, pero la función softmax no puede dar como resultado todos los ceros.
La regresión de caja termina sin función de activación. Está calculando las diferencias entre las coordenadas centrales(x, y), la anchura y la altura de la caja de anclaje y la caja de detección. Hay que tener cierto cuidado para que el regresor trabaje en el intervalo [-1, 1] en todos los niveles de la pirámide de características. Para ello se utilizan las siguientes fórmulas:
-
Xpíxeles = X × U ×WA + XA
-
Ypíxeles = Y × U ×HA +YA
-
Wpíxeles =WA × eW× V
-
Hpíxeles =HA × eH× V
En estas fórmulas, XA,YA,WA yHA son las coordenadas de una caja de anclaje (coordenadas centrales, anchura, altura), mientras que X, Y, W y H son las coordenadas predichas relativas a la caja de anclaje (deltas). Xpixels, Ypixels, Wpixels y Hpixels son las coordenadas reales, en píxeles, de la caja predicha (centro y tamaño). U y V son factores moduladores que corresponden a la varianza esperada de los deltas respecto a la caja de anclaje. Los valores típicos son U=0,1 para las coordenadas, y V=0,2 para los tamaños. Puedes comprobar que los valores en el intervalo [-1, 1] para las predicciones dan como resultado cajas predichas que se sitúan dentro del ±10% de la posición del ancla y dentro del ±20% de su tamaño.
Pérdida focal (para clasificación)
¿Cuántos cuadros de anclaje se consideran para una imagen de entrada? Volviendo a la Figura 4-15, con una imagen de entrada de ejemplo de 640x960 píxeles, los cinco mapas de características diferentes de la pirámide de características representan 80 * 120 + 40 * 60 + 20 * 30 + 10 * 15 + 5 * 7 = 12.785 ubicaciones en la imagen de entrada. Con 9 cajas de anclaje por ubicación, son algo más de 100.000 cajas de anclaje.
Esto significa que se generarán 100.000 recuadros de predicción por cada imagen de entrada. En comparación, en una aplicación típica hay de 0 a 20 casillas de verdad sobre el terreno por imagen. El problema que esto crea en los modelos de detección es que la pérdida correspondiente a las cajas de fondo (cajas asignadas para no detectar nada) puede abrumar a la pérdida correspondiente a las detecciones útiles en la pérdida total. Esto ocurre incluso si las detecciones de fondo ya están bien entrenadas y producen una pérdida pequeña. Este pequeño valor multiplicado por 100K puede seguir siendo órdenes de magnitud mayores que la pérdida de detección de las detecciones reales. El resultado final es un modelo que no se puede entrenar.
El artículo de RetinaNet sugiere una solución elegante a este problema: los autores ajustaron la función de pérdida para producir valores mucho más pequeños en fondos vacíos. Lo denominan pérdida focal. He aquí los detalles.
Ya hemos visto que RetinaNet utiliza una activación sigmoidea para generar probabilidades de clase. La salida es una serie de clasificaciones binarias, una para cada clase. Una probabilidad de 0 para cada clase significa "fondo"; es decir, nada que detectar aquí. La pérdida de clasificación utilizada es la entropía cruzada binaria. Para cada clase, se calcula a partir de la etiqueta de clase binaria real y (0 ó 1) y la probabilidad prevista para la clase p mediante la siguiente fórmula:
La pérdida focal es la misma fórmula con una pequeña modificación:
Para γ=0 se trata exactamente de la entropía cruzada binaria, pero para valores más altos de γ el comportamiento es ligeramente distinto. Para simplificar, consideremos sólo el caso de las cajas de fondo que no pertenecen a ninguna clase (es decir, donde y=0 para todas las clases):
Y tracemos los valores de la pérdida focal para distintos valores de p y γ(Figura 4-16).
Como puedes ver en la figura, con γ=2, que se consideró un valor adecuado, la pérdida focal es mucho menor que la pérdida de entropía cruzada normal, especialmente para valores pequeños de p. Para las casillas de fondo, donde no hay nada que detectar, la red aprenderá rápidamente a producir probabilidades de clase p pequeñas en todas las clases. Con la pérdida de entropía cruzada, estas casillas, incluso bien clasificadas como "fondo" con p=0,1, por ejemplo, seguirían aportando una cantidad significativa: CE(0,1) = 0,05. La pérdida focal es 100 veces menor FL(0,1) = 0,0005.
Con la pérdida focal, es posible sumar las pérdidas de todas las cajas de anclaje -todas ellas 100.000- y no preocuparse de que la pérdida total se vea abrumada por miles de pequeñas pérdidas de cajas de fondo fáciles de clasificar.
Pérdida L1 suave (para regresión en caja)
Los cuadros de detección se calculan mediante una regresión. Para las regresiones, las dos pérdidas más comunes son L1 y L2, también llamadas pérdida absoluta y pérdida al cuadrado. Sus fórmulas son (calculadas entre un valor objetivo a y el valor previsto â):
El problema de la pérdida L1 es que su gradiente es el mismo en todas partes, lo que no es bueno para el aprendizaje. Por eso se prefiere la pérdida L2 para las regresiones, pero tiene otro problema. En la pérdida L2, las diferencias entre los valores predichos y el objetivo se elevan al cuadrado, lo que significa que la pérdida tiende a ser muy grande a medida que la predicción y el objetivo se distancian. Esto se vuelve problemático si tienes algunos valores atípicos, como un par de puntos malos en los datos (por ejemplo, una casilla objetivo con el tamaño incorrecto). El resultado será que la red intentará ajustarse al punto malo de los datos a expensas de todo lo demás, lo que tampoco es bueno.
Un buen compromiso entre las dos es la pérdida Huber, o pérdida L1 suave (ver Figura 4-17). Se comporta como la pérdida L2 para valores pequeños y como la pérdida L1 para valores grandes. Cerca de cero, tiene la agradable propiedad de que su gradiente es mayor cuando las diferencias son mayores, y por tanto empuja a la red a aprender más donde comete los mayores errores. Para valores grandes, se convierte en lineal en lugar de cuadrática y evita que un par de valores objetivo malos la despisten. Su fórmula es
Donde δ es un parámetro ajustable. δ es el valor en torno al cual el comportamiento pasa de cuadrático a lineal. Se puede utilizar otra fórmula para evitar la definición a trozos:
Esta forma alternativa no da exactamente los mismos valores que la pérdida de Huber estándar, pero tiene el mismo comportamiento: cuadrático para valores pequeños, lineal para los grandes. En la práctica, cualquiera de las dos formas funcionará bien en RetinaNet, con δ=1.
Supresión no máxima
Una red de detección que utiliza numerosas cajas de anclaje, como RetinaNet, suele producir múltiples detecciones candidatas para cada caja objetivo. Necesitamos un algoritmo que seleccione una única caja de detección para cada objeto detectado.
La supresión no máxima (NMS) tiene en cuenta el solapamiento de cajas (IOU) y la confianza de clase para seleccionar la caja más representativa de un objeto determinado(Figura 4-18).
El algoritmo utiliza un sencillo enfoque "codicioso": para cada clase, considera el solapamiento (IOU) entre todas las casillas predichas. Si dos casillas se solapan más que un determinado valor A (IOU > A), se queda con la que tenga mayor confianza en la clase. En pseudocódigo tipo Python, para una clase dada:
def
NMS
(
boxes
,
class_confidence
):
result_boxes
=
[]
for
b1
in
boxes
:
discard
=
False
for
b2
in
boxes
:
if
IOU
(
b1
,
b2
)
>
A
:
if
class_confidence
[
b2
]
>
class_confidence
[
b1
]:
discard
=
True
if
not
discard
:
result_boxes
.
append
(
b1
)
return
result_boxes
El NMS funciona bastante bien en la práctica, pero puede tener algunos efectos secundarios no deseados. Observa que el algoritmo se basa en un único valor umbral(A). Cambiar este valor modifica el filtrado de la caja, especialmente en el caso de objetos adyacentes o superpuestos en la imagen original. Observa el ejemplo de la Figura 4-19. Si el umbral se fija en A=0,4, las dos cajas detectadas en la figura se considerarán "superpuestas" para la misma clase y se descartará la de menor confianza de clase (la de la izquierda). Esto es obviamente erróneo. Hay dos mariposas que detectar en esta imagen y, antes del NMS, ambas se detectaban con una confianza alta.
Aumentar el valor del umbral ayudará, pero si es demasiado alto, el algoritmo no conseguirá fusionar las casillas que corresponden al mismo objeto. El valor habitual para este umbral es A=0,5, pero sigue haciendo que los objetos que están muy juntos se detecten como uno solo.
Una ligera variación en del algoritmo básico NMS se denomina Soft-NMS. En lugar de eliminar por completo las casillas que no se solapan al máximo, reduce su puntuación de confianza según el factor:
siendo σ un factor de ajuste que sintoniza la fuerza del algoritmo Soft-NMS. Un valor típico es σ=0,5. El algoritmo se aplica considerando la casilla con la puntuación de confianza más alta para una clase determinada (la casilla max), y disminuyendo las puntuaciones de todas las demás casillas en este factor. A continuación, se aparta la casilla máxima y se repite la operación en las demás casillas hasta que no quede ninguna.
Para las casillas que no se solapan (IOU=0), este factor es 1. Por tanto, los factores de confianza de las casillas que no se solapan con la casilla máx. no se ven afectados. El factor disminuye gradualmente, pero de forma continua, a medida que las casillas se solapan más con la casilla máx. A las casillas muy solapadas (IOU=0,9) se les disminuye mucho el factor de confianza (×0,2), que es el comportamiento esperado porque son redundantes con la casilla máx. y queremos deshacernos de ellas.
Como el algoritmo Soft-NMS no descarta ninguna casilla, se utiliza un segundo umbral, basado en la confianza de la clase, para podar realmente la lista de detecciones.
El efecto de Soft-NMS en el ejemplo de la Figura 4-19 se muestra en la Figura 4-20.
Otras consideraciones
Para reducir la cantidad de datos necesarios, es habitual utilizar una columna vertebral preentrenada.
Los conjuntos de datos de clasificación son mucho más fáciles de reunir que los de detección de objetos. Por eso, los conjuntos de datos de clasificación fácilmente disponibles suelen ser mucho mayores que los conjuntos de datos de detección de objetos. Utilizar una columna vertebral preentrenada de un clasificador te permite combinar un gran conjunto de datos de clasificación genérico con un conjunto de datos de detección de objetos específico de una tarea y obtener un detector de objetos mejor.
El preentrenamiento se realiza en una tarea de clasificación. Después se retira el cabezal de clasificación y se añaden los cabezales FPN y de detección, inicializados al azar. El entrenamiento real de detección de objetos se realiza con todos los pesos entrenables, lo que significa que la columna vertebral se afinará mientras que el FPN y el cabezal de detección se entrenan desde cero.
Como los conjuntos de datos de detección suelen ser más pequeños, el aumento de datos (que trataremos con más detalle en el Capítulo 6) desempeña un papel importante en el entrenamiento. La técnica básica de aumento de datos consiste en recortar al azar recortes de tamaño fijo de las imágenes de entrenamiento, y con factores de zoom aleatorios (ver Figura 4-21). Con los cuadros delimitadores del objetivo ajustados adecuadamente, esto te permite entrenar la red con el mismo objeto en distintas ubicaciones de la imagen, a distintas escalas y con distintas partes del fondo visibles.
Una ventaja práctica de esta técnica es que también proporciona imágenes de entrenamiento de tamaño fijo a la red neuronal. Puedes entrenarte directamente en un conjunto de datos de entrenamiento formado por imágenes de diferentes tamaños y relaciones de aspecto. El aumento de datos se encarga de conseguir que todas las imágenes tengan el mismo tamaño.
Por último, lo que impulsa el entrenamiento y el ajuste de hiperparámetros son las métricas. Los problemas de detección de objetos han sido objeto de múltiples concursos a gran escala en los que se han estandarizado cuidadosamente las métricas de detección; este tema se trata con detalle en "Métricas para la detección de objetos", en el Capítulo 8.
Ahora que hemos visto la detección de objetos, vamos a centrar nuestra atención en otra clase de problemas: la segmentación de imágenes.
Segmentación
La detección de objetos encuentra cajas delimitadoras alrededor de objetos y los clasifica. La segmentación por instancias añade, por cada objeto detectado, una máscara de píxeles que da la forma del objeto. La segmentación semántica, por otra parte, no detecta instancias específicas de objetos, sino que clasifica cada píxel de la imagen en una categoría como "carretera", "cielo" o "personas".
Máscara R-CNN y segmentación de instancias
YOLO y RetinaNet, que hemos tratado en la sección anterior, son ejemplos de detectores de disparo único. Una imagen los atraviesa una sola vez para producir detecciones. Otro enfoque consiste en utilizar una primera red neuronal para sugerir posibles ubicaciones de los objetos a detectar, y luego utilizar una segunda red para clasificar y afinar las ubicaciones de estas propuestas. Estas arquitecturas se denominan redes de propuestas regionales (RPN).
Suelen ser más complejos y, por tanto, más lentos que los detectores de disparo único, pero también son más precisos. Hay una larga lista de variantes de RPN, todas basadas en la idea original de "regiones con características CNN": R-CNN, R-CNN rápida, R-CNN más rápida, y más. El estado del arte, en el momento de escribir esto, es Mask R-CNN, y esa es la arquitectura en la que nos vamos a sumergir a continuación.
La razón principal por la que es importante conocer arquitecturas como la R-CNN de máscara no es su precisión marginalmente superior, sino el hecho de que pueden ampliarse para realizar tareas de segmentación de instancias. Además de predecir un cuadro delimitador alrededor de los objetos detectados, pueden entrenarse para predecir su contorno, es decir, encontrar cada píxel perteneciente a cada objeto detectado(Figura 4-22). Por supuesto, entrenarlos sigue siendo una tarea de entrenamiento supervisado y los datos de entrenamiento tendrán que contener máscaras de segmentación de la verdad sobre el terreno para todos los objetos. Por desgracia, las máscaras son más lentas de generar a mano que los cuadros delimitadores y, por tanto, los conjuntos de datos de segmentación de instancias son más difíciles de encontrar que los conjuntos de datos de detección de objetos simples.
Veamos las RPN en detalle, analizando primero cómo realizan la detección clásica de objetos, y luego cómo ampliarlas para la segmentación por ejemplo.
Redes de propuestas regionales
Una RPN es una red de detección simplificada de un solo disparo que sólo se preocupa de dos clases: objetos y fondo. Un "objeto" es cualquier cosa etiquetada como tal en el conjunto de datos (cualquier clase), y "fondo" es la clase designada para una casilla que no contiene un objeto.
Una RPN puede utilizar una arquitectura similar a la configuración de RetinaNet que hemos visto antes: una red troncal convolucional, una red piramidal de características, un conjunto de cajas de anclaje y dos cabezas. Una cabeza se encarga de predecir las cajas y la otra de clasificarlas como objeto o fondo (aún no predecimos las máscaras de segmentación).
La RPN tiene su propia función de pérdida, calculada a partir de un conjunto de datos de entrenamiento ligeramente modificado: la clase de cualquier objeto de la verdad básica se sustituye por una única clase "objeto". La función de pérdida utilizada para las cajas es, como en RetinaNet, la pérdida de Huber. Para las clases, como se trata de una clasificación binaria, la entropía cruzada binaria es la mejor opción.
A continuación, las cajas predichas por la RPN se someten a una supresión no máxima. Las N cajas superiores, ordenadas por su probabilidad de ser un "objeto", se consideran propuestas de caja o regiones de interés (ROI) para la siguiente etapa. N suele rondar el millar, pero si la inferencia rápida es importante, puede ser de tan sólo 50. Las ROI también pueden filtrarse por una puntuación mínima de "objeto" o un tamaño mínimo. En la implementación de TensorFlow Model Garden, estos umbrales están disponibles aunque se establezcan en cero por defecto. Las malas ROI aún pueden clasificarse como "fondo" y ser rechazadas por la siguiente etapa, por lo que dejarlas pasar a nivel RPN no es un gran problema.
Una consideración práctica importante es que la RPN puede ser sencilla y rápida si es necesario (véase el ejemplo de la Figura 4-23). Puede utilizar la salida de la columna vertebral directamente, en lugar de utilizar una FPN, y sus cabezas de clasificación y detección pueden utilizar menos capas convolucionales. El objetivo es sólo calcular ROI aproximadas alrededor de objetos probables. Se refinarán y clasificarán en el paso siguiente.
Por ejemplo, la implementación de la R-CNN de máscara en el Jardín de modelos de TensorFlow utiliza una FPN en su RPN, pero sólo utiliza tres anclajes por ubicación, con relaciones de aspecto de 0,5, 1,0 y 2,0, en lugar de los nueve anclajes por ubicación que utiliza RetinaNet.
R-CNN
Ahora tenemos un conjunto de regiones de interés propuestas. ¿Y ahora qué?
Conceptualmente, la idea de la R-CNN(Figura 4-24) consiste en recortar las imágenes a lo largo de las ROI y volver a pasar las imágenes recortadas por la columna vertebral, esta vez con un cabezal de clasificación completo acoplado para clasificar los objetos (en nuestro ejemplo, en "mariposa", "araña", etc.).
En la práctica, sin embargo, esto es demasiado lento. La RPN puede generar entre 50 y 2.000 propuestas de ROI, y volver a pasarlas todas por la columna vertebral supondría mucho trabajo. En lugar de recortar la imagen, lo más inteligente es recortar directamente el mapa de características, y luego ejecutar cabezas de predicción sobre el resultado, como se muestra en la Figura 4-25.
Esto es algo más complejo cuando se utiliza un FPN. La extracción de características se sigue realizando en un mapa de características determinado, pero en un FPN hay varios mapas de características entre los que elegir. Por tanto, primero hay que asignar una ROI al nivel FPN más relevante. La asignación suele hacerse mediante esta fórmula
donde w y h son la anchura y la altura de la ROI, y n0 es el nivel FPN en el que los tamaños típicos de las cajas de anclaje se acercan más a 224. Aquí, suelo significa redondear al número más negativo. Por ejemplo, aquí tienes los ajustes típicos de R-CNN de máscara:
-
Cinco niveles FPN, P2, P3, P4, P5 y P6 (recordatorio: el nivel Pn representa un mapa de características 2n veces más pequeño en anchura y altura que la imagen de entrada)
-
Tamaños de las cajas de anclaje de 32x32, 64x64, 128x128, 256x256 y 512x512 en sus respectivos niveles (igual que en RetinaNet)
-
n0 = 4
Con estos ajustes, podemos comprobar que (por ejemplo) una ROI de 80x160 píxeles se asignaría al nivel P3 y una ROI de 200x300 al nivel P4, lo cual tiene sentido.
Remuestreo de ROI (alineación de ROI)
Hay que tener especial cuidado al extraer los mapas de características correspondientes a los ROI. Los mapas de características deben extraerse y remuestrearse correctamente. Los autores del artículo Mask R-CNN descubrieron que cualquier error de redondeo cometido durante este proceso afecta negativamente al rendimiento de la detección. Llamaron a su método de remuestreo preciso alineación de ROI.
Por ejemplo, tomemos una ROI de 200x300 píxeles. Se asignaría al nivel FPN P4, donde su tamaño relativo al mapa de características P4 sería (200 /24, 300 /24) = (12,5, 18,75). Estas coordenadas no deben redondearse. Lo mismo se aplica a su posición.
Las características contenidas en esta región de 12,5x18,75 del mapa de características P4 deben entonces muestrearse y agregarse (utilizando la agrupación máxima o la agrupación media) en un nuevo mapa de características, normalmente de tamaño 7x7. Se trata de una operación matemática bien conocida llamada interpolación bilineal, y no nos detendremos en ella aquí. Lo importante es recordar que tomar atajos aquí degrada el rendimiento.
Predicciones de clase y cuadro delimitador
El resto del modelo es bastante estándar. Los rasgos extraídos pasan por varios cabezales de predicción en paralelo, en este caso:
-
Un cabezal de clasificación para asignar una clase a cada objeto sugerido por la RPN, o clasificarlo como fondo
-
Un cabezal de refinamiento de caja que ajusta aún más la caja delimitadora
Para calcular las pérdidas de detección y clasificación, se utiliza el mismo algoritmo de asignación de cajas objetivo que en RetinaNet, descrito en el apartado anterior. La pérdida de caja también es la misma (pérdida de Huber). La cabeza de clasificación utiliza una activación softmax con una clase especial añadida para "fondo". En RetinaNet era una serie de clasificaciones binarias. Ambas funcionan, y este detalle de implementación no es importante. La pérdida total de entrenamiento es la suma de las pérdidas finales de caja y clasificación, así como las pérdidas de caja y clasificación de la RPN.
El diseño exacto de las cabezas de clase y de detección se da más adelante, en la Figura 4-30. También son muy similares a las utilizadas en RetinaNet: una secuencia recta de capas, compartida entre todos los niveles de la FPN.
La R-CNN de máscara añade un tercer cabezal de predicción para clasificar los píxeles individuales de los objetos. El resultado es una máscara de píxeles que representa la silueta del objeto (véase la Figura 4-19). Puede utilizarse si el conjunto de datos de entrenamiento contiene las correspondientes máscaras de objeto. Pero antes de explicar cómo funciona, debemos introducir un nuevo tipo de convolución, capaz de crear imágenes en lugar de filtrarlas y destilarlas: las convoluciones transpuestas.
Convoluciones transpuestas
Las convoluciones transpuestas, a veces también llamadas deconvoluciones, realizan una operación de sobremuestreo aprendible. Los algoritmos de sobremuestreo normales, como el sobremuestreo del vecino más próximo o la interpolación bilineal, son operaciones fijas. En cambio, las convoluciones transpuestas implican pesos aprendibles.
Nota
El nombre "convolución transpuesta" proviene del hecho de que en la representación matricial de una capa convolucional, que no tratamos en este libro, la convolución transpuesta se realiza utilizando la misma matriz convolucional que una convolución ordinaria, pero transpuesta.
La convolución transpuesta que se muestra en la Figura 4-26 tiene un único canal de entrada y otro de salida. La mejor forma de entender lo que hace es imaginar que está pintando con un pincel sobre un lienzo de salida. El pincel es un filtro 3x3. Cada valor de la imagen de entrada se proyecta a través del filtro en la salida. Matemáticamente, cada elemento del filtro 3x3 se multiplica por el valor de entrada y el resultado se añade a lo que ya hay en el lienzo de salida. A continuación, se repite la operación en la siguiente posición: en la entrada nos movemos de 1 en 1, y en la salida nos movemos con una zancada configurable (2 en este ejemplo). Cualquier zancada mayor que 1 provoca una operación de sobremuestreo. Los ajustes más frecuentes son la zancada 2 con un filtro 2x2 o la zancada 3 con un filtro 3x3.
Si la entrada es un mapa de características con varios canales, se aplica la misma operación a cada canal de forma independiente, con un filtro nuevo cada vez; luego se suman todas las salidas elemento a elemento, dando como resultado un único canal de salida.
Por supuesto, es posible repetir esta operación varias veces en el mismo mapa de características, con un nuevo conjunto de filtros cada vez, lo que da como resultado un mapa de características con múltiples canales.
Al final, para una entrada multicanal y una salida multicanal, la matriz de pesos de una convolución transpuesta tendrá la forma que se muestra en la Figura 4-27. Por cierto, tiene la misma forma que una capa convolucional normal.
Segmentación de instancias
Volvamos a a la Máscara R-CNN, y a su tercera cabeza de predicción que clasifica los píxeles individuales de los objetos. La salida es una máscara de píxeles que delinea la silueta del objeto (véase la Figura 4-22).
La R-CNN de máscara y otras RPN trabajan en una sola ROI a la vez, con una probabilidad bastante alta de que esa ROI sea realmente interesante, por lo que pueden hacer más trabajo por ROI y con mayor precisión. La segmentación de instancias es una de estas tareas.
El cabezal de segmentación de instancias utiliza capas de convolución transpuestas para sobremuestrear el mapa de características en una imagen en blanco y negro que se entrena para que coincida con la silueta del objeto detectado.
La Figura 4-30 muestra la arquitectura completa de la R-CNN de máscara.
Observa que el cabezal de máscara produce una máscara por clase. Esto parece redundante, ya que existe un cabezal de clasificación independiente. ¿Por qué predecir K máscaras para un objeto? En realidad, esta elección de diseño aumenta la precisión de la segmentación porque permite que el cabezal de segmentación aprenda pistas específicas de cada clase sobre los objetos.
Otro detalle de implementación es que el remuestreo y la alineación de los mapas de características con las ROI se realiza en realidad dos veces: una con una salida de 7x7x256 para el cabezal de clasificación y detección, y otra con ajustes diferentes (remuestreo a 14x14x256) específicamente para el cabezal de máscara, para darle más detalles con los que trabajar.
La pérdida de segmentación es una simple pérdida de entropía cruzada binaria píxel a píxel, que se aplica una vez que la máscara predicha se ha reescalado y remuestreado a las mismas coordenadas que la máscara real. Ten en cuenta que en el cálculo de la pérdida sólo se tiene en cuenta la máscara predicha para la clase predicha. Se ignoran las demás máscaras calculadas para las clases erróneas.
Ahora tenemos una imagen completa de cómo funciona Mask R-CNN. Una cosa que hay que observar es que, con todas las mejoras añadidas a la familia de detectores R-CNN, Mask R-CNN es ahora un detector de "dos pasadas" sólo de nombre. La imagen de entrada sólo pasa una vez por el sistema. La arquitectura sigue siendo más lenta que RetinaNet, pero consigue una precisión de detección ligeramente superior y añade la segmentación de instancias.
Existe una extensión de RetinaNet con una cabeza de máscara añadida(RetinaMask), pero no supera a Mask R-CNN. Curiosamente, el artículo señala que añadir el cabezal de máscara y la pérdida asociada en realidad mejora la precisión de las detecciones del cuadro delimitador (el otro cabezal). Un efecto similar podría explicar también parte de la mejora de la precisión de Mask R-CNN.
Una limitación del enfoque R-CNN de máscara es que las máscaras de objeto predichas tienen una resolución bastante baja: 28x28 píxeles. El problema similar, pero no exactamente equivalente, de la segmentación semántica se ha resuelto con enfoques de alta resolución. Exploraremos esto en la siguiente sección.
U-Net y Segmentación Semántica
En la segmentación semántica, el objetivo es clasificar cada píxel de la imagen en clases globales como "carretera", "cielo", "vegetación" o "personas" (véase la Figura 4-31). Las instancias individuales de objetos, como las personas individuales, no se separan. Todos los píxeles de "personas" de toda la imagen forman parte del mismo "segmento".
Para la segmentación semántica de imágenes, un enfoque sencillo y a menudo suficiente es la llamada U-Net. La U-Net es una arquitectura de red convolucional que se diseñó para la segmentación de imágenes biomédicas (véase la Figura 4-32) y ganó un concurso de rastreo celular en 2015.
La arquitectura U-Net se representa en la Figura 4-33. Una U-Net consta de un codificador que reduce la muestra de una imagen a una codificación (el lado izquierdo de la arquitectura), y un decodificador reflejado que aumenta la muestra de la codificación a la máscara deseada (el lado derecho de la arquitectura). Los bloques decodificadores tienen una serie de conexiones de salto (representadas por las flechas horizontales del centro) que se conectan directamente desde los bloques codificadores. Estas conexiones de salto copian rasgos a una resolución específica y los concatenan por canales con mapas de rasgos específicos en el descodificador. Esto lleva la información a varios niveles de granularidad semántica desde el codificador directamente al descodificador. (Nota: puede ser necesario recortar las conexiones de salto debido a ligeros desajustes de tamaño de los mapas de características en los niveles correspondientes del codificador y el decodificador. De hecho, U-Net utiliza todas las convoluciones sin relleno, lo que significa que se pierden píxeles de borde en cada capa. Sin embargo, esta elección de diseño no es fundamental, y también se puede utilizar relleno).
Imágenes y etiquetas
Para ilustrar la segmentación de imágenes con U-Net utilizaremos el conjunto de datos Mascotas Oxford, en el que cada una de las imágenes de entrada contiene una máscara de etiqueta, como se muestra en la Figura 4-34. La etiqueta es una imagen en la que a los píxeles se les asigna uno de tres valores enteros dependiendo de si son el fondo, el contorno del objeto o el interior del objeto.
Trataremos estos tres valores de píxel como el índice de las etiquetas de clase y entrenaremos a la red para que realice una clasificación multiclase:
model
=
...
model
.
compile
(
optimizer
=
'adam'
,
loss
=
tf
.
keras
.
losses
.
SparseCategoricalCrossentropy
(
from_logits
=
True
),
metrics
=
[
'accuracy'
])
model
.
fit
(
...
)
El código completo está disponible en 04b_unet_segmentation.ipynb en GitHub.
Arquitectura
Entrenar una arquitectura U-Net desde cero requiere un montón de parámetros entrenables. Como se explica en "Otras consideraciones", es difícil etiquetar conjuntos de datos para tareas como la detección y segmentación de objetos. Por lo tanto, para utilizar los datos etiquetados de forma eficiente, es mejor utilizar una columna vertebral preentrenada y emplear el aprendizaje por transferencia para el bloque codificador. Como en el Capítulo 3, podemos utilizar una MobileNetV2 preentrenada para crear la codificación:
base_model
=
tf
.
keras
.
applications
.
MobileNetV2
(
input_shape
=
[
128
,
128
,
3
],
include_top
=
False
)
El lado del descodificador consistirá en aumentar el muestreo de las capas para volver a la forma de máscara deseada. El descodificador también necesita mapas de características de capas específicas del codificador (conexiones de salto). Las capas del modelo MobileNetV2 que necesitamos pueden obtenerse por su nombre de la siguiente manera:
layer_names
=
[
'block_1_expand_relu'
,
# 64x64
'block_3_expand_relu'
,
# 32x32
'block_6_expand_relu'
,
# 16x16
'block_13_expand_relu'
,
# 8x8
'block_16_project'
,
# 4x4
]
base_model_outputs
=
[
base_model
.
get_layer
(
name
)
.
output
for
name
in
layer_names
]
La "pila inferior" o lado izquierdo de la arquitectura U-Net consiste entonces en la imagen como entrada, y estas capas como salidas. Estamos realizando un aprendizaje por transferencia, por lo que toda la parte izquierda no necesita ajustes de peso:
down_stack
=
tf
.
keras
.
Model
(
inputs
=
base_model
.
input
,
outputs
=
base_model_outputs
,
name
=
'pretrained_mobilenet'
)
down_stack
.
trainable
=
False
El sobremuestreo en Keras puede realizarse utilizando una capa Conv2DTranspose
. También añadimos normalización por lotes y no linealidad a cada paso del sobremuestreo:
def
upsample
(
filters
,
size
,
name
):
return
tf
.
keras
.
Sequential
([
tf
.
keras
.
layers
.
Conv2DTranspose
(
filters
,
size
,
strides
=
2
,
padding
=
'same'
),
tf
.
keras
.
layers
.
BatchNormalization
(),
tf
.
keras
.
layers
.
ReLU
()
],
name
=
name
)
up_stack
=
[
upsample
(
512
,
3
,
'upsample_4x4_to_8x8'
),
upsample
(
256
,
3
,
'upsample_8x8_to_16x16'
),
upsample
(
128
,
3
,
'upsample_16x16_to_32x32'
),
upsample
(
64
,
3
,
'upsample_32x32_to_64x64'
)
]
Cada etapa de la pila ascendente del descodificador se concatena con la capa correspondiente de la pila descendente del codificador:
for
up
,
skip
in
zip
(
up_stack
,
skips
):
x
=
up
(
x
)
concat
=
tf
.
keras
.
layers
.
Concatenate
()
x
=
concat
([
x
,
skip
])
Formación
Podemos mostrar en las predicciones de sobre unas pocas imágenes seleccionadas en utilizando una llamada de retorno de Keras:
class
DisplayCallback
(
tf
.
keras
.
callbacks
.
Callback
):
def
on_epoch_end
(
self
,
epoch
,
logs
=
None
):
show_predictions
(
train_dataset
,
1
)
model
.
fit
(
train_dataset
,
...
,
callbacks
=
[
DisplayCallback
()])
El resultado de hacerlo en el conjunto de datos Oxford Pets se muestra en , en la Figura 4-35. Observa que el modelo empieza con basura (fila superior), como cabría esperar, pero luego aprende qué píxeles corresponden al animal y qué píxeles corresponden al fondo.
Sin embargo, como el modelo está entrenado para predecir cada píxel como fondo, contorno o interior independientemente de los demás píxeles, vemos artefactos como regiones no cerradas y píxeles desconectados. El modelo no se da cuenta de que la región correspondiente al gato debería estar cerrada. Por eso este enfoque se utiliza sobre todo en imágenes en las que no es necesario que los segmentos a detectar sean contiguos, como en el ejemplo de la Figura 4-31, donde los segmentos "carretera", "cielo" y "vegetación" suelen tener discontinuidades.
Un ejemplo de aplicación es en los algoritmos de autoconducción, para detectar la carretera. Otro es en las imágenes por satélite, donde se utilizó una arquitectura U-Net para resolver el difícil problema de distinguir las nubes de la nieve; ambas son blancas, pero la cobertura de nieve es una información útil a nivel del suelo, mientras que la obstrucción por nubes significa que hay que volver a tomar la imagen.
Resumen
En este capítulo, hemos examinado objetivos y métodos de segmentación de imágenes. Empezamos con YOLO, teniendo en cuenta sus limitaciones, y luego hablamos de RetinaNet, que innova respecto a YOLO tanto en la arquitectura como en las pérdidas utilizadas. También hablamos de Mask R-CNN para realizar la segmentación por instancias y de U-Net para realizar la segmentación semántica.
En los próximos capítulos, profundizaremos en las distintas partes de la canalización de la visión por ordenador utilizando la arquitectura sencilla de clasificación de imágenes de aprendizaje por transferencia del Capítulo 3 como modelo central. Los pasos del proceso son los mismos independientemente de la arquitectura principal o del problema que se resuelva.
Get Aprendizaje automático práctico para visión por ordenador now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.