Full text
Proyecto Fin de Carrera Ingeniería de Telecomunicación Formato de Publicación de la Escuela Técnica Superior de Ingeniería Autor: F. Javier Payán Somet Tutor: Juan José Murillo Fuentes Dep. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2013 Trabajo Fin de Grado Grado en Tecnología de las Telecomunicaciones Reconocimiento Automático de Barcos en Imágenes Aéreas Mediante Aprendizaje Máquina Autor: Pedro Beltrán Guerra Tutor: Francisco Jose Simois Tirado Dpto. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2021
Trabajo Fin de Grado Grado en Tecnología de las Telecomunicaciones Reconocimiento Automático de Barcos en Imágenes Aéreas Mediante Aprendizaje Máquina Autor: Pedro Beltrán Guerra Tutor: Francisco Jose Simois Tirado Profesor Contratado Doctor Dpto. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2021
Trabajo Fin de Grado: Reconocimiento Automático de Barcos en Imágenes Aéreas Mediante Aprendizaje Máquina Autor: Pedro Beltrán Guerra Tutor: Francisco Jose Simois Tirado El tribunal nombrado para juzgar el trabajo arriba indicado, compuesto por los siguientes profesores: Presidente: Vocal/es: Secretario: acuerdan otorgarle la calificación de: El Secretario del Tribunal Fecha:
Agradecimientos Este trabajo marca el cierre de una etapa y el inicio de una nueva. Tras tantos años de esfuerzo, no puedo dejar de sentir una plenitud, orgullo y satisfacción inabarcables por cualquier palabra que pueda decir. Quiero aprovechar estas primeras líneas para agradecer a mis padres toda la ayuda y apoyo que han sabido darme durante toda mi vida. A mis hermanas, por ser los mejores ejemplos que he podido tener. También agradecer a todos mis compañeros de la universidad de todos estos años, de los que, haciendo memoria, me doy cuenta de que aprendí los consejos más sabios. A mis maestros, a todos, gran parte de lo que soy hoy es gracias a ellos. En concreto a Francisco José Simois por haberme dado la oportunidad de descubrir este campo que me era totalmente desconocido. Por último, no quería terminar sin hacer una especial mención a todas esas personas con las que algún día me crucé y con los que tanto he caminado. Ha sido un viaje digno de repetir, cada paso, cada descanso, cada borrón y cada acierto. Gracias. Pedro Beltrán Guerra Sevilla, 2021 I
Resumen El tráfico marítimo está creciendo cada vez más rápido. Más barcos supone un incremento de accidentes con consecuencias medioambientales, pesca ilegal o transporte de mercancías prohibidas. Esto ha hecho que muchas organizaciones como gobiernos o compañías de seguros tengan especial interés en la vigilancia del tráfico marítimo. El objetivo de este trabajo es la detección de barcos a partir de imágenes aéreas. Este problema es bastante complicado de resolver mediante técnicas de procesado de imagen clásicas pero supone un desafío apropiado para los altos niveles de abstracción que se pueden conseguir con las técnicas de aprendizaje máquina. En este proyecto se realiza un análisis profundo de las técnicas de Machine Learning, centrado en las técnicas de Deep Learning usadas para la segmentación de objetos en imágenes. Para ello, se comienza con un desarrollo teórico de los fundamentos del tratamiento de imágenes y el Deep Learning, para terminar con una recopilación y análisis de una serie de arquitecturas usadas en la actualidad, ahondándose en su estructura interna y las mejoras que aportan cada una de estas. Posteriormente, se presentan dos modelos para la resolución del problema de segmentación de barcos en imágenes aéreas, basándonos en el conjunto de datos proporcionados por Airbus para una competición en la plataforma Kaggle. Con este fin, se pasa a exponer las estructuras, los pasos necesarios para el ajuste y el desempeño a un nivel pormenorizado de cada uno de ellos. Finalmente, se presentan ambos modelos a la competición y se compara su rendimiento con los demás competidores a nivel mundial. III
1 Introducción Un barco que parecería grande en el río, sería muy pequeño en plena mar. Lucio Anneo Séneca 1.1 Motivación del proyecto La visión artificial es un campo que trata de emular la capacidad del ser humano de comprender su entorno en base a las imágenes que recibe del exterior. Sin embargo, esta habilidad no es sencilla de trasladar a un computador. Poder discernir cuáles son las propiedades externas que diferencian a unos objetos de otros, es algo que se realiza en base a un aprendizaje experiencial difícilmente parametrizable y, por lo tanto, difícilmente transferible. Sería como tratar de explicar el color azul a una persona que jamás podido ver. Por otro lado, la inteligencia artificial busca dotar a las maquinas la capacidad de aprender por sí mismas. Esto ha dado lugar a multitud de técnicas de machine learning para lograr el aprendizaje en base a la experiencia. De esta manera, utilizando técnicas de inteligencia artificial, no habría que transmitir ningún aprendizaje, sino que es el propio computador, por sí mismo, el que aprende en base a la experiencia a resolver problemas complejos. Tanto es así, que en la actualidad todas las competiciones que requieren un análisis de datos complejo, en general, y de visión artificial en particular, están lideradas por soluciones basadas en inteligencia artificial. Como alumno especializado en imagen y sonido he podido estudiar multitud de técnicas clásicas para el procesamiento de imagen y la visión artificial en profundidad. Sin embargo, la inteligencia artificial y, en concreto, el uso de redes neuronales convolucionales era algo que aún se mantenía en un territorio desconocido, casi mágico. ¿Cómo un algoritmo puede aprender de forma autónoma?, ¿en qué consiste una red neuronal?, ¿cuán sencillo o complejo es construir un modelo funcional con unos resultados competentes? Estas preguntas e inquietudes fueron las razones que me llevaron a abarcar este proyecto. 1.2 Objetivos El objetivo del proyecto es construir un modelo de segmentación que sea capaz de distinguir barcos en imágenes de satélite. De esta manera, investigar y tener un primer contacto con las tecnologías actuales de deep learning aplicadas al tratamiento de imágenes. 1
2Capítulo 1. Introducción Para ello, se usará como pretexto la competición publicada por Airbus en la plataforma Kaggle[ 1 ], intentando conseguir los mejores resultados posibles en el ranking. Se emplearán para ello los recursos que la organización pone a nuestra disposición, tanto el conjunto de datos para el ajuste de los modelos, como la herramienta de evaluación. Finalmente se realizará un análisis exhaustivo a nivel local del desempeño del modelo para concretar sus puntos fuertes y débiles. 1.3 Organización de la memoria La memoria del proyecto se divide en las siguientes partes: 1. Introducción: Es el capítulo actual, en este se realiza una exposición de las motivaciones al abarcar este proyecto y los objetivos marcados. 2. Estado del arte : En este capítulo se lleva a cabo un repaso de las técnicas clásicas de visión artificial para la segmentación y un análisis profundo de diferentes arquitecturas de redes neuronales construidas con éste propósito. 3. Fundamentos teóricos : Aquí se exponen las bases teóricas sobre las que se desarrollan tanto el tratamiento de imagen como los algoritmos de inteligencia artificial. 4. Análisis del problema y solución propuesta : A continuación se realiza un análisis del problema propuesto. Se comienza con un análisis del conjunto de datos de los que se disponen para el ajuste de los modelos. Seguidamente, se estudia la métrica que será usada para evaluar el desempeño de las predicciones realizadas. Finalmente, se exponen los modelos sobre los que se han trabajado, las herramientas usadas para su ajuste y una análisis de su rendimiento. 5. Conclusiones y líneas futuras : es el último capítulo en el que se resume el trabajo realizado y las conclusiones extraídas de este. Así mismo, se señalan posibles vías de mejora que, aún no habiendo sido exploradas, parecen prometedoras.
2 Fundamentos Teóricos Todo debería hacerse tan simple como sea posible, pero no más. Albert Einstein Es te capítulo abarca todos los conceptos teóricos necesarios para la resolución del problema propuesto. Para ello, se comienza con una introducción a la imagen digital y las operaciones que se pueden realizar en estas. Posteriormente, se hace un repaso de las técnicas de inteligencia artificial, para terminar en un análisis profundo de las redes neuronales y los algoritmos y técnicas usadas para el proceso de aprendizaje de éstas redes. 2.1 La imagen digital Una imagen monocroma se define como una función de intensidad (o nivel de gris) dependiente de dos dimensiones de posición f(i,j) , donde i y j son coordenadas espaciales y el valor de f será proporcional a la intensidad de la imagen en en el punto (i,j) [ 2 ]. La figura Figura 2.1 muestra la convención de ejes utilizada según éste criterio. Figura 2.1 Convención de ejes utilizada para la representación de imágenes digitales. La imagen digital surge de discretizar y codificar los valores de intensidad y sus coordenadas para el almacenamiento, representación y modificación por parte de una computadora. Esta se puede entender como una matriz en la que cada elemento representa un píxel (picture element). 3
4Capítulo 2. Fundamentos Teóricos De la discretización de las coordenadas surge la resolución de la imagen, mientras que la discretización de los valores de intensidad determinan la profundidad de píxel. La resolución de la imagen es el número de píxeles que forman la imagen, se expresa en número de píxeles de altura por números de píxeles de anchura (ej. 756x756) y determinará la resolución espacial o la capacidad de representar detalles. La profundidad de píxel es el numero de bits que codifica la intensidad de cada píxel, determinará la resolución en amplitud o el rango dinámico, teniendo para N bits un rango de 2N niveles de grises. En la Figura 2.2 se muestran algunos ejemplos de resoluciones y profundidades de píxel. Figura 2.2 Diferentes resoluciones y profundidades de píxel. En la primera fila disminuye la resolución y en la segunda disminuye la profundidad de píxel. 2.1.1 Imágenes en color Desde el punto de vista del ojo humano, todos los colores son vistos como combinaciones variables de los tres colores primarios: rojo (R), verde (G) y azul (B) [ 2 ]. Para describir una imagen digital en color se usa el mismo fundamento que el descrito anteriormente para imágenes monocroma. Sin embargo, en este caso, para cada píxel se discretizan y codifican sus componentes según el espacio de color que se utilice. De esta manera, para el espacio de color RGB, cada píxel se representa mediante la combinación de sus componentes de rojo, verde y azul. Esta representación puede verse como la combinación de tres planos de intensidad, uno para cada componente, como se muestra en la Figura 2.3 [3]. Figura 2.3 Planos de color RGB. Fuente: [3].
2.1 La imagen digital 5 2.1.2 Operaciones sobre imágenes Al tratarse las imágenes de matrices o, en el caso de imágenes en color, combinaciones de matrices (tensores) pueden realizarse operaciones sobre éstas. A continuación se realiza un repaso de las operaciones que se pueden realizar sobre las imágenes. Operaciones individuales Las operaciones individuales actúan sobre los valores de píxel para generar una nueva imagen. Una regla global aplicada a cada píxel modificará el valor de cada uno de estos. De manera que la salida de esta operación depende únicamente del valor que tiene el píxel de la entrada, siendo independiente de los píxeles adyacentes. Se puede entender como una función que transforma cada pixel de la imagen de entrada, x(i,j) , generando la salida s(i,j), como se muestra en la Ecuación 2.1 : s(i,j) = T(x(i,j)) (2.1) La función T(r) podrá ser una función lineal o no lineal. La imagen resultante será de la misma dimensión que la original. Entre estas, se pueden encontrar: •Negativo: Esta operación genera una imagen de salida inversa a la imagen de entrada. Para una imagen con los niveles de gris de 0 a 255, la función de transformación sería: T(r) = 255 −r(2.2) •Ley de potencia: somete a cada píxel a una transformación no lineal que sigue la Ecuación 2.3 T(r) = krγ(2.3) Donde k es una constante que suele ser igual a 1. En la Figura 2.4(b) se representan tres posibilidades de esta transformación: para γ>1 en color rojo punteado, para γ<1 en verde y para γ=1en negro. •Umbralización: T(r) = 0si r<umbral 255 si r≥umbral (2.4) 255 255 r T(r) (a) Operación negativo. 255 255 r T(r) (b) Ley de potencia. umbral 255 255 r T(r) (c) Operación umbral. Figura 2.4 Operaciones individuales.
6Capítulo 2. Fundamentos Teóricos Operaciones geométricas El objetivo de las operaciones geométricas es transformar los valores de la imagen tal como podría observarse desde otro punto de vista. Por tanto, escalarla, supondría acercar o alejar el punto de vista, rotarla, se correspondería con girar el punto de vista y trasladarlo, hacer lo mismo con éste[ 2 ]. •Interpolación: es el cálculo del valor de intensidad de un píxel como función de los píxeles que le rodean [ 2 ] y se trata de una operación esencial para la ejecución de las transformaciones geométricas. Debido a que las imágenes son elementos discretos, no existirán valores de intensidad entre los píxeles. Al realizar un transformación geométrica, los píxeles de la imagen transformada no tienen por qué coincidir con los píxeles de la imagen final, por lo que se deben calcular los nuevos valores de intensidad en dichos puntos. Rotación Figura 2.5 Posición de los píxeles transformados (azules) frentes a los de la imagen final (verdes). •Traslación: desplazar el píxel de la posición (i,j) hasta la posición (i+id,j+jd) , siguiendo la siguiente transformación: x=i+id y=j+jd o equivalentemente x y 1 = 1 0 id 0 1 jd 0 0 1 i j 1 (2.5) A veces es necesario el uso de interpolación, ya que los desplazamientos no tienen por qué ser números enteros. •Rotación: se introduce un giro en la imagen original, determinada por el ángulo θ y el centro de rotación (io,jo), quedando determinada por la siguiente transformación: x=cos θ(i−io)−sen θ(j−jo) y=sen θ(i−io)+cos θ(j−jo)o equivalentemente x y 1 = cos θ−sen θj0 sen θicos θj0 0 0 1 (i−io) (j−jo) 1 (2.6) •Escalado: consiste en la variación de tamaño de la imagen original. La tranformación se puede hacer en los ejes x e y y quedarán representados mediante los factores de escala Sx y Sy. Sigue la siguiente ecuación: x=Sxi y=Syjo equivalentemente x y 1 = Sx0 0 0Sy0 0 0 1 i j 1 (2.7) De manera que, cuando los factores de escala son mayores que 1, la imagen se expandirá, por lo que aparecerán huecos entre los píxeles que serán completados mediante repetición de los píxeles adyacentes o interpolación lineal.
2.1 La imagen digital 7 Operación de convolución Como ya se ha introducido en la Sección 3.2, la operación de convolución se basa en la existencia de una mascara o filtro por el que se hace pasar una imagen. De manera que, disponiendo de una imagen representada por una matriz x de tamaño M×N , se le aplicará un filtro definido por una matriz hde tamaño K1×K2(con K1<MyK2<N), según la siguiente expresión: (x∗h)[i,j] = K1−1 ∑ k1=0 K2−1 ∑ k2=0 h[k1,k2]x[i+k1,j+k2](2.8) Según los valores que compongan estos filtros, la operación de convolución sobre una imagen tendrá distintos resultados, algunos ejemplos son: •Detección de bordes: Existen muchas máscaras para la detección de bordes, una de las más sencillas son las mascaras Prewitt: Px= +1 0 −1 +1 0 −1 +1 0 −1 Py= +1+1+1 000 −1−1−1 (2.9) Donde Px calcula el gradiente vertical de la imagen y Py el horizontal, sirviendo como detector de bordes. •Suavizado: promediando el valor de los píxeles adyacentes, se realizará un suavizado de la imagen. Esto se puede hacer realizando la media aritmética de los píxeles ( B3x3 ) o aplicando un suavizado del tipo gaussiano (G3x3). B3x3=1 9 111 111 111 G3x3=1 16 121 242 121 (2.10) •Afilado: útiles para mejorar una imágenes que no resulten suficientemente nítidas. Se pueden utilizar máscaras similares a las usadas para detectar fronteras, haciendo que en éstas sus valores suman 1. S5= 0−1 0 −1 5 −1 0−1 0 (2.11) Otra opción, sería combinar un detector de fronteras y un filtro de suavizado, quedando: S5x5=1 5 −1−1−1−1−1 −1 2 2 2 −1 −1 2 8 2 −1 −1 2 2 2 −1 −1−1−1−1−1 (2.12) En la Figura 2.6 se puede ver el resultado de la aplicación de algunos de estos filtros. En procesamiento de imágenes, hay multitud de operaciones que se pueden representar de forma sencilla definiendo una máscara que se aplica sobre la imagen realizando convolución. Mas adelante, en la Sección 2.3 se verá que los valores que componen estos filtros de convolución, serán los parámetros cuyo valor se determinan en el proceso de aprendizaje automático.
8Capítulo 2. Fundamentos Teóricos (a) Imagen original (b) Prewitt vertical (c) Prewitt horizontal (d) Suavizado (e) Afilado con S5(f) Afilaco con S5x5 Figura 2.6 Efecto de diferentes mascaras de convolución.
2.2 Deep Learning 9 2.2 Deep Learning Las técnicas de Deep Learning son un subconjunto dentro del Machine Learning, que, a su vez, son un subconjunto de las técnicas de Inteligencia Artificial. Estos conceptos muy a menudo se usan indistintamente y conviene definirlos de forma separada para no caer en equívoco: •Inteligencia Artificial : comprende las técnicas y estrategias utilizadas para que computadores y autómatas manifiesten un comportamiento similar al comportamiento inteligente de un ser vivo. Entre ellos, la capacidad de aprender. •Machine Learning : su objetivo es desarrollar métodos para que un computador pueda mejorar con la experiencia la capacidad para resolver un problema determinado. •Deep Learning : técnica de Machine Learning, que consigue el aprendizaje en base a la prueba y error mediante la optimización de Redes Neuronales Artificiales profundas. Una forma sencilla de entender cómo se relacionan Deep Learning, Machine Learning e Inteligencia Artificial es mediante el gráfico de la Figura 2.7. Figura 2.7 Diagrama conceptual de I.A., M.L. y D.L. Fuente: [4]. La evolución en la Inteligencia Artificial tiende a la automatización de todo el proceso extracción de características. Los primeros logros de la Inteligencia Artificial eran sistemas expertos que, con reglas codificadas manualmente, simulaban el razonamiento de un experto en un dominio de aplicación. Posteriormente, con el estudio de grandes cantidades de datos y el Machine Learning, se consiguieron construir modelos para la resolución de problemas a partir de conjunto de datos, siendo un experto el que seleccionaba las características, atributos o variables que resultasen más representativas. Después de esto, aparecieron técnicas que podían descubrir éstas características automáticamente, denominadas técnicas de aprendizaje de representaciones. Finalmente, las técnicas de Deep Learning, además de encontrar las características de forma automática, son capaces de construir características a partir de éstas. Consiguen, de esta manera, aumentar el nivel de abstracción, generando jerarquías con varios niveles de características, descubriendo nuevas características a partir de las características del nivel anterior. [5] En la Figura 2.8 puede verse la evolución de las técnicas de Inteligencia Artificial. Datos de entrada Datos de entrada Datos de entrada Características más complejas Modelo Modelo Salida Características Carecterísticas Características Reglas Datos de entrada Salida Salida SalidaModelo Sistemas expertos Machine Learning Aprendizaje de representaciones Deep Learning Figura 2.8 Evolución de las técnicas de Inteligencia Artificial. Las etapas automatizadas del proceso han sido sombreadas. Fuente: [5].
16 Capítulo 2. Fundamentos Teóricos Descenso del gradiente Técnica de optimización para minimizar el valor de una función de manera iterativa. Esta técnica utiliza información exclusivamente local para llegar al mínimo de la función de pérdida. La información de la que se dispone es la pendiente, o el gradiente, de la función en el punto actual. La idea es dar pasos en la dirección opuesta al gradiente en ese punto, ya que es la dirección donde habrá una mayor disminución de la función de error. El vector gradiente ( ∇w ) quedaría definido como un vector cuyas componentes son las derivadas parciales con respecto a los pesos: ∇w=∂ ∂w1 ,∂ ∂w2 ,..., ∂ ∂wn(2.24) Que aplicado sobre la función de error E: ∇wE=∂E ∂w1 ,∂E ∂w2 ,..., ∂E ∂wn(2.25) Es éste gradiente el que utilizamos para actualizar los valores de los pesos ( w ) de la función. El gradiente nos dará la dirección y sentido en la que más se incrementa la función de error, para hacerlo descender habría que cambiar el sentido de éste, quedándonos: ∆w=−η∇wE(2.26) Donde η es la tasa de aprendizaje que representa la longitud del salto que va a darse en la dirección del gradiente. Este es uno de los hiperparámetros más influyentes en el proceso de entrenamiento y se le dedicará una explicación más profunda más adelante en esta misma sección. Como la función de pérdidas se expresa en función de su salida, usando la regla de la cadena, las derivadas parciales de la Ecuación 2.26 quedarían: ∂E ∂wi =∑ j ∂Ej ∂wi =∑ j ∂Ej ∂y ∂y ∂wi (2.27) Sin embargo, como se vio en la Subsección 2.2.1 las neuronas suelen tener una función de activación no lineal para generar la salida a partir de su entrada neta. Para calcular la derivada de la salida con respecto a cada uno de sus pesos aplicamos la regla de la cadena de nuevo, de manera que: ∂y ∂wi =∂y ∂z ∂z ∂wi =f0(z)∂z ∂wi =f0(z)xi(2.28) Siendo ∂y ∂z la derivada de la función de activación f(z) , esta es la razón por la que conviene que las funciones de activación sean continuas y derivables. Cabe señalar también que en la anterior ecuación se tiene que ∂z ∂wi=xi , ya que la entrada neta no es más que una combinación lineal de las entradas, como se determinó en la Ecuación 2.17. De esta manera, el gradiente de la función de error con respecto a los pesos de las neuronas quedarían: ∇wE=∑ j ∂Ej ∂yf0(z)xj(2.29) El término ∂Ej ∂y es sencillo de obtener de manera directa en la capa de salida, al tener una función de error definida. Sin embargo en las capas oculta es más difícil pues, a priori, no se sabe cuál debe ser la salida de estas neuronas, no pudiendo definir una función de error. No obstante sí es posible calcular cómo varía el error al cambiar su actividad.
2.2 Deep Learning 17 Un pequeño cambio en un pewo wi j de una neurona oculta j tendrá un efecto sobre el error cometido por la red que se puede aproximar por: ∆E≈∂E ∂wc i j ∆wc i j (2.30) El súper índice c indica que la neurona j está en la capa c de nuestra red. De manera que c=0 para la capa de entrada y c=Cen la capa de salida de la red. El error es evaluado en la capa de salida, pero para llegar hasta ese punto debe propagarse por toda la red. El error producido por un sólo camino entre la neurona j y la salida de la red al cambiar el peso wi j de esta vendría dado por: ∆E≈∂E ∂yC m ∂yC m ∂yC−1 n ∂yC−1 n ∂yC−2 p ... ∂yc+1 q ∂yc j ∂yc j ∂wc i j ∆wc i j (2.31) j Figura 2.17 Error de neurona oculta propagándose por un camino. Sin embargo, esta sería la contribución al error de un camino particular. Para tener el efecto global del cambio del peso wi j en el error cometido por la red, habría que sumar la contribución de todos los caminos posibles, quedando: ∆E≈∑ mnp...q ∂E ∂yC m ∂yC m ∂yC−1 n ∂yC−1 n ∂yC−2 p ... ∂yc+1 q ∂yc j ∂yc j ∂wc i j ∆wc i j (2.32) j Figura 2.18 Error de neurona oculta propagándose por la red. Sustituyendo la Ecuación 2.32 en la Ecuación 2.30, quedaría que: ∂E ∂wc i j =∑ mnp...q ∂E ∂yC m ∂yC m ∂yC−1 n ∂yC−1 n ∂yC−2 p ... ∂yc+1 q ∂yc j ∂yc j ∂wc i j (2.33) Esta expresión representa cómo se modifica el error al variar un parámetro particular wi j . De esta expresión se puede extraer: ∂E ∂yc j =∑ mnp...q ∂E ∂yC m ∂yC m ∂yC−1 n ∂yC−1 n ∂yC−2 p ... ∂yc+1 q ∂yc j (2.34) Que refleja cómo se modifica el error a la salida de la red con respecto a la variación de la salida de una neurona oculta j.
18 Capítulo 2. Fundamentos Teóricos Backpropagation El algoritmo de backpropagation está basado en la técnica del descenso del gradiente. Calcula eficientemente la suma de las contribuciones al error de todos los caminos entre una neurona y la salida. Esto lo consigue aprovechando la topología de la red, que se organiza como una serie de capas conectadas sucesivamente. Primero, se define δc j como la derivada parcial del error con respecto la entrada neta zj . De esta manera se incluye la función de activación de la neurona, que será necesaria en el cálculo del gradiente como se vio en la Ecuación 2.29, quedando: δc j=∂E ∂zc j =∂E ∂yc j ∂yc j ∂zc j =∂E ∂yc j f0(zc j)(2.35) Donde, recapitulando, f0(zc j) era la derivada de la función de activación de la neurona j . Para el cálculo de ∂E ∂yc j era necesario, según la Ecuación 2.34, tener en cuenta todos los caminos que conectaban la salida de una neurona oculta con la salida de la red. Sin embargo, si tenemos en cuenta la topología de la red, que se organiza de manera que todas las neuronas de la capa c comparten los caminos que van desde la capa c+1 hasta la salida, se pueden calcular los gradientes de las neuronas de la capa c a partir de los de la capa c+1 . Para ello, hay que relacionar el error de las neuronas de una capa oculta con el error de las de la siguiente capa, de manera que: ∂E ∂yc j =∑ k ∂E ∂yc+1 k ∂yc+1 k ∂yc j (2.36) Sustituyendo esto en la Ecuación 2.35 quedaría: δc j= ∑ k ∂E ∂yc+1 k ∂yc+1 k ∂yc j!f0(zc j) = ∑ k ∂E ∂yc+1 k ∂yc+1 k ∂zc+1 j!∂zc+1 k ∂yc j!f0(zc j) = ∑ k ∂E ∂zc+1 j ∂zc+1 k ∂yc j!f0(zc j) = ∑ k δc+1 j ∂zc+1 k ∂yc j!f0(zc j) (2.37) Al estar las capas conectadas una detrás de otra, la salida de la capa c , es la entrada de la capa c+1, por lo tanto yc=xc+1, sustituyendo: δc j= ∑ k δc+1 j ∂zc+1 k ∂xc+1 j!f0(zc j) = ∑ k δc+1 jwc+1 jk !f0(zc j)(2.38) De esta manera, ya se podrían calcular los gradientes de cada neurona de las capas ocultas con el gradiente de las neuronas de la capa que las suceden, ya que: ∂E ∂wc i j =δc jxc i(2.39) Y finalmente, los pesos de cada neurona se actualizarían haciendo uso de la Ecuación 2.26 de la siguiente manera: ∆wc i j =−ηδc jxc i(2.40) De manera que para actualizar los pesos de cada entrada de la neurona, hay que multiplicar la delta de su salida ( δc j ) por el valor de la entrada ( xc i ) para obtener el gradiente con respecto al peso y, a continuación, se le resta este valor suavizado por la tasa de aprendizaje (η).
2.2 Deep Learning 19 Tasa de aprendizaje Es uno de los hiperparámetros más importantes en la fase de aprendizaje. Aparece con la letra η en la ecuación de la actualización de pesos (Ecuación 2.26), representa la magnitud del salto que se dará en la dirección opuesta al sentido del gradiente y toma valores pequeños, entre 0,001 y0,1. El valor que tome este hiperparámetro puede contribuir de forma muy beneficiosa a la hora de acelerar el proceso de aprendizaje cuando está bien escogido o hacer que el modelo varíe de forma errática cuando no. De manera que, debe tomar un valor lo suficientemente grande para que no siga una trayectoria amortiguada y pequeña para que el algoritmo llegue a converger. Figura 2.19 Efecto de diferentes tasas de aprendizaje. Fuente [15]. 2.2.4 Resultados del entrenamiento Una vez entrenado el modelo puede converger en una solución óptima o no converger. En caso de que el modelo converja, el resultado puede encuadrarse en uno de los siguientes casos: •Sobreajuste: ocurre cuando el modelo se especializa en exceso sobre los ejemplos del conjunto de datos, de manera que llega a memorizar la salida óptima para cada entrada. Cuando esto ocurre, el modelo es incapaz de generalizar y, para cualquier entrada que no haya visto previamente, dará una salia errática. •Subajuste: para este caso el modelo generaliza tanto que es incapaz de encontrar las relaciones subyacentes entre los datos de entrada, no siendo capaz de realizar predicciones de manera adecuada. •Bien ajustado: este sería el resultado buscado en el proceso de entrenamiento de la red. El modelo es capaz de realizar predicciones adecuadas y de generalizar dando una respuesta óptima para datos de entrada nunca vistos con anterioridad. En la Figura 2.21 pueden verse ejemplos de funciones subajustadas, sobreajustadas y bien ajustadas a los datos de entrada. Figura 2.20 Regresiones lineales con distintos ajustes. Fuente [16].
20 Capítulo 2. Fundamentos Teóricos Mecanismos para evitar el sobreajuste El sobreajuste es una de las mayores limitaciones actuales de las redes neuronales profundas, debido a que al aumentar la cantidad de parámetros de la red, aumenta la posibilidad de caer en el sobreajuste. Para reconocer y evitar el sobreajuste, se hacen uso de una serie de buenas praxis y estrategias. La primera de ellas, consiste en dividir el conjunto de entrenamiento en tres subconjuntos: el conjunto de entrenamiento, de validación y de prueba: • El conjunto de entrenamiento es el que se usa para ajustar los parámetros de la red en la fase de entrenamiento que, mediante el algoritmo de backpropagation, se optimizan para minimizar el error.. • El conjunto de validación es también utilizado por la red en la fase de entrenamiento, pero sólo para evaluar el error de la predicción, en ningún caso ajustará los parámetros en función a este error. • El conjunto de prueba es un conjunto de los datos que se reservan y sólo son usados una vez el modelo está ya ajustado para medir la efectividad del modelo ajustado. Las divisiones en subconjuntos se deben realizar de manera que aparezcan todos los casos que queramos predecir para ajustar el modelo. De esta manera se garantiza que los errores estimados en los conjuntos de entrenamiento, validación y prueba se asemejan al error que resultará del uso de nuestra red en un caso real. De esta manera, el error del conjunto de entrenamiento disminuirá con cada paso iterativo del proceso de aprendizaje y, a medida que el modelo esté aprendiendo a reconocer generalidades de los datos, el error del conjunto de validación también lo hará. Sin embargo, en el momento en el que el modelo se sobre especialice en el conjunto de entrenamiento, su rendimiento en conjunto de validación comenzará a disminuir, aumentando el error en éste. SobreajusteSubajuste Figura 2.21 Evolución del error en el conjunto de entrenamiento (azul) y el de validación (rojo). Fuete: [17]. A partir de este concepto, se aplica una técnica llamada early stopping en el proceso de entrenamiento, que lo detiene cuando se detecta un incremento del error en el conjunto de validación para evitar entrar en el sobreajuste. Una vez se observa que el modelo llega al sobreajuste, existen diversas estrategias generales a seguir para evitar que esto ocurra. La primera opción es aumentar el conjunto de datos , de manera que al tener más ejemplos sobre los que extraer características, el modelo podrá generalizar mejor. El aumento del dataset se puede conseguir de manera orgánica, es decir, aumentando la cantidad de pares entrada-salida con nuevos
2.3 Redes Neuronales Convolucionales 21 ejemplos, o de manera sintética con el llamado data augmentation , que consiste en aumentar la cantidad de ejemplos haciendo transformaciones (rotaciones, escalado, cambios de luminancia, etc...) de los ejemplos que ya se tienen en el conjunto de datos. Otra opción es ajustar los hiperparámetros del modelo, como son el número de capas, el numero de neuronas por capas, el tipo de arquitectura y la tasa de aprendizaje. De esta forma, se ajusta la capacidad del modelo. Una arquitectura con menos cantidad de capas, al tener menos parámetros, tienen menos posibilidad de sobreajuste [ ? ]. De esta manera conseguimos que el modelo tenga la capacidad suficiente como para identificar las regularidades relevantes de los datos de entrenamiento, pero no tanta como para ajustarse a las particularidades. La última opción es combinar varios modelos , en los llamados ensembles, para que los errores cometidos por alguno de ellos se compense con los aciertos de los otros. Estos modelos pueden ser dos arquitecturas diferentes entrenadas de manera independiente o incluso las mismas arquitecturas entrenadas con distintos subconjuntos del conjunto de datos. Dropout Es una técnica muy usada adicionalmente para evitar el sobreajuste [ 18 ]. La técnica consiste en dejar activa las neuronas de la red de forma aleatoria en cada iteración con una probabilidad determinada (habitualmente, p=0,5 ). De manera que sólo quedarán activas una fracción de las neuronas disponibles. Esta técnica pude verse como la construcción de un ensemble formado por todas las subredes que pueden formarse a partir de la red original, pudiendo conseguir algo equivalente en funcionamiento a un ensemble entrenando una sola red [ 19 ]. En la Figura 2.22 se puede ver el funcionamiento de ésta técnica, representando en rojo las neuronas que no estarían siendo utilizadas en una época y en gris las que sí. Figura 2.22 Ejemplo del uso de Dropout en una Red Neuronal Profunda. 2.3 Redes Neuronales Convolucionales Las Redes neuronales convolucionales o, simplemente, redes convolucionales, son ampliamente usadas en problemas en los que es necesario realizar procesado de imágenes, como ya se adelantó en la Sección 3.2. Su funcionamiento se basa en el uso capas convolucionales que contienen filtros que se hacen pasar por toda la imagen. En estos filtros están los pesos o parámetros que la red va a aprender mediante backpropagation. Uno de los principales motivos de su uso es su mejor eficiencia en términos de memoria frente a las redes multicapa. Esto es debido a que, en vez de conectar todas las capas entre sí mediante matrices de multiplicación, usan convoluciones (Sección 3.1.2), cuyos filtros son mucho menores que las imágenes de entrada. Gracias a esto las redes convolucionales reducen en gran medida el número de parámetros a optimizar [14]. Los filtros en las capas convolucionales actúan sobre una pequeña región de la imagen en cada momento, de esa manera aprenderán a extraer características locales de la imagen. El tamaño de la región sobre la que se actúa viene dada por el tamaño del filtro y se le denomina campo receptivo . Por otro lado, una vez un filtro aprende a encontrar características en una región en particular, éste se usará en toda la imagen con lo que se reduce el número de parámetros a usar gracia al uso
22 Capítulo 2. Fundamentos Teóricos de pesos compartidos. El resultado de aplicar cada uno de los filtros aprendidos son los mapas de características. Cada una de las capas convolucionales tienen varios filtros, cada uno de ellos especializado en detectar una característica. La cantidad de filtros que contiene cada capa es un factor determinante a la hora de diseñar la red, ya que fija la cantidad de mapas de características que se obtienen a la salida de la capa o profundidad de la capa. Una manera de incrementar el ahorro computacional es hacer uso de convoluciones submuestreadas, que consiste en saltar tantas posiciones como marca el parámetro stride a la hora de hacer la convolución. Como consecuencia de la operación de convolución, se reduce el tamaño de la imagen de salida, por lo que en muchas ocasiones se introducen ceros de relleno ( zero padding ) para mantener el mismo tamaño que en la entrada original. A pesar del uso de pesos compartidos, el uso de campos receptivos locales y el submuestreo de las convoluciones, el coste computacional sigue siendo muy elevado al hacer uso de varias capas consecutivas. Por ello, tras la capa convolucional se suelen incluir capas de pooling , que reducen el tamaño de sus entradas para que las capas posteriores puedan trabajar con datos de entrada reducidos. Figura 2.23 Esquema habitual de una Red Neuronal Convolucional. Fuente: [20]. Las Redes Neuronales Convolucionales son idóneas para explotar la estructura espacial de las imágenes, ya que, en estas son muy importantes las relaciones de los píxeles con su vecindad y las redes convolucionales las aprovechan en gran medida, cosa que no ocurre con las redes multicapa tradicionales. [5]
3 Estado del arte Saber algo más que los otros es fácil, lo difícil es saber algo mejor que los otros. Lucio Anneo Séneca Las imágenes siempre han tenido una gran importancia en la vida humana, ya que la visión es, probablemente, el sentido más importante del ser humano. Como consecuencia, el tratamiento de imágenes y la visión artificial ha supuesto un amplio campo de estudio y en estos últimos años han empezado a aplicarse modelos de aprendizaje automático, consiguiendo grandes avances en ambos campos. Los campos de la visión artificial y el tratamiento de imágenes en los que se aplican algoritmos de machine learning son múltiples, entre los más destacados se tienen: •Clasificación : determina una clase o lista de clases de los objetos que aparecen en una imagen. •Detección de objetos: detecta la presencia de objetos en una imagen. •Segmentación semántica : Consiste en dividir una imagen en regiones. Tras esto, cada píxel es etiquetado de acuerdo con la clase del objeto donde está incluido. •Segmentación de instancias : proporciona diferentes etiquetas para cada uno de los objetos detectados, aún perteneciendo a una misma clase. Figura 3.1 Clasificación, detección de objetos, segmentación semántica y de instancias. Fuente:[ 21 ] . 23
24 Capítulo 3. Estado del arte El problema presentado se trata de un problema de segmentación, en el que es necesario diferenciar los barcos del resto de objetos o artefactos que puedan aparecer en imágenes de satélite. Por lo tanto, el análisis la técnica se centrará en este tipo de problemas. 3.1 Métodos no neuronales Antes de que apareciesen los algoritmos de aprendizaje automático, la visión artificial y el reconocimiento de objetos era un campo ampliamente estudiado. Estos algoritmos basaban su funcionamiento en la extracción de características. Las características de un objeto son extractos de información relevante de estos. Una gran variedad de características se usaban para la segmentación, como el color de píxel, Histograma de gradientes orientados (HOG)[ 22 ], Transformación de características invariantes a escala (SIFT)[ 23 ], patrones binarios locales (LBP)[ 24 ], Harris Corners[ 25 ], Shi-Tomasi[ 26 ], SUSAN[27], FAST[28] o AGAST[29], entre otras. Para la segmentación y clasificación a partir de estas características, existen multitud de métodos, como son: •Umbralización : uno de los métodos más simples que permite enmascarar objetos, se basa en establecer uno o varios valores umbrales. Dependiendo si un valor de la imagen cumple las restricciones marcadas por este umbral (o umbrales) se considerará parte de la máscara o del fondo. •Crecimiento de regiones : estos métodos determinan basándose en criterios de similitud y proximidad entre los píxeles. A menudo se usan píxeles que actúan como semillas para comenzar el crecimiento, a los que se le agregarán otros adyacentes si tienen valores que cumplen un criterio de homogeneidad [30]. •Clústering k-means : para este método es necesario saber a priori el numero de clases existentes (k). Pertenece a las técnicas de Machine Learning, un algoritmo iterativo que consigue establecer los centroides (o patrón) de las diferentes clases según sus características de manera no supervisada. •Maquinas de vectores soporte : clasificador binario que se basa en la búsqueda de un hiperplano que separe de forma óptima a los puntos de una clase de la otra. Para ello, construye un espacio de características con una dimensionalidad mayor a partir del espacio de características original. Resolviendo, de esta manera, el problema de que las diferentes clases no sean linealmente separables. •Conditional Random Fields (CRF) : Es un método ampliamente usado ya que es el método que mejor rendimiento tiene para la segmentación. Sin hacer uso de redes neuronales, es una técnica de Machine Learning para modelado estadístico muy útil cuando se disponen de datos estructurados. Los CRFs basan su funcionamiento en un grafo no dirigido donde los nodos representan variables y las aristas tienen pesos asociados, que, conjuntamente, describen una distribución de probabilidad. En procesamiento de imágenes, el grafo conecta ubicaciones cercanas o similares para asegurarse que reciben predicciones similares. Sin embargo, todos estos métodos basados en la extracción de características tienen un problema común: su efectividad depende de la calidad de las características extraídas de éstos. Los seres humanos somos propensos a no percibir de una forma consciente, o parametrizable, las características latentes o abstractas necesarias para la correcta segmentación de un objeto en una imagen. Sería necesaria, entonces, la extracción de las características de forma manual por expertos en la materia.
3.2 Redes Neuronales 25 3.2 Redes Neuronales Los recientes logros de las redes neuronales, en concreto de las redes neuronales convolucionales (Convolutional Neural Network (CNN)), han hecho posibles unos grades progresos en la segmentación. Tanto es así que el uso de CNNs se ha convertido en un estándar en el campo de la segmentación. Una operación de convolución puede ser definida como una función que realiza la suma de los productos de los pesos de un filtro y una imagen de entrada a medida que desplazamos este filtro por la imagen. Figura 3.2 Convolución Bidimensional. Fuente: [31]. Se ha observado que después de entrenar una red neuronal convolucional, los filtros de convolución que éstas contienen, tienden a generar mapas de activación para ciertas características de los objetos[ 32 ]. Esto hace que, ante el problema de la extracción de las características existente con los métodos tradicionales, los métodos basados en aprendizaje profundo puedan aprender mecanismos de extracción de características de forma automática con varios niveles de abstracción. El problema de la extracción de características se transfiere, entonces, al desarrollo de una mejor arquitectura de las redes y procedimientos de entrenamiento más optimizados. La tendencia a lo largo de los años ha sido aumentar la profundidad de la red (numero de capas) y anchura (cantidad de pesos en los filtros) de las redes utilizadas. A pesar de que esto hace que la fase de entrenamiento sea más compleja, mejora el rendimiento y la efectividad de los modelos gracias a la reutilización de características y a las extracción de características más abstractas. a medida que las capas son más profundas[33]. Figura 3.3 Imagen de entrada y mapas de activaciones de una CNN. Fuente: [34].
32 Capítulo 3. Estado del arte 3.2.2 Segmentación de Instancias La segmentación de instancias enmascara cada instancia de un objeto de forma independiente. En detección de objetos se usa un cuadro delimitador para detectar cada instancia de objetos de una imagen con una etiqueta para clasificarlos. La segmentación de instancias va un paso más allá y segmenta cada una de estas instancias. Métodos basados en segmentación tras la detección Dai et al. presentaron Multi-task Network Cascades (MNC) [ 51 ] observando que para la segmentación de instancias eran necesarias tres fases: diferenciar las instancias, estimar las máscaras y categorizar objetos. Para ello usaron una red con tres etapas en cascada que se encargará de cada una de estas fases. Como se puede observar en la Figura 3.15, todas las fases comparten el mapa de características extraído de la entrada con una red neuronal convolucional (por ejemplo VGG-16[ 38 ]). Destacar que cada fase tiene un termino en la función de pérdidas, pero las pérdidas de cada fase dependen de las anteriores. Figura 3.15 Estructura de MNC. Fuente: [51]. Mask R-CNN [ 52 ], propuesto por He et al., realiza segmentación de instancia tras la detección generando múltiples mascaras simultaneas. Mask R-CNN es una ampliación de Faster R-CNN[ 53 ], que aporta una rama que consta de dos fases: una primera que llamada Region Proposal Network que detecta objetos y propone cajas contenedoras de éstos, mientras la segunda extrae características de cada región y clasificará los objetos en estas. Mask R-CNN añade una rama que, en paralelo, realiza una predicción de mascaras de los objetos. Para el entrenamiento definieron una función de pérdidas que desacoplan las mascaras de las predicciones de clases. Figura 3.16 Estructura de Mask R-CNN. Fuente: [52]. La generación de cajas contenedoras hace estos modelos computacionalmente eficientes, sin embargo necesitarán procedimientos de alineamiento costosos. Además estos modelos necesitan generar una mascara de cada instancia. Para evitar esto, se introdujeron modelos basados en máscaras de segmentación en vez de modelos basados en la detección.
3.2 Redes Neuronales 33 Métodos basados en máscaras de segmentación Pinheiro et al. presentaron DeepMask [ 54 ]. Esta red está formada por una primera fase en la que se extraen mapas de características con un modelo de VGG preentrenado y modificado para conservar la información espacial. Tras esto, la red se divide en dos ramas: una pensada para la segmentar y clasificar el objeto que aparece en el centro de parches de la imagen y la otra para predecir si estos parches satisfacen dos condiciones: que un objeto esté centrado en el parche y que esté en la escala apropiada. La salida de esta segunda rama es una puntuación que indica la presencia de un objeto en el centro del parche. La estructura de DeepMask se puede ver en la Figura 3.17. Figura 3.17 Estructura de DeepMask. Fuente: [54]. Debido a la simplicidad y efectividad mostrada por DeepMask, los mismos autores presentaron SharpMask [ 55 ] tomándola como punto de partida. Como se puede observar en la Figura 3.18, SharpMask contiene un camino de subida y un camino de bajada. El camino de subida consiste en una arquitectura DeepMask. El camino de bajada, depura el resultado del camino de subida con un módulo de refinamiento, que aumenta el tamaño de la imagen en cada paso usando características de las capas de subida respectivas. El proceso continúa hasta que el tamaño de la imagen es restaurado, dando como resultado las máscaras de los objetos. Figura 3.18 a) Diagrama de SharpMask b) Modulo de refinamiento. Fuente: [55]. Los métodos basados en máscaras de segmentación consiguen modelos con mayor precisión. Sin embargo, no tienen la capacidad de capturar instancias de objetos con diferentes escalas.
34 Capítulo 3. Estado del arte Métodos basados en incorporación de características multiescalares MultiPath Network [ 56 ] presentada por Zagoruko et al. realiza tres modificaciones del modelo Fast R-CNN[ 57 ]. La primera modificación es la incorporación de conexiones de salto, que le dan al detector de objetos acceso a características de diferentes capas de la red. La segunda, un elemento de escalado para la explotación de contextos de objetos con diferentes resolución. Finalmente, una función de pérdidas integral. La Figura 3.19 muestra la arquitectura de MultiPath Network. Los mapas de características son extraídos de la imagen de entrada usando VGG16. Tras esto, usando conexiones de salto, estos mapas de características van a cuatro regiones escaladas. La salida de estas regiones se concatenan para la clasificación y la regresión de los cuadros delimitadores. Finalmente combinaron esta red con DeepMask, adaptándola para predecir máscaras de segmentación a partir de los cuadros delimitadores. Figura 3.19 Arquitectura de Multipath Network. Fuente: [56]. Este modelo intenta incorporar mapas de características multi-escalares para volverse invariante a la escala y agrega conexiones de salto para incorporar información contextual para una mejor segmentación. Sin embargo, carece de conocimiento sobre la posición relativa de las instancias de objetos. Métodos basados en en capturar la posición relativa de las instancias Dai et al. usaron el concepto de posición relativa en una red neuronal totalmente convolucional (FCN) y propusieron una red totalmente convolucional sensible a instancias múltiples llamado InstanceFCN [ 51 ]. Usaron un modelo pre-entrenado de VGG-16 para extraer los mapas de características. Éstos mapas de características son procesados por dos ramas convolucionales: una de ellas para estimar instancias y la otra para puntuar las instancias. Figura 3.20 Arquitectura de InstanceFCN. Fuente: [51].
3.2 Redes Neuronales 35 La primera rama genera una rejilla de tamaño kxk para recoger las posiciones relativas, la ultima capa convolucional tiene k 2 canales de salida correspondiente a los k 2 mapas de puntuación. Esta rama es la rama superior en la Figura 3.20. Sobre este mapa de puntuaciones se usa un modulo de ensamblaje para generar los objetos de instancias en una ventana deslizante de 21x21 pixels. La segunda rama, la inferior en la Figura 3.20, predice la probabilidad de que cada una de las ventanas contengan un objeto. Las ventanas con mayor puntuación son las correctas. MaskLab[58] combina las ventajas de los métodos basados en la detección y los basados en la segmentación semántica. MaskLab se construye sobre Faster R-CNN[ 53 ] e incorpora segmentación semántica y características de dirección. La arquitectura de MaskLab puede verse en Figura 3.21. Figura 3.21 Arquitectura de MaskLab. Fuente: [58]. Chen et al. presentaron TensorMask [ 59 ]. El principal concepto de esta arquitectura es el uso de tensores 4D como mascaras sobre la región de los objetos. Un tensor 4D es la unión de cuatro factores (V,U,H,W). El subtensor (H,W) representa la posición del objeto y (V,U) representa la posición relativa de la máscara de la instancia de un objeto. De la misma manera que FPN[ 60 ], TensorMask también tiene una estructura piramidal, llamada tensorbipyramid, para tener los beneficios de la multiescala. Métodos basados en propagación de características El flujo de información en la red neuronal convolucional es muy importante ya que los mapas de características de las primeras capas tienen mucha información en términos de localización, mientras que los de las últimas tienen un gran nivel de información de carácter semántico. Liu et al. se centraron en esta idea y propusieron PANet [ 61 ], cuya arquitectura se muestra en la Figura 3.22. Esta red toma como modelo base FPN[ 60 ] para extraer características en las diferentes capas. Posteriormente, para mejorar la jerarquía de características extraídas, utiliza un camino ascendente que aprovecha la precisión de las características de bajo nivel mediante conexiones laterales (Figura 3.22-(b)). Después de esto, se realiza un pooling adaptativo de las características de los diferentes niveles, cuya salida alimenta tres ramas que predicen la caja contenedora, la clase del objeto y la mascara de segmentación. Figura 3.22 Arquitectura de PANet. a) FPN b) Camino de aumento c) Agrupación de características adaptativa d) Rama de cajas contenedoras e) Fusión totalmente conectada. Fuente: [ 61 ].
36 Capítulo 3. Estado del arte Chen et al. presentaron Hybrid task cascade [ 62 ]. Esta arquitectura intercala la rama detección de cajas contenedoras con la con la de generación de máscaras, en vez de realizar las dos ramas en paralelo. De esta manera, la rama que genera las máscaras puede aprovechar las predicciones de cajas contenedoras. Por otro lado, una nueva rama que realiza predicción semántica se agrega fusionándose con las máscaras obtenidas para explorar información contextual. Un esquema de la arquitectura puede verse en la Figura 3.23. Figura 3.23 Arquitectura de Hybrid Task Cascade. Fuente: [62]. En la Tabla 3.2 podemos ver una comparativa de los métodos. Tabla 3.2 Comparativa de los diferentes modelos de segmentación de instancias en terminos de la media de la precisión como intersección sobre la unión. Modelo Año Dataset Usado Precisión media de IoU Hybrid Task Cascade 2019 Microsoft COCO 43.9% PANet 2018 Microsoft COCO 42.0% MaskLab+ 2017 Microsoft COCO 38.1% TensorMask 2019 Microsoft COCO 37.3% Mask R-CNN 2017 Microsoft COCO 37.1% SharpMask 2016 Microsoft COCO 25.1% MultiPath Network 2016 Microsoft COCO 25.0% DeepMask 2015 Microsoft COCO NS%
4 Análisis del problema y solución propuesta Lo mejor es enemigo de lo bueno François-Marie Arouet Se proponen dos alternativas para la resolución del problema de la segmentación de barcos en imágenes aéreas. La primera de ellas basada en segmentación semántica utilizando una combinación de dos modelos, un clasificador ResNet y un segmentador Unet (ensemble). La segunda solución se basa en segmentación de instancias, haciendo uso de la arquitectura Mask-rcnn. (a) Imagen original. (b) Segmentación semántica. (c) Segmentación de instancias. Figura 4.1 Diferencias entre segmentación en el dataset de Airbus. Primero se realizará un estudio de las datos proporcionados para, posteriormente, comenzar a entrenar los modelos de clasificación, segmentación. 4.1 Entorno de trabajo 4.1.1 Equipo utilizado Para una primera aproximación con la base de datos, el tratamiento y estudio de los datos que ésta traía, se hizo uso de un equipo portátil Lenovo x270. Posteriormente, para la fase de entrenamiento 37
38 Capítulo 4. Análisis del problema y solución propuesta del primer modelo se optó por el uso de los notebooks que la plataforma Kaggle pone a nuestra disposición de manera gratuita. Para el segundo modelo, se utilizaron notebooks de Google Colab. Las características de los entornos utilizados se resumen en la Tabla 4.1: Tabla 4.1 Características técnicas. Características Portátil Kaggle Google Colab Nvidia GPU x Tesla P100 Tesla K80 GPU RAM x 17GB 12GB CPU Chip Intel CORE i5 Intel Xeon CPU Intel Xeon CPU CPU RAM 8Gb 16,4GB 13,3GB Tiempo de sesión máximo Ilimitado 9h 12h Tiempo de semanal de uso Ilimintado 30h ns 4.1.2 Bibliotecas utilizadas Pytorch Biblioteca de código abierto para el aprendizaje automático basada en Torch, muy utilizada para visión artificial y procesamiento de lenguajes natural. En ella se define una clase tensor que son similares a vectores pero con los que se pueden operar en GPUs de Nvidia compatibles con CUDA, haciendo posible operaciones en paralelo. Fast.ai Una biblioteca programada sobre Pytorch que incorpora componentes de alto nivel de abstracción que pueden proporcionar de forma sencilla y rápida las herramientas necesaria la carga de los datasets, para el entrenamiento de arquitecturas actuales. IceVision Un framework que agrega a fast.ai la posibilidad de entrenar una mayor cantidad de arquitecturas, entre ellas Mask-rcnn, que es la que se ajustará para el segundo modelo propuesto. Scikit-image Una biblioteca para el tratamiento de imágenes muy util para el procesado y postprocesado de las máscaras.
4.2 Descripción del problema 39 4.2 Descripción del problema Como ya se explicó en la Sección 1.2, el problema consiste en dar solución a un reto de Kaggle propuesto por Airbus. A continuación se analizará el conjunto de datos proporcionado y la métrica de evaluación 4.2.1 Conjunto de Datos (Dataset) El conjunto de datos que se usará para el entrenamiento, validación y test es proporcionado por Airbus y se puede encontrar en la propia competición de Kaggle[1]. Este conjunto de entrenamiento tiene asociada una verdad de referencia recogida en un documento CSV (del inglés Comma-Separated Values). En este documento aparece una entrada por barco encontrado con el nombre de la imagen y los píxeles pertenecientes a la máscara de segmentación del barco. Cada entrada sigue la dupla [imagen.jpg,máscara] . De esta manera, una imagen aparecerá tantas veces en el dataset como barcos contenga. Las máscaras de segmentación están codificados en formato RLE (Run-Length Encoding). Para una explicación extendida de la codificación RLE y las funciones que hemos usado para su decodificación y codificación, ver Apéndice A. Análisis del dataset El dataset se compone de un conjunto de imágenes de 768x768 píxeles de tamaño. Haciendo un primer análisis, se observa que hay 192556 imágenes con verdad de referencia (que serán usadas para entrenamiento y validación) y 15606 imágenes para el test. En el conjunto de imágenes de entrenamiento/validación hay 150000 imágenes sin barcos y 42556 con barcos, entre las que aparecen 81723 barcos en total. Por otro lado distribución de cantidad de barcos por imagen, se puede ver en el siguiente gráfico. Figura 4.2 Distribución de imágenes por barcos que contienen en dataset original. Problema con el dataset Varios participantes en la competición advirtieron que las imágenes que componen el dataset son recortes de imágenes de satélite más grandes. Como se puede ver en la reconstrucción de la Figura 4.3 Los recortes se realizaron utilizando una ventana deslizante con un salto de 256 píxeles. Debido a esta forma de generar el conjunto de entrenamiento/validación aparece una gran cantidad de redundancia,con imágenes con zonas que se superponen. Esta redundancia hace que dispongamos de una gran cantidad de datos de entrada que no aportan nueva información para la extracción de características. No solo esto, sino que además, al hacer una división de manera aleatoria entre entrenamiento y validación, se introducirían filtraciones de datos
40 Capítulo 4. Análisis del problema y solución propuesta Figura 4.3 Recuperación de imagen original a partir de diferentes cortes. Fuente: [63]. del conjunto de entrenamiento al de validación, produciendo unos resultados engañosos en la fase de validación. Tras hacer un filtrado de éstas imágenes, las imágenes con barcos sin zonas superpuestas se reduciría de 42556 a 8635 imágenes en las cuales aparecen 15912 barcos. 4.2.2 Métrica de evaluación La métrica de validación que se usará para evaluar la competición es la función F2para diferentes umbrales de la intersección sobre la unión ( IoU ). La IoU se calculará para cada máscara siguiendo la Ecuación 4.1: IoU(A,B) = A∩B A∪B(4.1) Se calculará entonces la F2 , considerando valores positivos las máscaras cuya IoU superen los umbrales de 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9 y 0.95. Para cada uno de valores umbrales, la F2se calculará teniendo en cuenta la cantidad de verdaderos positivos, falsos negativos y falsos positivos siguiendo la Ecuación 4.2: Fβ(t) = (1+β2)·TP(t) (1+β2)·FP(t)+β2FN(t)+FP(t)(4.2) Donde β=2 . Se considera verdaderos positivos cuando una detección coincide con la verdad de referencia, falsos negativos cuando, existiendo en la verdad de referencia, no se encuentra en la detección y falsos positivos cuando una detección que no coincide con la verdad de referencia o no supera el umbral. La métrica F2 le dará 2 veces más importancia al recall que a la precisión, penalizando los falsos negativos [5]. En el Apéndice C se hace un repaso de las métricas más usadas. Para cada imagen, se obtendrá el valor medio de la F2como: ¯ F2=1 10 0.95 ∑ 0.5 F2(t)(4.3) Finalmente la puntuación resultante se obtiene haciendo la media de los valores de F2 medios calculados para cada una de las imágenes del dataset.
4.3 Primer modelo propuesto 41 4.3 Primer modelo propuesto Para este primer modelo predictivo se propone una combinación de dos arquitecturas trabajando conjuntamente. La primera de ellas conforma un modelo clasificador que reconoce la presencia de barcos y la segunda un modelo que segmenta barcos en las imágenes. Debido al gran desbalance del dataset entre imágenes que no contienen barcos y las que sí, primero se usa un modelo clasificador que filtrará todas las imágenes que no contengan barcos para, posteriormente, utilizar un segundo modelo entrenado exclusivamente para la segmentación en imágenes que sí contengan barcos. Clasificador ¿Ship == TRUE? Segmentador SÍ Máscara vacía NO Post-procesado y codificacion RLE Figura 4.4 Esquema del primer modelo propuesto. Además, este enfoque eliminará posibles falsos positivos en la segmentación, que, debido a la métrica usada para evaluar la competición, penalizaría mucho la puntuación final. Por otro lado, un clasificador binario que reconozca la presencia de barcos, hace que se reduzca una gran carga en la fase de aprendizaje del modelo encargado de la segmentación. Esto es debido a que éste sólo ajustará sus pesos sobre imágenes en las que existen barcos, que como ya vimos anteriormente, es un grupo mucho más reducido que el conjunto total. 4.3.1 Entrenamiento de los modelos Para el proceso de entrenamiento, en ambos modelos, se han realizado varias modificaciones del dataset. Por un parte, se ha efectuado un filtrado de las imágenes con zonas repetidas, como se explicó en el apartado de la Subsección 4.2.1. Por otro lado, se recortó cada imagen de 768x768 en trozos de 256x256 junto las máscaras que les corresponden para mejorar el rendimiento en memoria. De esta manera se reduce el tamaño de las imágenes, sin perder resolución espacial como ocurre con otras opciones como el escalado. 768px 768px 256px 256px 9 256px 256px 9 Recorte Figura 4.5 Recorte de imágenes de dataset y de las máscaras. Como se puede observar en la Figura 4.5, además del recorte se modificaron las máscaras, incluyendo un nuevo tipo de etiqueta para los espacios de separación entre los barcos que se encuentran muy cerca. Con esto se favorece que el modelo segmentador separe los barcos que se encuentran muy próximos.
48 Capítulo 4. Análisis del problema y solución propuesta valor umbral se considera como detectado el barco, por debajo de este se tendría como no detectado. De manera que una detección que supere el umbral se considerará verdadero positivo, una detección que no corresponda con ninguna máscara de referencia o no supere el umbral será falso positivo y una máscara de referencia a la que no corresponde ninguna detección falso negativo. Los verdaderos negativos no se han tenido en cuenta al tratarse del fondo. En la Figura 4.13 se muestran las distintas matrices de confusión para los diferentes umbrales seleccionados. (a) Umbral 0,5. (b) Umbral 0,6. (c) Umbral 0,7. (d) Umbral 0,8. (e) Umbral 0,9. (f) Umbral 0,95. Figura 4.13 Matrices de confusión según umbral de IoU. Se puede apreciar cómo el modelo muestra un buen comportamiento en los valores bajos del umbral, con un 56,62 % de verdaderos positivos en el umbral 0,5 , una precisión de 0,71 , un recall de 0,74 y una F2 de 0,73 . A medida que aumenta el umbral, van disminuyendo los verdaderos positivos y aumentando los falsos positivos. Aunque la cantidad de verdaderos positivos se mantiene hasta llegar al umbral 0,8 , donde caen a un 27,43 % , siendo sobrepasados por los falsos positivos que pasan a ser el 52,38 % , quedando una precisión de 0,34 , un recall de 0,57 y una F2 de 0,51. Finalmente, en el umbral más exigente, la cantidad de verdaderos positivos se hunde en un 0,73 % , siendo la gran mayoría los falsos positivos con un 79,08 % . La precisión, el recall y la F2 pasarían a tener valores cercanos a cero. Para ver cómo se comporta el modelo según la cantidad de barcos que aparecen en las imágenes, se analiza la distribución de verdaderos positivos en función de los barcos detectados en las imágenes. En la Figura 4.14 pueden verse las distribuciones de los verdaderos positivos según los valores umbral de la IoU (en naranja) y la distribución de la cantidad de barcos en las imágenes (en azul). En las gráficas se puede ver cómo, ya con valores bajos de umbralización, el modelo tiende a no detectar todos los barcos cuando aparecen muchos en la imagen. A medida que va aumentando el umbral, se van perdiendo las detecciones de la totalidad de los barcos . Para el umbral 0,5 no es capaz de detectar más de 10 barcos simultáneos, al subirlo a 0,6 el límite está en 9 barcos, para 0,6 en 8, descendiendo más rápidamente para los umbrales 0,8 , 0,9 y 0,95 donde la máxima cantidad de barcos simultáneos que detecta son 7, 5 y 1 respectivamente.
4.3 Primer modelo propuesto 49 (a) Umbral 0,5. (b) Umbral 0,6. (c) Umbral 0,7. (d) Umbral 0,8. (e) Umbral 0,9. (f) Umbral 0,95. Figura 4.14 Distribución de verdaderos positivos según umbral de IoU. Mejores casos A continuación, se recogen varios casos donde el modelo ha mostrado mejores resultados según la intersección sobre la unión media: Figura 4.15 Mejores casos de ensemble.
50 Capítulo 4. Análisis del problema y solución propuesta Peores casos A continuación, se muestran los casos donde el modelo ha mostrado peores resultados según la intersección sobre la unión media: Figura 4.16 Peores casos de ensemble. Resultados en la competición Una vez dado por bueno el modelo, se hacen pasar por éste las 15606 imágenes proporcionadas por Airbus para el test, generando un csv que se presenta a la competición. Los resultados son analizados por la plataforma Kaggle utilizado la métrica explicada en la Subsección 4.2.2. El resultado del primer modelo presentado en la competición es de 0.84037 en la puntuación privada y 0.72426 en la pública. Lo que situaría al modelo en el puesto 145 en el ranking privado y en el 129 del ranking publico.
4.4 Segundo modelo propuesto 51 4.4 Segundo modelo propuesto El segundo modelo propuesto utiliza una arquitectura habitualmente utilizada para la segmentación de instancias: Mask-rcnn[ 53 ]. Para ello se usó el framework IceVision[ 65 ]. Este framework requiere que el dataset sea transformado al formato del dataset COCO[ 66 ]. Para ello, primero se modificó el csv original para incluir las cajas contenedoras en una nueva columna, con el código adjunto en Apéndice B.2. Posteriormente, a la hora de cargar los datos, se utilizaron las herramientas que incluye IceVision. 4.4.1 Entrenamiento de la arquitectura Primero se instalan e importan las librerías necesarias. Código 4.9 Importado de librearías IceVision. # IceVision - IceData - MMDetection - YOLO v5 Installation !wget https://raw.githubusercontent.com/airctic/icevision/master/ install_colab.sh !chmod +x install_colab.sh && ./install_colab.sh #Librerías from icevision.all import * import pandas as pd Seguidamente es necesario preparar el dataset para ser cargado. Para ello se define una clase que se encargará de analizar y registrar todos los datos necesarios del dataset y convertir las anotaciones al formato del dataset COCO. Código 4.10 Clase para cargar los datos en Mask-rcnn. class ShipsParser(Parser): def __init__(self, template_record, data_dir): super().__init__(template_record=template_record) self.data_dir = data_dir self.df = dfwships self.class_map = ClassMap(list([’background’,’ship’])) def __iter__(self) -> Any: for o in self.df.itertuples(): yield o def __len__(self) -> int: return len(self.df) def record_id(self, o): return o.ImageId def parse_fields(self, o, record, is_new): if is_new: record.set_filepath(self.data_dir+’/’+o.ImageId) record.set_img_size(ImgSize(width=768, height=768))
52 Capítulo 4. Análisis del problema y solución propuesta record.detection.set_class_map(self.class_map) if isinstance(o.bbox,str): xmin,ymin,w,h=o.bbox[1:-1].split(’, ’) xmin=int(xmin) ymin=int(ymin) w=int(w) h=int(h) record.detection.add_bboxes([BBox.from_xywh(xmin, ymin, w, h)]) kg=list(map(int, o.EncodedPixels.split(’ ’))) record.detection.add_masks([RLE.from_kaggle(kg)]) record.detection.add_labels([’ship’]) De este código es importante puntualizar la transcodificación realizada de la RLE de Kaggle a la codificación RLE utilizada en el dataset COCO, que se define de forma diferente. Esta transcodificación ya estaba incluida en el framework IceVision, sin embargo fue necesario hacer una pequeña modificación en el método from_kaggle para que no produjese errores. La modificación de este método se ha adjuntado en el Apéndice B.3. A continuación, se analiza y registra el dataset, efectuando la separación entre los datasets de entrenamiento y validación. Código 4.11 División del conjunto de entrenaminto y de validación. template_record = InstanceSegmentationRecord() parser = ShipsParser(template_record,’/content/train_v2’) train_records, valid_records = parser.parse(data_splitter=RandomSplitter ([0.80, 0.20], seed=42)) Lo siguiente es establecer las trasnformaciones que se aplicarán a los datasets y generar los datasets de entrenamiento y validación. Código 4.12 Data augmentation dataset. SIZE=384 PRESIZE=768 # Datasets train_tfms = tfms.A.Adapter([*tfms.A.aug_tfms(size=SIZE, presize=PRESIZE , shift_scale_rotate=None), tfms.A.RandomScale(), tfms.A.Normalize() ]) valid_tfms = tfms.A.Adapter([*tfms.A.resize_and_pad(size=768), tfms.A. Normalize()]) train_ds = data.dataset.Dataset(train_records,train_tfms) valid_ds = data.dataset.Dataset(valid_records,valid_tfms) Produciendo de esta manera diferentes versiones de una misma imagen rotándola e introduciendo cambios de escala, como se puede ver en la Figura 4.17.
4.4 Segundo modelo propuesto 53 Figura 4.17 Imagen con instancias tras data augmentation. Posteriormente se carga la arquitectura a utilizar, que será Mask-rcnn sobre ResNet34. Código 4.13 Carga de arquitectura. model_type = models.torchvision.mask_rcnn backbone = model_type.backbones.resnet34_fpn() Tras esto se cargan los datasets en lotes. En esta ocasión se eligió un batch size de 8 imágenes por lote. Código 4.14 Carga de datasets por lotes. # DataLoaders train_dl = model_type.train_dl(train_ds, batch_size=8, num_workers=4, shuffle=True) valid_dl = model_type.valid_dl(valid_ds, batch_size=8, num_workers=4, shuffle=False) Finalmente, se carga el modelo, con sus respectivos lotes de entrenamiento y validación y se ejecuta el método lr_find() para encontrar una tasa de aprendizaje apropiada, produciendo la salida de la Figura 4.18 Código 4.15 Carga de los lotes al modelo. model = model_type.model(backbone=backbone, num_classes=2) learn = model_type.fastai.learner(dls=[train_dl, valid_dl], model=model) learn.lr_find() Figura 4.18 Salida de lr_find en Mask-rcnn.
54 Capítulo 4. Análisis del problema y solución propuesta Para terminar ejecutamos el método para iniciar el entrenamiento. El modelo se entrenó durante 50 épocas. La evolución de las funciones de pérdidas de entrenamiento y validación se pueden observar en la Figura 4.19. Código 4.16 Entrenamiento del modelo. learn.fine_tune(50, 1e-4, freeze_epochs=1) Figura 4.19 Evolución de las perdidas durante el entrenamiento. 4.4.2 Inferencia Para realizar la inferencia se cargaron las imágenes por lotes para optimizar el tiempo de inferencia. Código 4.17 Inferencia por lotes. path=’/content/’ bunches=generate_bunch(df.ImageId.values,bs=1000) out_pred_rows=[] for bunch in tqdm(bunches): datos=images_load(bunch) infer_ds = Dataset.from_images(datos, valid_tfms) infer_dl = model_type.infer_dl(infer_ds, batch_size=10) preds = model_type.predict_from_dl(model=model, infer_dl=infer_dl) del datos for i, pred in enumerate(preds): if pred.pred.detection.masks.data.shape[0] == 0: out_pred_rows += [{’ImageId’: bunch[i], ’EncodedPixels’: np. nan}] else: for mask in pred.pred.detection.masks.data: rle=rle_encode(mask) out_pred_rows += [{’ImageId’: bunch[i], ’EncodedPixels’: rle}] submission_df = pd.DataFrame(out_pred_rows)[[’ImageId’, ’EncodedPixels’ ]]
4.4 Segundo modelo propuesto 55 4.4.3 Análisis de resultados Para estudiar el desempeño del modelo se ha tomado el mismo conjunto de datos para la validación que en la Subsección 4.3.3. También se han establecido los mismos umbrales en la intersección sobre la unión que en el anterior modelo. En la Figura 4.20 se muestran las diferentes matrices de confusión para los diferentes umbrales seleccionados. (a) Umbral 0,5. (b) Umbral 0,6. (c) Umbral 0,7. (d) Umbral 0,8. (e) Umbral 0,9. (f) Umbral 0,95. Figura 4.20 Matrices de confusión según umbral de IoU. En la figura anterior puede verse que, ya en valores bajos del umbral, el rendimiento del modelo es bastante bajo, con un 47,79 % de verdaderos positivos, y lo peor de todo, con una alta cantidad de falsos positivos ( 45,59 % ), que hacen que tenga una precisión de 0,51 , un recall de 0,88 y una F2 de 0,76 . Como en el anterior modelo, a medida que se va aumentando el umbral, van disminuyendo los verdaderos positivos y aumentando los falsos positivos. Disminuyendo los verdaderos positivos un 5 % en el paso del umbral 0,5 al 0,6 y un 10 % cuando pasa de 0,6 a 0,7 . Al aumentar más el valor del umbral la cantidad de verdaderos positivos decae a un 18,58 % para el umbral 0,8 , a un 3,24 % para 0,9y un 0,07 % para 0,95. En este modelo cabe destacar que el recall se encuentra bastante alto hasta el umbral 0,9 disminuyendo muy rápidamente la precisión, una muestra de que el modelo está sobreajustado y devuelve muchos falsos positivos. En la Figura 4.21 pueden verse las distribuciones de los verdaderos positivos según los valores umbral de la IoU. Como ocurría con el anterior modelo, éste también tiende a no recuperar la totalidad de los barcos cuando aparecen una gran cantidad de éstos en las imágenes. Sin embargo, para el umbral de 0,5 , es capaz de segmentar más barcos simultáneos, llegando a segmentar hasta 12 barcos en la misma imagen. Con el umbral en 0,6 su límite superior está en 11 barcos. En 0,7 el límite superior es similar al del anterior modelo: 8 barcos. Con el resto de umbrales, tanto el límite como la cantidad de verdaderos positivos detectados decrece rápidamente con 7, 3 y 1 barco simultáneo detectado.
56 Capítulo 4. Análisis del problema y solución propuesta (a) Umbral 0,5. (b) Umbral 0,6. (c) Umbral 0,7. (d) Umbral 0,8. (e) Umbral 0,9. (f) Umbral 0,95. Figura 4.21 Distribución de verdaderos positivos según umbral de IoU. Mejores casos A continuación, se recogen varios casos donde el modelo ha mostrado mejores resultados según la intersección sobre la unión media: Figura 4.22 Mejores casos de Mask-rcnn.
4.4 Segundo modelo propuesto 57 Peores casos A continuación, se recogen varios casos donde el modelo ha mostrado peores resultados según la intersección sobre la unión media: Figura 4.23 Peores casos de Mask-rcnn. Resultados en la competición Una vez dado por bueno el modelo, se hacen pasar por éste las 15606 imágenes proporcionadas por Airbus para el test, generando un csv que se presenta a la competición. Los resultados son analizados por la plataforma Kaggle utilizado la métrica explicada en la Subsección 4.2.2. El resultado del segundo modelo presentado en la competición, como cabía de esperar por las pruebas de validación, es mucho peor que el del primero. Su nota es de 0,78902 en la puntuación privada y 0,65212 en la pública. Lo que situaría a éste modelo en el puesto 649 en el ranking privado y en el 615 del ranking publico.
Apéndice B Funciones importantes usadas B.1 Recorte de imágenes y generación de máscaras Código B.1 Función de recorte de imágenes. def trata_mask(image_name): rle=masks_df.query(’ImageId=="{0}.jpg"’.format(image_name))[’ EncodedPixels’] image=image_open(os.path.join(’../input/airbus-ship-detection/ train_v2’,’{0}.jpg’.format(image_name))) labels = label(masks_as_image(rle)) tmp = dilation(labels > 0, square(9)) tmp2 = watershed(tmp, labels, mask=tmp, watershed_line=True) > 0 tmp = tmp ^ tmp2 tmp = dilation(tmp, square(7)) msk = (255 * tmp).astype(’uint8’) props = measure.regionprops(labels) msk0 = 255 * (labels > 0) msk0 = msk0.astype(’uint8’) msk1 = np.zeros_like(labels, dtype=’bool’) max_area = np.max([p.area for p in props]) for y0 in range(labels.shape[0]): for x0 in range(labels.shape[1]): if not tmp[y0, x0]: continue if labels[y0, x0] == 0: if max_area > 4000: sz = 6 else: sz = 3 else: 65
66 Capítulo B. Funciones importantes usadas sz = 3 if props[labels[y0, x0] - 1].area < 300: sz = 1 elif props[labels[y0, x0] - 1].area < 2000: sz = 2 uniq = np.unique(labels[max(0, y0-sz):min(labels.shape[0], y0 +sz+1), max(0, x0-sz):min(labels.shape[1], x0+sz+1)]) if len(uniq[uniq > 0]) > 1: msk1[y0, x0] = True msk0[y0, x0] = 0 msk1 = 255 * msk1 msk1 = msk1.astype(’uint8’) msk2 = np.zeros_like(labels, dtype=’uint8’) msk = np.stack((msk0, msk1, msk2)) msk = np.rollaxis(msk, 0, 3) mascaras=img_crop(msk) recortes=img_crop(image) for n, recorte in enumerate(recortes): recorte_name=random_name() imsave(os.path.join(’masks’,’{0}.tif’.format(recorte_name)), mascaras[n],check_contrast=False,compress=’lzma’) imsave(os.path.join(’crops’,’{0}.jpg’.format(recorte_name)), recorte,quality=100,check_contrast=False) return 0 B.2 Generacíon de cajas contenedoras a partir de csv Código B.2 Código para generar cajas contenedoras. bboxes_dict = {} for image in tqdm(images_unique): rle_0 = masks.query(’ImageId=="’+image+’"’)[’EncodedPixels’] mask_0 = masks_as_image(rle_0) props = regionprops(mask_0) bboxes = [] for prop in props: bboxes.append(prop.bbox) bboxes_dict[image] = bboxes.copy() bboxes_df = pd.DataFrame([bboxes_dict]) bboxes_df = bboxes_df.transpose() bboxes_df.columns = [’bbox_list’] bboxes_df.to_csv(’bbox_dictionary.csv’, encoding=’utf-8-sig’)
B.3 Modificaciones a la API de IceVision 67 B.3 Modificaciones a la API de IceVision Código B.3 Método from_kaggle modificado. def from_kaggle(cls, counts: Sequence[int]): if len(counts) % 2 != 0: raise ValueError("Counts must be divisible by 2") current = 1 coco_counts = [] for start, count in zip(counts[::2], counts[1::2]): coco_counts.append(start - current) # zeros coco_counts.append(count) # ones current = start + count #Modificacion coco_counts.append(768*768-current+1) # remove trailing zero if coco_counts[-1] == 0: coco_counts.pop(-1) return cls.from_coco(coco_counts) B.4 Generación de lotes para la inferencia Código B.4 Función para cargar lotes de imágenes. def images_load(batch): images=[] for file in tqdm(batch): imagen=image_open(path+’/test_v2/’+file) images.append(imagen) return images Código B.5 Función para generar lotes de imágenes. def generate_bunch(arr,bs=1000): out=[] for i in range(len(arr)//bs): out.append(arr[:bs]) arr=arr[bs:] if len(arr) != 0:
68 Capítulo B. Funciones importantes usadas out.append(arr) return out B.5 Análisis de rendimiento de modelos Se ha usado la biblioteca umetrics de https:// github.com/ quantumjot/ unet_segmentation_metrics. Código B.6 Función para calcular las métricas. def get_stats(th=0.5): df = pd.DataFrame(columns=(’file’, ’n_true_labels’, ’n_pred_labels’,’ n_true_positives’,’n_false_positives’,’n_false_negatives’,’ per_object_IoU’,’IoU_med’,’f2’)) #recorre directamente el directorio con las mascaras for archivo in tqdm(os.listdir(’/content/drive/MyDrive/airbus/mascaras /gt/’)) : y_true=imread(’/content/drive/MyDrive/airbus/mascaras/gt/’+archivo) y_pred=imread(’/content/drive/MyDrive/airbus/mascaras/pred/’+archivo ) result=umetrics.calculate(y_true, y_pred, strict=True, iou_threshold =th) f2=(5*result.n_true_positives)/(5*result.n_true_positives+4*result. n_false_negatives+result.n_false_positives) #guarda el resultado en un csv [nombre, n] entrada= pd.DataFrame([[archivo, result.n_true_labels,result. n_pred_labels,result.n_true_positives,result.n_false_positives, result.n_false_negatives,result.per_object_IoU,np.mean(result. per_object_IoU),f2]], columns=(’file’, ’n_true_labels’, ’ n_pred_labels’,’n_true_positives’,’n_false_positives’,’ n_false_negatives’,’per_object_IoU’,’IoU_med’,’f2’)) df=df.append(entrada,ignore_index=True) return df
Apéndice C Métricas de validación En el siguiente apéndice se hace un repaso de las métricas empleadas para medir el rendimiento de modelos predictivos. C.1 Precisión La precisión mide el ratio de verdaderos positivos, entre todos los positivos que ha devuelto el modelo. De manera que: Precision =TP T P +FP (C.1) C.2 Recall El recall (o exhaustividad) mide la cantidad de verdaderos positivos entre todos los verdaderos positivos existentes. Que se puede expresar como: Recall =T P T P +FN (C.2) C.3 IoU La IoU o intersección sobre la unión es una métrica para medir la similitud entre una máscara predicha y la perteneciente a la verdad de referencia. Sigue la siguiente ecuación: IoU =Mascarapred ∩Mascarare f Mascarapred ∪Mascarare f (C.3) De manera que el resultado llegaría a su máximo cuando las máscaras estén perfectamente alineadas. 69
Índice de Figuras 2.1 Convención de ejes utilizada para la representación de imágenes digitales 3 2.2 Diferentes resoluciones y profundidades de píxel. En la primera fila disminuye la resolución y en la segunda disminuye la profundidad de píxel 4 2.3 Planos de color RGB. Fuente: [3] 4 2.4 Operaciones individuales 5 2.5 Posición de los píxeles transformados (azules) frentes a los de la imagen final (verdes) 6 2.6 Efecto de diferentes mascaras de convolución 8 2.7 Diagrama conceptual de I.A., M.L. y D.L. Fuente: [4] 9 2.8 Evolución de las técnicas de Inteligencia Artificial. Las etapas automatizadas del proceso han sido sombreadas. Fuente: [5] 9 2.9 Modelo de Hodking-Huxley. Fuente: [5] 10 2.10 Modelo estándar de neurona artificial. Fuente: [8] 11 2.11 Función logística y su derivada 12 2.12 Función tangente hiperbólica y su derivada 13 2.13 Función ReLU y su derivada 13 2.14 Redes neuronales feed-forward 14 2.15 Red neuronal competitiva 14 2.16 Red neuronal recurrente 15 2.17 Error de neurona oculta propagándose por un camino 17 2.18 Error de neurona oculta propagándose por la red 17 2.19 Efecto de diferentes tasas de aprendizaje. Fuente [15] 19 2.20 Regresiones lineales con distintos ajustes. Fuente [16] 19 2.21 Evolución del error en el conjunto de entrenamiento (azul) y el de validación (rojo). Fuete: [17] 20 2.22 Ejemplo del uso de Dropout en una Red Neuronal Profunda 21 2.23 Esquema habitual de una Red Neuronal Convolucional. Fuente: [20] 22 3.1 Clasificación, detección de objetos, segmentación semántica y de instancias. Fuente:[21] 23 3.2 Convolución Bidimensional. Fuente: [31] 25 3.3 Imagen de entrada y mapas de activaciones de una CNN. Fuente: [34] 25 3.4 Arquitectura de FCN. Fuente: [37] 26 3.5 Dilatednet con campo receptivo 3x3, 7x7 y 15x15. Fuente: [41] 27 3.6 DeepLab. Fuente: [42] 27 3.7 Arquitectura propuesta en Deconvnet. Fuente: [44] 28 71
72 Índice de Figuras 3.8 Arquitectura de U-net. Fuente: [45] 28 3.9 Arquitectura de SegNet. Fuente: [46] 28 3.10 Modulo de contexto de ParseNet. Fuente: [47] 29 3.11 A. Estructura general de GCN, B. Modulo de Convolución Global, C. Modulo de Refinamiento de Bordes. Fuente: [48] 29 3.12 Estructura de EncNet. Fuente: [49] 30 3.13 Atrous spatial Pyramid Pooling. Fuente: [42] 30 3.14 Estructura de PSPNet. Fuente: [50] 31 3.15 Estructura de MNC. Fuente: [51] 32 3.16 Estructura de Mask R-CNN. Fuente: [52] 32 3.17 Estructura de DeepMask. Fuente: [54] 33 3.18 a) Diagrama de SharpMask b) Modulo de refinamiento. Fuente: [55] 33 3.19 Arquitectura de Multipath Network. Fuente: [56] 34 3.20 Arquitectura de InstanceFCN. Fuente: [51] 34 3.21 Arquitectura de MaskLab. Fuente: [58] 35 3.22 Arquitectura de PANet. a) FPN b) Camino de aumento c) Agrupación de características adaptativa d) Rama de cajas contenedoras e) Fusión totalmente conectada. Fuente: [61] 35 3.23 Arquitectura de Hybrid Task Cascade. Fuente: [62] 36 4.1 Diferencias entre segmentación en el dataset de Airbus 37 4.2 Distribución de imágenes por barcos que contienen en dataset original 39 4.3 Recuperación de imagen original a partir de diferentes cortes. Fuente: [63] 40 4.4 Esquema del primer modelo propuesto 41 4.5 Recorte de imágenes de dataset y de las máscaras 41 4.6 Esquema de ResNet34 42 4.7 Salida de LR finder en ResNet 43 4.8 Imagen con máscara tras data augmentation 44 4.9 Evolución de función de perdidas durante el entrenamiento 45 4.10 Salida de lr_find en Unet 45 4.11 Efecto de apertura en post-procesado 47 4.12 Distribución de imágenes por barcos que contienen en dataset de validación 47 4.13 Matrices de confusión según umbral de IoU 48 4.14 Distribución de verdaderos positivos según umbral de IoU 49 4.15 Mejores casos de ensemble 49 4.16 Peores casos de ensemble 50 4.17 Imagen con instancias tras data augmentation 53 4.18 Salida de lr_find en Mask-rcnn 53 4.19 Evolución de las perdidas durante el entrenamiento 54 4.20 Matrices de confusión según umbral de IoU 55 4.21 Distribución de verdaderos positivos según umbral de IoU 56 4.22 Mejores casos de Mask-rcnn 56 4.23 Peores casos de Mask-rcnn 57 A.1 Ilustración de codificación Run-Length Encode 61
Índice de Tablas 3.1 Comparativa de los diferentes modelos de segmentación semántica en terminos de la media de la precisión como intersección sobre la unión 31 3.2 Comparativa de los diferentes modelos de segmentación de instancias en terminos de la media de la precisión como intersección sobre la unión 36 4.1 Características técnicas 38 4.2 Hiperparámetros en el modelo clasificador 43 4.3 Hiperparámetros en el modelo segmentador 46 73
80 Bibliografía [47] Wei Liu, Andrew Rabinovich, and Alexander C Berg. ParseNet: Looking Wider to See Better. 2015. [48] Chao Peng, Xiangyu Zhang, Gang Yu, Guiming Luo, and Jian Sun. Large kernel matters - Improve semantic segmentation by global convolutional network. In Proceedings - 30th IEEE Conference on Computer Vision and Pattern Recognition, CVPR 2017, volume 2017-Janua, pages 1743–1751, 2017. [49] Hang Zhang, Kristin Dana, Jianping Shi, Zhongyue Zhang, Xiaogang Wang, Ambrish Tyagi, and Amit Agrawal. Context Encoding for Semantic Segmentation. Proceedings of the IEEE Computer Society Conference on Computer Vision and Pattern Recognition, (January 2019):7151–7160, mar 2018. [50] Hengshuang Zhao, Jianping Shi, Xiaojuan Qi, Xiaogang Wang, and Jiaya Jia. Pyramid scene parsing network. In Proceedings - 30th IEEE Conference on Computer Vision and Pattern Recognition, CVPR 2017, volume 2017-Janua, pages 6230–6239, 2017. [51] Jifeng Dai, Kaiming He, and Jian Sun. Instance-Aware Semantic Segmentation via Multi-task Network Cascades. Proceedings of the IEEE Computer Society Conference on Computer Vision and Pattern Recognition, 2016-December:3150–3158, 2016. [52] Kaiming He, Georgia Gkioxari, Piotr Dollár, and Ross Girshick. Mask R-CNN. IEEE Transactions on Pattern Analysis and Machine Intelligence, 42(2):386–397, 2020. [53] Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. IEEE Transactions on Pattern Analysis and Machine Intelligence, 39(6):1137–1149, 2017. [54] Pedro O. Pinheiro, Ronan Collobert, and Piotr Dollar. Learning to segment object candidates. Advances in Neural Information Processing Systems, 2015-Janua:1990–1998, 2015. [55] Matthew D Zeiler and Rob Fergus. Visualizing and Understanding Convolutional Networks. 9905:480–494, nov 2013. [56] Sergey Zagoruyko, Adam Lerer, Tsung Yi Lin, Pedro O Pinheiro, Sam Gross, Soumith Chintala, and Piotr Doll r. A multipath network for object detection. In British Machine Vision Conference 2016, BMVC 2016, volume 2016-Septe, pages 15.1–15.12, 2016. [57] Ross Girshick. Fast R-CNN. In Proceedings of the IEEE International Conference on Computer Vision, volume 2015 Inter, pages 1440–1448, 2015. [58] Liang Chieh Chen, Alexander Hermans, George Papandreou, Florian Schroff, Peng Wang, and Hartwig Adam. MaskLab: Instance Segmentation by Refining Object Detection with Semantic and Direction Features. In Proceedings of the IEEE Computer Society Conference on Computer Vision and Pattern Recognition, pages 4013–4022, 2018. [59] Xinlei Chen, Ross Girshick, Kaiming He, and Piotr Dollar. TensorMask: A foundation for dense object segmentation. In Proceedings of the IEEE International Conference on Computer Vision, volume 2019-Octob, pages 2061–2069, 2019. [60] Tsung Yi Lin, Piotr Dollár, Ross Girshick, Kaiming He, Bharath Hariharan, and Serge Belongie. Feature pyramid networks for object detection. Proceedings - 30th IEEE Conference on Computer Vision and Pattern Recognition, CVPR 2017, 2017-January:936–944, 2017.
Bibliografía 81 [61] Shu Liu, Lu Qi, Haifang Qin, Jianping Shi, and Jiaya Jia. Path Aggregation Network for Instance Segmentation. (arXiv:1803.01534v3 [cs.CV] UPDATED). Cvpr, pages 8759–8768, 2018. [62] Kai Chen, Jiangmiao Pang, Jiaqi Wang, Yu Xiong, Xiaoxiao Li, Shuyang Sun, Wansen Feng, Ziwei Liu, Jianping Shi, Wanli Ouyang, Chen Change Loy, and Dahua Lin. Hybrid task cascade for instance segmentation. Proceedings of the IEEE Computer Society Conference on Computer Vision and Pattern Recognition, 2019-June:4969–4978, 2019. [63] Emil. My mistake | airbus ship detection challenge discussion. 2018. https:// www.kaggle. com/ c/ airbus-ship-detection/ discussion/ 69246. [64] Jeremy Howard. Deep Learning for Coders with fastai and PyTorch, volume 66. 2020. [65] airctic. Icevision. 2018. https:// airctic.com/ 0.8.1/ . [66] Tsung-Yi Lin, Michael Maire, Serge Belongie, Lubomir Bourdev, Ross Girshick, James Hays, Pietro Perona, Deva Ramanan, C. Lawrence Zitnick, and Piotr Dollár. Microsoft coco: Common objects in context. Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics), 8693 LNCS:740–755, 5 2014. [67] Olivier Petit, Nicolas Thome, Clement Rambour, and Luc Soler. U-net transformer: Self and cross attention for medical image segmentation. 2021.