Full text
1 Equation Chapter 1 Section 1 Trabajo Fin de Máster Máster Universitario en Ingeniería de Telecomunicación Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel Dpto. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Autora: Rocío Méndez Hernández Tutoras: Begoña Acha Piñero Mª del Carmen Serrano Gotarredona Sevilla, 2019
i Trabajo Fin de Máster Máster Universitario en Ingeniería de Telecomunicación Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel Autora: Rocío Méndez Hernández Tutoras: Begoña Acha Piñero Catedrática de Universidad Mª del Carmen Serrano Gotarredona Catedrática de Universidad Dpto. de Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2019
ii
iii Trabajo Fin de Máster: Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel Autora: Rocío Méndez Hernández Tutoras: Begoña Acha Piñero Mª del Carmen Serrano Gotarredona El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2019 El Secretario del Tribunal
iv
v A todos los que habéis creído en mí Y a los que no
vi
vii Agradecimientos Muchas gracias a mis padres, pues a todo lo que me habéis dado le debo el estar aquí y ahora. Gracias por el esfuerzo y el empeño que siempre habéis puesto en la educación de vuestros hijos, y por apoyarme en mis decisiones. A mis hermanos, quienes con frecuencia se burlan de mí porque, según ellos, “me paso el día estudiando”, también os doy las gracias, porque los momentos de distracción os los debo a vosotros. Gracias a Alfonso por haber combinado los dos; por pasarte el día estudiando conmigo y por los momentos de descanso. Quiero agradecer a los docentes de la escuela el papel que han jugado en la formación de esta generación de telecos y de mí en particular, y a mis compañeros de carrera por su ayuda y colaboración en esta hazaña que es estudiar teleco; todos habéis contribuido a que llegue este momento. En especial, gracias a mis compañeros del Máster de Teleco, y muy especialmente a los que os considero mis amigos. A lo largo de estos siete años ha habido etapas más duras que este proyecto, sin embargo nada ha sido tan personal y autónomo como este Trabajo Fin de Máster, y constituye lo que considero un gratificante final a mi paso por la escuela. Finalmente, gracias a mis tutoras, Begoña y Carmen, por introducirme en el mundo del deep learning y haber despertado en mí el interés por este campo, así como por vuestra guía y orientación durante este proyecto. Rocío Méndez Hernández. Sevilla, 2019.
xiv
1 1 INTRODUCCIÓN Los avances tecnológicos no pueden suceder sin científicos o ingenieros. El desafío de la sociedad es equiparar a las suficientes personas, con las habilidades correctas y formas de pensar, que lleguen a trabajar en los problemas más importantes. – Eric Schmidt – os avances tecnológicos llevan revolucionando el mundo de la medicina desde finales del siglo XIX [5]. El descubrimiento de los rayos X, así como del electrocardiograma, supusieron un cambio en la concepción de la medicina y en el diagnóstico de pacientes. Desde entonces, múltiples áreas de la ingeniería y las telecomunicaciones han dedicado esfuerzos al desarrollo de tecnologías médicas, ayudando tanto en el diagnóstico, como en el tratamiento o en la prevención de enfermedades. Son invenciones como el marcapasos, la endoscopia, el respirador artificial, la ecografía, la resonancia magnética, etc. Frecuentemente, el objetivo de estas innovaciones tecnológicas es la obtención de imágenes médicas, cuyo análisis es sin duda una herramienta fundamental de diagnóstico en la actualidad. Aún más, estos avances han supuesto, además de la dedicación de ingenieros electrónicos, eléctricos o de telecomunicaciones, la aparición de nuevas carreras dedicadas exclusivamente a la aplicación de la ingeniería al campo médico, como pueden ser la Ingeniería de la Salud o la Ingeniería Biomédica. Tampoco se puede olvidar el papel que tienen en la medicina actual la historia clínica computarizada o los softwares de ayuda al diagnóstico, posibles gracias al progreso meteórico de la computación en los últimos 30 años. En la actualidad se sigue innovando a pasos agigantados en el ámbito de la sanidad, en el que se han involucrado industrias como la robotización, la realidad virtual, la impresión 3D o la inteligencia artificial. En esta última, en concreto en el aprendizaje automático aplicado a imágenes médicas, se centrará el presente proyecto. A lo largo de este capítulo, se ofrecerá una introducción a la motivación de este proyecto. En primer lugar, se contextualizará la motivación médica, que no es otra que la detección del cáncer de una forma más fiable. En segundo lugar, se introducirá la técnica utilizada para dicho propósito, la segmentación. Por último, se hablará brevemente del reto al que intenta responder este trabajo de fin de máster. 1.1 Motivación médica El pasado año 2018, se diagnosticaron alrededor de 18 millones de casos nuevos de cáncer, según los datos del Centro Internacional de Investigación sobre el Cáncer (IARC) [6], de los cuales aproximadamente 300000 fueron casos de melanoma, lo que representa el 1,6% del total. Esto supone un 20% de todos los casos de cáncer de piel; sin embargo, este porcentaje sube hasta el 50% cuando se habla de tasas de mortalidad, lo que convierte al melanoma en el cáncer de piel más letal. L
2 Introducción 1.1.1 Detección del melanoma A pesar de estos datos de incidencia y mortalidad, el melanoma es un cáncer con una alta tasa de supervivencia si se detecta temprano, pudiendo tratarse y evitar así su extensión de las capas superiores de la piel, a las capas más profundas y a otras partes del cuerpo, donde su tratamiento se hace más complicado [7]. Figura 1-1: Etapas del melanoma [8]. En la Figura 1-1 se muestran las etapas del melanoma. Cuanto más pequeño y más fino sea –primeras etapas–, mayor será la probabilidad de curación pues se podrá eliminar satisfactoriamente mediante una escisión. Por ello, es muy recomendable la revisión frecuente de las lesiones de la piel, para poder diagnosticarlo de manera precoz y evitar que llegue a las fases III y IV. Sin embargo, los melanomas en las primeras etapas pueden ser difíciles de distinguir de otras lesiones benignas como los lunares, las manchas marrones o los crecimientos de la piel, como puede observarse en la Figura 1-2. Son lo que se conoce como lesiones pigmentadas: lesiones cutáneas que tienen una coloración anormal. De hecho, aproximadamente entre el 20% y el 30% de los melanomas se desarrollan a partir de lesiones ya existentes [7]. Por ello, y dado que son visibles en la superficie de la piel, se puede –y se debe– vigilar las propias lesiones pigmentadas y acudir a dermatólogos expertos a que las inspeccionen [9] [10]. Figura 1-2: Lesiones pigmentadas malignas (melanoma) y benignas [11].
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 3 1.1.2 Dermatoscopia La técnica utilizada en dermatología para la visualización de las lesiones de la piel es la dermatoscopia. Es un procedimiento no invasivo para el cual se emplea un dispositivo –dermatoscopio– sobre la piel, que amplifica 10 veces la imagen a la vez que elimina las reflexiones, permitiendo visualizar las características lesión con más detalle y apreciar capas más profundas de la misma [9] [12]. Figura 1-3: Dermatoscopio [9]. En comparación con un examen de la lesión a simple vista, el uso del dermatoscopio mejora la precisión en el diagnóstico del melanoma, principalmente por el mayor nivel de detalle que se obtiene, que permite la apreciación de características de la lesión no discernibles a simple vista [13]. Esta diferencia puede observarse en la siguiente figura, en la que se recogen dos imágenes de la misma lesión, una con dermatoscopio y otra con una cámara normal. (a) (b) Figura 1-4: Lesión pigmentada [10]. (a) Imagen macroscópica (a simple vista), (b) imagen dermatoscópica. Adicionalmente, hay dermatoscopios que pueden conectarse a sistemas informáticos donde poder ver la imagen con más detalle, lo que se suele denominar dermatoscopia digital. Estos sistemas permiten la digitalización y el almacenamiento de las imágenes, facilitando el control y seguimiento de los lunares, especialmente si el paciente presenta un gran número de ellos. [10] [12] Asimismo, la imagen digital obtenida se puede analizar computacionalmente, procesándola con algoritmos que permitan la detección automática del melanoma. Los esfuerzos de la comunidad científica en este sentido están centrados actualmente en la aplicación de métodos de aprendizaje automático, y más concretamente en técnicas de aprendizaje profundo (deep learning). Este enfoque está ganando interés debido a los prometedores datos de rendimiento que se están obteniendo recientemente [9]. 1.2 Segmentación de lesiones pigmentadas El objetivo de este proyecto, como indica su propio título, será la segmentación de imágenes dermatoscópicas de lesiones pigmentadas, con el propósito de posteriormente clasificarlas en diferentes enfermedades. En esta sección se estudiará brevemente en qué consiste la segmentación y cuál es su utilidad en este tipo de problemas, dejando para el capítulo 2 un análisis más detallado de las técnicas de segmentación y el estado del arte en cuanto a lesiones pigmentadas.
4 Introducción 1.2.1 Introducción a la segmentación La segmentación consiste en dividir una imagen en varias partes o zonas llamadas segmentos. Normalmente, su finalidad es localizar objetos en la imagen, o bien detectar límites o bordes dentro de la misma. Para ello, a cada píxel de la imagen se le asigna una etiqueta o categoría, separándolos en regiones que comparten alguna característica, como puede ser el color, la textura, el nivel de gris, el brillo, el contraste, etc. En las siguientes figuras se muestran varios ejemplos de segmentación. En la Figura 1-5 se puede observar una segmentación de una imagen en varias categorías. La división genera 4 clases que pueden posteriormente identificarse como tigre, césped, arena y río; es lo que se conoce como segmentación semántica. En la Figura 1-6 se muestra cómo se puede segmentar la misma imagen, pero esta vez con el objetivo de hallar los bordes o discontinuidades presentes en ella. En este caso, se puede decir que hay 2 categorías: borde y no borde. Finalmente, en la Figura 1-7 se clasifican los píxeles de la imagen también en 2 categorías: el objeto o región de interés –el tigre, en este ejemplo– y el fondo. Figura 1-5: Ejemplo de segmentación en 4 categorías [14]. Figura 1-6: Ejemplo de segmentación para detección de bordes. Figura 1-7: Ejemplo de segmentación en 2 categorías (objeto de interés y fondo). Como se puede observar, el resultado de la segmentación de una imagen es otra imagen, llamada máscara, en la que cada píxel tiene asignado un color único según la categoría asignada. Suele ser común representar la imagen original con la máscara superpuesta, de forma que se pueda apreciar con más detalle la calidad de la segmentación. La superposición de los ejemplos anteriores con su máscara correspondiente se muestra en la Figura 1-8.
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 5 (a) (b) (c) Figura 1-8: Superposición de imagen original y máscara de segmentación. (a) 4 categorías. (b) Detección de bordes. (c) 2 categorías (objeto de interés y fondo). En definitiva, el fin último de una segmentación va a ser simplificar o modificar de algún modo la representación de una imagen en algo que sea más significativo y/o más fácil de analizar [13]. 1.2.2 Aplicación en imágenes médicas Como se ha comentado, los métodos automáticos de análisis de las imágenes de posibles melanomas están ganando interés. Esto es cierto tanto para el caso de la detección del melanoma, como para el análisis de imágenes médicas de cualquier tipo, y es lo que se conoce como diagnóstico asistido por ordenador (DAO, o CAD por sus siglas en inglés). El uso de estos sistemas en imágenes médicas resulta muy conveniente para profesionales de la medicina ya que les pueden ayudar a interpretar toda la información disponible, a resaltar lo más relevante y en definitiva a alcanzar un diagnóstico más completo y óptimo [13] [15]. El análisis computacional de imágenes suele incluir 4 etapas [11] [15]: i) Preprocesamiento, cuyo objetivo es la eliminación del ruido de la imagen y en ocasiones la corrección de niveles en la misma. ii) Segmentación, para detectar las diferentes regiones de la imagen. iii) Extracción de características, que analizará el resultado de la segmentación con el propósito de hallar atributos de interés en la imagen, que dependerán del problema a tratar. También se le llama reconocimiento de patrones. iv) Clasificación, basándose en las características o no presentes en la imagen y en su importancia para el problema a tratar. La segmentación es por tanto un paso importante en el procesamiento de imágenes médicas, pues va a detectar la estructura de la imagen, la cual se necesitará para posteriormente poder hallar las regiones de interés o las características relevantes, que tendrán más o menos importancia en el diagnóstico. De hecho, en el caso particular de las imágenes médicas, se suele evitar el preprocesamiento para perder la menor información posible, pues todo puede ser relevante para el diagnóstico. Así, la segmentación se convierte en el primer paso para una clasificación de la imagen, el cual es el objetivo final, y por tanto de especial transcendencia para evitar errores posteriores. En el caso de las lesiones pigmentadas, a las que concierne este proyecto, se tratará de segmentar las imágenes con el objetivo de delimitar la localización de la lesión, siendo ésta la región de interés, y obviar de esta forma la piel sana y otros elementos como el vello. En la siguiente figura se recogen varios ejemplos.
6 Introducción Figura 1-9: Segmentación de lesiones pigmentadas [11]. 1.3 ISIC Challenge Para intentar reducir la tasa de mortalidad del melanoma, se creó la International Skin Imaging Collaboration (ISIC) [11], una asociación entre la industria y la comunidad académica diseñada para facilitar el análisis computacional de imágenes de la piel. Está centrada en el desarrollo de estándares para las tecnologías, técnicas y terminología utilizadas en este ámbito, así como el mantenimiento de un archivo de acceso público de imágenes digitales de lesiones cutáneas con las que poder validar los estándares propuestos. Este archivo sirve además como un recurso público de imágenes para la enseñanza y para el desarrollo y prueba de sistemas de diagnóstico automático. 1.3.1 ISIC Challenge: Análisis de lesiones cutáneas para la detección del melanoma Para impulsar los avances orientados a la mejora de la eficiencia y la precisión en el diagnóstico de melanoma, la ISIC organiza cada año, desde el 2016, un concurso o challenge cuyo objetivo es el desarrollo de herramientas de análisis de imágenes para el diagnóstico automático del melanoma. Este proyecto tratará de responder al challenge correspondiente al pasado año 2018. Este reto, así como los de los 2 años anteriores, se divide en 3 tareas: i) Segmentación, cuyo propósito es hallar los bordes de la lesión pigmentada en una imagen dermatoscópica. ii) Detección de características, cuyo objetivo es la localización de atributos en la lesión considerados como patrones clínicamente significativos. iii) Diagnóstico, que tratará de clasificar la lesión según las categorías de enfermedades establecidas, siendo una de ellas el melanoma. Para cada tarea, se proporciona a los participantes amplias bases de datos consistentes en imágenes dermatoscópicas procedentes del archivo de ISIC, así como los resultados esperados para cada una de las tareas, de forma que se pueda comparar con el rendimiento del algoritmo desarrollado. Es un proyecto que está teniendo un éxito notable, y que va mejorando cada año, tanto en cantidad de imágenes disponibles con sus resultados asociados, como en posibles características presentes en la lesión (tarea 2), y en número de categorías de clasificación de las lesiones (tarea 3). Para el challenge de 2018, más de 10 mil imágenes fueron proporcionadas para las 3 tareas, procedentes de las fuentes de datos arXiv:1902.03368 [16] y HAM10000 [17]. Es un crecimiento significativo si se compara con las disponibles en el primer desafío en 2016, que fueron 900.
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 7 Con el crecimiento de las bases de datos, ha sido posible además refinar la clasificación de las lesiones. Cuando en la convocatoria de 2016 se proponía la clasificación de las lesiones entre melanoma y lesión benigna, en el challenge de 2018 se distinguen 7 categorías, de las cuales 4 son malignas, incluido el melanoma. Esto implica también un aumento en los atributos dermatológicos característicos de cada una de las categorías. 1.3.2 ISIC Archive El archivo de la ISIC contiene en la actualidad más de 13000 imágenes dermatoscópicas, adquiridas en una variedad de dispositivos y en diferentes centros clínicos líderes a nivel internacional. La contribución al archivo es por tanto muy extensa y heterogénea, de forma que se asegure una muestra representativa y clínicamente relevante. Todas las imágenes que se aportan al archivo son analizadas para garantizar su calidad. La mayoría incluyen sus propios metadatos clínicos, los cuales son examinados por expertos en melanoma. Asimismo, parte de las imágenes que no tienen ya atributos asignados son caracterizadas también por expertos. De esta forma, las imágenes incluirán las características dermatológicas necesarias para poder discriminar entre los distintos tipos de lesiones cutáneas y para ser susceptibles de análisis por partes de algoritmos de diagnóstico automático.
11 2 METODOLOGÍA La inteligencia es la habilidad para adaptarse a los cambios. – Stephen Hawking – a inteligencia artificial está de moda. Desde que se han desarrollado las capacidades de procesamiento necesarias, las tecnologías de inteligencia artificial han avanzado considerablemente, impulsado también por la cantidad de datos disponibles actualmente en Internet, necesarios para entrenar los algoritmos. Aunque son métodos que la comunidad científica y académica lleva estudiando desde mediados del siglo XX, no ha sido hasta este despegue y su consecuente aplicación en el mundo empresarial que se han empezado a oír frecuentemente términos como machine learning o inteligencia artificial. Casi cualquier negocio puede hacer uso de ello para analizar sus datos y buscar tendencias, personalizar sus interacciones con los usuarios o las campañas de marketing. Gigantes como Amazon, Google o Microsoft están apostando por estas tecnologías y haciendo disponibles servicios de machine learning al público general, con la potencia de procesamiento requerida, en sus respectivas plataformas: Google Cloud, AWS y Azure. En este capítulo se verá la aplicación del machine learning al ámbito concreto que atañe a este proyecto: la segmentación de imágenes dermatoscópicas. Se comenzará por un repaso al estado del arte en segmentación de lesiones pigmentadas, para dar una visión general de las técnicas utilizadas. A continuación, se entrará de lleno en los conceptos y técnicas de deep learning, incluyendo su enmarcamiento dentro del mundo de la inteligencia artificial y el machine learning. Finalmente, se terminará con el propósito último de este capítulo y este proyecto: el método propuesto para segmentación de lesiones pigmentadas. 2.1 Estado del arte en segmentación de lesiones pigmentadas Las primeras evidencias en la literatura de análisis computacional de lesiones pigmentadas se remontan a 1987 [13], y desde entonces se han ido aplicando distintos algoritmos con más o menos éxito, hasta llegar a la actualidad en la que el estándar se ha convertido en las redes neuronales. Como se verá en los próximos apartados, la segmentación de lesiones se ha convertido en una de las áreas importantes de investigación y se encuentran disponibles numerosos algoritmos y técnicas de segmentación, debido a su importancia como primer paso crucial en el análisis de imágenes dermatoscópicas [13] [18]. 2.1.1 Técnicas clásicas de segmentación Existen numerosas técnicas de segmentación, y la complejidad del problema y los diferentes propósitos buscados hace que sea muy complicado encontrar un método que se ajuste a todos los tipos de aplicaciones. Para L
18 Metodología Figura 2-9: Neuronas. (a) Estructura de una neurona biológica, (b) modelo computacional (perceptrón) [31]. Cada neurona recibe impulsos por sus dendritas y genera otro impulso que sale a través de su axón, el cual se puede dividir múltiples veces y conectarse mediante sinapsis a las dendritas de otras neuronas. En el modelo computacional, las señales de entrada (𝑥𝑖) interaccionan en forma de multiplicación por un peso (peso sináptico, 𝑤𝑖) con las dendritas, y la neurona se activa en función de la suma de sus entradas. De este modo, la salida de la neurona viene dada por la siguiente expresión [25] [31]: 𝑦=𝑓(∑𝑤𝑖𝑥𝑖+𝑏), donde 𝑓(𝑥) es la llamada función de activación, la cual normalmente es la función escalón: 𝑓(𝑥)={1, 𝑠𝑖 ∑𝑤𝑖𝑥𝑖+𝑏>0 𝑖 0, 𝑒.𝑜.𝑐. El sesgo 𝑏 es, por tanto, el umbral que debe superar la suma de las entradas para que la neurona se active, y los pesos 𝑤𝑖 representan la fortaleza de la conexión sináptica entre neuronas. La idea fundamental del perceptrón es que los valores de los pesos y el sesgo se pueden aprender, y controlar de este modo la influencia que tienen unas neuronas sobre otras. Redes neuronales artificiales El modelo del perceptrón es capaz de realizar clasificaciones binarias y lineales. Para realizar otros tipos de clasificación o regresión se generaliza el modelo en lo que se denominan redes neuronales artificiales (ANNs, por sus siglas en inglés). A diferencia del modelo cerebral de interconexión, en el que las neuronas de conectan de manera aparentemente aleatoria y amorfa, las redes neuronales artificiales siguen una estructura más ordenada. En ellas, las neuronas se organizan en capas –de ahí que se denomine también perceptrón multi-capa (MLP)–, y suelen ser unidireccionales, es decir que sus enlaces no forman bucles [25]. Un perceptrón multicapa está formado por una capa de entrada, varias capas intermedias de perceptrones, y una capa de salida formada también por perceptrones. El tipo de capa más común es la capa completamente conectada, en la que cada neurona se conecta a todas las neuronas de la capa anterior, y no hay conexiones entre neuronas de la misma capa:
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 19 Figura 2-10: Red neuronal artificial con capas completamente conectadas [31]. En una ANN, siempre habrá una capa de entrada y una de salida, además de un número variable de capas intermedias –llamadas capas ocultas–, el cual dependerá del problema. Así, se puede considerar al perceptrón como un caso particular de red en la que se tiene una sola capa (la de salida) con una sola neurona. Por otro lado, cuando se habla de una red de N capas, dicho número se refiere al número de capas ocultas más la capa de salida, ya que la capa de entrada no está formada por neuronas. Normalmente, todas las neuronas de una misma capa tendrán las mismas propiedades, es decir serán del mismo tipo y tendrán la misma función de activación. Además de las 2 funciones lineales ya comentadas para el perceptrón, se pueden utilizar otros tipos diferentes de funciones de activación. Las más comunes se recogen en la siguiente tabla: Tabla 2-1: Funciones de activación comunes en redes neuronales. Función Ecuación Gráfica Escalón 𝑓(𝑥)={0, 𝑥<0 1, 𝑥≥0 Signo 𝑓(𝑥)={−1, 𝑥<0 1, 𝑥≥0 Lineal 𝑓(𝑥)=𝑥 Logística (sigmoide) 𝑓(𝑥)=1 1+𝑒−𝑥 Tangente hiperbólica 𝑓(𝑥)=𝑒𝑥−𝑒−𝑥 𝑒𝑥+𝑒−𝑥 ReLU 𝑓(𝑥)=max (0,𝑥) Leaky ReLU 𝑓(𝑥)=max (0.01𝑥,𝑥)
20 Metodología Las redes neuronales permiten implementar comportamientos altamente no lineales, y de hecho está demostrado que con una red de una sola capa oculta se puede aproximar cualquier función continua. Conforme se aumenta el número de capas o el número de neuronas por capa se incrementa la capacidad de representación de la red [31]. Aprendizaje de redes neuronales Al igual que para cualquier problema de aprendizaje automático, es necesario entrenar el modelo para ajustar los parámetros y que sea capaz de realizar las predicciones esperadas para el problema en cuestión. El algoritmo de aprendizaje más utilizado en redes neuronales es el de retropropagación (backpropagation) [25] [31]. A grandes rasgos, el método se basa en calcular la influencia que tiene cada uno de los parámetros de la red en el error final mediante el uso de derivadas parciales, y ajustar proporcionalmente los parámetros en la dirección de la derivada. Es decir, en cada iteración, se calcula el error total de la red, 𝛿𝑇, como la suma de los errores de cada salida: 𝛿𝑇=∑𝛿𝑘 𝑘=∑(𝑎𝑘−𝑦𝑘) 𝑘, 𝑘=1..𝑛ú𝑚.𝑠𝑎𝑙𝑖𝑑𝑎𝑠 Donde 𝑎𝑘 es el valor real de la salida 𝑘, e 𝑦𝑘 es el valor predicho por la red. Con ello, se actualiza cada parámetro 𝑤𝑖 mediante la siguiente expresión: 𝑤𝑖+=𝑤𝑖−𝜂·𝜕𝜀𝑇 𝜕𝑤𝑖 La derivada parcial del error respecto a cada parámetro se calcula haciendo uso de la regla de la cadena desde el error a la salida de la red hacia la entrada, de forma que es como si el error se “propagase hacia atrás”. Es por ello que se suele decir que en una iteración se hace primero una pasada hacia delante (para realizar la predicción) y otra hacia atrás (para actualizar parámetros: retropropagación). Figura 2-11: Retropropagación en una red de 1 perceptrón [28]. El parámetro 𝜂 se denomina ritmo de aprendizaje (learning rate), y especifica la velocidad a la que se lleva a cabo el aprendizaje. Es uno de los hiperparámetros más importantes en el aprendizaje de redes neuronales, y es en general difícil de ajustar, ya que si es muy alto los valores de los parámetros darán grandes saltos y será muy probable saltarse la solución óptima o no converger, y si es muy bajo puede tardar mucho en converger o quedarse atascado en mínimos locales.
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 21 Figura 2-12: Comportamiento de diferentes ritmos de aprendizaje respecto al tiempo [31]. Otros hiperparámetros de las redes neuronales son el número de épocas (epochs) y el tamaño del lote (batch size) [31]. Una época es una pasada hacia delante y hacia atrás (predicción + retropropagación) de todo el conjunto de datos completo por la red neuronal. En general, cuantas más épocas se hagan mejor entrenada estará la red, sin embargo hay que tener cuidado de no sobreentrenarla: Figura 2-13: Error frente al número de épocas [32]. En cuanto al lote o batch, es el conjunto de muestras que se hacen pasar por la red en una iteración hacia adelante y hacia atrás, antes de actualizar los parámetros. Por ejemplo, si se tiene un set de datos de 2000 muestras, y se toma un tamaño de batch de 10, en cada época se iterará hacia delante y hacia atrás 200 veces. Redes neuronales convolucionales Las redes neuronales artificiales son una solución de carácter general que se puede utilizar para casi cualquier tipo de problema, sin embargo hay aplicaciones en las que su estructura no es la más conveniente, como es el caso del procesamiento de imágenes. La gran dimensión de los datos de entrada en este caso hace que el número de parámetros crezca exponencialmente [25] [32]. Por ejemplo, para una imagen a color de 32x32, con 3 valores por píxel, se tendría un total de 32x32x3=3072 valores de entrada, que junto al sesgo hacen un total de 3073 parámetros por una sola neurona de la capa. Y eso siendo una imagen tremendamente pequeña. Ante esta necesidad surgieron las redes neuronales convolucionales (CNNs), las cuales tienen en cuenta la disposición espacial de los datos de entrada. Así, en lugar de tener en cada capa neuronas completamente conectadas, las neuronas se disponen espacialmente del mismo modo que los datos de entrada. Por ejemplo, si la entrada es la imagen de 32x32x3, la capa de entrada tendrá la siguiente forma:
22 Metodología Figura 2-14: Capa de entrada en una red convolucional [29]. Cada neurona de una capa convolucional constituye un filtro que se aplica a una región concreta de los datos procedentes de la capa anterior, procesando todos sus canales y aplicando la función de activación, produciendo como resultado otro canal de salida: Figura 2-15: Capa convolucional de un filtro [29]. Un solo filtro o neurona recorre todos los píxeles de la imagen con los mismos pesos, como se indica con las flechas en la figura, produciendo una salida cada vez que se aplica, de forma que es como si el filtro se desplazase (convolucionase) sobre la imagen. El paso de desplazamiento (stride) va a condicionar el tamaño de la salida, la cual será de las veces que “quepa” el filtro en la imagen. Dado que suele ser de 1, si se quiere conservar a la salida el tamaño de la entrada, será necesario rellenar con ceros el borde de la imagen, lo que se denomina zeropadding. En este ejemplo, el filtro es de tamaño 3x3x3, por lo que sólo habrá 27 pesos, a pesar de que la imagen es de 32x32x3. Como se puede observar se ha reducido considerablemente el número de parámetros. Además, en una misma capa convolucional puede haber varios filtros que trabajen con los mismos datos de entrada, produciendo cada uno de ellos un canal de salida: Figura 2-16: Capa convolucional de 50 filtros [29].
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 23 La salida de una capa convolucional se denomina mapa de características, y equivale a una imagen transformada. Además de capas convolucionales, las CNNs pueden contener también capas de submuestreo, para disminuir el tamaño de las salidas, y capas completamente conectadas, las cuales suelen situarse en el lado de la salida para tomar una decisión integrando la información extraída por las capas convolucionales y de submuestreo. Figura 2-17: Filtro de submuestreo "max-pooling" de 2x2 y paso 2 en un canal de entrada [29]. Figura 2-18: Capa de submuestreo para reducción del tamaño a la mitad [29]. La arquitectura de una red neuronal convolucional, incluyendo el número de capas y su orden, no está predefinido, aunque para problemas de clasificación suele ser habitual intercalar capas convolucionales con capas de submuestreo, y al final no más de 2 capas completamente conectadas. Las redes neuronales convolucionales se utilizan para identificar objetos en fotos y vídeos, para reconocimiento facial, generación y mejora de imágenes, creación de efectos como cámara lenta y mejora de la calidad de las imágenes, etc. En definitiva, hoy en día las CNNs se utilizan en todos los casos que involucran imágenes y vídeos, enmarcado dentro del campo de la visión artificial (computer vision) [14] [31]. Aprendizaje profundo Las redes neuronales convolucionales ofrecen más prestaciones cuanto más número de capas se utilicen. Conforme se aumenta la profundidad de la red, se pueden resolver problemas más complejos que otros algoritmos no pueden afrontar. Las redes neuronales simples con cientos o incluso miles de neuronas, conectadas de una manera relativamente simple, no pueden duplicar lo que el cerebro humano puede hacer, lo cual resulta evidente si se tiene en cuenta que los cerebros humanos tienen alrededor de 86 billones de neuronas y una interconectividad muy compleja. Es aquí donde surge el concepto de aprendizaje profundo o deep learning. A grandes rasgos, el aprendizaje profundo consiste en utilizar redes neuronales con más neuronas, capas e interconectividad. Como es lógico, todavía se está muy lejos de imitar el cerebro humano en toda su complejidad, pero se está avanzando en esa dirección [27]. En la siguiente imagen se muestra una arquitectura típica para un problema de clasificación de imágenes:
24 Metodología Figura 2-19: Ejemplo de red neuronal profunda para clasificación [33]. Los avances en computación, desde los vehículos autónomos, pasando por las supercomputadoras que juegan al Go, y hasta el reconocimiento de voz, utilizan por debajo de alguna forma el aprendizaje profundo. En definitiva, el aprendizaje profundo ha hecho posibles numerosas aplicaciones prácticas del aprendizaje automático y, por extensión, del campo general de la inteligencia artificial [26] [27]. 2.2.3 Redes neuronales usadas en segmentación Los problemas de segmentación tienen la particularidad de que no se trata de clasificar toda la imagen en una categoría, sino que se clasifica cada píxel de la misma. Es por ello que la salida de estas redes deberá tener el mismo tamaño que la entrada. La mayoría de las arquitecturas propuestas para segmentación, están basadas en CNNs de clasificación ya conocidas, y que han supuesto contribuciones significativas al campo de la visión artificial. Estas redes tienen arquitecturas basadas en la CNN clásica representada en la Figura 2-19, la cual es la conocida y pionera LetNet de 1998 [34]. Concretamente destacan [35]: • AlexNet [36]: Una CNN de la Universidad de Toronto pionera en la clasificación de imágenes, que ganó el ImageNet Large Scale Visual Recognition Challenge de 2012 con una precisión del 84,6%. Consta de 5 capas convolucionales, capas de submuestreo, activaciones con ReLUs, y 3 capas completamente conectadas. Supuso una revolución pues fue la primera solución basada en CNNs que ganó el challenge de ImageNet. • VGG-16 [37]: Este modelo de la Universidad de Oxford quedó segunda en el concurso ImageNet 2014 con una precisión del 92,7%. Utiliza una pila de capas convolucionales con pocos canales de salida en las primeras capas, en lugar de pocas capas con muchas salidas como propone la AlexNet. • GoogLeNet [38]: Es la red que ganó el ImageNet de 2014 con una precisión del 93,3%, perteneciente a Google. Está compuesta por 22 capas y un nuevo bloque llamado módulo inception, por ello se la conoce también como Inception (a día de hoy hay 3 versiones). El módulo inception realiza diferentes transformaciones en los mismos datos de entrada (una convolución de 5×5, una de 3×3, una de 1x1 y un submuestreo de 3x3), vinculando los resultados en una sola salida. Con las convoluciones pequeñas se consiguió reducir drásticamente el número de parámetros, y de hecho a pesar de tener 22 capas de profundidad redujo el número de parámetros de 60 millones (AlexNet) a 4 millones. • ResNet [39]: Un modelo de Microsoft que ganó el challenge de ImageNet en 2015 con una precisión del 96,4%. Es conocida por su profundidad (152 capas) y la introducción de bloques residuales. Los bloques residuales abordan el problema de la formación de una arquitectura realmente profunda sin incrementar demasiado la complejidad, permitiendo que las capas puedan copiar sus entradas a la siguiente capa. De esta forma, la red proporciona a las capas un punto de referencia desde el cual aprender, en lugar de comenzar desde cero.
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 25 Figura 2-20: Tasa de error (top-5) en el ImageNet Large Scale Visual Recognition Challenge [35]. Para segmentación, la arquitectura de red neuronal que se utiliza es en general una red de codificadores seguida de una red de decodificadores. El codificador se encargará de extraer las características de la imagen, y la tarea del decodificador será la de recuperar los detalles de los objetos proyectando las características extraídas (baja resolución) en el espacio de píxeles, para obtener una clasificación de los mismos (alta resolución). Para ello, se suele partir de una de las arquitecturas ya comentadas, y se reemplazan las capas completamente conectadas (las que realizan la clasificación) por capas que realicen una interpolación o upsampling con el objetivo de generar una salida con el mismo tamaño que la entrada. Este tipo de redes son por tanto completamente convolucionales (Fully Convolutional Networks, FCN). Los primeros en implementar una arquitectura de este tipo fueron unos investigadores de la Universidad de Berkeley, en la que se tiene una única interpolación: Figura 2-21: Estructura de la FCN para segmentación [40]. El problema de esta FCN básica es que las capas convolucionales y de submuestreo reducen la resolución de los mapas de características de salida, por lo que sus predicciones son típicamente de baja resolución, resultando en bordes de objetos relativamente borrosos. Como respuesta a ello, se han propuesto una variedad de enfoques basados en FCN pero más avanzados, que modifican de algún modo el camino de decodificación para mejorarlo y conseguir mayor precisión. Entre ellas se incluyen SegNet [41], Dilated Convolutions [42], DeepLabv1 [43] y U-Net [1], todas ellas de 2015, y FPN [44], PSPNet [45], DeepLabv2 [46] y RefineNet [47], de 2016.
26 Metodología Figura 2-22: Arquitectura de la SegNet [41]. Figura 2-23: Arquitectura de la FPN [44]. 2.2.4 Plataformas de aprendizaje automático A día de hoy, Python lidera el ranking de lenguajes de programación utilizados en aprendizaje automático. Su aumento de popularidad en los últimos 3 años ha coincidido con el descenso de R, que aun así todavía le sigue de cerca. También se utiliza, aunque en mucha menor medida, Java y C/C++ [48]. De las 11 frameworks más utilizados, 10 de ellos funcionan con Python. Los más populares son TensorFlow, Keras, PyTorch y Caffe. Un estudio de uso, interés y popularidad [49] otorgó la siguiente puntuación a las plataformas más utilizados, basándose en las demandas de empleo, la encuesta de uso de KDnuggets [48], las publicaciones (Medium, Amazon Books, ArXiv) y la actividad en GitHub: Figura 2-24: Principales plataformas de deep learning [49].
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 27 Tensorflow, respaldado por Google, y Pytorch, con el respaldo de Facebook, son las dos plataformas independientes que mejor puntuación han obtenido, y ambas están disponibles para Python. Aunque Tensorflow es el ganador indiscutible, Pytorch está creciendo mucho en el último año. Figura 2-25: Crecimiento de frameworks de deep learning en 2019 [50]. Son dos plataformas con un alto nivel de personalización, lo cual permite implementar mejores modelos pero a su vez hace que la curva de aprendizaje sea más lenta. Keras y FastAI son APIs de alto nivel muy intuitivas, para Tensorflow y Pytorch respectivamente, y muy recomendadas si se está empezando en el mundo del deep learning. En particular, Keras [51] queda en la segunda posición total, teniendo a día de hoy una gran base de usuarios, gran demanda en el mercado, y muchos artículos en Medium. De hecho, su popularidad está creciendo si se realiza un análisis con Google Trends: Figura 2-26: Análisis de tendencias de las principales plataformas de aprendizaje profundo, a junio de 2019 [Fuente: Elaboración propia con Google Trends]. Por ello, y por su API fácil de usar para principiantes, es el framework que se utilizará en este proyecto.
34 Metodología una GPU especialmente diseñada para plataformas de deep learning. Figura 2-31: Rendimiento de la GPU NVIDIA Tesla T4 [60]. Para el uso de Google Colab se accede a través de cualquier navegador, y ofrece, entre otras cosas: • Posibilidad de activar una GPU, y utilizarla durante 12 horas cada vez • Utilizar Python 2 ó 3 • El uso de Jupyter Notebooks, un enfoque para programar en Python basado en web • Tiene preinstaladas las librerías comunes usadas en aprendizaje automático, y ofrece la posibilidad de instalar otras que se necesiten • Enlazar con la cuenta de Google Drive para poder leer desde ahí los datos de entrada y guardar las salidas deseadas. Todo ello resulta muy conveniente para entornos académicos, o desarrolladores que están empezando y necesitan probar sus modelos de una forma eficiente pero no tienen acceso a una GPU, como es el caso de este Trabajo Fin de Máster. En la siguiente tabla se recogen los detalles del hardware utilizado en Google Colab para este proyecto: Parámetro Valor GPU NVIDIA Tesla T4 GPU RAM 15.8 GB CPU Intel® Xeon® CPU CPU RAM 12.72 GB Velocidad CPU 2.30 GHz Núcleos CPU 2
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 35 Duración máxima de sesión 12 h Tiempo ocioso máximo 1.5 h Tabla 2-2: Especificaciones hardware (Google Colab). Modelo A continuación se incluye el código Python de implementación del modelo, el cual está ligeramente basado en el modelo VGGUnet publicado por Jibin Mathew en GitHub [61]: from keras.models import * from keras.layers import * def Unet(VGG_Weights_path, freeze_vgg=True, input_height=128, input_width=128, image_ordering="channels_last"): # Input assert input_height%16 == 0 assert input_width%16 == 0 if image_ordering=="channels_first": input_shape = (3,input_height,input_width) channel_axis = 1 else : input_shape = (input_height,input_width,3) channel_axis = 3 img_input = Input(shape=input_shape) # ##################################### Encoder ######################################## # Block 1 x = Conv2D(64, (3,3), activation='relu', padding='same', name='block1_conv1', data_format=image_ordering)(img_input) x = Conv2D(64, (3,3), activation='relu', padding='same', name='block1_conv2', data_format=image_ordering)(x) f1 = x x = MaxPooling2D((2,2), strides=(2,2), name='block1_pool',data_format=image_ordering)(x) # Block 2 x = Conv2D(128, (3,3), activation='relu', padding='same', name='block2_conv1', data_format=image_ordering)(x) x = Conv2D(128, (3,3), activation='relu', padding='same', name='block2_conv2', data_format=image_ordering)(x) f2 = x x = MaxPooling2D((2,2), strides=(2,2), name='block2_pool',data_format=image_ordering)(x) # Block 3 x = Conv2D(256, (3,3), activation='relu', padding='same', name='block3_conv1', data_format=image_ordering)(x) x = Conv2D(256, (3,3), activation='relu', padding='same', name='block3_conv2', data_format=image_ordering)(x) x = Conv2D(256, (3,3), activation='relu', padding='same', name='block3_conv3', data_format=image_ordering)(x) f3 = x x = MaxPooling2D((2,2), strides=(2,2), name='block3_pool',data_format=image_ordering)(x)
36 Metodología # Block 4 x = Conv2D(512, (3,3), activation='relu', padding='same', name='block4_conv1', data_format=image_ordering)(x) x = Conv2D(512, (3,3), activation='relu', padding='same', name='block4_conv2', data_format=image_ordering)(x) x = Conv2D(512, (3,3), activation='relu', padding='same', name='block4_conv3', data_format=image_ordering)(x) f4 = x x = MaxPooling2D((2,2), strides=(2,2), name='block4_pool',data_format=image_ordering)(x) # Block 5 x = Conv2D(512, (3,3), activation='relu', padding='same', name='block5_conv1', data_format=image_ordering)(x) x = Conv2D(512, (3,3), activation='relu', padding='same', name='block5_conv2', data_format=image_ordering)(x) x = Conv2D(512, (3,3), activation='relu', padding='same', name='block5_conv3', data_format=image_ordering)(x) f5 = x x = MaxPooling2D((2,2), strides=(2,2), data_format=image_ordering)(x) # Create VGG encoder model and freeze weights vgg = Model(img_input, x) vgg.load_weights(VGG_Weights_path) if freeze_vgg: for layer in vgg.layers: layer.trainable = False # ###################################### Decoder ####################################### # Block 6 o = f5 o = UpSampling2D(name='block6_upsamp', size=(2,2))(o) o = Conv2D(512, (2,2), activation='relu', padding='same', name='block6_upconv', data_format=image_ordering, kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block6_norm1')(o) o = concatenate([o, f4], axis=channel_axis) o = Conv2D(512, (3,3), activation='relu', padding='same', name='block6_conv1', data_format=image_ordering, kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block6_norm2')(o) o = Conv2D(512, (3,3), activation='relu', padding='same', name='block6_conv2', data_format=image_ordering, kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block6_norm3')(o) # Block 7 o = UpSampling2D(name='block7_upsamp', size=(2,2))(o) o = Conv2D(256, (2,2), activation='relu', padding='same', name='block7_upconv', data_format=image_ordering, kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block7_norm1')(o) o = concatenate([o, f3], axis=channel_axis) o = Conv2D(256, (3,3), activation='relu', padding='same', name='block7_conv1', data_format=image_ordering, kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block7_norm2')(o) o = Conv2D(256, (3,3), activation='relu', padding='same', name='block7_conv2', data_format=image_ordering, kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block7_norm3')(o)
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 37 # Block 8 o = UpSampling2D(name='block8_upsamp', size=(2,2))(o) o = Conv2D(128, (2,2), activation='relu', padding='same', name='block8_upconv', data_format=image_ordering, kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block8_norm1')(o) o = concatenate([o, f2], axis=channel_axis) o = Conv2D(128, (3,3), activation='relu', padding='same', name='block8_conv1', data_format=image_ordering , kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block8_norm2')(o) o = Conv2D(128, (3,3), activation='relu', padding='same', name='block8_conv2', data_format=image_ordering , kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block8_norm3')(o) # Block 9 o = UpSampling2D(name='block9_upsamp', size=(2,2))(o) o = Conv2D(64, (2,2), activation='relu', padding='same', name='block9_upconv', data_format=image_ordering, kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block9_norm1')(o) o = concatenate([o, f1], axis=channel_axis) o = Conv2D(64, (3,3), activation='relu', padding='same', name='block9_conv1', data_format=image_ordering, kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block9_norm2')(o) o = Conv2D(64, (3,3), activation='relu', padding='same', name='block9_conv2', data_format=image_ordering, kernel_initializer='he_normal')(o) o = BatchNormalization(axis=channel_axis, name='block9_norm3')(o) o = Conv2D(1, (1,1), activation='sigmoid', padding='same', name='output', data_format=image_ordering)(o) model = Model(inputs=img_input, outputs=o) return model Como se puede observar, la definición del modelo es muy inmediata; partiendo de la arquitectura se pueden ir definiendo las capas una detrás de otra con sus tipos y parámetros correspondientes. Para cerciorarse de cómo es el modelo resultante, se puede ejecutar la función summary() sobre el mismo, en cuyo resultado se pueden ver las capas definidas y las conexiones entre ellas, así como el número de parámetros del modelo: ______________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ============================================================================================== input (InputLayer) (None, 128, 128, 3) 0 ______________________________________________________________________________________________ block1_conv1 (Conv2D) (None, 128, 128, 64) 1792 input_2[0][0] ______________________________________________________________________________________________ block1_conv2 (Conv2D) (None, 128, 128, 64) 36928 block1_conv1[0][0] ______________________________________________________________________________________________ block1_pool (MaxPooling2D) (None, 64, 64, 64) 0 block1_conv2[0][0] ______________________________________________________________________________________________ block2_conv1 (Conv2D) (None, 64, 64, 128) 73856 block1_pool[0][0] ______________________________________________________________________________________________ block2_conv2 (Conv2D) (None, 64, 64, 128) 147584 block2_conv1[0][0] ______________________________________________________________________________________________ block2_pool (MaxPooling2D) (None, 32, 32, 128) 0 block2_conv2[0][0] ______________________________________________________________________________________________ block3_conv1 (Conv2D) (None, 32, 32, 256) 295168 block2_pool[0][0] ______________________________________________________________________________________________ block3_conv2 (Conv2D) (None, 32, 32, 256) 590080 block3_conv1[0][0] ______________________________________________________________________________________________ block3_conv3 (Conv2D) (None, 32, 32, 256) 590080 block3_conv2[0][0]
38 Metodología ______________________________________________________________________________________________ block3_pool (MaxPooling2D) (None, 16, 16, 256) 0 block3_conv3[0][0] ______________________________________________________________________________________________ block4_conv1 (Conv2D) (None, 16, 16, 512) 1180160 block3_pool[0][0] ______________________________________________________________________________________________ block4_conv2 (Conv2D) (None, 16, 16, 512) 2359808 block4_conv1[0][0] ______________________________________________________________________________________________ block4_conv3 (Conv2D) (None, 16, 16, 512) 2359808 block4_conv2[0][0] ______________________________________________________________________________________________ block4_pool (MaxPooling2D) (None, 8, 8, 512) 0 block4_conv3[0][0] ______________________________________________________________________________________________ block5_conv1 (Conv2D) (None, 8, 8, 512) 2359808 block4_pool[0][0] ______________________________________________________________________________________________ block5_conv2 (Conv2D) (None, 8, 8, 512) 2359808 block5_conv1[0][0] ______________________________________________________________________________________________ block5_conv3 (Conv2D) (None, 8, 8, 512) 2359808 block5_conv2[0][0] ______________________________________________________________________________________________ block6_upsamp (UpSampling2D) (None, 16, 16, 512) 0 block5_conv3[0][0] ______________________________________________________________________________________________ block6_upconv (Conv2D) (None, 16, 16, 512) 1049088 block6_upsamp[0][0] ______________________________________________________________________________________________ block6_norm1 (BatchNormalization) (None, 16, 16, 512) 2048 block6_upconv[0][0] ______________________________________________________________________________________________ concatenate_5 (Concatenate) (None, 16, 16, 1024) 0 block6_norm1[0][0] block4_conv3[0][0] ______________________________________________________________________________________________ block6_conv1 (Conv2D) (None, 16, 16, 512) 4719104 concatenate_5[0][0] ______________________________________________________________________________________________ block6_norm2 (BatchNormalization) (None, 16, 16, 512) 2048 block6_conv1[0][0] ______________________________________________________________________________________________ block6_conv2 (Conv2D) (None, 16, 16, 512) 2359808 block6_norm2[0][0] ______________________________________________________________________________________________ block6_norm3 (BatchNormalization) (None, 16, 16, 512) 2048 block6_conv2[0][0] ______________________________________________________________________________________________ block7_upsamp (UpSampling2D) (None, 32, 32, 512) 0 block6_norm3[0][0] ______________________________________________________________________________________________ block7_upconv (Conv2D) (None, 32, 32, 256) 524544 block7_upsamp[0][0] ______________________________________________________________________________________________ block7_norm1 (BatchNormalization) (None, 32, 32, 256) 1024 block7_upconv[0][0] ______________________________________________________________________________________________ concatenate_6 (Concatenate) (None, 32, 32, 512) 0 block7_norm1[0][0] block3_conv3[0][0] ______________________________________________________________________________________________ block7_conv1 (Conv2D) (None, 32, 32, 256) 1179904 concatenate_6[0][0] ______________________________________________________________________________________________ block7_norm2 (BatchNormalization) (None, 32, 32, 256) 1024 block7_conv1[0][0] ______________________________________________________________________________________________ block7_conv2 (Conv2D) (None, 32, 32, 256) 590080 block7_norm2[0][0] ______________________________________________________________________________________________ block7_norm3 (BatchNormalization) (None, 32, 32, 256) 1024 block7_conv2[0][0] ______________________________________________________________________________________________ block8_upsamp (UpSampling2D) (None, 64, 64, 256) 0 block7_norm3[0][0] ______________________________________________________________________________________________ block8_upconv (Conv2D) (None, 64, 64, 128) 131200 block8_upsamp[0][0] ______________________________________________________________________________________________ block8_norm1 (BatchNormalization) (None, 64, 64, 128) 512 block8_upconv[0][0] ______________________________________________________________________________________________ concatenate_7 (Concatenate) (None, 64, 64, 256) 0 block8_norm1[0][0] block2_conv2[0][0] ______________________________________________________________________________________________ block8_conv1 (Conv2D) (None, 64, 64, 128) 295040 concatenate_7[0][0] ______________________________________________________________________________________________ block8_norm2 (BatchNormalization) (None, 64, 64, 128) 512 block8_conv1[0][0] ______________________________________________________________________________________________ block8_conv2 (Conv2D) (None, 64, 64, 128) 147584 block8_norm2[0][0] ______________________________________________________________________________________________
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 39 block8_norm3 (BatchNormalization) (None, 64, 64, 128) 512 block8_conv2[0][0] ______________________________________________________________________________________________ block9_upsamp (UpSampling2D) (None, 128, 128, 128 0 block8_norm3[0][0] ______________________________________________________________________________________________ block9_upconv (Conv2D) (None, 128, 128, 64) 32832 block9_upsamp[0][0] ______________________________________________________________________________________________ block9_norm1 (BatchNormalization) (None, 128, 128, 64) 256 block9_upconv[0][0] ______________________________________________________________________________________________ concatenate_8 (Concatenate) (None, 128, 128, 128 0 block9_norm1[0][0] block1_conv2[0][0] ______________________________________________________________________________________________ block9_conv1 (Conv2D) (None, 128, 128, 64) 73792 concatenate_8[0][0] ______________________________________________________________________________________________ block9_norm2 (BatchNormalizatio (None, 128, 128, 64) 256 block9_conv1[0][0] ______________________________________________________________________________________________ block9_conv2 (Conv2D) (None, 128, 128, 64) 36928 block9_norm2[0][0] ______________________________________________________________________________________________ block9_norm3 (BatchNormalization) (None, 128, 128, 64) 256 block9_conv2[0][0] ______________________________________________________________________________________________ output (Conv2D) (None, 128, 128, 1) 65 block9_norm3[0][0] ============================================================================================== Total params: 25,866,177 Trainable params: 11,145,729 Non-trainable params: 14,720,448 ______________________________________________________________________________________________ El modelo está configurado por defecto para que deje “congelados” los pesos preentrenados del codificador VGG-16, es decir que no se modifiquen durante el entrenamiento. Por ello, algo más la mitad de los parámetros aparecen como no entrenables. Esto va a reducir el tiempo de entrenamiento significativamente.
41 3 RESULTADOS La calidad nunca es un accidente; siempre es el resultado de un esfuerzo de la inteligencia. – John Ruskin – lo largo de este capítulo se presentarán los resultados del entrenamiento de la red, así como sus capacidades de predicción. Para ello se utilizará el conjunto de datos de entrenamiento del challenge de segmentación del ISIC 2018, el cual tiene un total de 2594 imágenes en color en formato JPEG, con sus máscaras asociadas en blanco y negro en formato PNG [16] [17]. En dicho concurso se incluyen también sets de datos de validación y test final, sin embargo no están disponibles las máscaras asociadas ya que se comprueba la validez a través de su propio sistema, el cual está ya desactivado. Por lo tanto, de dichas imágenes se tomará aproximadamente el 15% (400 imágenes) para realizar la validación, y las restantes 2194 para el entrenamiento de la red. 3.1 Mediciones de rendimiento Para medir la calidad de un sistema de aprendizaje automático hay muchas posibles métricas, dependiendo de lo que se quiera valorar con ello, o dar más importancia a ciertos tipos de errores o aciertos. Se puede decir que, píxel a píxel, hay 4 tipos de predicciones, considerando el positivo como presencia de lesión (píxel activo) y el negativo como no lesión o fondo [29]: • Verdadero Positivo (TP): ejemplo positivo que se ha predicho como positivo. • Falso Positivo (FP): ejemplo negativo que se ha predicho positivo. También se le denomina error tipo I. • Verdadero Negativo (TN): ejemplo negativo predicho correctamente como negativo. • Falso Negativo (FN): ejemplo positivo que se ha predicho como negativo. Denominado error tipo II. A Figura 3-1: Tipos de predicciones en una segmentación [62].
42 Resultados En función de estos valores, se pueden calcular varios tipos de métricas, entre las que se incluyen las que se recogen a continuación. Para el reto del ISIC 2018 la métrica utilizada es el índice Jaccard, aunque por proporcionar una información completa del comportamiento del algoritmo también se calculan las demás. Tasa de acierto (accuracy) Mide, de entre todos los datos, qué proporción se han clasificado correctamente, ya sea por verdadero positivo o verdadero negativo: 𝑎𝑐𝑐=𝑇𝑃+𝑇𝑁 𝑇𝑃+𝐹𝑃+𝑇𝑁+𝐹𝑁 Aunque es la métrica que se suele utilizar por defecto en los sistemas de aprendizaje automático, no es adecuada cuando hay una mayoría de ejemplos de uno de los tipos (positivos o negativos). Esto es así debido a que no tiene en cuenta dicho desequilibrio, y tendrán por tanto más peso los datos del tipo mayoritario. Precisión (precision) Mide la tasa de los clasificados como positivos que realmente lo son: 𝑃= 𝑇𝑃 𝑇𝑃+𝐹𝑃 Sensibilidad (sensitivity o recall) Mide la proporción de los que realmente son positivos que se han clasificado como tal. También se le denomina tasa de verdaderos positivos o TPR. 𝑅=𝑇𝑃𝑅= 𝑇𝑃 𝑇𝑃+𝐹𝑁 Especificidad (specificity) Mide la proporción de los que realmente son negativos que se han clasificado como tal. Se le llama también tasa de falsos negativos. 𝑇𝑁𝑅= 𝑇𝑁 𝑇𝑁+𝐹𝑃 Índice Jaccard (Jaccard index) Es una medida de la similitud entre dos conjuntos de muestras, A y B. En particular, se puede considerar A como el valor predicho y B como el valor real, siendo ambos imágenes y las muestras sus píxeles correspondientes. Se define como: 𝐽(𝐴,𝐵)=|𝐴∩𝐵| |𝐴∪𝐵| También se le llama Intersection over Union (IoU). Es una métrica muy utilizada en visión artificial, pues es una medida del solapamiento entre los píxeles de dos imágenes:
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 43 Figura 3-2: Índice Jaccard para detección de objetos en imágenes [62] En función de los tipos de predicción, se puede obtener como: 𝐽= 𝑇𝑃 𝑇𝑃+𝐹𝑁+𝐹𝑃 Coeficiente de Sorensen-Dice (Sorensen-Dice coefficient) El coeficiente de Sorensen-Dice, o coeficiente de Dice, también mide la similitud entre dos conjuntos, definiéndose como: 𝐷𝑆𝐶(𝐴,𝐵)=2·|𝐴∩𝐵| |𝐴|+|𝐵| Igualmente, en función de los tipos de predicción binaria se puede expresar como: 𝐷𝑆𝐶=2·𝑇𝑃 2·𝑇𝑃+𝐹𝑁+𝐹𝑃 Este coeficiente es equivalente a lo que se conoce como medida F1 o score F1, el cual es un compromiso entre la precisión y la sensibilidad, definido como: 𝐹1=2·𝑃·𝑅 𝑃+𝑅=2·𝑇𝑃 2·𝑇𝑃+𝐹𝑁+𝐹𝑃=𝐷𝑆𝐶 3.2 Entrenamiento y validación 3.2.1 Parámetros iniciales En la siguiente tabla se recogen los parámetros utilizados para el entrenamiento definitivo de la red: Tabla 3-1: Parámetros de entrenamiento. Parámetro Valor Dimensiones de entrada 128x128x3 Tamaño del conjunto de datos 2194 Tamaño del batch 2 Épocas 50 Tipo de optimizador Adam Tasa de aprendizaje 1×10−3 (valor por defecto) El modelo del que se ha partido es el indicado en la sección 2.3.3, en el que se tiene el codificador VGG-16 con
50 Resultados La elección de uso del índice Jaccard con umbral en lugar del puro se basa en un análisis [64] que demostró que el uso directo de Jaccard como medida de rendimiento no reflejaba con precisión el número de imágenes en las que falla la segmentación automatizada. En la Tabla 2-1 se pueden consultar dichos números, que también se pueden observar en el histograma: Figura 3-8: Histograma del índice Jaccard de las predicciones Visualmente, cuando el índice Jaccard cae por debajo del umbral, la corrección o validez de la segmentación puede ser objeto de debate. En este caso, un total de 76 imágenes han quedado por debajo del umbral, lo que supone un 19% de las imágenes.
51 4 CONCLUSIONES La idea o la información es sólo una semilla en la mente. Lo que realmente hará que las cosas cambien es la acción. – Miguel Ángel Ruiz Macías – l aprendizaje profundo ha revolucionado el mundo de la inteligencia artificial. Tras la realización de este Trabajo Fin de Máster, resulta evidente que se requiere de unas altas capacidades de procesamiento para poder obtener buenos resultados, y es por tanto comprensible el estancamiento que sufrió el deep learning hasta que dicha potencia de procesamiento fue desarrollada y aparecieron las GPUs. Estando éstas disponibles –tras previo pago– las posibilidades son infinitas, no únicamente en el campo de la medicina. En los últimos años se está avanzando a pasos agigantados, y se puede pensar que las tecnologías de inteligencia artificial van a jugar un papel muy importante en la sociedad del futuro. De esta forma, en campos como el médico, se puede esperar que la tecnología dé el salto desde la investigación –muy activa en numerosas áreas– a la aplicación en entornos reales, ayudando a la detección y prevención de enfermedades. 4.1 Conclusiones Tras la conclusión de este proyecto, se puede afirmar que se han cumplido los objetivos que en un principio se establecieron, esto es, desarrollar un sistema capaz de segmentar automáticamente imágenes de lesiones pigmentadas. Tras el entrenamiento del sistema, se ha logrado una tasa de acierto del 98.9% sobre el conjunto de datos utilizado, y consiguiendo un buen 93% de accuracy e índice Jaccard de 0.761 sobre los datos utilizados para test. Si bien no son resultados perfectos, se afirma que son buenos porque se puede comparar –aunque sin llegar a su nivel– con el rendimiento obtenido por los ganadores del reto de ISIC 2018, quienes obtuvieron 94.2% de tasa de acierto y un índice Jaccard de 0.838. Esta diferencia se debe, además de la evidente diferencia entre los modelos, a varios factores, como pueden ser: i) Los datos de test no son los mismos en ambos casos, no siendo posible por tanto una comparación objetiva. Sin embargo estas medidas pueden servir de indicativo de la calidad del sistema, y se pueden considerar aceptables en general teniendo en cuenta los resultados obtenidos por investigadores en este campo. ii) El tamaño de los conjuntos de entrenamiento no es el mismo en ambos casos, debido a la necesidad en este proyecto de extraer los datos de test de dicho conjunto. Por consiguiente, no han tomado parte del entrenamiento estas 400 imágenes. Esto es solucionable utilizando la técnica del data augmentation, la cual se comenta en las líneas futuras (sección 4.2). E
52 Conclusiones iii) No se han entrenado las capas del codificador debido a la técnica de transfer learning utilizada y a las limitaciones de computación. Éstas están únicamente entrenadas únicamente para la base de datos de ImageNet, por lo que no extraerán las posibles características específicas de las lesiones pigmentadas. También es importante destacar el gran potencial que tiene la técnica del transfer learning. Con bases de datos como la de ImageNet, que contiene más de 1 millón de imágenes clasificadas en 1000 categorías, se impulsa enormemente el desarrollo de redes de clasificación de imágenes, que hacen disponibles los pesos obtenidos al que quiera beneficiarse de ellos. La capacidad de utilizar modelos existentes facilita su aplicación a nuevos retos y cuestiones, acelerando su desarrollo y permitiendo a los desarrolladores centrar sus esfuerzos en los desafíos específicos del problema a tratar. A pesar de haber entrenado la red durante 50 épocas, los resultados han evidenciado que con 20 épocas es suficiente, además de recomendado para evitar que la red se sobreentrene. El valor óptimo en cuanto a coste de validación es 9 épocas, punto en el que se obtiene un valor de la función de coste de 0.252 y una tasa de acierto del 92.1%, siendo la tasa de acierto máxima de 93.3% en 42 épocas. Es posible parar el entrenamiento cuando la función de coste deja de mejorar y guardar el modelo con los pesos de ese momento, técnica que se denomina early stopping. No obstante, es necesario aclarar que los resultados de predicción recogidos en esta memoria no son para el modelo óptimo sino para el que se ha ejecutado durante 50 épocas. Finalmente, conviene resaltar el valor del entorno Keras para introducirse en el mundo de aprendizaje profundo. Aunque es un framework menos utilizado que otros en entornos comerciales, es sin duda un paquete extremadamente intuitivo, que permite la definición y entrenamiento de redes neuronales de forma muy sencilla, rápida y bastante personalizable, además de estar respaldado por la potencia de TensorFlow si se desea. Asimismo, cuenta con una comunidad muy activa, que hace disponibles numerosos artículos, tutoriales, foros y modelos desarrollados por los propios usuarios, lo cual contribuye enormemente a aprenderlo de forma autodidacta, como ha sido el caso de este proyecto. 4.2 Líneas futuras Habiendo cumplido los objetivos establecidos para este Trabajo Fin de Máster, se considera que se le podría dar continuidad al estudio con las siguientes líneas de trabajo con el objetivo de perfeccionar el modelo y evitar el sobreajuste: i) Una forma de evitar el sobreajuste es proporcionando más datos de entrenamiento, para ayudar a la red a que generalice mejor. Dado que no se dispone de dichos datos, una técnica muy utilizada es el aumento de datos (data augmentation), por la cual se realizan transformaciones sobre las propias imágenes que se tienen disponibles, como son rotaciones, aumentos o transformaciones elásticas. De hecho, en el artículo de la U-Net se recomienda este tipo de práctica, y en general en el mundo de la imagen biomédica, ya que la deformación es la variación más común en el tejido real, pudiendo ser simulada eficientemente mediante transformaciones. ii) Otra forma de solucionar el sobreajuste es implementar regularización en la red. La regularización es una técnica que trata de simplificar el modelo de la red, ya que cuanto más complejo sea más probabilidades hay de que se ajuste demasiado a los datos de entrenamiento. Para ello se establecen algunos parámetros a 0 de forma que no contribuyan a la solución, y consecuentemente simplificando el modelo. En redes neuronales, el método utilizado para ello es el dropout. Para la red U-Net, el lugar recomendado para implementar el dropout es al final del camino de contracción. iii) Para mejorar el rendimiento de la red, es también importante controlar la tasa de aprendizaje. Implementar una tasa de aprendizaje adaptativa, que comience alta y vaya disminuyendo conforme avancen las épocas, asegura que al comienzo de la ejecución se avance lo suficientemente rápido, y conforme se acerque a la solución se realice un ajuste más fino, permitiendo llegar a la solución óptima. iv) Implementar programáticamente el early stopping y guardar el modelo óptimo, de forma que se puedan realizar con él las predicciones definitivas de la red. Todas estas mejoras propuestas son susceptibles de ser implementadas en Keras. La primera de ellas es muy sencilla de realizar, mediante el paquete ImageDataGenerator, aunque al tener más imágenes será más lento el
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 53 entrenamiento. Para la regularización existe la capa Dropout, que no hay más que añadir al modelo detrás de la capa que se desee, y anulará los parámetros que considere óptimos mediante el entrenamiento. Ésta no se ha implementado debido a que el uso de BatchNormalization también tiene un efecto regularizador, y su uso en conjunto con Dropout no está probado que sea necesario, aunque se deja también como línea de investigación abierta el ver si se complementan entre ellas o cuál tiene más ventajas. En cuanto a la variación dinámica de la tasa de aprendizaje, algunos optimizadores de Keras admiten parámetros que permiten controlar la caída (decay) de la tasa de aprendizaje, como es el caso de Adam. De hecho, además del decay personalizado, Adam ya implementa por defecto una caída de la tasa de aprendizaje. Otra forma de adaptar la tasa de aprendizaje es el uso de callbacks durante el entrenamiento. En concreto, Keras ofrece la clase LearningRateScheduler que facilita su implementación. Asimismo, existe el callback EarlyStopping que permite parar el entrenamiento cuando una métrica dada deja de mejorar.
55 ANEXO A: REFERENCIAS [1] O. Ronneberger, P. Fischer and T. Brox, “U-Net: Convolutional Networks for Biomedical Image Segmentation,” University of Freiburg, 2015. [2] ISBI, “Segmentation of neuronal structures in EM stacks Challenge,” 2012. [Online]. Available: http://brainiac2.mit.edu/isbi_challenge/. [Accessed 10 Jul 2019]. [3] D. Ciresan, L. Gambardella, A. Giusti y J. Schmidhuber, «Deep neural networks segment neuronal membranes in electron microscopy images,» NIPS, p. 2852–2860, 2012. [4] ISBI, “Cell Tracking Challenge,” [Online]. Available: http://celltrackingchallenge.net/. [Accessed 10 Jul 2019]. [5] The Gale Group Inc., “Technology: I. History of Medical Technology,” in Encyclopedia of Bioethics, 2004. [6] IARC, “Global Cancer Observatory,” 2019. [Online]. Available: https://gco.iarc.fr/. [Accessed 9 Jun 2019]. [7] The Skin Cancer Foundation, “Skin Cancer Information: Melanoma,” 2019. [Online]. Available: https://www.skincancer.org/skin-cancer-information/melanoma. [Accessed 9 Jun 2019]. [8] J. Jaworek-Korjakowska, “Computer-Aided Diagnosis of Micro-Malignant Melanoma Lesions Applying Support Vector Machines,” BioMed Research International, vol. 2016 (Article ID 4381972), 2016. [9] International Dermoscopic Society; International Skin Imaging Collaboration, “Dermoscopedia,” 2019. [Online]. Available: https://dermoscopedia.org/. [Accessed 9 Jun 2019]. [10] J. J. C. García, “Lesiones Pigmentadas: Valoración Dermatoscópica,” Revista Clínica de Medicina en Familia, vol. 4, no. 2, pp. 177-179, 2011. [11] International Skin Imaging Collaboration, “International Skin Imaging Collaboration,” 2019. [Online]. Available: https://www.isic-archive.com/. [Accessed 30 Jun 2019]. [12] M. Zortea, S. O. Skrøvseth, T. R. Schopf, H. M. K. and F. Godtliebsen, “Automatic Segmentation of Dermoscopic Images by Iterative Classification,” International Journal of Biomedical Imaging, vol. 2011 (Article ID 972648), 2011. [13] A. Masood and A. A. Al-Jumaily, “Computer Aided Diagnostic Support System for Skin Cancer: A Review of Techniques and Algorithms,” International Journal of Biomedical Imaging, vol. 2013 (Article ID 323268), 2013. [14] F.-F. Li and J. C. Niebles, “Computer Vision: Foundations and Applications, course notes (s131),” Stanford University, 2016. [Online]. Available:
56 Anexo A: Referencias http://vision.stanford.edu/teaching/cs131_fall1617/index.html. [Accessed 19 Jun 2019]. [15] N. Sharma, A. K. Ray, K. S. Sharma, K. Shukla, S. Pradhan and L. M. Aggarwal, “Segmentation and classification of medical images using texture-primitive features: Application of BAM-type artificial neural network,” Journal of Medical Physics, vol. 33, no. 3, pp. 119-26, 2008. [16] N. Codella, V. Rotemberg, P. Tschandl, M. E. Celebi, S. Dusza, D. Gutman, B. Helba, A. Kalloo, K. Liopyris, M. Marchetti, H. Kittler and A. Halpern, “Skin Lesion Analysis Toward Melanoma Detection 2018: A Challenge Hosted by the International Skin Imaging Collaboration (ISIC),” 2018. [17] P. Tschandl, C. Rosendahl and H. Kittler, “The HAM10000 dataset, a large collection of multi-source dermatoscopic images of common pigmented skin lesions,” Scientific Data, vol. 5, no. 180161, 2018. [18] M. E. Celebi, N. Codella and A. Halpern, “Dermoscopy Image Analysis: Overview and Future Directions,” IEEE Journal of Biomedical and Health Informatics, vol. 23, no. 2, pp. 474-478, March 2019. [19] P. Bhati and M. Singha, “Segmentation Techniques for Skin Lesion: A Comparative Study,” International Journal of Tren in Research and Development, vol. 5, no. 3, May 2018. [20] V. Revathi and A. Chithra, “A Review on Segmentation Techniques in Skin Lesion Images,” International Research Journal of Engineering and Technology, vol. 2, no. 9, Dec 2015. [21] T. Mendoza et al., “Comparison of Segmentation Methods for Automatic Diagnosis of Dermoscopy Images,” 29th Annual International Conference of the IEEE Engineering in Medicine and Biology Society, pp. 6572-6575, 2007. [22] J. Rogowska, “Handbook of Medical Image Processing and Analysis,” Academic Press, 2009. [23] C. Piech, “Artificial Intelligence: Principles and Techniques, course notes (cs221),” Stanford University, 2013. [Online]. Available: https://stanford.edu/~cpiech/cs221/index.html. [Accessed 19 Jun 2019]. [24] S. Yuheng and Y. Hao, “Image Segmentation Algorithms Overview,” SiChuan University, ChengDu, 2017. [25] J. Capitán Fernández and J. Ferruz Melero, “Sistemas Inteligentes, course notes (51420030),” University of Seville, 2018. [26] Nvidia Corporation, “Nvidia blog: Deep Learning,” 2019. [Online]. Available: https://blogs.nvidia.com/blog/category/deep-learning/. [Accessed 19 Jun 2019]. [27] Oracle Corporation, “Oracle Big Data Blog,” [Online]. Available: https://blogs.oracle.com/bigdata/. [Accessed 19 Jun 2019]. [28] BigML, Inc., “Machine Learning 101,” 2019. [Online]. Available: https://bigml.com/ml101. [Accessed 19 Jun 2019]. [29] J. J. Murillo Fuentes and J. C. Aradillas Jaramillo, “Análisis de Datos y Procesado de la Información, course notes (51420022),” University of Seville, 2019. [30] V. Jha, “Machine Learning Algorithm - Backbone of emerging technologies,” 2017. [Online]. Available: https://www.techleer.com/articles/203-machine-learning-algorithm-backbone-of-emerging-
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 57 technologies/. [Accessed 26 Jun 2019]. [31] A. Karpathy, “Convolutional Neural Networks for Visual Recognition, course notes (cs231n),” Stanford University, 2019. [Online]. Available: http://cs231n.stanford.edu/. [Accessed 19 Jun 2019]. [32] S. Jain, “An Overview of Regularization Techniques in Deep Learning,” 19 Apr 2018. [Online]. Available: https://www.analyticsvidhya.com/blog/2018/04/fundamentals-deep-learning-regularization- techniques/. [Accessed 26 Jun 2019]. [33] M. Peemen, B. Mesman and H. Corporaal, “Efficiency Optimization of Trainable Feature Extractors for a Consumer Platform,” in Advances Concepts for Intelligent Vision Systems - 13th International Conference, Ghent, Belgium, 2011. [34] Y. Lecun, L. Bottou, Y. Bengio y P. Haffner, «Gradient-based learning applied to document recognition,» Proceedings of the IEEE, vol. 86, nº 11, pp. 2278-2324, November 1998. [35] K. Nguyen, C. Fookes, A. Ross y S. Sridharan, «Iris Recognition With Off-the-Shelf CNN Features: A Deep Learning Perspective,» IEEE Access, vol. 6, pp. 18848-18855, 2018. [36] A. Xrizhevsky, I. Sutskever y G. E. Hinton, «ImageNet Classification with Deep ConvolutionalNeural Networks,» University of Toronto, 2012. [37] K. Simonyan and A. Zisserman, “Very Deep Convolutional Networks for Large-Scale Image Recognition,” University of Oxford, 2014. [38] C. Szegedy, W. Liu, Y. Jia, P. Sermanet, S. Reed, D. Anguelov, D. Erhan, V. Vanhoucke and A. Rabinovich, “Going Deeper with Convolutions,” Google Inc., University of North Carlina, University of Michigan, 2014. [39] K. He, X. Zhang, S. Ren and J. Sun, “Deep Residual Learning for Image Recognition,” Microsoft Research, 2015. [40] J. Long, E. Shelhamer and T. Darrell, “Fully Convolutional Networks for Semantic Segmentation,” UC Berkeley, 2014. [41] V. Badrinarayanan, A. Kendall and R. Cipolla, “SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation,” 2015. [42] F. Yu and V. Koltun, “Multi-Scale Context Aggregation by Dilated Convolutions,” Princeton University, Intel Labs, 2015. [43] L.-C. Chen, G. Papandreou, I. Kokkinos, K. Murphy and A. L. Yuille, “Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs,” Univ. of California, Google Inc., Ecole Centrale Paris, 2014. [44] T.-Y. Lin, P. Dollár, R. Girshick, K. He, B. Hariharan and S. Belongie, “Feature Pyramid Networks for Object Detection,” Facebook AI Research, Cornell University, Cornell Tech, 2016. [45] H. Zhao, J. Shi, X. Qi, X. Wang and J. Jia, “Pyramid Scene Parsing Network,” The Chinese University of Hong Kong, SenseTime Group Limited, 2016. [46] L.-C. Chen, G. Papandreou, I. Kokkinos, K. Murphy and A. L. Yuille, “DeepLab: Semantic Image
58 Anexo A: Referencias Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs,” 2016. [47] G. Lin, A. Milan, C. Shen and I. Reid, “RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation,” The University of Adelaide, Australian Centre for Robotic Vision, 2016. [48] G. Piatetsky, “Machine Learning platforms: Trends and Analysis,” 2019. [Online]. Available: https://www.kdnuggets.com/2019/05/poll-top-data-science-machine-learning-platforms.html. [Accessed 26 Jun 2019]. [49] J. Hale, “Deep Learning Framework Power Scores 2018,” 20 Sep 2018. [Online]. Available: https://towardsdatascience.com/deep-learning-framework-power-scores-2018-23607ddf297a. [Accessed 26 Jun 2019]. [50] J. Hale, “Which Deep Learning Framework is Growing Fastest?,” 1 Apr 2019. [Online]. Available: https://towardsdatascience.com/which-deep-learning-framework-is-growing-fastest-3f77f14aa318. [Accessed 26 Jun 2019]. [51] “Keras Docs,” [Online]. Available: https://keras.io/. [Accessed 28 Jun 2019]. [52] “Machine Learning Cheatsheet,” 2017. [Online]. Available: https://mlcheatsheet.readthedocs.io/en/latest/. [Accessed 28 Jun 2019]. [53] C. S. Sergey Ioffe, “Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift,” Google, Inc, 2015. [54] F. Doukkali, “Batch normalization in Neural Networks,” 20 Oct 2017. [Online]. Available: https://towardsdatascience.com/batch-normalization-in-neural-networks-1ac91516821c. [Accessed 28 Jun 2019]. [55] F. Peccia, “Batch normalization: theory and how to use it with Tensorflow,” 16 Sep 2018. [Online]. Available: https://towardsdatascience.com/batch-normalization-theory-and-how-to-use-it-with- tensorflow-1892ca0173ad. [Accessed 28 Jun 2019]. [56] D. Sarkar, “A Comprehensive Hands-on Guide to Transfer Learning with Real-World Applications in Deep Learning,” 15 Nov 2018. [Online]. Available: https://towardsdatascience.com/a-comprehensive- hands-on-guide-to-transfer-learning-with-real-world-applications-in-deep-learning-212bf3b2f27a. [Accessed 28 Jun 2019]. [57] V. Iglovikov and A. Shvets, “TernausNet: U-Net with VGG11 Encoder Pre-Trained on ImageNet for Image Segmentation,” Lyft Inc., Massachusetts Institute of Technology, 2018. [58] M. u. Hassan, «VGG16 – Convolutional Network for Classification and Detection,» 20 Nov 2018. [En línea]. Available: https://neurohive.io/en/popular-networks/vgg16/. [Último acceso: 30 Jun 2019]. [59] Google, Inc., “Google Colaboratory,” [Online]. Available: https://colab.research.google.com/. [Accessed 30 Jun 2019]. [60] Nvidia Corporation, “Nvidia Tesla T4 GPU,” 2019. [Online]. Available: https://www.nvidia.com/engb/data-center/tesla-t4/. [Accessed 30 Jun 2019]. [61] J. Mathew, “Image Segmentation Keras: Implementation of Segnet, FCN, UNet and other models in Keras.,” [Online]. Available: https://github.com/jibinmathew69/image-segmentation-keras. [Accessed 19
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 59 Jun 2019]. [62] A. Rosebrock, “Intersection over Union (IoU) for object detection,” PyImageSearch, 7 Nov 2016. [Online]. Available: https://www.pyimagesearch.com/2016/11/07/intersection-over-union-iou-for- object-detection/. [Accessed 30 Jun 2019]. [63] C. Qian, H. Jiang y T. Liu, «ISIC 2018 – Skin Lesion Analysis,» MTLab, Meitu, Inc, 2018. [64] N. C. F. Codella, D. Gutman, M. E. Celebi, B. Helba, M. A. Marchetti, S. W. Dusza, A. Kalloo, K. Liopyris, N. Mishra, H. Kittler and A. Halpern, “Skin Lesion Analysis Toward Melanoma Detection: A Challenge at the 2017 International Symposium on Biomedical Imaging (ISBI), Hosted by the International Skin Imaging Collaboration (ISIC),” 2017. [65] Invicro, LLC, “Rhesus Teeth Segmentation by Use of Multi-Atlas Library,” [Online]. Available: https://www.invicro.com/rhesus-teeth-segmentation-by-use-of-multi-atlas-library/. [Accessed 30 Jun 2019].
66 Anexo C: Detalles de Implementación Cálculo de métricas import math import numpy as np def model_metrics(y_true, y_pred): targ = y_true[:,:,0] predict = y_pred[:,:,0] npixels = targ.size # tp: true=1 & pred=1 tp = np.sum(targ*predict) # fp: true=0 & pred=1 fp = np.sum((predict-targ)==1) # fn: true=1 & pred=0 fn = np.sum((targ-predict)==1) # tn: true=0 & p=0 tn = npixels-tp-fp-fn accuracy = (tp+tn)/(tp+fp+tn+fn) if math.isnan(accuracy): accuracy=0.0 precision = tp/(tp+fp) if math.isnan(precision): precision=0.0 recall = tp/(tp+fn) if math.isnan(recall): recall=0.0 specificity = tn/(tn+fp) if math.isnan(specificity): specificity=0.0 dice = 2*tp/(2*tp+fn+fp) if math.isnan(dice): dice=0.0 jaccard = tp/(tp+fn+fp) if math.isnan(dice): jaccard=0.0 jaccard_threshold = jaccard if jaccard_threshold<0.65: jaccard_threshold = 0.0 metrics_array = [accuracy, precision, recall, specificity, dice, jaccard, jaccard_threshold] return metrics_array
Aprendizaje profundo para la segmentación de lesiones pigmentadas de la piel 67 Predicción y obtención de métricas from keras.models import load_model import matplotlib.pyplot as plt import pandas as pd import datetime import numpy as np import sys from utils import getImage, getSegmentation, model_metrics # ################################# PARAMETERS ################################ DIM_ORDER='channels_last' save_predictions = True save_metrics = True # ----------------- Test parameters test_images_path = "data/validation/input/" test_segs_path = "data/validation/groundtruth/" test_size = 400 test_results_path = "data/results/" # ----------------- Model parameters load_model_path = "checkpoint/vgg_model.2019-06-29_1114.acc98.h5" width = 128 height = 128 # ############################# MODEL LOADING ################################## m = load_model(load_model_path) # ############################# PREDICTION ##################################### images = glob.glob( test_images_path + "*.jpg" ) images.sort() dte = datetime.datetime.now().strftime("%Y-%m-%d_%H%M") if save_predictions: output_path = test_results_path + "%s/" %dte try: os.mkdir(output_path) except OSError: print ("Creation of the directory %s failed" %output_path) else: print ("Successfully created the directory %s" %output_path) headers = ['accuracy', 'precision', 'sensitivity', 'specificity', 'dice coeff', 'jaccard', 'jaccard threshold'] index = [] metrics_list = [] i=0 start = datetime.datetime.now() for imgName in images: # Predict segmentation mask X = getImage(imgName, width, height, DIM_ORDER) pr = m.predict( np.array([X]), verbose=0)[0] pr = (pr>0.5).astype(int) # Get ground truth and calculate metrics maskName = imgName.replace(test_images_path,test_segs_path). replace(".jpg", "_segmentation.png") Y = getSegmentation(maskName, width, height, DIM_ORDER) metrics = model_metrics(Y, pr) metrics_list.append(metrics)
68 Anexo C: Detalles de Implementación # Save prediction image if save_predictions: index.append(imgName.replace(test_images_path, "")) pr_img = pr*255 outName = maskName.replace(test_segs_path, output_path) cv2.imwrite(outName, pr_img) # Progress i=i+1 print("\r", "Iteration: %d/%d" %(i,test_size), end="") if i%50==0: end = datetime.datetime.now() dur = (end-start).total_seconds() print('\t %d s' %dur) print('\t', headers) print('\t', np.mean(metrics_list, axis=0)) start = datetime.datetime.now() # Calculate mean metrics_df = pd.DataFrame(metrics_list, index=index, columns=headers) metrics_total = metrics_df.mean(axis=0, numeric_only=True) print('\nMétricas finales:') print(metrics_total) # Save to csv file if save_metrics: metrics_df.loc['MEAN'] = metrics_total metrics_df.to_csv("records/test_metrics.%s.csv"%dte, mode="w+", index=True, header=True)