Full text
Curso: 2022-2023 Director/Directora: Zulueta Guerrero, Ekaitz Estudiante: Millán Fernández de Landa, Mikel EVALUACIÓN DE REGIONES SIGNIFICATIVAS PARA EL ENTRENAMIENTO DE UNA RED NEURONAL A TRAVÉS DE FOTOGRAFÍAS DE UNA SUPERFICIE MÁSTER UNIVERSITARIO EN INGENIERÍA DE CONTROL, AUTOMATIZACIÓN Y ROBÓTICA TRABAJO FIN DE MASTER Fecha: Bilbao, 16 de Julio del 2023
Resumen En los últimos años, las redes neuronales convolucionales (CNN) han experimentado un progreso significativo en términos de arquitectura, rendimiento y aplicaciones. Estos avances han impulsado el campo de la visión artificial y han llevado a mejoras en diversas tareas, como el reconocimiento de objetos, la clasificación de imágenes, la detección de anomalías y la segmentación semántica. La mejora de la arquitectura, el avance en el desarrollo de técnicas que benefician el aprendizaje y el aumento de la capacidad de cómputo han permitido crear redes neuronales más profundas (VGG o ResNet), y han demostrado un mejor rendimiento en la clasificación de imágenes. Sin embargo, la calidad de los datos empleados para el entrenamiento de una red neuronal deben de ser de la mayor posible para obtener mejores resultados. La calidad de los datos dependerá de la información que pueda aportar a la red. En este trabajo, se entrenara una red neuronal convolucional utilizando fotos de una pared extraídas mediante una cámara posicionada al extremo del robot (Kuka LBR iiwa 7 R800) . La pared tendrá diferentes elementos, y los resultados de este entrenamiento se obtendrá información sobre las zonas de mayor interés para la red neuronal. Abstract In recent years, convolutional neural networks (CNNs) have seen significant progress in terms of architecture, performance and applications. These advances have boosted the field of computer vision and have led to improvements in a variety of tasks, such as object recognition, image classification, anomaly detection and semantic segmentation. Improved architecture, advances in the development of techniques that benefit learning and increased computational capacity have enabled the creation of deeper neural networks (VGG or ResNet), and have demonstrated better performance in image classification. However, the quality of the data used for training a neural network must exhibit the utmost quality to obtain the best results. The quality of the data will be determined by the information that it can feed to the network. iii
In this work, a convolutional neural network will be trained using photos of a wall obtained using a camera placed on the arm of a robot (Kuka LBR iiwa 7 R800). The wall will have different elements, and the results of this training will provide information about the areas of greatest interest to the neural network. Laburpena Azken urteotan, Sare Neuronal Konboluzionalak (CNN) aurrerapen handia izan dute arkitekturari, errendimenduari eta aplikazioei dagokienez. Aurrerapen hauek ordenagailu bidezko ikusmenaren eremua bultzatu dute eta hainbat zereginetan hobekuntzak ekarri dituzte, hala nola, objektuen ezagupena, irudien sailkapena, anomaliak hautematea eta segmentazio semantikoa. Arkitekturaren hobekuntzak, ikaskuntza mesedegarri duten tekniken garapenean izandako aurrerapenak eta konputazio-ahalmena handitzeak sare neuronal sakonagoak (VGG edo ResNet) sortzea ahalbidetu dute, eta irudien sailkapenean errendimendu hobea erakutsi dute. Hala ere, neurona-sare bat entrenatzeko erabiltzen diren datuen kalitateak ahalik eta kalitaterik handiena izan behar du emaitza hobeak lortzeko. Datuen kalitatea sareari eman liezaiokeen informazioaren araberakoa izango da. Lan honetan, sare neuronal konboluzional bat lantzen da errobot baten (Kuka LBR iiwa 7 R800) izkinean kokatutako kamerak lortutako horma baten argazkiak erabiliz. Hormak elementu desberdinak izango ditu, eta prestakuntza horren emaitzek sare neuronalerako interes handiena duten arloei buruzko informazioa emango dute. Palabras clave: Redes Neuronales Convolucionales, Visión artificial, Cinemática, Kuka LBR iiwa 7 R800, Detección de patrones. iv
Índice Lista de tablas vii Lista de ilustraciones ix Acrónimos xiii 1 Introducción y contexto 1 1.1 Introducción ............................... 1 1.2 Contexto.................................. 1 2 Alcance y objetivos 3 3 Antecedentes bibliográficos y estado del arte 5 3.1 Redes neuronales convolucionales . . . . . . . . . . . . . . . . . . . . 5 3.1.1 Estructura y los componentes clave de una CNN . . . . . . . . 5 3.1.2 Aprendizaje en una red neuronal convolucional . . . . . . . . 7 3.1.3 Importancia de los puntos clave en una imagen . . . . . . . . 8 3.1.4 Patrones naturales más fáciles de aprender para una CNN . . 9 3.1.5 Métodos y técnicas para mejorar el aprendizaje de patrones . 10 3.1.6 Casos de estudio y aplicaciones . . . . . . . . . . . . . . . . . 11 3.2 Robot de 6 grados de libertad . . . . . . . . . . . . . . . . . . . . . . 11 3.2.1 Cinemática directa . . . . . . . . . . . . . . . . . . . . . . . . 12 3.2.2 Cinemática Inversa . . . . . . . . . . . . . . . . . . . . . . . . 13 4 Desarrollo de la solución 15 4.1 Seguimiento de brazo robótico a marcador Tag . . . . . . . . . . . . 15 4.1.1 Organización del algoritmo . . . . . . . . . . . . . . . . . . . 15 4.1.2 Conexión con el robot, inicialización de variables y punto inicial 16 4.1.3 Cinemática Directa . . . . . . . . . . . . . . . . . . . . . . . . 17 4.1.4 Obtener vectores de rotación y traslación del Tag . . . . . . . 20 4.1.5 Obtener nuevas coordenadas . . . . . . . . . . . . . . . . . . 22 4.1.6 Cinemática Inversa . . . . . . . . . . . . . . . . . . . . . . . . 23 4.2 Entrenamiento de la Red . . . . . . . . . . . . . . . . . . . . . . . . . 30 4.2.1 Obtener las Fotos Originales de la Pared . . . . . . . . . . . . 30 v
4.2.2 División de las fotos obtenidas para poder entrenar la red neuronal.............................. 36 4.2.3 Entrenamiento de la Red Neuronal . . . . . . . . . . . . . . . 42 4.2.4 Poner a Prueba la Red Neuronal . . . . . . . . . . . . . . . . . 43 5 Análisis de resultados 45 5.1 Entrenamiento de la Red . . . . . . . . . . . . . . . . . . . . . . . . . 45 6 Conclusiones y trabajos futuros 51 Referencias bibliográficas 53 A Programas fuente 59 A.1 Seguimiento de brazo robótico a marcador Tag . . . . . . . . . . . . 59 A.1.1 Main.m .............................. 59 A.1.2 CinematicaDirecta.m . . . . . . . . . . . . . . . . . . . . . . . 61 A.1.3 CinematicaInversa.m . . . . . . . . . . . . . . . . . . . . . . . 62 A.1.4 Camara.m............................. 66 A.1.5 Corregir.m............................. 67 A.2 Entrenamiento de la Red . . . . . . . . . . . . . . . . . . . . . . . . . 68 A.2.1 MainFotos.m ........................... 68 A.2.2 DividirFotos.m .......................... 71 A.2.3 CodigoEntrenamiento.m . . . . . . . . . . . . . . . . . . . . . 74 A.2.4 Irakurri.m............................. 77 A.2.5 Irakurri.m............................. 78 vi
Lista de tablas 4.1 Parámetros de DH, donde dbs = 340mm , dse = 400mm , dew = 400mm ydwf = 126mm. .............................. 18 vii
Lista de ilustraciones 3.1 Ejemplo de capas de una red neuronal convolucional típica[5]. . . . . 5 3.2 Ejemplo de capa convolucinal con filtro [5]. . . . . . . . . . . . . . . . 6 3.3 Ejemplo de pooling (max)[28]. . . . . . . . . . . . . . . . . . . . . . . 6 3.4 Diagrama de forward pass y backward pass [3]. . . . . . . . . . . . . . 7 3.5 EjemplodeSIFT[27]. ........................... 9 3.6 Foto del robot empleado. . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.7 Diagrama de relación entre cinemática directa e inversa [2]. . . . . . . 12 4.1 Secuencia del programa. . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.2 Conexión entre Matlab y el Robot. . . . . . . . . . . . . . . . . . . . . . 16 4.3 Parte del programa donde se sitúa el robot en la posición deseada para empezarconelloop............................. 17 4.4 Llamada a la función de cinemática directa. . . . . . . . . . . . . . . . 17 4.5 Diagrama del robot Kuka iiwa R800 [31]. . . . . . . . . . . . . . . . . 18 4.6 Función de cinemática directa. . . . . . . . . . . . . . . . . . . . . . . 19 4.7 La inicialización de las variables necesarias en la función Camara para que se pueda leer el AprilTag. . . . . . . . . . . . . . . . . . . . . . . . 20 4.8 ID 0 de la familia de AprilTag 36h11 [10]. . . . . . . . . . . . . . . . . 21 4.9 Bucle dentro de la función Camara que busca el ID del AprilTag requerido. 22 4.10 Llamada a la función CinematicaInversa() desde el main. . . . . . . . . 23 4.11 Inicialización de los parámetros del robot para la parte de posición en la función CinematicaInversa(). . . . . . . . . . . . . . . . . . . . . . . 24 4.12 Representación de un robot articular de tres ejes [2]. . . . . . . . . . . 24 4.13 Cálculo del ángulo del primer eje y zu.................. 25 4.14 Código del cálculo para que la posición del robot esté dentro del rango. 26 4.15 Las dos configuraciones que puede tener el codo. . . . . . . . . . . . . 26 4.16 Código del cálculo de la segunda y cuarta articulación. . . . . . . . . . 27 4.17 Código para asegurar que los valores de las articulaciones se mantienen entreloslímites. .............................. 27 4.18 Código para el cálculo de la matriz R0 4................... 28 4.19 Código para el cálculo de la matriz de rotación que se desea obtener. . 29 4.20 Código para el cálculo de las últimas articulaciones del robot. . . . . . 30 4.21 Pareddeestudio. .............................. 31 4.22 Código para el cálculo de la matriz R0 4................... 32 ix
Además de los avances en la arquitectura de las CNN, también ha habido mejoras en las técnicas de entrenamiento. Un ejemplo es el aprendizaje transferido, donde las redes pre-entrenadas se utilizan como punto de partida para tareas relacionadas [34]. Esta técnica ha demostrado ser eficaz para obtener resultados sólidos con conjuntos de datos más pequeños. En cuanto a las aplicaciones, las CNN han sido ampliamente adoptadas en diversas industrias. En la medicina, se han utilizado para el diagnóstico de enfermedades a partir de imágenes médicas, como la detección de cáncer en mamografías. En el campo de los vehículos autónomos, se utilizan para la detección y clasificación de objetos en tiempo real. También se han aplicado en la industria de la seguridad, el análisis de vídeo, la realidad aumentada y muchas otras áreas. Uno de los desafíos en el entrenamiento de una red neuronal para realizar tareas de visión por computadora es la capacidad de la red para identificar y centrarse en las regiones más relevantes de una imagen. En algunos casos, las imágenes pueden tener características irrelevantes que pueden afectar negativamente el rendimiento de la red, y en otros casos regiones muy complejas pueden resultar difíciles para el aprendizaje de la red. En este contexto, el presente trabajo se enfoca en la evaluación de las regiones más relevantes presentes en una superficie mediante fotografías. Estas regiones tendrán características de distinta complejidad, y se evaluará la capacidad de aprendizaje de una red neuronal de las mismas. 2Chapter 1 Introducción y contexto
2 Alcance y objetivos El presente trabajo tiene como objetivo evaluar mediante el entrenamiento de una red neuronal cuales son las regiones más significativas en el aprendizaje. Para lograrlo, se tendrán que realizar diferentes tareas que se comentarán a continuación. En primer lugar, para obtener las fotos necesarias para el entrenamiento de la red neuronal, se deben de realizar las funciones que permitan controlar la posición y orientación que adoptará el robot. Para ello, se debe resolver el problema cinemático directo e inverso del robot utilizado (KUKA LBR IIWA 7 R800). Para poner a prueba las funciones creadas y para la familiarización del uso de la cámara, se realizará un algoritmo que permita al robot cambiar de posición y de orientación en función de las necesidades del momento. En segundo lugar, se procederá a obtener las fotos y a segmentarlas en imágenes de menor tamaño para que la red neuronal pueda utilizarlas como datos de entrada de la red. Para conseguirlo, primero se deberá crear un programa que permita al robot moverse por toda la pared que se quiere analizar y sacar fotos en cada una de las posiciones. Una vez obtenidas las fotos, se debe de crear un programa que divida y clasifique las fotos en función de si las fotos se utilizarán para entrenar, validar o testear la red neuronal. En tercer lugar, se debe de entrenar la red neuronal. Para ello, se utilizarán técnicas que mejorarán el entrenamiento de la red neuronal. Una de estas técnicas será el uso del aprendizaje transferido [34], que consiste en utilizar una red neuronal previamente entrenada y modificar únicamente las últimas capas de la red neuronal. Un objetivo secundario del presente trabajo es evaluar la implementación de las distintas técnicas utilizadas. Por último, se debe crear un programa que permita discutir gráficamente los datos obtenidos. Para ello, se pondrá a prueba la red neuronal creada y se compararán las predicciones de la red con los resultados obteniendo el error en cada una de las zonas de la pared estudiada. Con estos datos se crearán gráficos que permitan discutir los resultados y sacar conclusiones de este trabajo. 3
3 Antecedentes bibliográficos y estado del arte 3.1 Redes neuronales convolucionales Las redes neuronales convolucionales (CNN, por sus siglas en inglés) son una clase especializada de redes neuronales artificiales que han revolucionado el campo de la visión por computadora. Estas redes están diseñadas específicamente para obtener un rendimiento mayor al procesar y analizar datos visuales, como imágenes y vídeos, con el objetivo de identificar patrones y características relevantes. La arquitectura básica de una CNN se compone de varias capas interconectadas, cada una con una función específica en el procesamiento de la información visual. La capa inicial es la capa de entrada, que recibe la imagen en su forma cruda. A medida que la información fluye a través de la red, las capas posteriores realizan operaciones de convolución, agrupamiento (pooling) y activación para extraer gradualmente características más abstractas y significativas [5]. 3.1.1 Estructura y los componentes clave de una CNN Las capas principales de una red neuronal convolucional son: Figure 3.1: Ejemplo de capas de una red neuronal convolucional típica[5]. La capa de convolución: Es una de las partes fundamentales de una CNN. Consiste en aplicar un conjunto de filtros a la imagen de entrada para detectar car5
acterísticas locales, como bordes, esquinas y texturas. Estos filtros se deslizan sobre la imagen y realizan una operación matemática conocida como convolución, que combina la información de píxeles vecinos. Esta operación permite capturar patrones espaciales en la imagen y generar mapas de características convolucionales. Figure 3.2: Ejemplo de capa convolucinal con filtro [5]. La capa de agrupamiento (pooling): Después de la capa de convolución, la capa de agrupamiento (pooling) reduce la dimensionalidad de los mapas de características, preservando las características más importantes y descartando el ruido o detalles irrelevantes. El agrupamiento se realiza dividiendo la imagen en regiones solapadas y tomando el valor máximo o promedio de cada región, lo que disminuye la cantidad de información a procesar en las capas posteriores. Figure 3.3: Ejemplo de pooling (max)[28]. Las capas totalmente conectadas: reciben las características extraídas y las utilizan para realizar la tarea específica, como la clasificación de imágenes, detección de objetos o reconocimiento facial. Estas capas se asemejan a las de una red neuronal tradicional y utilizan funciones de activación para introducir no linealidades en el modelo y permitir la representación de relaciones complejas entre las características [38]. Además de dichas capas, existen otros elementos, como son las funciones de activación [14]. Estas son funciones matemáticas que se aplican a la salida de una 6Chapter 3 Antecedentes bibliográficos y estado del arte
neurona o unidad de procesamiento en una red neuronal. Estas funciones introducen no linealidad en el modelo, permitiendo a la red aprender y modelar relaciones complejas en los datos. Cuando se procesa una entrada en una neurona, se realiza una combinación lineal de las entradas ponderadas por los pesos sinápticos. Posteriormente, se aplica la función de activación a esta suma ponderada para determinar la salida de la neurona. 3.1.2 Aprendizaje en una red neuronal convolucional El proceso de aprendizaje en una CNN se basa en la optimización iterativa de una función de pérdida mediante el algoritmo de retropropagación y descenso de gradiente. El objetivo es ajustar los pesos y sesgos de las neuronas de la red para minimizar la diferencia entre las salidas predichas y los valores reales. En primer lugar, se realiza una pasada hacia adelante (forward pass) por la red, donde los datos de entrenamiento se propagan a través de las capas convolucionales, de agrupamiento y totalmente conectadas, generando una predicción. Luego, se calcula el error entre la predicción y los valores reales utilizando una función de pérdida, como el error cuadrático medio (MSE) o la entropía cruzada. Figure 3.4: Diagrama de forward pass y backward pass [3]. A continuación, se realiza una pasada hacia atrás (backward pass) utilizando el algoritmo de retro-propagación. Durante esta etapa, se calculan las derivadas parciales del error con respecto a los pesos y sesgos de cada neurona de la red. Estas derivadas se utilizan para ajustar los parámetros de la red en dirección opuesta al gradiente del error, mediante el descenso de gradiente [1]. El descenso de gradiente estocástico (3.1) actualiza los pesos y sesgos de la red mediante la multiplicación de la derivada parcial del error con respecto a los parámetros por una tasa de aprendizaje. Esto se repite iterativamente para múltiples ejemplos de 3.1 Redes neuronales convolucionales 7
entrenamiento hasta que la función de pérdida se minimiza o se alcanza un criterio de convergencia. θt+1 =θt−α∇E(θt)(3.1) Además, se utilizan técnicas de regularización, en este caso, la regularización L2 (3.2). Estas se usan para evitar que en vez de que la red neuronal aprenda, la red neuronal memorice. Este fenómeno se llama sobre-ajuste (over-fitting) y es perjudicial para el modelo. La regularización permite reducir la complejidad del modelo, lo cual permite mejorar la capacidad del modelo de generalizar. L2(θ) = λ n X j=1 θ2 j(3.2) El último concepto que se comentará es el de la normalización de los lotes (batch normalization). Esta es una técnica que se utiliza para reducir la dimensión de los cálculos que se realizan para calcular la media del error o la desviación estándar [22]. 3.1.3 Importancia de los puntos clave en una imagen En el procesamiento de imágenes y visión por computadora, los puntos clave (keypoints) desempeñan un papel fundamental para identificar regiones de interés y detectar patrones relevantes en una imagen. Estos puntos clave son puntos distintivos y significativos que se caracterizan por tener propiedades únicas y estables, como cambios en la intensidad, texturas o formas, que los hacen fácilmente detectables en diferentes escalas y orientaciones. Los métodos más utilizados son el SIFT y el SURF. El SIFT utiliza una pirámide de imágenes en diferentes escalas para buscar puntos clave en distintos niveles de detalle [37]. Luego, para cada punto clave detectado, se calculan descriptores que codifican la información local de su vecindario, como gradientes de intensidad y orientación. Estos descriptores son invariantes a las transformaciones mencionadas y pueden ser utilizados para comparar y emparejar puntos clave entre diferentes imágenes [15]. 8Chapter 3 Antecedentes bibliográficos y estado del arte
Figure 3.5: Ejemplo de SIFT [27]. El SURF es un algoritmo similar a SIFT pero más rápido y eficiente computacionalmente [30]. Al igual que SIFT, SURF también detecta puntos clave invariantes a cambios de escala, rotación y cambios en la iluminación. Sin embargo, SURF utiliza filtros de caja y una matriz hessiana aproximada para acelerar el cálculo de los descriptores, lo que lo hace especialmente adecuado para aplicaciones en tiempo real [29]. La importancia de los puntos clave radica en su capacidad para identificar regiones de interés y detectar patrones relevantes en una imagen. Al encontrar puntos clave distintivos y estables, se pueden localizar características específicas, como esquinas, bordes o texturas, que son fundamentales para reconocer objetos o realizar tareas de análisis visual [24]. 3.1.4 Patrones naturales más fáciles de aprender para una CNN Las redes neuronales convolucionales (CNN) han demostrado ser altamente eficientes en el aprendizaje y detección de patrones naturales en imágenes [5]. Algunos de los patrones visuales más comunes y fáciles de aprender para una CNN incluyen bordes, texturas simples, esquinas y puntos de interés. Estos patrones son ampliamente estudiados en la literatura y se ha demostrado que las CNN tienen una gran capacidad para aprender y detectar eficientemente estos patrones naturales. A continuación, se discutirán estos patrones y se mencionarán estudios previos relevantes. Los bordes son transiciones abruptas de intensidad en una imagen y son uno de los patrones visuales más básicos [35]. En una imagen, los bordes representan cambios significativos en la intensidad de los píxeles y pueden corresponder a límites entre objetos, contornos o formas. Las CNN pueden aprender a detectar bordes mediante el uso de filtros convolucionales que responden a cambios de intensidad 3.1 Redes neuronales convolucionales 9
en diferentes direcciones. Estos filtros convolucionales se utilizan para capturar características locales en la imagen y resaltar los bordes. Las texturas simples se refieren a patrones repetitivos y regulares en una imagen, como rayas, puntos o cuadros. Estas texturas tienen una estructura definida y pueden ser fácilmente aprendidas por una CNN [18]. Al utilizar múltiples filtros convolucionales, una CNN puede capturar diferentes características texturales en la imagen y detectar patrones como líneas paralelas, puntos dispersos o áreas con texturas uniformes [8]. Las esquinas y los puntos de interés son características distintivas en una imagen que representan cambios bruscos en la orientación de los bordes. Estos puntos son fácilmente identificables y proporcionan información valiosa sobre la estructura y contenido de la imagen [4]. Las CNN pueden aprender a detectar esquinas y puntos de interés utilizando filtros convolucionales diseñados para responder a cambios de orientación en los bordes. Estos filtros ayudan a resaltar y localizar puntos clave en la imagen. 3.1.5 Métodos y técnicas para mejorar el aprendizaje de patrones El aprendizaje de patrones complejos es un desafío importante en el entrenamiento de redes neuronales convolucionales (CNN). Afortunadamente, existen varios enfoques avanzados y técnicas que se han desarrollado para mejorar la capacidad de una CNN para aprender patrones complejos de manera más eficiente. En este caso se utilizarán dos técnicas ampliamente utilizadas: el uso de una arquitectura más profunda (en este caso el VGG16) y el aprendizaje transferido . Utilizar una arquitectura de red neuronal más profunda tiene varios beneficios. En primer lugar, las redes neuronales más profundas tienen una mayor capacidad de capturar y aprender representaciones más complejas y abstractas de los datos. Además, tienen el potencial de mejorar el rendimiento. Por otro lado, una red neuronal pre-entrenada más profunda puede ayudar a regularizar el modelo y reducir el sobre-ajuste. Sin embargo, la razón principal del uso de esta red es la transferencia de características. Al re-entrenar una red neuronal profunda, especialmente en tareas relacionadas o conjuntos de datos similares, se pueden transferir las características aprendidas previamente. Las capas iniciales de una red pre-entrenada suelen ser responsables de extraer características de bajo nivel, como bordes y texturas simples, que son relevantes para una amplia gama de problemas. Al aprovechar estas características pre-entrenadas, se acelera el proceso de aprendizaje y se mejora la capacidad de generalización del modelo [32]. 10 Chapter 3 Antecedentes bibliográficos y estado del arte
En este caso, solo se van a re-entrenar las últimas capas de la red neuronal. A esta técnica se la conoce como "ajuste fino" o "transfer learning" en inglés. Las últimas capas de una red neuronal suelen ser responsables de la extracción de características de alto nivel, que son más específicas para el conjunto de datos utilizado en el entrenamiento original. Estas capas contienen información que es más relevante para la tarea específica que se desea abordar [21]. 3.1.6 Casos de estudio y aplicaciones Las redes convolucionales han demostrado ser una de las técnicas más poderosas en el campo del reconocimiento de imágenes. Esto ha permitido que se haya aplicado en todo tipo de sectores [20]. Uno de los sectores que más se está investigando e implementando es el sector de la medicina. Se está aplicando en diferentes campos, como puede ser la cirugía [23] o la identificación de enfermedades a través de imágenes [6]. También se está investigando a cerca del reconocimiento facial y los aspectos más abstractos de la misma como la detección de emociones [36]. Otro sector que está avanzando rápidamente en la implementación de la visión artificial es el sector industrial. Se puede aplicar de muchas formas, desde la detección de piezas defectuosas en una línea de producción [11] hasta la combinación de la visión artificial con la robótica, para saber situar el robot en el lugar adecuado en todo momento. Otro ámbito en el que se está investigando es el de los vehículos autónomos. Se lleva décadas investigando sobre la conducción autónoma, y la visión artificial para la detección de carriles o para la detección de otros vehículos y señales ya está siendo implementada [19]. Además, ya se pueden encontrar los primeros modelos que son capaces de estacionar sin que el conductor tenga que intervenir en el proceso. 3.2 Robot de 6 grados de libertad Para la realización de este proyecto, se va a tener que utilizar un robot de 6 grados de libertad. Los comandos y el control utilizado hasta ahora han causado errores y no permiten hacer lo que se quiere realizar en este proyecto. Por lo tanto, se va a hacer un control de posición para este robot en Matlab. Se estudiará, por lo tanto, la cinemática directa e inversa del modelo LBR iiwa 7 R800. Este robot tiene 7 grados de libertad, pero se bloqueará uno de ellos para que se simplifiquen las ecuaciones y resulten más fáciles los cálculos. 3.2 Robot de 6 grados de libertad 11
por lo tanto la posición y la orientación del extremo del robot vendrá dada por las relaciones: x=fx(q1, q2, q3, q4, q5, q6, q7) y=fy(q1, q2, q3, q4, q5, q6, q7) z=fz(q1, q2, q3, q4, q5, q6, q7) ϕ=fα(q1, q2, q3, q4, q5, q6, q7) θ=fβ(q1, q2, q3, q4, q5, q6, q7) ψ=fγ(q1, q2, q3, q4, q5, q6, q7) (4.1) El modelo cinemático directo se ha obtenido mediante el método de DenavitHartenberg. Este método sirve para relacionar la articulación i−1 a la articulación i. Figure 4.5: Diagrama del robot Kuka iiwa R800 [31]. Los parámetros de Denavit-Hartenberg son los siguientes: i θidiaiαi 1θ1dbs 0−π 2 2θ20 0 π 2 3θ3dse 0π 2 4θ40 0 −π 2 5θ5dew 0−π 2 6θ60 0 π 2 7θ7dwf 0 0 Table 4.1: Parámetros de DH, donde dbs = 340mm , dse = 400mm , dew = 400mm y dwf = 126mm. Con la tabla de DH se obtienen las matrices de transformación homogénea, siguiendo la siguiente matriz: Ti−1 i= cos(θi)−sin(θi)cos(αi)sin(θi)sin(αi)aicos(θi) sin(θi)cos(θi)cos(αi)−cos(θi)sin(αi)aisin(θi) 0sin(αi)cos(αi)di 0 0 0 1 (4.2) 18 Chapter 4 Desarrollo de la solución
Por lo tanto, las matrices quedan: T0 1= cos(θ1) 0 −sin(θ1) 0 sin(θ1) 0 cos(θ1) 0 0−1 0 dbs 0 0 0 1 T1 2= cos(θ2) 0 sin(θ2) 0 sin(θ2) 0 −cos(θ2) 0 0 1 0 0 0 0 0 1 T2 3= cos(θ3) 0 sin(θ3) 0 sin(θ3) 0 −cos(θ3) 0 0 1 0 dse 0 0 0 1 T3 4= cos(θ4) 0 −sin(θ4) 0 sin(θ4) 0 cos(θ4) 0 0−1 0 0 0 0 0 1 T4 5= cos(θ5) 0 −sin(θ5) 0 sin(θ5) 0 cos(θ5) 0 0−1 0 dew 0 0 0 1 T5 6= cos(θ6) 0 sin(θ6) 0 sin(θ6) 0 −cos(θ6) 0 0 1 0 0 0 0 0 1 T6 7= cos(θ7) 0 −sin(θ7) 0 sin(θ7) 0 cos(θ7) 0 0−1 0 dwf 0 0 0 1 (4.3) Así pues, se puede obtener la matriz T0 7 que indica la localización del sistema asociado al extremo del robot respecto al sistema de referencia de la base del robot: T0 7=T0 1T1 2T2 3T3 4T4 5T5 6T6 7= nxoxaxpx nyoyaypy nzozazpz 0 0 0 1 (4.4) Esto en el código se traduce de la siguiente forma: Figure 4.6: Función de cinemática directa. 4.1 Seguimiento de brazo robótico a marcador Tag 19
Un detalle es que no se ha tenido en cuenta la distancia de la muñeca del robot. Esto es porque esta distancia se tendrá en cuenta más adelante. Con la matriz 4.4 solucionada, la cinemática directa está resuelta. Por lo tanto, en cada iteración se podrán obtener la ubicación y la orientación del extremo del robot. 4.1.4 Obtener vectores de rotación y traslación del Tag Como se ha explicado previamente, la identificación del Tag se hará mediante una cámara situada en el extremo de robot. Para este cometido, se ha utilizado una función de Matlab llamada readAprilTag(), que está dentro de la función creada cámara. Esta función es capaz de identificar el número que representa cada Tag y obtiene la matriz de rotación y el vector de traslación. Para la utilización de esta función, previamente se ha tenido que calibrar la cámara con la app de Matlab "Camera Calibrator" [25]. Una vez calibrada la cámara, la sesión de calibración se guarda como "calibrationSession.mat". Aquí se guardan todos los parámetros necesarios de la cámara para que la función readAprilTag() sea capaz de obtener la información del AprilTag. En la función Camara, por lo tanto, primero se inicializa la cámara con la que se va a trabajar. En este caso siempre sera el 2, ya que el 1 es la cámara del portátil. A continuación recoge la información guardada en la sesión de calibración y recoge de esa sesión la información necesaria de la cámara. Esta es guardada en una variable llamada "intrinsics". Por último, antes del loop de esta función, se determina que tamaño tienen los AprilTAg utilizados. Esta información será necesaria para el cálculo de las distancias y de la orientación. Figure 4.7: La inicialización de las variables necesarias en la función Camara para que se pueda leer el AprilTag. A partir de aquí, la función entra en un bucle. No se saldrá de este bucle hasta que la función haya detectado el AprilTag deseado. Para ello, primero, dentro del bucle, se saca una foto. A continuación, esa foto es analizada con la función readAprilTag(). Si hay un AprilTag en la foto, la función devolverá el ID (el número) del AprilTag detectado y el "pose". La variable "pose" 20 Chapter 4 Desarrollo de la solución
tiene como información la matriz de rotación del AprilTag respecto de la cámara y el vector de traslación respecto de la cámara. La función readAprilTag() tiene cuatro entradas en este caso: La imagen, los "intrinsics", el tamaño del AprilTag y por último, la familia a la que pertenece el AprilTag, que en este caso es "tag36h11" [10]. Existen distintas familias de AprilTag en función de cuales sean las necesidades de la aplicación para la que se vayan a usar. En este caso, se escoge la familia "tag36h11", ya que son las más simples y son las recomendadas para aplicaciones en las que se necesite un tiempo de respuesta menor. Figure 4.8: ID 0 de la familia de AprilTag 36h11 [10]. La matriz de rotación y el vector de traslación se devuelven de la función de la siguiente forma: R3∗3= r11 r12 r13 r21 r22 r23 r31 r32 r33 (4.5) P3∗1= px py pz (4.6) Sin embargo, la matriz y el vector obtenidos no se podrán aplicar directamente, ya que no tienen los mismos ejes que tiene el extremo del robot, por lo tanto se tendrán que hacer unos cambios que se tratarán en la siguiente sección. Estos cambios se realizarán en la siguiente función. Por lo tanto, el código de loop queda de la siguiente forma: 4.1 Seguimiento de brazo robótico a marcador Tag 21
Figure 4.9: Bucle dentro de la función Camara que busca el ID del AprilTag requerido. 4.1.5 Obtener nuevas coordenadas Una vez obtenida la matriz de rotación del Tag respecto de la cámara y el vector de traslación, se tienen que juntar los dos componentes para hacer una matriz que se pueda multiplicar a la matriz homogénea previa para así poder obtener las nuevas coordenadas cartesianas respecto de la base y los nuevos ángulos de Euler. Sin embargo, los ejes no coinciden con los del extremo del robot, y además al girar la cámara los ejes vuelven a cambiar. Esto hace que se tengan que obtener primero los ángulos de Euler de la matriz de rotación del AprilTag, reordenarlas en función de la configuración del robot y crear una nueva matriz de rotación, que esta vez si, al multiplicar dicha matriz con la matriz de rotación R0 7 , se obtenga la matriz de rotación final que dará los ángulos de Euler deseados. Primero, se tienen que obtener los ángulos de Euler. Se pueden obtener de muchas formas, pero en este caso se utiliza la función de Matlab "rotm2eul()" que los obtiene directamente. Después se reordenan y se vuelve a crear la matriz con la función de Matlab "rotm2eul(). A esta matriz de rotación se la denominará como R7 8 , como si de una extensión del robot se tratase. Se crea una matriz homogénea T7 8 con dicha matriz de rotación y el vector de traslación reordenado P7 8. T7 8="R7 8P7 8 0 1 #(4.7) 22 Chapter 4 Desarrollo de la solución
De lo que se deduce: T0 8=T0 7T7 8= nxoxaxpx nyoyaypy nzozazpz 0 0 0 1 (4.8) Un problema es que la función que se está utilizando para obtener la matriz y las coordenadas, el readAprilTag() cambia la dirección de las coordenadas en función de si la cámara está boca abajo o no. Por lo tanto, hay que hacer una condición que distinga esto. Por lo tanto, de la matriz de rotación obtenida se obtienen los ángulos de Euler originales y se cambian en función de la posición del robot. Por lo tanto, los ángulos de Euler de la cámara se reorganizan, y se hace una matriz homogénea con el vector de traslación también reorganizado. A esta matriz se la llama R7 8 , y si se multiplica la matriz homogénea original con la matriz de la cámara se obtienen los ángulos de Euler y la posición deseados a los que se quiere mover el extremo del robot. 4.1.6 Cinemática Inversa El problema cinemático inverso trata de encontrar los valores que tienen que adoptar las coordenadas articulares del robot para que el robot se posicione en un punto y con una orientación definida. Para ello, se ha diseñado una función en Matlab llamada CinematicaInversa(). Las entradas de la función son los ángulos de Euler del extremo del robot (a, b, c) y la posición del extremo del robot en coordenadas cartesianas (x, y, z). Las salidas serán el giro de los siete ejes del robot en radianes para que el extremo del robot llegue a la orientación y posición deseadas. Figure 4.10: Llamada a la función CinematicaInversa() desde el main. El problema se ha abordado mediante el método geométrico y utilizando el desacoplo cinemático, por lo tanto primero se abordara el problema de la posición con los primeros cuatro ejes del robot(el tercer eje estará bloqueado) y por último se abordará el problema de la orientación con los últimos tres ejes. En la función CinematicaInversa(), en primer lugar, se inicializan las longitudes del robot, como se ha hecho en la cinemática directa. En esta ocasión tampoco 4.1 Seguimiento de brazo robótico a marcador Tag 23
se introduce la distancia de la muñeca, esta se tendrá en cuenta siempre en otra función. También se introducen los límites de giro de cada eje. Esto se hace con el propósito de que se limite el giro de los ejes y no se obtenga una salida que el robot no pueda realizar. Este es un problema que se tenía con las funciones del ToolBox. Figure 4.11: Inicialización de los parámetros del robot para la parte de posición en la función CinematicaInversa(). A continuación, se procede a calcular los valores de los primeros cuatro ejes. Teniendo el tercer eje bloqueado, el diagrama es el siguiente: Figure 4.12: Representación de un robot articular de tres ejes [2]. Los datos de partida son px , py y pz , ya que se conocen de las matrices homogéneas calculadas previamente. Se observa que el valor de q1se obtiene como: q1 = arctg(py px )(4.9) 24 Chapter 4 Desarrollo de la solución
Hay que tener en cuenta que para el cálculo de los próximos ángulos hay que hacer unos cálculos preliminares. Primero, se resta la altura de la base del robot, ya que será constante y no cambiara cuando q2yq4cambien. Por lo tanto: zu=z−l1(4.10) Esto en el código se refleja como: Figure 4.13: Cálculo del ángulo del primer eje y zu Además, hay que tener en cuenta la posibilidad de que se pida llegar a un punto fuera del alcance del robot. Por lo tanto se toman dos medidas principales. En el caso de que se quiera llegar a un punto demasiado lejano, se calcula el punto más cercano en la dirección del punto original. Primero se calcula el radio del punto requerido respecto al origen, que en este caso será la segunda articulación. RadioP unto =qx2+y2+z2 u(4.11) El radio máximo del robot ( Rmax ) es de 800mm. Se hacen los cálculos con 790mm para dejar un margen de error. Si el punto de la ecuación 4.11 es superior, se calcula en que proporción es el radio del punto superior al radio máximo, para así multiplicarlo y calcular el nuevo punto al alcance del robot. El multiplicador queda: Multiplicador =sR2 max x2+y2+z2 u (4.12) Y entonces, el nuevo punto: x=x∗Multiplicador y=y∗Multiplicador zu=zu∗Multiplicador (4.13) Esto se traduce en el código de la siguiente forma: 4.1 Seguimiento de brazo robótico a marcador Tag 25
Figure 4.14: Código del cálculo para que la posición del robot esté dentro del rango. Una vez habiendo asegurado que el punto a calcular está dentro del rango, se procede a calcular q2 y q3 . Para obtener q2 y q3 , se tiene que tener en consideración que existen dos tipos de configuraciones para el codo: codo abajo y codo arriba. (a) Codo abajo (b) Codo arriba Figure 4.15: Las dos configuraciones que puede tener el codo. Por lo tanto, para cada configuración de codo habrá una solución de q2 y q4 . Con el teorema del coseno se obtiene que: q4(1) = −acos(C4) q4(2) = acos(C4) (4.14) Donde: C4=x2+y2+zu2−l2 2−l2 3 2l2l3 (4.15) Y queda: q2=atan(zu px2+y2) + atan(l3sin(q4) l2l3cos(q4))−π 2(4.16) Trasladado al código: 26 Chapter 4 Desarrollo de la solución
Figure 4.16: Código del cálculo de la segunda y cuarta articulación. Por último, se tiene que asegurar que ninguna articulación excede su rango de movimiento. Previamente se ha asegurado que el punto no esté demasiado lejos, pero puede suceder que por límites propios de las articulaciones el robot no sea capaz de llegar a ciertos puntos. En este caso, si el ángulo de alguna articulación supera sus posibilidades, este parámetro coge el valor del ángulo más cercano al que pueda llegar. Esta solución pretende única y exclusivamente que el controlador del robot no mande una señal de error, ya que en estos casos el robot deja de seguir el código y se queda congelado, teniendo que reiniciarlo. En el código: Figure 4.17: Código para asegurar que los valores de las articulaciones se mantienen entre los límites. 4.1 Seguimiento de brazo robótico a marcador Tag 27
Figure 4.26: Coordenadas de la pared para el nombramiento de las fotos según la posición. Por lo tanto, el nombre de cada foto que se vaya a sacar será dependiendo de las coordenadas de la pared en las que se haya sacado. Las ecuaciones para obtener dichas coordenadas son: NombreHorizontal =−HorizontalT otal 2+ 7(i−1)√2(mm) NombreV ertical =V erticalT otal 2−10(j−1)(mm) (4.30) Después, con la posición del robot calculada, se utiliza la función de cinemática inversa para obtener los ángulos de cada eje del robot. Acto seguido se mueve el robot al punto deseado. El cálculo de las posiciones y los nombres de las fotos, en el código: 34 Chapter 4 Desarrollo de la solución
Figure 4.27: Código para el cálculo de las posiciones que adoptará el robot para sacar las fotos y el cálculo de los nombres de las fotos que se sacaran respecto a las coordenadas de la pared. Cada vez que se mueva el robot, hay que sacar una foto y guardarla en una carpeta para luego poder utilizarla. Teniendo en cuenta que la línea anterior a esta es la que mueve el robot de posición, se introduce un tiempo de pausa para que al robot le de tiempo a colocarse en la nueva posición. Después se saca la foto, se crea el nombre de la foto con las variables de la posición previamente comentadas y se guarda la foto en la carpeta deseada. Por último, se vuelven a inicializar los valores de las coordenadas del robot a las iniciales. Con esto, el bucle quedaría definido. Figure 4.28: Código para obtener las fotos y guardarlas en la carpeta deseada. Una vez terminados los bucles, se apaga el servidor y se termina la conexión con el robot. Con esto, se termina el código que permite sacar las fotos necesarias de la pared mediante el robot. 4.2 Entrenamiento de la Red 35
4.2.2 División de las fotos obtenidas para poder entrenar la red neuronal Previamente se ha comentado como las fotos deben de ser divididas en un tamaño que la red neuronal pueda tratar. La red neuronal que se va a utilizar como base para el entrenamiento es la VGG16. Esta está diseñada para que las fotos tengan una resolución de 128*128, pero se puede cambiar para que pueda entrenarse con fotos de 64*64 o 32*32, por ejemplo. Las fotos originales tienen una resolución de 640*480, resolución no válida para la red. Figure 4.29: Fotos obtenidas a través de la cámara pegada a al final del Robot. Resolución 640*480. Segmentar las fotos servirá en primer lugar para poder utilizarlas para el entrenamiento de la red, pero también servirá para que tenga mayor cantidad de datos de entrada para ser entrenada. Para realizar esto, se ha diseñado dos programas que dividen las fotos originales. Son dos porque se van a hacer dos entrenamientos con dos tamaños de imagen de entrenamiento, de 64*64 y 128*128. Los dos programas son idénticos, por lo tanto se explicará un único programa, el de 64*64. El programa es un script de Matlab que se llama "DividirFotos.m". Lo primero que se hace en el script es limpiar la memoria y borrar todo lo que haya en unas carpetas llamadas "ImagenesTrain", "ImagenesTest" y "ImagenesVal". A continuación, se crean tres arrays con los mismos nombres. 36 Chapter 4 Desarrollo de la solución
Figure 4.30: Primeras líneas del script "DividirFotos.m". Las fotos que se vayan a dividir se separaran en tres carpetas diferentes, que son las que se han limpiado inicialmente. Esto es porque a la hora de entrenar una red neuronal, una cantidad de datos sirve para entrenar (Train), otra para asegurarse durante el entrenamiento que no se está produciendo sobre-ajuste (Val) y por último las fotos que permitirán al final poner a prueba la red neuronal entrenada (Test). Las carpetas tendrán un porcentaje distinto de fotos. En este caso, La carpeta del entrenamiento tendrá un 70% de las fotos, la carpeta de validación un 15% y la carpeta de testeo el último 15%. Más adelante en el programa se realizará la partición. Figure 4.31: Variables que permitirán situar las fotos en las carpetas adecuadas. La siguiente parte del código está dedicada a dividir las fotos y a darles a cada división de las fotos el nombre con las coordenadas apropiadas. Para ello, primero se realizan las mismas cuentas que en el script que obtiene las fotos para poder llamar a todas las fotos desde este script. Después, se hacen los cálculos de cuál será la posición de las nuevas fotos partiendo de la posición de la foto original que se ha partido. Para ello, primero se hace el cálculo de cuanta distancia abarca cada píxel de una foto en la pared. La distancia se mide de forma experimental, y en el código se tiene que: Figure 4.32: Cálculo de la distancia de pared por píxel. 4.2 Entrenamiento de la Red 37
Donde 492 son los milímetros de pared que abarca horizontalmente una foto original y NxmaxSub son los 640 píxeles que tiene horizontalmente cada imagen. Por lo tanto, si se tienen las coordenadas del centro de cada foto original y la distancia por píxel, se pueden obtener las coordenadas de las nuevas fotos que se vayan a obtener. Primero, se leen las fotos originales en el siguiente fragmento de código: Figure 4.33: Leer las fotos originales para luego poder trocearlas. Una vez obtenida la foto que se troceará, se hace un nuevo bucle que tomará una sección de la foto con el tamaño deseado y lo guardará. En este caso, por cada 100 píxeles de la foto original, ser guardará una foto con el nuevo tamaño, como muestra la siguiente imagen. Figure 4.34: División de las fotos originales en fotos más pequeñas. Cada 100 píxeles en la foto original, una nueva foto de tamaño 64*64. 38 Chapter 4 Desarrollo de la solución
Después, se crea un número aleatorio entre 0 y 1 que determinará en cual de las tres carpetas se guardará la nueva imagen recortada. El código de esta parte es: Figure 4.35: Código para dividir las fotos originales, ponerles nombre y clasificarlos en la carpeta correspondiente. Como se muestra en las siguientes imágenes, el resultado de dividir la imagen original es la siguiente. 4.2 Entrenamiento de la Red 39
(a) Resolución 64*64. (b) Resolución 128*128. Figure 4.36: Las dos resoluciones que se van a utilizar las redes neuronales. Una vez divididas las fotos y tras haberlas guardado en las carpetas correspondientes, queda organizar los datos de entrada de tal forma que la red neuronal las acepte. Para ello, hay que crear un "imageDatastore" de todas las imágenes de cada carpeta y atribuir a cada imagen unas coordenadas. Aunque se le hayan puesto los nombres con las coordenadas, no son datos que la red neuronal entienda. Hace falta juntar cada imagen con su celda correspondiente de coordenadas. El "imageDatastore" tiene que ir unido a un "arrayDatastore" que guarde las coordenadas de cada imagen en el mismo orden que se han guardado las imágenes en el "imageDatastore". Para ello, se ha creado una nueva función llamada "Irakurri.m". Esta función lee todos los títulos de las imágenes del "imageDatastore" y guarda las coordenadas en un array (data) de tal forma que se irán acumulando todas las coordenadas de las imágenes en el mismo orden en los que se han guardado las imágenes. Por último, se normalizan las coordenadas de tal forma que el tiempo de computación de la red neuronal se reduzca cuando calcule la media y la varianza del error. En el código: 40 Chapter 4 Desarrollo de la solución
Figure 4.37: Código que lee los nombres de cada foto y guarda las coordenadas en un array. Una vez obtenido el array, se puede crear un conjunto de datos que la red neuronal puede leer. La última parte del código del programa de la división de fotos: Figure 4.38: Parte del código que guarda los datos de entrada de la red neuronal de tal forma que las pueda leer. Una vez acabado con esto, se puede proceder a entrenar la red neuronal. Todos los datos de este programa quedan guardados y no se deben de perder por si se desea cambiar de configuración de la red neuronal y entrenarla otra vez. 4.2 Entrenamiento de la Red 41
4.2.3 Entrenamiento de la Red Neuronal Para crear el código de entrenamiento que se ha utilizado, se ha utilizado la App "DeepNetworkDesigner" [26]. Esta App permite entrenar redes neuronales viejas o crear nuevas redes neuronales de forma sencilla. En la sección "ImportData", se cargan los datos de entrenamiento y validación creados previamente. Figure 4.39: Código que carga los datos de entrenamiento y validación necesarios para el entrenamiento. A continuación, Matlab brinda la opción de cambiar varios parámetros del entrenamiento de la red neuronal. Figure 4.40: Algunos de los parámetros que se pueden cambiar para entrenar la red neuronal. Se han hecho varios intentos de entrenamiento, y algunos de estos parámetros se han ido cambiando hasta dejarlos como en la imagen, como la frecuencia de validación. Se ha aumentado la frecuencia de validación ya que se ha visto que no hace falta validar tanto si el entrenamiento va correctamente y ahorra muchísimo tiempo. La siguiente parte del código corresponde a las diferentes capas de la red neuronal. Se han hecho tres cambios. En primer lugar, en la capa de entrada, se ha ajustado el tamaño de la imagen para cada caso. Esto se hace en la primera línea. 42 Chapter 4 Desarrollo de la solución
Figure 4.41: Zona del código donde se escoge el tamaño de las imágenes de entrada. En el caso de la imagen anterior, las imágenes de entrada serán del tamaño 128*128, pero esto se puede cambiar a 64*64, por ejemplo. El segundo cambio, es que para utilizar la técnica de aprendizaje transferido, se han bloqueado todas las capas excepto las últimas tres. Para bloquear el aprendizaje, se utiliza el comando "WeightL2Factor". Figure 4.42: Zona del código donde se bloquean los pesos sinápticos de las capas. Por último, se han cambiado los nombres de las tres últimas capas para dejar claro cuales son las que cambian. Estas no tienen la restricción para los pesos que tienen las anteriores. Figure 4.43: Las tres últimas capas y la capa de salida. Una vez acabado el entrenamiento, se guardan los resultados obtenidos. Figure 4.44: Zona del código que guarda la red neuronal entrenada. 4.2.4 Poner a Prueba la Red Neuronal Para poner a prueba la red neuronal entrenada se han realizado dos programas. El primero se llama "EjecutarRedEntrenaDatosTest.m". En este programa, con las fotos guardadas en la carpeta de test, se calculan los errores de posicionamiento que hace la red neuronal respecto a la realidad tanto en el eje X como en el eje Y. 4.2 Entrenamiento de la Red 43
Figure 5.5: Error en Y en entrenamiento con imágenes de resolución 128*128. 50 Chapter 5 Análisis de resultados
6 Conclusiones y trabajos futuros En el presente trabajo se ha entrenado una red neuronal con diferentes configuraciones para detectar las zonas más significativas de una superficie. Para realizar el entrenamiento es necesario un conjunto de datos. Este conjunto de datos se ha obtenido mediante una cámara situada en el extremo de un robot. En este caso, se trata del robot Kuka LBR iiwa 7 R800, que tiene 7 grados de libertad de los cuales se ha bloqueado uno para poder trabajar con el como si fuese un robot de 6 grados de libertad convencional. El brazo del robot ha recorrido una superficie elegida (pared con canaleta y AprilTags) haciendo fotos. A continuación, estas fotos se han segmentado en imágenes de menor tamaño para poder usarlos como datos de entrada de una red neuronal convolucional y tener un tiempo de entrenamiento manejable. Se han usado 3000 fotos originales, y cada una de estas se ha segmentado en 20 imágenes más. Para el entrenamiento, se ha utilizado la técnica de aprendizaje transferido, que consiste en utilizar una red neuronal previamente entrenada (VGG16) y bloquear todos los pesos sinápticos menos los de las últimas capas. Con esto, la red neuronal es capaz de especializar en la tarea específica que se desea. Por último, la red neuronal creada ha sido puesta a prueba. Se ha hecho la comparativa de dos redes neuronales creadas, la que ha sido entrenada con imágenes de tamaño 64*64 y la que ha sido entrenada con imágenes 128*128. La red neuronal con mejores resultados ha sido la entrenada con imágenes de 128*128, ya que ha sido la que menor error ha tenido en las zonas significativas de la pared. Se demuestra que dependiendo de la complejidad del elemento de la pared, la red neuronal puede ser incapaz de entender los patrones del mismo, provocando que no aprenda el elemento. Esto se demuestra especialmente en la red neuronal de 64*64, donde las zonas del AprilTag tienen una tasa de error muy elevada aun siendo claramente zonas muy diferenciadas del resto de la pared. En contraste con con los AprilTag, el elemento simple de la pared, la canaleta, ha sido capaz de detectarla en ambas redes neuronales, con una tasa de error mínima en las dos. 51
En resumen, una red neuronal con imágenes de entrada más pequeñas es peor detectando patrones más complejos, y por esta razón, zonas diferenciadas para el ojo humano pueden no significar nada para red neuronal. Un punto que podría ser de interés como continuación de este trabajo es el entrenamiento de una red neuronal únicamente con las fotos en las que aparezca algún elemento de interés y descartar las fotos donde solo se vea la pared. El uso de imágenes que únicamente contengan información de interés podría mejorar el rendimiento de la red neuronal incluso en los elementos más complejos de la pared. 52 Chapter 6 Conclusiones y trabajos futuros
Referencias bibliográficas [1] Saad Albawi, Tareq Abed Mohammed, and Saad Al-Zawi. „Understanding of a convolutional neural network“. In: IEEE, Aug. 2017, pp. 1–6 (cit. on p. 7). [2] Carlos Balaguer et al Antonio Barrientos Luis Felipe Peñin. Fundamentos de Robótica. 2nd. Universidad Politécnica de Madrid. Mc Graw Hill (cit. on pp. 12, 24). [4] Axel Barroso-Laguna, Edgar Riba, Daniel Ponsa, and Krystian Mikolajczyk. „Key.Net: Keypoint Detection by Handcrafted and Learned CNN Filters“. In: (2019) (cit. on p. 10). [5] Dulari Bhatt, Chirag Patel, Hardik Talsania, et al. „CNN Variants for Computer Vision: History, Architecture, Application, Challenges and Future Scope“. In: Electronics 10 (20 Oct. 2021), p. 2470 (cit. on pp. 1, 5, 6, 9). [6] R. Ezhilarasi and P. Varalakshmi. „Tumor Detection in the Brain using Faster R-CNN“. In: IEEE, Aug. 2018, pp. 388–392 (cit. on p. 11). [7] Carlos Faria, Flora Ferreira, Wolfram Erlhagen, Sérgio Monteiro, and Estela Bicho. „Position-based kinematics for 7-DoF serial manipulators with global configuration control, joint limit and singularity avoidance“. In: Mechanism and Machine Theory 121 (Mar. 2018), pp. 317–334 (cit. on p. 13). [8] Zhen-Hua Feng, Josef Kittler, Muhammad Awais, Patrik Huber, and Xiao-Jun Wu. „Wing Loss for Robust Facial Landmark Localisation with Convolutional Neural Networks“. In: IEEE, June 2018, pp. 2235–2245 (cit. on p. 10). [11] Gonzalez and Safabakhsh. „Computer Vision Techniques for Industrial Applications and Robot Control“. In: Computer 15 (12 Dec. 1982), pp. 17–32 (cit. on p. 11). [12] Md Foysal Haque, Hye-Youn Lim, and Dae-Seong Kang. „Object Detection Based on VGG with ResNet Network“. In: IEEE, Jan. 2019, pp. 1–3 (cit. on p. 1). [13] Asmida Ismail, Siti Anom Ahmad, Azura Che Soh, Khair Hassan, and Hazreen Haizi Harith. „Improving Convolutional Neural Network (CNN) Architecture (miniVGGNet) with Batch Normalization and Learning Rate Decay Factor for Image Classification“. In: International Journal of Integrated Engineering 11 (4 Sept. 2019) (cit. on p. 1). [14] Asifullah Khan, Anabia Sohail, Umme Zahoora, and Aqsa Saeed Qureshi. „A survey of the recent architectures of deep convolutional neural networks“. In: Artificial Intelligence Review 53 (8 Dec. 2020), pp. 5455–5516 (cit. on p. 6). [15] Muhammad Zeeshan Khan, Saad Harous, Saleet Ul Hassan, et al. „Deep Unified Model For Face Recognition Based on Convolution Neural Network and Edge Computing“. In: IEEE Access 7 (2019), pp. 72622–72633 (cit. on p. 8). 53
[16] K. Kreutz-Delgado, M. Long, and H. Seraji. „Kinematic analysis of 7 DOF anthropomorphic arms“. In: IEEE Comput. Soc. Press, 1990, pp. 824–830 (cit. on p. 13). [17] Yixian Lau. „Understanding how noise affects the accuracy of CNN image classification“. In: 2021 (cit. on p. 1). [18] Louis Lettry, Michal Perdoch, Kenneth Vanhoey, and Luc Van Gool. „Repeated Pattern Detection Using CNN Activations“. In: 2017 IEEE Winter Conference on Applications of Computer Vision (WACV) (Mar. 2017), pp. 47–55 (cit. on p. 10). [19] Peiliang Li, Xiaozhi Chen, and Shaojie Shen. „Stereo R-CNN Based 3D Object Detection for Autonomous Driving“. In: IEEE, June 2019, pp. 7636–7644 (cit. on p. 11). [20] Zewen Li, Fan Liu, Wenjie Yang, Shouheng Peng, and Jun Zhou. „A Survey of Convolutional Neural Networks: Analysis, Applications, and Prospects“. In: IEEE Transactions on Neural Networks and Learning Systems 33 (12 Dec. 2022), pp. 6999–7019 (cit. on p. 11). [21] Guosheng Lin, Chunhua Shen, Anton van den Hengel, and Ian Reid. „Efficient Piecewise Training of Deep Structured Models for Semantic Segmentation“. In: IEEE, June 2016, pp. 3194–3203 (cit. on p. 11). [22] Shuying Liu and Weihong Deng. „Very deep convolutional neural network based image classification using small training sample size“. In: IEEE, Nov. 2015, pp. 730–734 (cit. on p. 8). [23] M.J.H. Lum, J. Rosen, M.N. Sinanan, and B. Hannaford. „Optimization of a Spherical Mechanism for a Minimally Invasive Surgical Robot: Theoretical and Experimental Approaches“. In: IEEE Transactions on Biomedical Engineering 53 (7 July 2006), pp. 1440– 1445 (cit. on p. 11). [24] Aravindh Mahendran and Andrea Vedaldi. „Understanding deep image representations by inverting them“. In: IEEE, June 2015, pp. 5188–5196 (cit. on p. 9). [29] Je-Kang Park, Bae-Keun Kwon, Jun-Hyub Park, and Dong-Joong Kang. „Machine learning-based imaging system for surface defect inspection“. In: International Journal of Precision Engineering and Manufacturing-Green Technology 3 (3 July 2016), pp. 303– 310 (cit. on p. 9). [30] Yoga Dwi Pranata, Kuan-Chung Wang, Jia-Ching Wang, et al. „Deep learning and SURF for automated classification and detection of calcaneus fractures in CT images“. In: Computer Methods and Programs in Biomedicine 171 (Apr. 2019), pp. 27–37 (cit. on p. 9). [32] Hoo-Chang Shin, Holger R. Roth, Mingchen Gao, et al. „Deep Convolutional Neural Networks for Computer-Aided Detection: CNN Architectures, Dataset Characteristics and Transfer Learning“. In: IEEE Transactions on Medical Imaging 35 (5 May 2016), pp. 1285–1298 (cit. on p. 10). [33] Deepak Tolani, Ambarish Goswami, and Norman I. Badler. „Real-Time Inverse Kinematics Techniques for Anthropomorphic Limbs“. In: Graphical Models 62 (5 Sept. 2000), pp. 353–388 (cit. on p. 13). [34] Lisa Torrey and Jude Shavlik. Transfer Learning. IGI Global, 2010, pp. 242–264 (cit. on pp. 2, 3). 54 Referencias bibliográficas
[35] Ruohui Wang. Edge Detection Using Convolutional Neural Network. 2016, pp. 12–20 (cit. on p. 9). [36] Biao Yang, Jinmeng Cao, Rongrong Ni, and Yuyu Zhang. „Facial Expression Recognition Using Weighted Mixture Deep Neural Network Based on Double-Channel Facial Images“. In: IEEE Access 6 (2018), pp. 4630–4640 (cit. on p. 11). [37] Liang Zheng, Yi Yang, and Qi Tian. „SIFT Meets CNN: A Decade Survey of Instance Retrieval“. In: IEEE Transactions on Pattern Analysis and Machine Intelligence 40 (5 May 2018), pp. 1224–1244 (cit. on p. 8). [38] Bolei Zhou, Aditya Khosla, Agata Lapedriza, Aude Oliva, and Antonio Torralba. „Learning Deep Features for Discriminative Localization“. In: IEEE, June 2016, pp. 2921–2929 (cit. on p. 6). Páginas Web [3] baeldung.com. 2023. URL: https://www.baeldung.com/cs/epoch-neural-networks (cit. on p. 7). [9] github.com. 2023. URL: https://github.com/Modi1987/KST-Kuka-Sunrise-Toolbox (cit. on p. 15). [10] github.com. 2023. URL: https://github.com/KamaljeetSahoo/AprilTag-Detector (cit. on p. 21). [25] mathworks.com. 2023. URL: https://www.mathworks.com/help/vision/ug/usingthe-single-camera-calibrator-app.html (cit. on p. 20). [26] mathworks.com. 2023. URL: https://www.mathworks.com/help/deeplearning/gs/ get-started-with-deep-network-designer.html (cit. on p. 42). [27] medium.com. 2023. URL: https://medium.com/databreach/introductiontosift-scale-invariant-feature-transform-65d7f3a72d40 (cit. on p. 9). [28] paperswithcode.com. 2023. URL: https://paperswithcode.com/method/max-pooling (cit. on p. 6). [31] researchgate.net. 2023. URL: https://www.researchgate.net/figure/Manipulatorgenericstructurejoint-variablesandDH-framesassigned-The7-DoF_ fig1_320895915 (cit. on p. 18). Páginas Web 55
MÁSTER UNIVERSITARIO EN INGENIERÍA DE CONTROL, AUTOMATIZACIÓN Y ROBÓTICA TRABAJO FIN DE MÁSTER ANEXO A: PROGRAMAS FUENTE EVALUACIÓN DE REGIONES SIGNIFICATIVAS PARA EL ENTRENAMIENTO DE UNA RED NEURONAL A TRAVÉS DE FOTOGRAFÍAS DE UNA SUPERFICIE Estudiante Millán, Fernández de Landa, Mikel Director/Directora Zulueta, Guerrero, Ekaitz Departamento Ingeniería de Sistemas y Automática Curso académico 2022-2023 Bilbao, 16 de Julio de 2023
A Programas fuente A.1 Seguimiento de brazo robótico a marcador Tag A.1.1 Main.m close all ; clear all ; clc ; %% Estabilizar conexion con Robot warning('off '); ip='172.31.1.147';% IP del Robot % Comienza la conexion con el servidor global t_Kuka; t_Kuka = net_establishConnection ( ip ); if ~ exist ( 't_Kuka','var') || isempty ( t_Kuka ) || strcmp ( t_Kuka .Status , 'closed') warning('Connection could not be establised , script aborted'); return;%en caso de no detectar el robot , el programa se para inmediatamente else %% Inicializacion de variables q1 = 0.62; q2 = -1.36; q3 = 0; q4 = 0; q5 = 0; q6 = 0; q7 = 0; Deltax = 0; Deltay = 0; Deltaz = 0; %% Inicio movimiento 59
A.1.4 Camara.m function [ MatrizRotacion , VectorTraslacion , id ] = Camara cam = webcam (2); load('calibrationSession .mat '); intrinsics = calibrationSession . CameraParameters . Intrinsics ; tagSize = 60; % mm while true I= snapshot (cam); imshow (I); [id ,~ , pose ] = readAprilTag (I ," tag36h11 ", intrinsics , tagSize); for i = 1: length ( pose ) MatrizRotacion = pose (i). Rotation ; VectorTraslacion = pose (i). Translation ; end if id(i)==2 break end end end 66 Chapter A Programas fuente
A.1.5 Corregir.m abc78 = rotm2eul ( MatrizRotacion (1:3 ,1:3) ,'ZYX '); abc78 (2) = abc78 (2) ; abc78 (3) = abc78 (3) ; abc78 (1) if abc78 (1) <= pi /2 && abc78 (1) >=-pi /2 R78Acond = eul2rotm ([ - abc78 (1) abc78 (3) -abc78 (2) ]); else R78Acond = eul2rotm ([ - abc78 (1) -abc78 (3) + abc78 (2) ]); end Rot07 = R07 (1:3 ,1:3); R08 = Rot07 * R78Acond ; abc08 = rotm2eul (R08 ,'ZYX '); AngX = abc08 (3); AngY = abc08 (2); AngZ = abc08 (1); %% Correccion de la camara % Esto se ha hecho de forma experimental Dx = VectorTraslacion(1); Dy = VectorTraslacion(2); Dz = VectorTraslacion(3); Dz = 3.4347* Dz + 23.75; %% Distacia que se quiere mantener con la camara Dz = Dz -526; R78Tot = [ R78Acond (1 ,1:3) -Dy; R78Acond (2 ,1:3) Dx; R78Acond (3 ,1:3) Dz ; 0 0 0 1]; R08Tot = R07*R78Tot; %% Calculo Matriz %R = [-Dy ; Dx ; Dz ; 1]; R=[0 ; 0 ; 0 ; 1]; % Dist = R07 *R; Dist = R08Tot *R; x = Dist (1) ; y = Dist (2) ; A.1 Seguimiento de brazo robótico a marcador Tag 67
z = Dist (3) ; A.2 Entrenamiento de la Red A.2.1 MainFotos.m close all ; clear all ; clc ; %% Estabilizar conexion con Robot warning('off'); ip='172.31.1.147';% IP del Robot % Comienza la conexion con el servidor global t_Kuka; t_Kuka = net_establishConnection ( ip ); if ~ exist ( 't_Kuka','var ') || isempty ( t_Kuka ) || strcmp ( t_Kuka .Status , 'closed') warning('Connection could not be establised , script aborted'); return;%en caso de no detectar el robot , el programa se para inmediatamente else %% Setup Fotos % Inicializar webcam cam = webcam (2); %% Inicio movimiento % Posicion de descanso relVel=0.25; % sobrepasar velocidad relativa de las articulaciones pos ={0 , 0, 0, 0, 0, 0, 0}; movePTPJointSpace ( t_Kuka , pos , relVel ); % Posicion de inicio x = -141; y = -565; z = 650; % Los angulos por experimentacion 68 Chapter A Programas fuente
a = 45* pi /180; b = -90* pi /180; c = 0* pi /180; Nx =50; Ny = 60; HorizontalTotal = sqrt (2) *7*( Nx -1); VerticalTotal = 10*( Ny -1) ; [q1 , q2 , q3 , q4 , q5 , q6 , q7 ]= CinematicaInversa (a, b , c, x, y, z); pos ={q1 , q2 , q3 , q4 , q5 , q6 , q7 }; movePTPJointSpace ( t_Kuka , pos , relVel ); for i =1:1: Nx %50 for j =1:1: Ny % 60 % Calculo x, y, z x = x -(i -1) *7; y = y+(i -1) *7; z = z -(j -1) *10; % Nombres Fotos NombreHorizontal = -HorizontalTotal /2 + sqrt (2) *7*(i -1); NombreVertical = VerticalTotal /2 - 10*(j -1) ; [q1 , q2 , q3 , q4 , q5 , q6 , q7] = ... CinematicaInversa (a, b, c, x, y, z); pos ={q1 , q2 , q3 , q4 , q5 , q6 , q7 }; movePTPJointSpace ( t_Kuka , pos , relVel ); % Fotos pause (0.5) imagen = snapshot (cam); NombreFichero = strcat ( 'ImagenesMas\F',sprintf( '%.1f ,%.1 f',... NombreHorizontal , NombreVertical ),'. jpg '); imwrite (imagen , NombreFichero ); x = -141; y = -565; z = 650; A.2 Entrenamiento de la Red 69
end end pos ={0 , 0, 0, 0, 0, 0, 0}; movePTPJointSpace ( t_Kuka , pos , relVel ); end %% apagar el servidor net_turnOffServer ( t_Kuka ); fclose(t_Kuka); 70 Chapter A Programas fuente
A.2.2 DividirFotos.m clc close all clear all delete(['C :\ Users \ Mikel \ Desktop \TFM - Publicaciones '... '\ RED_NEURONAL \ Imagenes \ ImagenesTrain \* ']) delete(['C :\ Users \ Mikel \ Desktop \TFM - Publicaciones '... '\RED_NEURONAL\Imagenes\ImagenesTest\*']); delete(['C :\ Users \ Mikel \ Desktop \TFM - Publicaciones '... '\ RED_NEURONAL \ Imagenes \ ImagenesVal \* ']); SalidasTrain=[]; SalidasVal =[]; SalidasTest =[]; Ptrain =0.7; Pval =0.15; Ptest =0.15; %% Nombres de las fotos NxmaxSub = 640; NymaxSub = 480; Nx =64; Ny =64; Nxmax = 50; Nymax = 60; DistImagen = 492; %mm DistPixel = DistImagen / NxmaxSub ; HorizontalTotal = sqrt (2) *7*( Nxmax -1) ; VerticalTotal = 10*( Nymax -1); for i =1:1: Nxmax %50 for j =1:1: Nymax % 60 % Nombres Fotos A.2 Entrenamiento de la Red 71
NombreHorizontal = -HorizontalTotal /2+ sqrt (2) *7*( i -1) ; NombreVertical = VerticalTotal /2 -10*(j -1) ; NombreFichero = sprintf ('F %.1f ,%.1 f.jpg '... ,NombreHorizontal , NombreVertical ); I= imread( NombreFichero ); for i1 =1:100: NxmaxSub -Nx for i2 =1:100: NymaxSub -Ny NombreHorizontalSub = NombreHorizontal - DistPixel *... ( NxmaxSub -2* Nx) /2+ i1* DistPixel ; NombreVerticalSub = NombreVertical + DistPixel *... ( NymaxSub -2* Ny)/2 -i2* DistPixel ; Isub =I(i2: i2+Nx -1, i1:i1+Ny -1 ,:) ; Prob = random ('Uniform',0,1 ,1,1); if Prob < Ptrain NombreFichero = strcat ( 'ImagenesTrain \F ',sprintf ... ('%.1f ,%.1 f. jpg ', NombreHorizontalSub , NombreVerticalSub)); imwrite (Isub , NombreFichero ); else if Prob < Ptrain + Pval NombreFichero = strcat ( 'ImagenesVal \F',sprintf ... ('%.1f ,%.1 f. jpg ', NombreHorizontalSub , ... NombreVerticalSub)); imwrite (Isub , NombreFichero ); else NombreFichero = strcat ( ' ImagenesTest\F',sprintf ... ('%.1f ,%.1 f. jpg ', NombreHorizontalSub , ... NombreVerticalSub)); imwrite (Isub , NombreFichero ); end 72 Chapter A Programas fuente
end end end end end ImagenesInputTrain = imageDatastore (" ImagenesTrain \", ... "FileExtensions",".jpg"); LTrain = length ( ImagenesInputTrain . Files ); [ SalidasTrain , xmaxTrain , ymaxTrain ]= Irakurri ( ImagenesInputTrain . Files , ... LTrain); SalidasDSTrain=arrayDatastore(SalidasTrain); ImagenesConSalidasDSTrain = combine ( ImagenesInputTrain , SalidasDSTrain); ImagenesInputTest = imageDatastore (" ImagenesTest \" ," FileExtensions",".jpg"); LTest = length ( ImagenesInputTest . Files ); [ SalidasTest , xmaxTest , ymaxTest ]= Irakurri ( ImagenesInputTest . Files , LTest ); SalidasDSTest = arrayDatastore ( SalidasTest ); ImagenesConSalidasDSTest = combine ( ImagenesInputTest , SalidasDSTest ); ImagenesInputVal = imageDatastore (" ImagenesVal \" ," FileExtensions",".jpg"); LVal = length ( ImagenesInputVal . Files ); [ SalidasVal , xmaxVal , ymaxVal ]= Irakurri ( ImagenesInputVal . Files , LVal ); SalidasDSVal = arrayDatastore ( SalidasVal ); ImagenesConSalidasDSVal = combine ( ImagenesInputVal , SalidasDSVal); save all A.2 Entrenamiento de la Red 73
A.2.3 CodigoEntrenamiento.m %% Import Data % Import training and validation data . dsTrain = ImagenesConSalidasDSTrain; dsValidation = ImagenesConSalidasDSVal ; %% Set Training Options % Specify options to use when training . opts = trainingOptions (" sgdm ",... "ExecutionEnvironment","gpu",... " InitialLearnRate " ,0.0011 ,... " L2Regularization " ,0.0001 ,... " LearnRateSchedule "," piecewise ", ... "LearnRateDropFactor",0.2, ... "LearnRateDropPeriod",5, ... " MaxEpochs " ,20 ,... " MiniBatchSize " ,64,... " Shuffle " ," every - epoch ",... "ValidationFrequency",250,... " Plots "," training - progress ",... " ValidationData ", dsValidation ); %% Create Array of Layers layers = [ imageInputLayer ([128 128 3] ," Name " ," imageinput ") convolution2dLayer ([3 3] ,64 ," Name " ," conv1_1 "," Padding ", ... [1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu1_1 ") convolution2dLayer ([3 3] ,64 ," Name " ," conv1_2 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu1_2 ") maxPooling2dLayer ([2 2] ," Name " ," pool1 " ," Stride " ,[2 2]) convolution2dLayer ([3 3] ,128 ," Name "," conv2_1 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu2_1 ") convolution2dLayer ([3 3] ,128 ," Name "," conv2_2 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu2_2 ") 74 Chapter A Programas fuente
maxPooling2dLayer ([2 2] ," Name " ," pool2 " ," Stride " ,[2 2]) convolution2dLayer ([3 3] ,256 ," Name "," conv3_1 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu3_1 ") convolution2dLayer ([3 3] ,256 ," Name "," conv3_2 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu3_2 ") convolution2dLayer ([3 3] ,256 ," Name "," conv3_3 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu3_3 ") maxPooling2dLayer ([2 2] ," Name " ," pool3 " ," Stride " ,[2 2]) convolution2dLayer ([3 3] ,512 ," Name "," conv4_1 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu4_1 ") convolution2dLayer ([3 3] ,512 ," Name "," conv4_2 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu4_2 ") convolution2dLayer ([3 3] ,512 ," Name "," conv4_3 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu4_3 ") maxPooling2dLayer ([2 2] ," Name " ," pool4 " ," Stride " ,[2 2]) convolution2dLayer ([3 3] ,512 ," Name "," conv5_1 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu5_1 ") convolution2dLayer ([3 3] ,512 ," Name "," conv5_2 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu5_2 ") convolution2dLayer ([3 3] ,512 ," Name "," conv5_3 "," Padding " ,[1 1 1 1] ," WeightL2Factor " ,0) reluLayer (" Name "," relu5_3 ") maxPooling2dLayer ([2 2] ," Name " ," pool5 " ," Stride " ,[2 2]) fullyConnectedLayer (1000 ," Name "," Benito ") reluLayer (" Name " ," relu6 ") dropoutLayer (0.5 ," Name " ," drop6 ") fullyConnectedLayer (100 ," Name " ," Patxi ") reluLayer (" Name " ," relu7 ") dropoutLayer (0.5 ," Name " ," drop7 ") fullyConnectedLayer (2 ," Name " ," fc ") A.2 Entrenamiento de la Red 75