scieee AI-readable full text Open interactive document viewer

Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas

Garrucho Fernández, Fernando

Abstract

La inteligencia Artificial y más concretamente el Deep Learning o aprendizaje profundo está siendo de gran relevancia hoy en día ya que se implementa en dispositivos que todos usamos diariamente. En este trabajo se conocerá un poco acerca de esta tecnología, viendo su historia, entendiendo sus elementos más básicos, adentrándose en su estructura y diseñando una red neuronal completa, en este caso se diseñará una red neuronal convolucional en Python para clasificación de imágenes más concretamente imágenes de plantas que se clasificarán por su número de hojas y se propondrán varias técnicas de preprocesado de imagen para mejorar el rendimiento de la red. Por último, se compararán los resultados con otro algoritmo que nada tiene que ver con inteligencia artificial y que también sirve para reconocimiento de imágenes. Este estudio no tiene un fin comercial, sino familiarizarse con esta herramienta tan potente que es el Deep learning, aprender sobre el tratamiento de las imágenes y conocer técnicas para mejorar el aprendizaje de estas redes.

Full text

i Equation Chapter 1 Section 1 Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas Autor: Fernando Garrucho Fernández Tutor: Rubén Martín Clemente Dpto. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2022 ii iii Trabajo Fin de Grado Ingeniería de Telecomunicaciones Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas Autor: Fernando Garrucho Fernández Tutor: Rubén Martín Clemente Profesor titular Dpto. de Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2022 iv v Trabajo Fin de Grado: Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas Autor: Fernando Garrucho Fernández Tutor: Rubén Martín Clemente El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: vi Acuerdan otorgarle la calificación de: Sevilla, 2022 El Secretario del Tribunal vii Agradecimientos Estas líneas son en agradecimiento a todas esas personas que son importantes para mi y que aprecio y respeto, y que sin ellas no hubiese sido posible finalizar esta etapa. A mis padres quienes me han dado todo (y les debo todo) y me han inculcado desde pequeño que hay que trabajar duro para conseguir lo que te propongas. A mi hermano quien es una de las personas más importantes en mi día a día y que seremos compañeros y amigos para toda la vida. A mis abuelas, a mis tios y tias, mis primos y prima, y toda la familia cercana que es importante desde que tengo uso de razón y a todos aquellos que ya no están pero que nunca los olvidaré. A mis amigos los cuáles me sirven de apoyo continuo hasta casi que algunos son considerados familia y que también aportan alegría para afrontar cada día. A mis compañeros de clase y a toda la gente que he conocido por la universidad a través de programas como Erasmus o SICUE los cuales me han hecho mejor persona y he aprendido mucho de ellos. A aquellos profesores que merece la pena escucharlos y que demuestran su vocación por la profesión los cuales han hecho que me apasione esta ingeniería. Y por último, y no por ello menos importante, darme las gracias a mi, gracias por creer en mi y no darme por vencido, por trabajar sin descanso cuando fue necesario y por luchar por todos los objetivos que me propongo sin decaer, porque como aficionado al deporte me acuerdo de las palabras que pronunció el entrenador de tenis Toni Nadal, antiguo entrenador y tío de Rafa Nadal, las cuales sirvieron a Rafa para llegar a ser el mejor tenista de la historia y me sirven a mi para afrontar nuevos retos: “Es fácil poner ilusión en una final de Grand Slam, lo difícil es poner esa ilusión en cada partido, en cada entrenamiento y en cada bola que se juega para ser uno de los pocos privilegiados que llegan hasta allí”. Fernando Garrucho Fernández Sevilla, 2022 viii ix Resumen La inteligencia Artificial y más concretamente el Deep Learning o aprendizaje profundo está siendo de gran relevancia hoy en día ya que se implementa en dispositivos que todos usamos diariamente. En este trabajo se conocerá un poco acerca de esta tecnología, viendo su historia, enteniendo sus elementos más básicos, adentrándose en su estructura y diseñando una red neuronal completa, en este caso se diseñará una red neuronal convolucional en Python para clasificación de imágenes más concretamente imágenes de plantas que se clasificarán por su número de hojas y se propondrán varias técnicas de preprocesado de imagen para mejorar el rendimiento de la red. Por último, se compararán los resultados con otro algoritmo que nada tiene que ver con inteligencia artificial y que también sirve para reconocimiento de imágenes. Este estudio no tiene un fin comercial, sino familiarizarse con esta herramienta tan potente que es el Deep learning, aprender sobre el tratamiento de las imágenes y conocer técnicas para mejorar el aprendizaje de estas redes. xvi Figura 5-20. Respuesta al entrenamiento del modelo. Imágenes sin procesar. 40 Figura 5-21. Número de imágenes. 41 Figura 5-22. Respuesta al entrenamiento del modelo. Imágenes procesadas. 41 Figura 5-23. Número de imágenes 42 Figura 5-24. Respuesta al entrenamiento. Imágenes procesadas. 42 Figura 5-25. Respuesta al entrenamiento del modelo. Imágenes procesadas. 43 Figura 5-26. Respuesta al algoritmo en matlab. 44 Figura 5-27. Precisión del fichero Count1leaf.m 44 Figura 5-28. Caso de error del algoritmo y su corrección. 44 Figura 5-29. Precisión del fichero count2leaves.m. 45 Figura 5-30. Muestra una planta con dos hojas clasificada como si fuese 1 hoja ya que no se encuentran sus hojas separadas. 45 Figura 5-31. Precisión del fichero count3leaves.m 45 Figura 5-32. Precisión del fichero count4leaves.m 45 Figura 5-33. Precisión del fichero count5leaves.m 45 xvii ÍNDICE DE CÓDIGOS Código 5-1. Librerías usadas en el proyecto. 22 Código 5-2. Descomposición de la BBDD. 25 Código 5-3. Cuenta el número de imágenes. 26 Código 5-4. Número de imágenes aplicando el 80-10-10 % para la primera categoría. 27 Código 5-5. Reparte las imágenes en sus respectivos directorios de train, validation y test. 27 Código 5-6. Red neuronal Convolucional 28 Código 5-7. Hiperparámetros. 29 Código 5-8. Data augmentation con ImageDataGenerator. 29 Código 5-9. Image Data Generator. 30 Código 5-10. Obtención de valores de steps_per_epoch y validation_steps. 30 Código 5-11. Entrenamiento del modelo 31 Código 5-12. Precisión para los datos de prueba. 31 Código 5-13. Muestra las curvas de aprendizaje y error. 31 Código 5-14. Muestra la matriz de confusión y reporte de los resultados. 31 Código 5-15. Número de imágenes elegido. 32 Código 5-16. Implementación de la red Inception_v3. 33 Código 5-17. Creación de las últimas capas de la red. 34 Código 5-18. Extracción del color verde. 36 Código 5-19. Erosión. 36 Código 5-20. Extracción de hojas de la imagen. 36 Código 5-21. Capa final de la red. 37 xviii xix LISTA DE ACRÓNIMOS IA Inteligencia Artificial DL Deep Learning ML Machine Learning CNN Convolutional Neural Networks BGR Blue Green Red GPU Graphics Processing Unit CPU Central Processing Unit BBDD Base de Datos. HSV Hue, Saturation, Value xx Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 1 1 INTRODUCCIÓN n los siguientes apartados se explican los motivos por los que se decidió realizar este proyecto basado en el campo del ‘Deep Learning’ o aprendizaje profundo, más concretamente en las redes neuronales y dentro de éstas las convolucionales que son las que mejores prestaciones ofrecen en el tratamiento de imágenes como se verá posteriormente. También se detallan los objetivos de este estudio, así como la estructura u organización de esta memoria. 1.1 Motivación Cada día se ven numerosas implementaciones de la IA en todos los ámbitos. En la industria del automóvil la conducción autónoma es una realidad, también el reconocimiento de voz se ha implementado de manera exitosa en muchos de los dispositivos usados cotidianamente pudiendo interactuar con ellos con la voz, otro sería el reconocimiento facial o la detección de huellas dactilares los cuales han mejorado tanto que nuestras contraseñas quedan protegidas por estos sistemas, incluso el reconocimiento de imágenes en nuestros móviles puede hacer que detecte las personas que aparecen en cada foto de la galería. Todas las mejoras enumeradas usan el aprendizaje profundo, es por ello por lo que la motivación de este estudio es familiarizarse con este campo y más concretamente en el campo de visión por ordenador, más conocido como reconocimiento de imágenes por ordenador, el cual se especializa en el reconocimiento de imágenes. Se persigue entender el funcionamiento de estas redes y compararlas con otros métodos alternativos de clasificación para ver si son estrictamente necesarias. 1.2 Objetivos El principal objetivo de este trabajo es conocer el mundo del Machine Learning y del Deep Learning y aprender sobre preprocesamiento de imágenes en Python. Para ello se elegirá una base de datos sobre la que trabajar, esta base de datos contiene imágenes sobre plantas de diferentes especies clasificadas por su número de hojas. Esas imágenes se preprocesarán para así ayudar a la red neuronal a clasificarlas, luego se diseñará la red neuronal y se optimizará para adecuarla al problema de clasificación presentado. Se harán las modificaciones pertinentes para mejorar lo máximo posible la precisión de la red aprendiendo de las curvas de aprendizaje e interpretando la matriz de confusión, por último, se presentará un algoritmo en Matlab que resuelve problemas de clasificación para compararlo con la red neuronal y ver si esta es realmente necesaria para este problema. 1.3 Estructura La organización que se ha seguido para el proyecto ha sido la siguiente: • Capítulo 1. Introducción: En este se presenta la motivación de este proyecto, así como el objetivo que E “La inteligencia artificial sería la versión definitiva de Google. El motor de búsqueda definitivo que entendería todo en la web. Entendería exactamente lo que quieres, y te daría lo correcto. No estamos cerca de hacer eso ahora. Sin embargo, podemos acercarnos cada vez más a eso, y eso es básicamente en lo que trabajamos”- Larry Page, fundador de Google - Introducción 2 2 se persigue, se enumera también su estructura. • Capítulo 2. Aprendizaje Profundo: Introducción al Machine Learning y a la Inteligencia artificial, presentación del Deep Learning y profundización en cómo funciona una red neuronal y cuáles son sus partes. • Capítulo 3. Redes Neuronales Convolucionales: Presentación del tipo de redes neuronales conocidas como convolucionales, estructura y partes que la conforman. Descripción de sus principales problemas y métodos usados para solucionarlos, por último, se interpretan sus salidas. • Capítulo 4. Preprocesado de los datos: Herramienta usada para el preprocesamiento de los datos que ayudará a la red a tener mejor rendimiento. • Capítulo 5. Implementación y experimentos: Entorno usado, diseño de la red neuronal, problemas encontrados y soluciones a estos en forma de experimentos, resultados finales. Por último, algoritmo en Matlab para compararlo con el rendimiento de la red neuronal. • Capítulo 6. Conclusiones y líneas futuras: Interpretación de los resultados obtenidos y planteamiento de posibles mejoras futuras Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 3 2 APRENDIZAJE PROFUNDO n el siguiente apartado se detalla todo lo que se necesita conocer sobre aprendizaje profundo para la realización de este proyecto. Se comenzará con un repaso general sobre inteligencia artificial hasta indagar en las redes neuronales y sus diferentes partes y etapas, comprender las curvas de aprendizaje y la posterior mejora de modelos. 2.1. Introducción 2.1.1 Inteligencia Artificial La Inteligencia Artificial o IA (AI en inglés) es la simulación de procesos de inteligencia humana por parte de sistemas informáticos. Estos procesos incluyen el aprendizaje (la adquisición de información y reglas para el uso de la información), el razonamiento (usando las reglas para llegar a conclusiones aproximadas o definitivas) y la autocorrección. Las aplicaciones particulares de la IA incluyen sistemas expertos, reconocimiento de voz y visión artificial [1]. Se considera que el punto de partida de esta tecnología es el año 1950, precisamente, cuando Turing publica un artículo con el título “Computing machinery and intelligence” en la revista Mind, donde se hacía la pregunta: “¿pueden las máquinas pensar?” y proponía un método para determinar si una máquina puede pensar. Los fundamentos teóricos de la IA se encuentran en el experimento que propone en dicho artículo y que pasó a denominarse Test de Turing, en el cual se plantea si una máquina pudiera pasar por un humano en una charla a ciegas. Esta prueba sigue estando vigente en la actualidad y es motivo de estudios e investigaciones continuas. Aunque no fue hasta el año 1956, cuando los padres de la inteligencia artificial moderna, John McCarty, Marvin Misky y Claude Shannon acuñaron formalmente el término IA durante la conferencia de Darmouth. La inteligencia artificial tuvo un período de sequía propiciado por la falta de interés y de optimismo en el tema, este período es conocido como “AI Winter”. Hasta el año 1997 cuando el supercomputador Deep Blue de IBM ganó al campeón mundial de ajedrez Gari Kasparov. El año 1997 es considerado por algunos historiadores como el punto de inflexión donde comenzó a oírse la inteligencia artificial fuera de los ámbitos académicos y de investigación. Sin embargo, es en la segunda década del siglo XXI cuando comienzan a aparecer los acontecimientos de impacto para llevar la IA al punto de despegue donde se encuentra en este momento [2] [3]. En febrero de 2011, el supercomputador Watson de IBM gana en el concurso televisivo de Estados Unidos “Jeopardy”, en el que se realizan preguntas y cuestiones diferentes de todo tipo, cultura y conocimiento, a los dos mejores concursantes del programa, Brad Ruttler y Ken Jennings. Watson es una computadora capaz de aprender a medida que trabaja y acumula información y que puede interactuar con el lenguaje humano en un lenguaje natural. Watson va aprendiendo con las interacciones con el usuario [2] [3]. Otro hito importante fue la presentación de Apple del asistente virtual Siri integrado en el teléfono móvil iPhone 4S en el año 2011 y donde comenzaron las primeras experiencias de aprendizaje automático y los primeros indicios de aprendizaje profundo. Hasta el día de hoy, donde se ha incrementado el uso del IoT y los dispositivos controlados por voz, no sólo por la mayor entrada de los asistentes de voz de Google, Amazon o Apple en el ámbito doméstico sino por el crecimiento esperado de su implantación en oficinas y áreas de trabajo [2] [3]. Aunque al pensar en Inteligencia Artificial se nos viene a la mente robots reemplazando humanos el objetivo real no es ése, sino mejorar la vida de las personas haciendo tareas repetitivas y manejando grandes cantidades de datos mucho mejor y más eficientemente. La Inteligencia artificial está compuesta de numerosas ramas, en este trabajo nos centraremos en el Machine Learning y más concretamente en el Deep Learning. E Aprendizaje profundo 4 4 Figura 2-1. Jerarquía de la IA, ML y DL. Fuente: Nadia Berchane (M2 IESCI, 2018) 2.1.2 Aprendizaje Máquina “En definitiva, el aprendizaje máquina (o machine learning) es un maestro del reconocimiento de patrones, y es capaz de convertir una muestra de datos en un programa informático capaz de extraer inferencias de nuevos conjuntos de datos para los que no ha sido entrenado previamente”, explica José Luis Espinoza, científico de datos de BBVA México [4]. “Machine Learning” o Aprendizaje Máquina es una rama dentro de la IA y ésta tomará un conjunto de datos de entrada y emitirá una respuesta basada en los datos dados que determine como correcta. Lo hace mediante algoritmos cuyo rendimiento mejora a medida que se exponen a más datos a lo largo del tiempo. En cuanto a sus algoritmos, estos pueden ser muy potentes, pueden ser entrenados para reconocer patrones en los datos que los humanos no pueden y pueden hacer predicciones futuras basadas en lo que ya saben del pasado. Varias industrias ya lo han implementado en sus operaciones, incluyendo la analítica de negocios, la automatización del marketing, el servicio al cliente, la prevención del fraude y la seguridad [5]. Dada la madurez del área de investigación en Machine Learning, existen muchos enfoques bien establecidos para el aprendizaje automático por parte de máquinas. Cada uno de ellos utiliza una estructura algorítmica diferente para optimizar las predicciones basadas en los datos recibidos. Machine Learning es un amplio campo con una compleja taxonomía de algoritmos que se agrupan, en general, en tres grandes categorías: aprendizaje supervisado, aprendizaje no supervisado y aprendizaje por refuerzo [5]. 2.1.2.1 Aprendizaje Supervisado Se refiere a aprendizaje supervisado cuando los datos usados para el entrenamiento incluyen la solución deseada, llamada etiqueta o “label”. Algunos algoritmos de esta categoría son la regresión lineal, la regresión logística y redes neuronales [6]. Será este último el caso de interés del proyecto. 2.1.2.2 Aprendizaje no Supervisado Se refiere a aprendizaje no supervisado cuando los datos usados para el entrenamiento no incluyen la solución y será el algoritmo el que intente clasificar la información por sí mismo. Algunos algoritmos de esta categoría son clustering (K-means) o principal component analysis (PCA) [6]. 2.1.2.3 Aprendizaje por refuerzo Se refiere a aprendizaje por refuerzo cuando el modelo se implementa en forma de un agente que deberá explorar un espacio desconocido y determinar las acciones a llevar a cabo mediante prueba y error: aprenderá por sí mismo gracias a las recompensas y penalizaciones que obtiene de sus acciones. Este aprendizaje permite ser combinado con otros tipos, y está ahora mismo muy de moda puesto que el mundo real presenta muchos de estos escenarios [6]. 2.1.3 Deep Learning Tal y cómo se comenta en el punto 2.1.2.1 los modelos supervisados contarán con etiquetas o “labels”, que es lo Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 5 que se está intentando predecir. A los datos de entrada se les conoce como “features”. Un modelo o “model” es la relación entre features y labels y tiene dos fases claramente diferenciadas. En primer lugar, se establece la fase de entrenamiento donde el modelo aprende mostrándole los datos de entrada que se tienen etiquetados con su solución. Esto hace que se cree una relación entre las features y labels. Cuando el modelo es entrenado se pasa a la fase de predicción donde basándose en las relaciones creadas en el entrenamiento el modelo intenta predecir nuevos datos sin etiquetar [6]. Si se considera un modelo simple que establezca relación entre features y labels podría establecerse de la siguiente forma: → 𝑦= → 𝑤 → 𝑥+𝑏 Ecuación 1 Donde “→ 𝑦” es el vector de la etiqueta del dato de entrada, “→ 𝑥” es la característica, “→ 𝑤” es la pendiente y se llama peso (o weight en inglés) y “b” es el punto de intersección de la recta en el eje y se llama sesgo (o bias en inglés) [6]. En este contexto, por ahora se puede considerar que la fase de entrenamiento de un modelo consiste básicamente en ajustar los parámetros (los pesos wi y el sesgo b) de tal manera que el resultado de la función de loss (discrepancia entre los valores ideales y los reales) retorna el valor mínimo posible. Sabiendo esto se puede definir Deep Learning o Aprendizaje profundo. Serían modelos, como el de antes mencionado, con múltiples niveles de abstracción que realizan transformaciones lineales y no lineales para obtener una salida próxima a la esperada [6]. Las redes neuronales artificiales no son más que modelos computacionales que imitan estas características arquitecturales, permitiendo que dentro del sistema global haya redes de unidades de proceso que se especialicen en la detección de determinadas características ocultas en los datos [7]. Estos modelos están compuestos por diferentes capas de neuronas, y cada capa sirve para diferente propósito donde cada parámetro importa mucho en el resultado final. Figura 2-2. Estructura de una red neuronal [6]. En los siguientes apartados se verá cómo funcionan las redes neuronales, las funciones de activación, cómo se conecta entre sí cada neurona y la importancia de los parámetros e hiperparámetros. 2.2. Redes Neuronales 2.2.1 Perceptrón Para entender las redes neuronales se debe comenzar por comprender el funcionamiento de su unidad mínima, la neurona o el perceptrón. Un perceptrón efectúa cálculos para detectar características o tendencias en los datos de Redes neuronales convolucionales 12 12 Redes Convolucionales, pues al mantener el tamaño de la imagen entre una capa y otra es posible crear redes más profundas, lo que a su vez permite extraer características más específicas de las imágenes durante el entrenamiento [15] . Figura 3-6. Padding [15]. 3.3.3 Stride El stride es el número de posiciones que se mueve la ventana hacia la derecha, en la figura 3-6 se ve como el Stride tiene valor 1, esto es lo normal o común ya que para reducir la imagen y simplificar la información se suele utilizar el Pooling. En este caso de estudio no se hará uso del Stride [12]. 3.4. Overfitting y Underfitting A la hora de entrenar las redes neuronales, en este caso las convolucionales, pueden aparecer dos fenómenos llamados sobreajuste o overfitting y subajuste o underfitting, estos vienen dados cuando la cantidad de imágenes disponibles para entrenar no es demasiado grande. Las redes neuronales convolucionales necesitan varios miles de imágenes para tener resultados sólidos, aunque con varios cientos se pueden obtener resultados decentes como se verá en próximos capítulos. El sobreajuste ocurre cuando la red neuronal aprende demasiados detalles de unas pocas imágenes dadas, no generalizando las características de la imagen por lo que al intentar predecir una nueva probablemente falle en su predicción. Es decir, el modelo se ajusta demasiado a los datos de entrenamiento y no es capaz de predecir datos que no ha visto antes [16]. También puede ocurrir el fenómeno de subajuste, esto es que los datos son insuficientes para que el modelo aprenda. No se puede intentar clasificar varias categorías con pocas decenas de datos de entrenamiento [16]. Lo ideal sería tener los suficientes datos para que el modelo aprenda y generalice las características de la imagen sin centrarse en los pequeños detalles de los datos de entrenamiento. El overfitting es un problema muy común y se verá en el siguiente apartado varios métodos para intentar mitigarlo. Figura 3-7. Subajuste, correcto y overfitting [17]. Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 13 3.5. Data Augmentation, Transfer Learning y Dropout Para evitar el sobreajuste una solución clara ya ha sido mencionada anteriormente y es tener más datos de entrenamiento, pero a veces esto no es posible debido a que la base de datos disponible tiene un número limitado de imágenes y no podemos aumentarlo. Debido a esto nace la función de Data Augmentation: ésta permite la creación de más datos a partir de los proporcionados empleando modificaciones como giros, inversiones, cambios de color, aumentar el tamaño, introducir ruido, entre muchos otros. Esto hace que la base de datos dada aumente considerablemente “engañando” al modelo, que pensará que son imágenes diferentes cuando en realidad han sido modificadas a partir de una sola. Y a mayor número de datos mejor generaliza el modelo. Es importante resaltar que se realiza la transformación de manera online durante el procesamiento, permitiendo hacer el proceso automático mientras se realiza el entrenamiento sin necesidad de modificar los datos almacenados en disco. Así el modelo ve una imagen generada aleatoriamente una sola vez. Evidentemente, estas transformaciones se podrían realizar previamente e incluirlas en el conjunto de datos de entrenamiento. De esta manera el preprocesado resultaría más rápido, puesto que no se realizarían las transformaciones en tiempo de ejecución, pero en cambio el espacio de almacenamiento y el tiempo de carga de los datos en memoria serían más elevados [18]. Figura 3-8. Ejemplo de data augmentation [12]. El data augmentation tiene limitaciones: no se puede llegar a extraer todas las características importantes con unas pocas imágenes ya que realmente las imágenes generadas son repeticiones de otras con pocas modificaciones. Pero existe una forma de poder usar una red ya pre entrenada con una gran cantidad de datos, y poder adaptarla al problema que se requiera. A este procedimiento se le conoce como Transfer Learning y existen dos formas de utilizar una red pre entrenada que son Feature Extraction y Fine Tunning [19]. Feature Extraction no es más que usar una red ya diseñada con los pesos ya optimizados porque ha sido entrenada con millones de imágenes y miles de clases con procesadores muy potentes capaces de soportar tal volumen de entrenamiento. Empresas como Google realizan modelos de tal envergadura. Es por ello por lo que el Feature Extraction permite hacer uso de estos modelos ya entrenados y haciendo solo pequeñas modificaciones para sus neuronas de salida se pueden adaptar al problema que se requiera [20]. Fine Tunning sigue el mismo concepto que el Feature Extraction. Sin embargo, éste se diferencia en que se modifican algunas capas de la base convolucional del modelo, es decir, se realiza un ajuste más fino para adaptarlo mejor al problema requerido lo que puede ocasionar que mejore su rendimiento [20]. Por último, la técnica conocida como Dropout “apaga” algunas neuronas ya sea de la base convolucional o las neuronas de salida, haciendo que el modelo no mecanice el aprendizaje y así evite el overfitting. Es una técnica ampliamente usada y ha demostrado su buen funcionamiento [21]. Redes neuronales convolucionales 14 14 3.6. Curvas de aprendizaje, Matriz de confusión y Reporte de clasificación. Los resultados del entrenamiento por cada época mostrarán tanto el valor de las precisiones para los datos de entrenamiento y para los datos de validación como el error para ambos datos. Estos valores quedarán representados en una gráfica y formarán una curva creciente para el caso de la precisión y una curva decreciente para el caso de la función de pérdida. A estas curvas se les conoce como curvas de aprendizaje. Las curvas de aprendizaje se utilizan para ver la evolución del modelo, comprobar si aprende correctamente y si va disminuyendo la función de pérdida o si, en cambio, le cuesta aprender debido al subajuste o sobreajuste y la función de pérdida es creciente. Es realmente importante aprender a interpretar las curvas de aprendizaje ya que esto puede ayudar a detectar posibles fallos en el modelo. Generalmente para evaluar modelos sencillos solo hay que centrarse en su precisión, es decir, la proporción entre las predicciones correctas que ha hecho el modelo y el total de predicciones. Sin embargo, aunque en ocasiones resulta suficiente, otras veces es necesario profundizar más y tener en cuenta los tipos de predicciones correctas e incorrectas que realiza el modelo en cada una de sus categorías. Una herramienta para evaluar modelos es la matriz de confusión (confusion matrix), es una tabla con filas y columnas que contabilizan las predicciones en comparación con los valores reales. Se usa esta tabla para entender mejor cómo el modelo se comporta y es muy útil para mostrar de forma explícita cuando una clase es confundida con otra [6]. Una matriz de confusión tiene la siguiente estructura. Figura 3-9. Estructura de una matriz de confusión binaria. En la que VP es la cantidad de positivos que fueron clasificados correctamente como positivos por el modelo. VN es la cantidad de negativos que fueron clasificados correctamente como negativos por el modelo. FN es la cantidad de positivos que fueron clasificados incorrectamente como negativos. FP es la cantidad de negativos que fueron clasificados incorrectamente como positivos. Con esta matriz de confusión, la precisión se puede calcular sumando los valores de la diagonal y divido por el total: 𝐴𝑐𝑐𝑢𝑟𝑎𝑐𝑦 = (𝑉𝑃 + 𝑉𝑁) / (𝑉𝑃 + 𝐹𝑃 + 𝑉𝑁 + 𝐹𝑁) Ecuación 4. Precisión del modelo. Pero ¿como se muestra una matriz de confusión para modelos de más de una categoría?, se ve en la siguiente figura. Figura 3-10. Matriz de confusión de un modelo de 4 clases. En este caso los elementos de la diagonal representan el número de puntos en que la etiqueta que predice el Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 15 modelo coincide con el valor real de la etiqueta, mientras que los otros valores nos indican los casos en que el modelo ha clasificado incorrectamente. Por tanto, cuanto más altos son los valores de la diagonal mejor será la predicción. También existe una función que devolverá un reporte con porcentajes de interés sobre la precisión para cada clase de los datos de predicción. Esta función se denomina classification_report() de la librería Sklearn. Los parámetros son los siguientes: Figura 3-11. Ejemplo de Classification Report. • Precision: Porcentaje de predicciones positivas correctas respecto al total de predicciones positivas. • Recall: Porcentaje de predicciones positivas correctas en relación con el total de positivas reales. • F1-score: Media armónica ponderada de la precision y el recall. Cuanto más se acerque a 1, mejor será el modelo. • Support: Estos valores indican cuantas imágenes pertenecen a cada clase en el conjunto de datos de prueba o test. Los promedios indicados incluyen la macro average (que promedia la media no ponderada por etiqueta) y la weighted average (que promedia la media ponderada por soporte por etiqueta). El micro average (que promedia el total de verdaderos positivos, falsos negativos y falsos positivos) sólo se muestra para la clasificación multietiqueta o multiclase con un subconjunto de clases, porque de lo contrario corresponde a la accuracy (como en la figura 3-11) y sería la misma para todas las métricas. Redes neuronales convolucionales 16 16 Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 17 4 PREPROCESADO DE LOS DATOS n este capítulo se presentará una herramienta para preprocesar las imágenes de la base de datos antes de ser usadas por el modelo de DL. Se comprobará en capítulos posteriores como éste preprocesado mejora la precisión ya que ayudará al modelo a distinguir mejor el número de hojas de cada imagen. A continuación, se van a presentar las técnicas que serán usadas en los experimentos, así como los programas empleados y el entorno utilizado. 4.1. OpenCV OpenCV (Open Source Computer Vision Library) es una biblioteca de código abierto que incluye varios cientos de algoritmos de visión por ordenador. OpenCV tiene una estructura modular, lo que significa que el paquete incluye varias bibliotecas compartidas o estáticas [22]. Figura 4-1. Logo de OpenCV. Se usará openCV ya que contiene numerosos tutoriales que facilitan la implementación, en este caso se va a realizar en python (Ver sección 5.1). OpenCV contiene un apartado para preprocesado de imágenes que es el que interesa para este proyecto, donde se encuentran numerosos métodos de preprocesado, a continuación, se verán los métodos que se emplearán posteriormente. 4.2. Cambiar el espacio del color También conocido por su traducción al inglés Changing Color-space este método permite cambiar de un espacio de color a otro, como puede ser BGR↔ Gray, BGR ↔ HSV, entre otros. Para la conversion de color, se usa la función cv.cvtColor(input_image, flag) donde flag determina el tipo de conversión. Para la conversion BGR → GRAY se usa el flag cv.COLOR_BGR2GRAY. Similarmente para BGR → HSV, se usa el flag cv.COLOR_BGR2HSV. En este caso de estudio se pasará de BGR a HSV, esto se puede usar para extraer un objeto de color. En HSV, es más fácil representar un color que en el espacio BGR. HSV son las siglas en inglés de matiz, saturación y valor respectivamente. Por lo que los colores vendrán representados en una matriz de tres elementos donde el primer valor corresponde al matiz, el segundo a la saturación y el tercero al valor o brillo de éste. Estos valores van desde el 0 al 180 para el matiz, del 0 al 255 para la saturación y del 0 al 255 para el valor. Todo lo explicado se puede ver en la siguiente figura: E Preprocesado de los datos 18 18 Figura 4-2. Rango de valores para todos los colores en HSV. Siguiendo la Figura 4-2, en la imagen de la derecha se ve cómo los valores del matiz (Hue) están representados en el eje horizontal, los valores de la saturación (Saturation) en el eje vertical y los valores del brillo (Value) corresponderían a la profundidad representada en la imagen de la izquierda. Por ejemplo, el color verde aproximadamente comprende el rango desde (30,25,25) hasta (80,255,255) para que sea capaz de detectar todas las tonalidades. Una vez se tienen los valores que se quieren extraer de la imagen, el método cv.inRange() extrae los objetos que están compuestos por el rango de color elegido creando una imagen con dicho objeto de color blanco y el fondo negro, dicha imagen se denomina máscara. Por último, a dicha máscara se le aplicará la operación and con la imagen original, esto hará que el objeto extraído tenga su color original mientras el fondo permanecerá negro [23]. Figura 4-3. Imagen original, máscara y resultado final. 4.3. Transformaciones Morfológicas Las transformaciones morfológicas son algunas operaciones simples basadas en la forma de la imagen. Normalmente son aplicadas en imágenes binarias. Son necesarias dos entradas, una es la imagen original, la segunda es la estructuración del elemento o kernel que es quien decide la naturaleza de la operación. Existen numerosos métodos, en este caso se va a usar la erosión ya que va a resultar de utilidad, más adelante se verá dicha utilidad. La idea básica de la erosión es, simplemente, eliminar los bordes de los objetos de la imagen. El kernel se compara con la imagen (como en la convolución). Un píxel en la imagen original (tanto 1 como 0) será considerado 1 solo si todos los píxeles alrededor del kernel son 1, en otro caso es erosionado (se hace 0). Lo que ocurre es lo siguiente, todos los píxeles cercanos a los límites serán descartados en función del tamaño del kernel. Así, el grosor o el tamaño del objeto en primer plano disminuye o simplemente la región blanca disminuye en la imagen. Es útil para eliminar pequeños ruidos blancos o separar dos objetos conectados que es el caso de este estudio [24]. Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 19 Figura 4-4. Ejemplo de erosión [24]. Preprocesado de los datos 20 20 Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 21 5 IMPLEMENTACIÓN Y EXPERIMENTOS 5.1 Entorno Todo lo explicado anteriormente corresponde a un marco teórico, pero ¿cómo funcionan las redes neuronales en la práctica? ¿Qué hay que hacer para diseñarlas? Para resolver estas preguntas es necesario hablar de Keras. Keras es una biblioteca de Redes Neuronales de Código Abierto escrita en Python. Está especialmente diseñada para posibilitar la experimentación rápida con redes de aprendizaje profundo. Sus fuertes son el ser amigable para el usuario, modular y extensible. Su autor principal es el ingeniero de Google François Chollet. En 2017, el equipo de TensorFlow de Google decidió ofrecer soporte a Keras en la biblioteca de core de TensorFlow3. Además del soporte para las redes neuronales estándar, Keras ofrece soporte para las Redes Neuronales Convolucionales. Ofrece un conjunto de abstracciones más intuitivas y de alto nivel haciendo más sencillo el desarrollo de modelos de aprendizaje profundo [25]. Figura 5-1. Logo de Keras [25]. Debido a que Keras es básicamente una librería de Python, se requiere hacer un uso completo del intérprete de Python. Es por ello por lo que se va a usar Jupyter notebook, puesto que es un entorno de desarrollo muy extendido que permite sacar partido a la interactividad de Python y, a la vez, proporciona una gran versatilidad para compartir parte de códigos con anotaciones a través de la comodidad e independencia de plataforma que ofrece un navegador web [6] [26]. Por este motivo, los notebooks son usados a menudo para desarrollar redes neuronales en la comunidad de científicos e ingenieros de datos. Un notebook es un fichero generado por Jupyter Notebook que se puede editar desde un navegador web, permitiendo mezclar la ejecución de código Python con anotaciones [6]. Figura 5-2. Logo de jupyter notebook [26]. Un problema conocido y ya mencionado anteriormente sobre las redes neuronales es que entrenar la red con los datos disponibles puede llevar horas. Una forma de hacer que este proceso se aligere es usar la GPU del ordenador a la hora de entrenar, es decir la tarjeta gráfica, en vez de la CPU que es lo que usará por defecto. Usar la GPU incrementa la velocidad de entrenamiento debido a que estos procesadores realizan más rápido los cálculos necesarios que las CPU [6]. Para realizar este cambio será necesario instalar un software llamado cuDNN. La biblioteca de redes neuronales profundas de NVIDIA CUDA® (cuDNN) es una biblioteca de primitivas para Implementación y experimentos 28 28 Código 5-6. Red neuronal Convolucional Donde la capa de entrada (o “input layer” en inglés) cuenta con 32 filtros o kernel de 3x3 y el tensor usado es de 150x150x3, el 3 es debido a que las imágenes son a color (RGB). La función de activación elegida es ReLu debido a su buen rendimiento en problemas de clasificación (ver sección 3.1.1). Se realiza la operación de maxpooling después de cada capa convolucional con una ventana de 2x2 (ver sección 3.1.2). Se realizan 4 niveles de abstracción hasta obtener 256 filtros kernel, este nivel de abstracción se repite y se procede al aplanado. Después del aplanado, vienen las capas densamente conectadas, estas últimas serán las encargadas de la clasificación, es por eso por lo que la última capa deben de ser estrictamente del mismo número que las categorías con las que se cuentan. Sabiendo esto se añade una capa de neuronas densamente conectadas, exactamente 256 neuronas, para buscar características que quizás la red neuronal convolucional no haya encontrado. Y por último se añaden 9 neuronas, que son las encargadas de clasificar las imágenes en las 9 categorías que se disponen, la función de activación de estas últimas será softmax debido a que es la necesaria para clasificación de imágenes (ver sección 3.3.1). Se ha elegido esta estructura tras probar otras estructuras similares y realizar pequeñas modificaciones a partir de modelos que han demostrado su buen comportamiento en clasificación de imágenes. Se puede ver un resumen de la red neuronal creada en la siguiente figura: Figura 5-5. Resumen de la red diseñada. La red neuronal creada contiene 1.2 millones de parámetros. Es lo suficientemente profunda para resolver el problema complejo que se presenta y lo suficientemente extensa para entrenar el gran número de imágenes con el que se cuenta. 5.3.3 Hiperparámetros Como se vio en secciones anteriores la elección de los hiperparámetros es crucial para el buen funcionamiento de la red. En este caso, los hiperparámetros elegidos han sido los siguientes. Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 29 Código 5-7. Hiperparámetros. Como función de pérdida se ha usado “categorical_crossentropy”. Ésta se utiliza en tareas de clasificación multiclase. Se trata de tareas en las que un ejemplo sólo puede pertenecer a una de las muchas categorías posibles, y el modelo debe decidir cuál (cómo en el caso de estudio). Softmax es la única función de activación que se recomienda utilizar con la función de pérdida “categorical_crossentropy” [32]. Para el optimizador se usa ‘sgd’ con el learning rate por defecto (0.01), otra opción muy común en problemas de clasificación es usar el optimizador ‘Adams’ aunque en este caso se ha preferido usar ‘sgd’ porque se ha demostrado un mejor rendimiento para problemas de clasificación de más de dos clases [33]. Y por último se usa como métrica ‘accuracy’ debido a que calcula cuantas veces la predicción es igual a la etiqueta, es decir, va devolviendo la precisión que es justamente lo buscado. 5.3.4 Data augmentation Se hace uso de la técnica conocida como Data Augmentation (véase apartado 3.5) a través de Image Data Generator (véase apartado 5.2.5) para así poder aumentar la base de datos. Código 5-8. Data augmentation con ImageDataGenerator. Los cambios que se realizan a las imágenes son: rotación desde 0 hasta 60º, giros tanto verticalmente sobre su eje como horizontalmente y por último cambios en el brillo de la imagen. Estos cambios no afectan negativamente a la hora de extraer características de las imágenes ya que todas se mantienen prácticamente iguales y el único cambio es que estarán giradas o con su brillo modificado. Es por ello por lo que se han elegido estos cambios. 5.3.5 Image Data Generator Una vez se tiene el modelo definido y configurado, se pasará a ver cómo cargar las imágenes que están en los directorios indicados, convirtiéndolas en tensores float32 y pasarlas a la red neuronal, junto con sus respectivas etiquetas. Para ello se usa un objeto generador para las imágenes de entrenamiento, las imágenes de validación y para las imágenes de prueba. Siguiendo el código 5-6 se ve como la primera capa de neuronas contiene 32 elementos y acepta imágenes del tamaño 150x150x3 (el 3 como se explicó antes hace referencia que son a color), es por ello por lo que el generador deberá generar imágenes de tamaño 150×150 y sus respectivas etiquetas. [6] Pero, además, los datos deben ser normalizados antes de pasarlos a la red neuronal. En este caso, se preprocesarán las imágenes normalizando los valores de píxeles para que estén en el rango {0,1} (originalmente todos los valores están en el rango {0,255}). En Keras esto se consigue con el parámetro rescale de la clase ImageDataGenerator del paquete preprocessing de Keras (véase código 5-5). ImageDataGenerator permite instanciar generadores de lotes de imágenes (y sus etiquetas) a través de los métodos flow(data, labels) o flowfromdirectory(directory) cuando se trata de un directorio, como es este caso. Estos generadores se pueden usar con los métodos del modelo de Keras que aceptan instancias de generadores de datos como argumento como son fit_generator( ), evaluate_generator( ) y predict_generator( ). El código del caso de estudio que crea tres objetos que instancian a cada uno de los generadores respectivamente es: Implementación y experimentos 30 30 Código 5-9. Image Data Generator. Donde el tipo de class_mode es categorical debido a que la clasificación a realizar es de más de 2 clases (en el caso de 2 sería ‘binary’). Resaltar que en el generador para los datos de test se ha puesto la variable shuffle (que por defecto está a true) a false. Dejar este valor a true hará que se barajen los datos de prueba lo que puede ocasionar errores en la matriz de confusión mostrando una precisión para los datos de prueba que no coincide a la del modelo. La razón de la diferencia es que el generador produce lotes que comienzan en una posición diferente, por lo que las etiquetas y las predicciones no coincidirán, ya que se refieren a objetos diferentes. Cómo se vio en la sección 5.3.1 los datos de entrenamiento serán los que hagan que la red aprenda las características de cada categoría para poder clasificar nuevas imágenes correctamente. Los datos de validación son aquellos que la red neuronal no verá como parte del entrenamiento, pero serán usados para comprobar qué tan bien o qué tan mal se ha entrenado el modelo en cada epoch. Con las métricas, como la Accuracy, que se pueden obtener de este conjunto de datos de validación, servirán de guía para decidir como sintonizar los hiperparámetros del algoritmo antes de repetir el proceso de entrenamiento para otra epoch. Por último, los datos de predicción o test son aquellos datos que el modelo no ha visto nunca anteriormente durante la etapa de entrenamiento (ni como datos de entrenamiento ni como datos de validación), permitiendo obtener una medida de comportamiento del algoritmo más objetiva y evaluar si nuestro modelo generalizado correctamente [20]. Los datos de entrenamiento y validación serán ambos usados durante la etapa de entrenamiento (ver código 5-11) mientras que los datos de predicción serán usados en la etapa de testeo o predicción para representar la precisión del modelo y la matriz de confusión (ver código 5-12 y 5-14). 5.3.6 Entrenamiento Debido a que los datos se generan de manera indefinida, el modelo de Keras necesita saber cuántas muestras extraer del generador antes de decidir que ha finalizado una época (epoch): este es el papel del argumento steps_per_epoch. Cuando se usa el método fit_generator( ) también se le puede pasar el argumento validation_data con el generador de las imágenes que usaremos para validar. En este caso se requiere indicar con el argumento validation_steps cuántas muestras deben extraerse del generador en cada epoch. Para calcular sendos valores automáticamente se sigue el siguiente código. Código 5-10. Obtención de valores de steps_per_epoch y validation_steps. Donde el batch size se ha elegido de 64 debido a la gran cantidad de datos totales que se tienen para que el entrenamiento no dure demasiado. Los valores de los argumentos steps_per_epoch y de validation_steps se puede Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 31 ver en el Código 5-10. Ahora solo falta definir el número de epochs y entrenar el modelo. Código 5-11. Entrenamiento del modelo 5.3.7 Resultados y Matriz de Confusión Para mostrar los resultados se han seguido los siguientes códigos: para la precisión de los datos de prueba el código 5-12, para las curvas de aprendizaje y error el código 5-13 y para la matriz de confusión y un resumen de los resultados el código 5-14. Código 5-12. Precisión para los datos de prueba. Código 5-13. Muestra las curvas de aprendizaje y error. Código 5-14. Muestra la matriz de confusión y reporte de los resultados. Una vez ejecutado estos códigos se obtiene lo mostrado en la figura 5-6. Implementación y experimentos 32 32 Figura 5-6. Resultados del entrenamiento Viendo los resultados se pueden sacar varias conclusiones (como interpretar estos resultados y el significado de los parámetros ya se vio en el apartado 3.6): primero se ve que los datos de entrenamiento (curva roja de la matriz de confusión) se van adaptando a la red por cada epoch haciendo que la precisión de esta suba hasta más de un 60 %. La precisión de los datos de validación (curva azul de la matriz de confusión) crece hasta alrededor de un 58%. Y por último los datos de prueba dan una precisión de un 57%, esto quiere decir que el 57% de los datos que nunca ha visto antes los clasifica correctamente. Se puede ver en la matriz de confusión cómo el modelo no está funcionando como se espera, el mejor porcentaje de precisión se tiene para las imágenes de 2 y 4 hojas (ambas son las que cuentan con más imágenes para el entrenamiento) mientras que a partir de 5 hojas el acierto es casi nulo. En el reporte de clasificación como se vio en el apartado 3.6 muestra la precisión individual de las distintas categorías para los datos de prueba, se ve como las categorías con más precisión son las que cuentan con más datos como ya se ve en la matriz de confusión. Se va a crear otro modelo el cual cuente con las mismas imágenes de entrenamiento para cada categoría para ver si mejora su rendimiento. 5.3.8 Segundo Modelo Para el siguiente modelo se propone igualar el número de imágenes a usar en cada categoría. En el modelo anterior se tiene un número muy distante de imágenes de cada categoría lo que puede estar provocando que se entrene mucho más una clase que otra y la clasificación no sea óptima (ver fichero Contador_de_hojas_vequeal.ipynb). Para este modelo se contará con el siguiente número de imágenes. El cuál es el mayor posible ya que de 9 imágenes no hay más de 570. Código 5-15. Número de imágenes elegido. Descartando las imágenes de 7 y 8 hojas ya que son muy escasas (menos de 200 imágenes). Es esencial modificar el número de neuronas de salida que en este caso será 7 debido a que se han eliminado dos clases. Después de hacer el reparto equitativo, se entrena la misma red neuronal que antes, obteniendo los siguientes resultados. Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 33 Figura 5-7. Resultados del entrenamiento. A pesar de igualar el número de imágenes y evitar que se entrene más una categoría a otra se ve como el modelo no ha mejorado en la precisión para los datos de prueba. La precisión sigue estando alrededor de un 54 %. Cabe recordar que para que un modelo de red neuronal tenga una precisión considerada alta, este debe contar con muchísimas imágenes para entrenamiento, en este caso se cuenta con algunos centenares lo que hace que sea difícil obtener un buen porcentaje. Sin embargo, se van a probar diversos métodos para conseguir la solución más óptima. En el siguiente apartado se probará el método de transfer learning, visto en secciones anteriores, para ver si está siendo problema del diseño del modelo o si en cambio es problema de cómo se están tratando los datos. 5.3.9 Tercer Modelo Para este modelo se realiza la técnica de transfer learning (ver sección 3.5). Este fichero usa la red neuronal inceptionv3 preentrenada con las imágenes de imagenet (ver fichero Contador_de_hojas_vtg.ipynb). El código para usar para implentar la red con los pesos ya entrenados y definidas las capas que no se requiere volver a entrenarlas es el siguiente: Código 5-16. Implementación de la red Inception_v3. El modelo cuenta con 21 millones de parámetros ya entrenados, la salida de esta red neuronal quedará definida de la siguiente forma. Implementación y experimentos 34 34 Código 5-17. Creación de las últimas capas de la red. Se puede ver en el código 5-17 que se ha usado la técnica Dropout (ver sección 3.5) para reducir el overfitting. Esta salida genera 9 millones de parámetros entrenables junto a los 21 millones no entrenables de antes suman un total de 31 millones de parámetros. Figura 5-8. Número de parámetros de la red. Esta red será entrenada solo con 10 epochs ya que la mayoría de sus parámetros ya están pre entrenados. El resultado obtenido es el siguiente. Figura 5-9. Resultados del entrenamiento Esta vez los datos de entrenamiento alcanzan el 100 por cien de precisión mientras que se ve como la precisión de los datos de validación no mejora respecto a los casos anteriores, es decir, se mantiene alrededor de un 50%. Lo mismo ocurre para los datos de prueba donde la precisión está alrededor de un 53 % igual que en los anteriores casos. El modelo no consigue aprender a clasificar correctamente los datos, aun contando con pocos, y al probar con una red pre entrenada no parece que sea problema del modelo, el problema parece estar en las imágenes que son realmente difíciles de clasificar, por lo que en los siguientes apartados se probarán unos experimentos para conseguir una solución que se denomine aceptable procesando las imágenes. 5.4 Experimentos Esta base de datos ya contaba con un estudio previo en el cual habían conseguido algo menos de un 70% de precisión [29]. El estudio consistía en el uso de InceptionV3 con las últimas capas modificadas, a este proceso se le conoce como Fine Tunning, se usaron las imágenes de ImageNet y la red se entrenó 20 veces para mejorar la precisión, con todo este proceso no se logró superar un 70%. Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 35 En la sección anterior se han visto los resultados del mejor modelo conseguido para resolver este problema. Sin embargo, el porcentaje de acierto conseguido no es muy elevado y en la matriz de confusión se puede ver como el modelo falla en sus predicciones y cuáles son sus puntos más débiles. Es por ello por lo que en este apartado se pretende mostrar algunos experimentos realizados para mejorar ese porcentaje y estudiar más a fondo este problema para ver cómo solucionarlo. 5.4.1 Purgar base de datos y preprocesar las imágenes Uno de los problemas más llamativos de esta base de datos es que tiene muchas imágenes realmente difíciles de clasificar, incluso para el ojo humano (veáse figura 5-10), es por ello por lo que se eliminarán manualmente todas estas fotos que pueden estar confundiendo más que ayudando a entrenar a la red. Figura 5-10. Imágenes difíciles de clasificar para las categorías 1,2,3,4,5,6,7,8,9+ . Tras esta reducción, el número resultante de hojas obtenido es el siguiente. Figura 5-11. Número de imágenes en la base de datos. La reducción ha sido de 2498 elementos, imágenes que no estaba nada claro a que categoría pertenecen y más que ayudar pueden estar confundiendo a la red. Cómo se ve en la Figura 5-11 se ha decidido no reducir el número de 7 y 8 hojas ya que es extremadamente pequeño para entrenar una red neuronal y no se utilizarán estas categorías ya que sus imágenes son insuficientes para entrenar la red. También se va a realizar un preprocesado de los datos para así ayudar al modelo como se vio en el capítulo 4. El preprocesado que se va a realizar será el siguiente: En primer lugar, se eliminará el fondo, es decir, todo aquello que no son hojas y que muestra información irrelevante para el proceso. Para ello se ha creado el siguiente código donde como se vio en el capítulo 4 se elige un rango de ‘verdes’, estos colores elegidos no serán eliminados de la imagen, luego se crea una máscara donde se extrae la zona donde aparece el rango de color elegido, esta máscara es en blanco y negro, para volver a ponerlo de su color original se utiliza el método bitwise_and() el cual mezcla la imagen original con la máscara, añadiendo Implementación y experimentos 36 36 el color solo en la zona extraída. Este procedimiento se puede entender mejor viendo el código 5-18. Para mostrar las imágenes en pantalla se ha utilizado cv.imshow(). Código 5-18. Extracción del color verde. Para las imágenes que tienen más de una hoja se va a hacer otra modificación, esta modificación será la erosión (Veáse apartado 4) para ello se ha empleado el código 5-19. Código 5-19. Erosión. Se ve como en la anterior imagen perteneciente a la categoría de dos hojas tiene estas muy pegadas pudiendo confundir a la red y clasificándola como una hoja, pero con la erosión estas dos hojas quedan aisladas. Eliminación del fondo y erosión serán los dos cambios aplicados a las fotos, para aplicarlos a toda la base de datos se utiliza el código 5-20. Código 5-20. Extracción de hojas de la imagen. Una vez realizada la erosión se ve que algunas imágenes no han sido detectadas por el filtro y el resultado final es una imagen en negro, esto es debido a que las hojas de esas imágenes no tienen un tono verdoso y se mezclan con el color de la tierra o son negras o grisáceas. Estas imágenes han sido eliminadas ya que se escapan del objeto de este estudio. Todo el procesado se hará en el fichero llamado OpenCV.ipynb. Se va a realizar una clasificación del modelo progresiva, es decir, primero se va a clasificar entre 2 categorías, luego entre 3, después entre 4 y así hasta finalizar. Este procedimiento podrá mostrar la evolución del modelo al ir añadiendo categorías y así comprender un poco mejor su funcionamiento. Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 37 5.4.2 Clasificación entre 2 categorías Se va a realizar una clasificación entre plantas con 1 hoja y plantas con 2 hojas (ver ‘Fichero CH_V_2hojas.ipynb’). Se seguirá un modelo entrenado desde cero con la misma estructura e hiperparámetros de los modelos anteriores definidos en el punto 5.3.2. Para ello se tomarán las nuevas rutas de las imágenes que se encuentran en diferentes directorios ya que vamos a utilizarlas preprocesadas y en las carpetas de train, validation y test se crearán a su vez 2 subdirectorios como en el apartado anterior donde irán las carpetas 1 y 2 en este caso, pertenecientes a las clases usadas. El reparto será el mismo 80% imágenes para entrenamiento, 10% para validación y 10% para test. Figura 5-12. Imágenes para la realización de la clasificación y cuantas de ellas servirá para cada cometido. La red neuronal será entrenada desde cero siguiendo el modelo ya usado para los apartados 5.3.7 y 5.3.8, con ligeras diferencias: las neuronas de salida en este caso deben de ser 2 ya que tenemos un problema de clasificación entre 2 categorías. Las imágenes a usar serán las imágenes procesadas del apartado 5.4.1 para ver si mejora al procesar las imágenes respecto a los modelos con las imágenes sin procesar. Código 5-21. Capa final de la red. Aplicando los mismos hiperparámetros y la técnica de data augmentation, tras entrenar la red con 125 épocas y un batch de 20, se obtienen los siguientes resultados: Figura 5-13. Curvas de aprendizaje y error del modelo, matriz de confusión y precisión con las imágenes de prueba. Se ve como el modelo alcanza una precisión de casi el 96 por ciento. Si se compara este mismo modelo con otro exactamente igual, pero con las imágenes sin procesar (ver fichero CH_V_2hojas.ipynb), se obtienen los siguientes resultados para la misma cantidad de imágenes. Implementación y experimentos 44 44 Figura 5-26. Respuesta al algoritmo en matlab. Se ve como cuenta correctamente el número de hojas en la figura 5-23, pero ahora se va a calcular el porcentaje de acierto para todas las hojas de cada directorio. Primero se comenzará a contar las imágenes de 1 hoja y ver que precisión tiene. Para este cometido se ha seguido el fichero de Matlab count1leave.m. Figura 5-27. Precisión del fichero Count1leaf.m Se ha obtenido una precisión del 86%, para entender las imágenes que no está detectando se va a a ver el siguiente ejemplo. Figura 5-28. Caso de error del algoritmo y su corrección. Donde se ve como no detecta que hay una hoja. Esto es debido al área mínima que se está utilizando para detectar hojas, es decir, la hoja de la figura 5-30 tiene menos de 200 píxeles de área y aunque se haya hecho el rescalado no la está detectando pero no es problema del algoritmo que se está siguiendo ya que si se reajusta el área a detectar para esta imagen en concreto se ve en la segunda imagen de la figura 5-30 como si la detecta. Es decir, el algoritmo funciona pero la base de datos con la que se cuenta contiene hojas de todos los tamaños y formas que hace difícil ajustar el algoritmo para que detecte todos esos detalles. Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 45 Al probar con las imágenes de 2 hojas (Fichero count2leaves.m). Figura 5-29. Precisión del fichero count2leaves.m. Se ve como la precisión es mucho menor que la obtenida con las redes neuronales, esto es debido a que no detecta que hay dos elementos, debido a que la erosión no es perfecta y hay bastantes hojas que no están separadas claramente, si se aumenta la erosión muchas imágenes quedarían demasiado erosionadas y desaparecerían hojas de la imagen, habría que hacer una erosión individual por cada imagen de la base de datos para dejar todas las hojas de todas las imágenes claramente separadas, esto se escapa del objetivo de este proyecto. Nuevamente se ve la dificultad que tiene esta base de datos para su clasificación. Figura 5-30. Muestra una planta con dos hojas clasificada como si fuese 1 hoja ya que no se encuentran sus hojas separadas. Se ha visto como el problema no es el algoritmo, sino la dificultad de la clasificación para toda la base de datos. Para 3 hojas se tiene la siguiente salida. Figura 5-31. Precisión del fichero count3leaves.m Para 4 hojas. Figura 5-32. Precisión del fichero count4leaves.m El porcentaje de acierto baja por cada categoría añadida, viéndolo para las imágenes de 5 hojas. Figura 5-33. Precisión del fichero count5leaves.m El porcentaje de acierto se reduce a menos del 5%, y el área buscada es menos de 10 píxeles, por lo que al aumentar de categoría es más difícil es para el algoritmo detectar las hojas y al haber más ruido en las imágenes el algoritmo lo confunde con hojas. El algoritmo visto funciona a la perfección, pero para imágenes bien definidas donde se conoce el Área o las propiedades de los elementos que se desean contar, sin embargo, la base de datos contiene imágenes muy diversas de plantas de todos los tamaños y formas lo que hace realmente difícil ajustar los parámetros del modelo para obtener una buena precisión. La red neuronal sin embargo puede aprender más características generales y consigue un porcentaje de acierto muy superior para esta base de datos. Implementación y experimentos 46 46 Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 47 6 CONCLUSIONES Y LÍNEAS FUTURAS n el experimento que se ha seguido se ha creado una red neuronal convolucional para clasificación de imágenes, más concretamente, para imágenes de plantas con su número de hojas contadas. La red neuronal convolucional creada demostró la dificultad que tenía esta tarea ya que las imágenes eran realmente difíciles de clasificar. Primero se vio cómo el modelo creado era incapaz de clasificar bien las imágenes obteniendo un 55% de precisión para los datos de prueba y viendo la matriz de confusión se vio como solo clasificaba correctamente aquellas categorías que contaban con miles de imágenes (sección 5.2.7). Después se creó un segundo modelo el cual contaba con el mismo número de imágenes para cada clase, viendo los resultados se vio como seguía siendo bastante mejorable la precisión obteniendo de nuevo un 55% para los datos de prueba (sección 5.2.8). Es por ello por lo que se creó un tercer modelo, usando la técnica de transfer learning, el cual usaba la compleja red neuronal inceptionV3 ya preentrenada con las imágenes de imagenet, pero este modelo tampoco mejoraba los resultados a la hora de clasificar, obteniendo de nuevo un porcentaje de acierto menor a un 60% (sección 5.2.9). Es por ello por lo que se opta en este proyecto por hacer experimentos, empezando por purgar la base de datos que contiene imágenes realmente difíciles de clasificar incluso para el ojo humano, ya sea por que aparecen malas hierbas o porque no está nada claro su número de hojas al ser cada una de diferente tamaño y forma (sección 5.3.1). Acto seguido se preprocesaron las imágenes, eliminando todo aquello que no era información importante, es decir, las hojas y dejando las hojas aisladas sobre un fondo negro. La otra modificación fue la erosión para dejar separadas las hojas de aquellas plantas que contaban con sus hojas muy pegadas entre si dificultando también la clasificación (sección 5.3.1). Se propuso generar modelos progresivos empezando por clasificar 2 clases (1 hoja y 2 hojas) y comparándolo con el modelo que usa los datos sin preprocesar. Se ve como la precisión alcanzada por el modelo que usa los datos preprocesados es superior a el que usa los datos sin preprocesar y se demuestra como sigue el mismo patrón al añadir las siguientes categorías (secciones 5.3.2 a 5.3.4). Se tuvieron que eliminar las categorías 5,6,7 y 8 ya que cuentan con demasiadas pocas imágenes realmente aprovechables para hacer que el modelo aprenda, sin embargo, si se añadió la categoría de 9 hojas o más y se sigue comprobando como los experimentos funcionan obteniendo una precisión aceptable y en la matriz de confusión se puede apreciar como la clasificación está siendo correcta (secciones 5.3.5 a 5.3.6). Por último, se propuso un algoritmo de Matlab para comprobar si era necesario crear una red neuronal con la complejidad que lleva el proceso en vez de clasificarlas por un algoritmo de Matlab más sencillo. El agoritmo demuestra su buen funcionamiento detectando el número de hojas de cualquier imagen si se ajustan bien sus parámetros. La dificultad llega cuando se intenta ver la precisión de acierto para toda una categoría donde cada imagen es diferente a la otra con diferentes tamaños de hojas y formas lo que hace realmente difícil hacer un buen ajuste de los parámetros para que detecte las hojas en todas las imágenes. Esto hace que mientras más hojas haya en la imagen la erosión es peor y hay más ruido por lo que el algoritmo se vuelve prácticamente inservible para tan complejas fotos. Es por ello por lo que en este caso parece esencial el uso de la red neuronal convolucional con el preprocesado de las imágenes que obtiene un más que aceptable porcentaje de acierto para tan pocas imágenes de entrenamiento con las que se cuenta. Como línea futura de investigación se propone buscar métodos más complejos sobre clasificación o preprocesado de imágenes que puedan ayudar a subir la precisión, sobre todo para aquellas clases que cuentan con un centenar o incluso menos de un centenar de imágenes. O incluso buscar modelos o métodos innovadores de Deep learning que puedan tratar mejor esta base de datos que contiene imágenes nada triviales para su clasificación. E Conclusiones y Líneas Futuras 48 48 Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 49 REFERENCIAS [1] L. Rouhiainen, Inteligencia Artifical, Alienta. [2] F. Berzal, Inteligencia Artificial, Universidad de Granada. [3] M. A. Boden, Inteligencia artificial., Turner, 2017. [4] J. L. Espinoza, "BBVA. Machine Learning y como funciona." [En línea]. Available: https://www.bbva.com/es/machine-learning-que-es-y-como-funciona/. [5] T. M. &. M. T. M. Mitchell, Machine learning, New York: McGraw-hill, 1997. [6] J. Torres, Deep Learning: Introduccion a la practica con Keras, Independiente, 2018. [7] R. Arrabales, "Xataka" Marzo 2016. [En línea]. Available: https://www.xataka.com/robotica-e-ia/deeplearning-que-es-y-por-que-va-a-ser-una-tecnologia-clave-en-el-futuro-de-la-inteligencia-artificial. [Último acceso: Junio 2022]. [8] F. Ramírez, Historia de la IA: Frank Rosenblatt y el Mark I Perceptrón, el primer ordenador fabricado específicamente para crear redes neuronales en 1957, 2018. [9] S. Haykin, Neural Networks: A Comprehensive Foundation (2 edición), Prentice Hall, 1998. [10] L. Yang y A. Shami, On hyperparameter optimization of machine learning algorithms: Theory and practice, 2020. [11] Y. Cruz, M. Rivas, R. Quiza, A. Villalonga, R. Haber y G. Beruvides, Ensemble of convolutional neural networks based on an evolutionary algorithm applied to an industrial welding process, 2021. [12] R. Holbrook, "Kaggle" [En línea]. Available: https://www.kaggle.com/learn/computer-vision. [13] D. Calvo, "DiegoCalvo" 2017. [En línea]. Available: https://www.diegocalvo.es/red-neuronal- convolucional/. [14] D. Ciresan, U. Meier, J. Masci, L. M. Gambardella y J. Schmidhuber, Flexible, High Performance Convolutional Neural Networks for Image Classification, 2011. [15] A. Perera, "ayeshmanthaperera" Septiembre 2018. [En línea]. Available: https://ayeshmanthaperera.medium.com/what-is-padding-in-cnns-71b21fb0dd7. [Último acceso: Junio 2022]. [16] W. Koehrsen, Overfitting vs. underfitting: A complete example, Towards Data Science, 2018. [17] "Aprende Machine Learning" 2017. [En línea]. Available: https://www.aprendemachinelearning.com/que-es-overfitting-y-underfitting-y-como-solucionarlo/. [Último acceso: Junio 2022]. Referencias 50 50 [18] C. Shorten y T. M. Khoshgoftaar, A survey on Image Data Augmentation for Deep Learning, 2019. [19] L. &. S. J. Torrey, Transfer learning. In Handbook of research on machine learning applications and trends: algorithms, methods, and techniques, 2010. [20] J. Torres, Introducción a la práctica con Keras 2 parte, Independiente, 2020. [21] N. Srivastava, G. Hinton, A. Krizhevsky, I. Sutskever y R. Salakhutdinov, Dropout: Una forma fácil de prever el sobreajuste en redes neuronales, University of Toronto, 2015. [22] "OpenCV" [En línea]. Available: https://opencv.org/. [23] "Open CV. Changing Colorspace" [En línea]. Available: https://docs.opencv.org/4.x/df/d9d/tutorial_py_colorspaces.html. [24] "OpenCV. Morphological Transformations" [En línea]. Available: https://docs.opencv.org/4.x/d9/d61/tutorial_py_morphological_ops.html. [25] "Keras" [En línea]. Available: https://keras.io/. [Último acceso: 2022]. [26] "Jupyter Notebook" [En línea]. Available: https://jupyter.org/. [Último acceso: 2022]. [27] "cuDNN" [En línea]. Available: https://developer.nvidia.com/cudnn. [Último acceso: 2022]. [28] "Github" [En línea]. Available: https://github.com/. [29] M. Dyrmann, "Leaf Counting Dataset" 2018. [En línea]. Available: https://vision.eng.au.dk/leafcounting-dataset/. [30] N. D. M. N. P. M. S. S. G. &. J. R. Teimouri, Weed Growth Stage Estimator Using Deep Convolutional Neural Networks., 2018. [31] M. P, "Data Scientist" 13 Mayo 2022. [En línea]. Available: https://datascientest.com/es/crossvalidation-definicion-e- importancia#:~:text=La%20t%C3%A9cnica%20del%20Train%2DTest%20Split&text=Una%20parte% 20servir%C3%A1%20para%20el,explotar%C3%A1%20en%20la%20cross%2Dvalidation.. [32] J. Brownlee, Probability for Machine Learning, Machine Learning Mastery, 2019. [33] N. S. &. S. R. Keskar, Improving generalization performance by switching from adam to sgd, 2017. Procesamiento de imágenes con técnicas de aprendizaje profundo para la detección de hojas en plantas 51 ANEXO omo se comentó en la sección 5.1 todos los códigos y ficheros mencionados en esta memoria se pueden ver online a través del siguiente enlace, también se pueden dejar dudas, sugerencias de mejora o si hay algún error para acceder a ellos. • https://github.com/fgfcad/TFGfgf C