Logo Studenta

Desarrollo de un sistema embebido en FPGA para la deteccion de defectos en la fabricacion de baldosas

¡Este material tiene más páginas!

Vista previa del material en texto

Trabajo Final 
 Carrera Ingeniería de Sistemas 
 Facultad de Ciencias Exactas - UNICEN 
 Desarrollo de un Sistema Embebido en FPGA para la detección de 
 defectos en la fabricación de baldosas 
 Director: Mg. Lucas Leiva 
 Codirector: Dr. Martín Vázquez 
 Alumno: Tomás Ariel Medina 
 1. Introducción 4 
 1.1 Motivación 4 
 1.2 Objetivos 5 
 1.3 Trabajo propuesto 6 
 1.4 Organización de la tesis 6 
 2. Marco teórico 8 
 2.1 Inspección visual 8 
 2.2 Machine Vision 11 
 2.2.1 Sistemas embebidos en Machine Vision 12 
 2.2.2 Plataformas de Procesamiento para Sistemas Embebidos en Machine Vision 14 
 2.2.3 SoC FPGAs 15 
 2.2.4 Lógica Programable (PL) 17 
 2.2.5 Sistema de Procesamiento (PS) 19 
 2.3 Diseño de lógica programable 21 
 2.3.1 Enfoque tradicional para diseño de lógica programable 21 
 2.3.2 Síntesis de Alto Nivel 23 
 2.4 Síntesis de Alto Nivel para procesamiento de imágenes 25 
 3. Ambiente y metodología de desarrollo 27 
 3.1 Ambiente de desarrollo 27 
 3.2 Componentes hardware 33 
 3.3 Software para desarrollo 35 
 3.4 Plataforma de desarrollo 37 
 3.4.1 Diagrama de bloques simplificado 37 
 3.4.2 Programación de PS 39 
 3.5 Metodología de desarrollo 39 
 4. Corrección de distorsión de lente 43 
 4.1 Distorsión radial 43 
 4.2 Implementación con xfOpenCV 47 
 4.3 Solución basada en aproximación de funciones 49 
 4.3.1 Propuesta 49 
 4.3.2 Desarrollo del modelo matemático 50 
 4.3.3 Pruebas 52 
 4.4 Solución basada en aproximación con vectores precalculados 54 
 4.4.1 Propuesta 54 
 4.4.2 Cálculo de la solución 56 
 4.4.3 Análisis de resultados 58 
 4.5 Resultados en HLS 61 
 2 
 5. Desarrollo de algoritmos de detección de defectos 63 
 5.1 Inspección de bordes, esquinas y dimensión 63 
 5.1.1 Descripción del algoritmo 63 
 5.1.2 Implementación en Alto nivel 68 
 5.1.3 Migración a xfOpenCV y optimización 70 
 5.1.4 Resultados experimentales 77 
 5.2 Detección de defectos por gotas (blobs) 81 
 5.2.1 Descripción del algoritmo 81 
 5.2.2 Implementación en Alto nivel 83 
 5.2.3 Migración a xfOpenCV y optimización 88 
 5.2.4 Resultados experimentales 95 
 5.3 Detección de defectos de material (pinholes) 99 
 5.3.1 Descripción del algoritmo 99 
 5.3.2 Implementación en Alto nivel 102 
 5.3.3 Migración a xfOpenCV y optimización 106 
 5.3.4 Resultados experimentales 108 
 6. Conclusiones 112 
 6.1 Trabajo realizado y resultados obtenidos 112 
 6.2 Contribuciones 113 
 6.3 Trabajos futuros 114 
 Apéndice: Plataforma ZYNQ 116 
 Bibliografía 124 
 3 
 1. Introducción 
 1.1 Motivación 
 El control de calidad es una parte fundamental del proceso de fabricación. En esta 
 etapa se asegura que los productos cumplen con requerimientos determinados para continuar 
 su fabricación o que están listos para ser comercializados. La fabricación de baldosas de 
 textura aleatoria no es una excepción, ya que implica una inspección visual para determinar si 
 existen defectos en su forma o superficie que provoquen que no cumplan con los estándares 
 de calidad impuestos por el fabricante. En ocasiones, dicha inspección es realizada por 
 personas, quienes deben soportar condiciones perjudiciales para la salud, como la exposición 
 constante a altos niveles de ruido, altas temperaturas, además de que el simple hecho de estar 
 presente para visualizar los productos puede provocar accidentes de distinta gravedad. Por otro 
 lado, al ser ejecutadas por humanos, la calidad de detección de defectos está sujeta a la 
 subjetividad y experiencia de los operarios que la realicen, y debido a que es una tarea 
 repetitiva, la fatiga también afecta a esta inspección. 
 Como manera de suplantar a las personas en estas tareas, existen las soluciones de 
 visión computacional para automatizar este trabajo. Para la implementación de estos tipos de 
 sistemas en la fabricación de baldosas, se pueden emplear dispositivos ya preparados para 
 realizar tareas de Machine Vision [1, 2], pero este tipo de productos son de un muy alto costo, 
 lo que puede ser un impedimento para las industrias de la región. 
 También se puede realizar la implementación propia de un sistema de este tipo, para lo 
 que hay que tener en cuenta la plataforma sobre la que se va a trabajar. Una opción es utilizar 
 una solución basada en software. Por otro lado, existen plataformas que se apoyan en el 
 procesamiento por hardware, entre las que se destacan las que emplean FPGAs debido a su 
 muy alto rendimiento en procesamiento de imágenes (muy útil en el caso de aplicaciones de 
 tiempo real) por su paralelismo inherente, su tamaño reducido, su bajo consumo de energía, 
 entre otras ventajas. Como una solución híbrida, existen los SoC FPGA que brindan la 
 posibilidad de procesar por hardware y por software a la vez, por lo que son plataformas muy 
 flexibles a la hora de implementar este tipo de sistemas y se han vuelto muy populares en la 
 industria. Sin embargo, pese a sus ventajas, el desarrollo para FPGAs y SoC FPGAs no 
 4 
 siempre resultaba sencillo para este tipo de aplicaciones debido al bajo nivel de abstracción de 
 los lenguajes con los que se configuran. Por esta razón, los principales fabricantes de estas 
 plataformas comenzaron a ofrecer herramientas de desarrollo a partir de código de alto nivel 
 para realizar la llamada Síntesis de Alto Nivel ( High-Level Synthesis ), junto con bibliotecas para 
 el procesamiento de determinados tipos de datos, entre las que existen bibliotecas específicas 
 para el procesamiento de imágenes. 
 1.2 Objetivos 
 Se establece la hipótesis de que los sistemas embebidos basados en SoC FPGA son 
 apropiados para la implementación de sistemas de visión computacional para ser aplicados a la 
 industria regional. Esta hipótesis se apoya en que el uso de estas tecnologías responde a la 
 demanda del sector industrial, debido a el gran rendimiento que ofrecen para el procesamiento 
 de imágenes y las características de estas plataformas que hacen que sean físicamente aptas 
 para ser instaladas en un entorno de manufactura. 
 Partiendo del trabajo “Inspección visual automática en baldosas con texturas aleatorias”, 
 realizado por Echeverz y Melograno [3], donde se describen algoritmos para la detección de 
 distintos tipos de defectos en baldosas, el objetivo principal de este informe consiste en migrar 
 tres de los mismos para ser utilizados en una plataforma basada en SoC FPGA, basándose 
 principalmente en el uso de Síntesis de Alto Nivel para la implementación de éstos. En 
 particular, se seleccionan los algoritmos de detección de defectos en bordes, esquinas y 
 dimensión, defectos por gotas ( blobs ) y defectos de agujeros ( pinholes ). 
 Como objetivos secundarios se establecen: 
 ■ Contribuir al desarrollo de mecanismos y técnicas de trabajo para la 
 implementación de algoritmos de procesamiento de imágenes con Síntesis de 
 Alto Nivel. 
 ■ Proponer una plataforma general basada en SoC FPGA para el fácil y rápido 
 desarrollo de nuevos algoritmos de inspección visual. 
 ■ Contribuir al establecimiento de metodologías de pruebas visuales para 
 ambientes industriales. 
 5 
 1.3 Trabajo propuesto 
 Se propone el desarrollo de módulos IP de procesamiento de imágenes que ejecuten 
 los algoritmos de detección de defectos de bordes, esquinasy dimensión, defectos por gotas y 
 defectos de agujeros en baldosas cerámicas de textura aleatoria. El correcto funcionamiento de 
 los mismos será comprobado con simulación por software, con imágenes de baldosas tomadas 
 en un ambiente que se asimile al real de la industria. Estos módulos IP deben poderse importar 
 en la plataforma para su implementación en el equipo de hardware seleccionado. 
 Por otro lado, se propone también una plataforma de procesado de video compatible 
 con el equipo de hardware en la que sea posible incorporar los módulos IP cada uno de los 
 algoritmos. Sin embargo, no se realizaron las pruebas de funcionamiento sobre el hardware ya 
 que no se tuvo acceso a los equipos en las últimas etapas de desarrollo. 
 1.4 Organización de la tesis 
 El presente trabajo se encuentra dividido en 6 capítulos. 
 El primer capítulo es una Introducción, donde se describen las Motivaciones, Objetivos y 
 el trabajo que se propone en esta investigación. 
 El segundo capítulo está dedicado a establecer un marco teórico de Inspección visual, 
 Machine Vision y las tecnologías usadas comúnmente en estas áreas. 
 En el tercer capítulo se describen las herramientas de software utilizadas, metodologías 
 de desarrollo que se siguen, el ambiente empleado para generar las imágenes de prueba, los 
 componentes de hardware utilizados y una breve descripción de la plataforma base de 
 procesado de video propuesta. 
 El cuarto capítulo está dedicado a explicar cómo se llega a una solución para la 
 corrección de la distorsión de lente, que surge como necesidad de los algoritmos de inspección 
 de baldosas. 
 En el quinto capítulo se detalla cómo se desarrollan los tres algoritmos de detección de 
 defectos. Para cada uno se explica en qué consiste el algoritmo original, cómo es la primera 
 migración implementada sobre C++ con OpenCV, cómo es la siguiente migración a la 
 descripción en Alto Nivel de HLS con xfOpenCV, y el análisis de los resultados de las 
 simulaciones y de síntesis. 
 6 
 En el sexto capítulo se hacen las conclusiones sobre lo desarrollado, a su vez 
 nombrando posibles trabajos futuros. 
 Por último, se incluye también un Apéndice, en el cual se explica de forma más 
 exhaustiva la plataforma de procesado de video propuesta. 
 7 
 2. Marco teórico 
 Este capítulo tiene como objetivo establecer un marco teórico para la tesis, explicando 
 el estado del arte de Machine Vision y tecnologías de hardware para su implementación. En la 
 Sección 2.1 se introduce a la inspección visual en el ámbito industrial y las desventajas que 
 conlleva emplear personas para estas tareas. En la Sección 2.2 se presentan las alternativas 
 de Inspección visual basadas en Machine Vision , junto con descripciones de los distintos tipos 
 de soluciones comúnmente utilizadas. En la Sección 2.3 se explican distintos enfoques para el 
 desarrollo de Lógica Programable: el tradicional y el basado en Síntesis de Alto Nivel. Por 
 último, en la Sección 2.4 se explica el estado actual de tecnologías de Síntesis de Alto Nivel 
 para el procesamiento de imágenes. 
 2.1 Inspección visual 
 Inspección visual significa, en su definición más básica, inspeccionar con la mirada. 
 Esta inspección supone, por un lado, asegurar características de calidad específicas de bienes 
 intermedios o finales y, por otro lado, detectar y analizar variaciones de un proceso de 
 manufactura [4]. 
 En general, los procesos de fabricación suelen incluir etapas de inspección visual para 
 asegurar la calidad y correctitud del estado del producto. Históricamente, esto fue en principio 
 realizado exclusivamente por humanos, los cuales podían ser empleados normales dedicados 
 completa o parcialmente a realizar estas tareas, tanto como empleados especializados, 
 entrenados e instruidos para realizar inspecciones de gran calidad. El tipo de empleados 
 necesarios depende de cada producto, además de los estándares de calidad requeridos. 
 El sistema de visión humano, compuesto por los ojos y el cerebro, tiene grandes 
 capacidades, algunas de las cuales no pueden ser igualadas aún por las máquinas. Además de 
 la capacidad para ver, se suman capacidades cognitivas que pueden ser útiles para las 
 inspecciones, tales como la intuición, la aplicación de conocimientos previos y la fácil 
 adaptabilidad a distintas condiciones de trabajo. 
 Por otro lado, la capacidad de procesamiento del cerebro es también destacable, ya que 
 cuenta con más de 10 10 células neuronales, algunas de las cuales tienen más de 10.000 
 8 
 contactos (o sinapsis) con otras neuronas [5]. Estas neuronas conforman un sistema de 
 procesamiento de una naturaleza concurrente, capaz de procesar imágenes en instantes. 
 Sin embargo, a pesar de sus grandes capacidades, el sistema de visión humano no es 
 infalible. Diversas pruebas tales como ilusiones ópticas demuestran que hay ocasiones en las 
 que la visión del hombre no detecta claramente las propiedades de los objetos observados. 
 Algunas de las más conocidas son la ilusión Checker Shadow de Edward H. Adelson [6] (Figura 
 1), donde dos cuadrados A y B sobre un tablero pueden ser percibidos como de colores 
 distintos aunque en realidad tienen la misma tonalidad de gris; la ilusión Ebbinghaus de 
 Hermann Ebbinghaus (Figura 2), en la que distintos círculos de igual tamaño pueden ser 
 percibidos como de si fueran de tamaños distintos dependiendo de los objetos que los rodean; 
 y la ilusión café wall de Richard Gregory [7] (Figura 3), en la cual líneas divisorias paralelas 
 parecen inclinadas una con otra. Estas ilusiones ópticas dejan en evidencia que la visión del 
 humano en ciertas situaciones tiene problemas en la detección de colores, dimensiones y 
 ángulos u orientaciones. 
 Figura 1. Ilusión óptica Checker Shadow . Extraída de [8]. 
 Figura 2. Ilusión óptica Ebbinghaus . Extraída de [9]. 
 9 
 Figura 3. Ilusión óptica café walls . Extraída de [10]. 
 El sistema de visión humana también tiene desventajas en tareas de inspección. Estas 
 tareas a menudo son monótonas, laboriosas, fatigantes, subjetivas, carentes de buena 
 reproducibilidad. Además, el proceso es difícil de documentar en detalle, muy lento en la 
 mayoría de los casos y de gran costo económico. 
 También hay que tener en cuenta que las inspecciones visuales suelen suceder en 
 ambientes de producción hostiles, generalmente dentro de fábricas. Esto conlleva a que las 
 personas encargadas de estas tareas se tengan que exponer a peligrosas condiciones de 
 trabajo, tales como: 
 ■ Exposición a temperaturas perjudiciales para la salud. 
 ■ Exposición a ruidos intensos que pueden dañar el oído. 
 ■ Exposición a radiación. 
 ■ Exposición a sustancias tóxicas. 
 ■ Peligros físicos al estar cerca de máquinas en movimiento. 
 Además, al incluir al sujeto humano, se corre el riesgo de contaminación del ambiente de 
 producción, lo que es vital para la fabricación de productos como por ejemplo circuitos 
 integrados, displays y dispositivos de almacenamiento [11] o productos farmacéuticos [12]. 
 Por estas razones, junto con las otrasgrandes ventajas que ofrecen los sistemas 
 automatizados por computadora, es que se desarrollaron y adoptaron soluciones de Machine 
 Vision en los procesos de manufactura a pesar de que el sistema visual humano es excepcional 
 para muchas tareas. Sin embargo, se vuelve a destacar que la visión humana impulsada por el 
 sistema cognitivo todavía hoy tiene capacidades que no se pueden igualar por las 
 10 
 computadoras. Sobre esto último, se están realizando grandes avances tecnológicos en cuanto 
 al desarrollo de algoritmos para simular el aprendizaje y toma de decisiones humanos como 
 una manera de acercarse a estas capacidades, utilizando métodos de Machine Learning . 
 2.2 Machine Vision 
 A partir de la década de 1960 comenzaron las primeras investigaciones acerca del uso 
 de computadoras para la automatización de tareas industriales con procesamiento de 
 imágenes, pero no fue hasta la década siguiente que se lograrían gran cantidad de 
 implementaciones exitosas. Esta área de investigación fue llamada Machine Vision , y fue 
 rápidamente cobrando importancia en compañías líderes en la fabricación, lo que ayudó 
 también a la incubación y desarrollo de tecnologías de Machine Vision [13]. 
 En la actualidad, Machine Vision es una de las tecnologías clave en la fabricación por la 
 creciente demanda de documentación de calidad y trazabilidad de productos. Es necesario que 
 sistemas ingenieriles como máquinas o líneas de producción ejecuten inspecciones de calidad 
 para remover productos defectuosos de la producción o controlen a otras máquinas para 
 realizarlo [14], o para que se realicen acciones específicas sobre productos que lo requieran 
 (es decir, no necesariamente es para desechar productos con fallas). 
 Algunas de las tareas comunes a resolver con sistemas de Machine Vision son: 
 ■ Identificación de objetos para discernir diferentes los diferentes tipos de objetos, por 
 ejemplo, para controlar el flujo del material o decidir qué inspecciones realizar. Esto 
 puede estar basado en símbolos especiales de identificación, como cadenas de 
 caracteres o códigos de barra, o en características específicas de los mismos objetos, 
 como su forma. 
 ■ Detección de posición es utilizada, por ejemplo, para controlar robots que ensamblan 
 los componentes de un producto en sus posiciones correctas, como una máquina que 
 monta los componentes electrónicos en un circuito impreso (PCB). La detección de 
 posición puede hacerse considerando 2 o 3 dimensiones, dependiendo de los 
 requerimientos de la aplicación. 
 ■ Chequeo de completitud que es realizado típicamente luego de que cierta etapa de 
 montaje de un producto ha sido completada, por ejemplo, luego de que los 
 componentes electrónicos han sido situados, para así verificar que el producto se montó 
 correctamente, es decir, que los componentes correctos están en el lugar adecuado. 
 11 
 ■ Inspección de forma y dimensión, la cual es utilizada para chequear los atributos 
 geométricos de un producto y así asegurar que estos se encuentran dentro de los 
 límites preestablecidos. Esto puede ser realizado durante el proceso de producción, 
 pero también luego de que el producto ha sido usado durante algún tiempo, para 
 asegurar que aún cumple con los requerimientos a pesar del uso y desgaste. 
 ■ Inspección de superficie es utilizada para chequear la superficie de un producto 
 terminado, buscando imperfecciones tales como rayaduras, marcas, manchas. 
 2.2.1 Sistemas embebidos en Machine Vision 
 Si bien las soluciones de Machine Vision se podrían categorizar de varias maneras 
 teniendo en cuenta distintos criterios, en el presente trabajo se hace la distinción entre 
 soluciones de computación genéricas y soluciones embebidas. Ambas categorías tienen sus 
 cualidades, ventajas, desventajas, formas de desarrollo particulares y, dependiendo de los 
 requerimientos de la aplicación, un tipo de solución puede ser más adecuado que otro. 
 Las soluciones de computación genéricas son soluciones en las que se utilizan 
 computadoras de propósito general para su implementación. Son computadoras cuyo 
 funcionamiento en general está basado en software, y son usadas para realizar tareas de 
 distinta índole. Su flexibilidad en cuanto a las aplicaciones permite que sean adecuadas para 
 Machine Vision . Un sistema de Machine Vision de este tipo se puede conformar con un 
 dispositivo de captura de imágenes conectado a la computadora de propósito general, donde 
 con un software se procesan las imágenes obtenidas, se logran las mediciones buscadas y a 
 partir de ello se accionan los actuadores para que trabajen sobre los productos. En la Figura 4 
 se representa gráficamente un sistema de estas características, donde las imágenes de los 
 productos son captadas por una cámara, procesadas por software en la computadora que, de 
 ser necesario, puede accionar un brazo robótico para apartar los dispositivos defectuosos. 
 12 
 Figura 4. Representación gráfica de un sistema de Machine Vision con una computadora de uso general. 
 En contraposición, un sistema embebido es aquel diseñado para realizar una tarea 
 específica. Ejemplos de sistemas embebidos son los que controlan hornos microondas, 
 receptores GPS, dispositivos de telecomunicaciones, electrónica de aeronaves y equipamiento 
 médico. Estos sistemas pueden estar basados en software ejecutado por un procesador, pero 
 no siempre es necesario, ya que esto puede ser reemplazado por un circuito integrado que 
 realice las mismas funciones en hardware. Sin embargo, la combinación de procesador y 
 software típicamente ofrece más flexibilidad que un diseño en hardware [15]. 
 Muchas aplicaciones deben cumplir con restricciones de tiempo real. Si el 
 procesamiento no se completa dentro de una ventana de tiempo determinada puede resultar en 
 una seria pérdida de la calidad provista por el sistema [16]. Debido a esto, en ocasiones se 
 prefieren los sistemas embebidos ya que por definición no poseen programas adicionales 
 corriendo en el sistema que puedan interferir con la disponibilidad de la aplicación (aunque si 
 bien no son tan comunes, también existen sistemas operativos de tiempo real, o RTOS , para 
 computadoras de propósito general que buscan solucionar esta problemática [17]). De esta 
 manera, como el sistema embebido se centra en realizar una tarea determinada, se puede 
 optimizar en cuanto a tiempo de operación. 
 Así como el tiempo de operación, los sistemas embebidos también posibilitan la 
 reducción de sus dimensiones físicas (al haber plataformas de tamaños reducidos), peso, 
 consumo de energía, robustez en ambientes hostiles y costo. 
 13 
 2.2.2 Plataformas de Procesamiento para Sistemas Embebidos en 
 Machine Vision 
 Existen diversas tecnologías para conformar sistemas embebidos de Machine Vision , 
 algunas de las cuales son: 
 ■ Microcontroladores: son circuitos integrados programables. Incluyen CPU, memorias y 
 el manejo de periféricos en un solo chip. En general, su uso se orienta a tareas de 
 control que no requieran gran poder de cálculo. Un ejemplo de microcontroladores el 
 ATmega328P, presente en las placas de desarrollo Arduino Uno (Figura 5) 
 ■ DSPs ( Digital Signal Processors ): por sus siglas en inglés, procesadores de señales 
 digitales. Su forma de operación se basa en el procesamiento de señales como si 
 fueran secuencias de números. Son aplicables a problemas como procesamiento de 
 audio, compresión de información, telecomunicaciones. Ejemplos de DSPs son los de la 
 familia TMS320, fabricados por Texas Instruments. 
 ■ ASICs ( Application Specific Integrated Circuits ): por sus siglas en inglés, circuitos 
 integrados hechos a medida de la aplicación. Al tener la lógica implementada en 
 hardware puro, son sumamente eficientes en rendimiento, consumo de energía y 
 ocupación de área. Como desventajas, tienen costos de desarrollo y producción muy 
 elevados, siendo rentable cuando se fabrican al menos 50000 unidades para ser 
 vendidos en productos de ambientes comerciales [18]. 
 ■ FPGAs: son dispositivos de hardware reprogramable a medida de la aplicación. Se 
 asemejan a los ASICs en cuanto a que la lógica de la solución se implementa en 
 hardware, sin embargo su desarrollo es mucho más sencillo, y es más rentable para la 
 producción de pocas unidades. En contraste, son menos eficientes que los ASICs. 
 14 
 Figura 5. Arduino Uno, placa de desarrollo basada en el microcontrolador ATmega328P. Extraída de [19]. 
 2.2.3 SoC FPGAs 
 System on a Chip es un concepto que se aplica a circuitos integrados que contienen 
 todos o la mayoría de los componentes de una computadora en un mismo chip. De esta 
 manera y contrastando con las computadoras de uso estándar, los SoC suelen incluir CPU, 
 memoria principal, puertos de entrada/salida y memoria secundaria. Otros más avanzados 
 pueden incluir GPUs integrados, módulos WiFi, más de un CPU, co-procesadores, entre otros 
 componentes. 
 Que se integren todos estos componentes en un chip implica varias ventajas, pero 
 principalmente se reduce el consumo energético necesario, se mejora la performance general 
 (ya que se reduce la distancia de un componente a otro), el área total que ocupa disminuye y el 
 costo de producción es menor a comparación de la fabricación de cada módulo por separado. 
 Como principales desventajas se tiene que el desarrollo de los mismos es más complejo, el 
 costo de producción en pocas unidades puede no ser rentable, y se elimina la opción de 
 reemplazar un componente defectuoso (ya que con un SoC habría que cambiar el chip 
 completo, en lugar del componente específico). Pero estas cualidades los hacen adecuados 
 para aplicaciones de sistemas embebidos, teléfonos móviles y aplicaciones de Internet of 
 Things . 
 En particular, los SoC FPGAs son sistemas que integran FPGA (a lo que se le llama 
 lógica programable o PL) y un CPU (que conforma el sistema de procesamiento o PS) en un 
 mismo chip, pudiendo así tener en una placa de desarrollo una arquitectura similar a la que se 
 muestra en la Figura 6. Estos sistemas surgen como evolución de los otros tipos de placas con 
 15 
 FPGAs y CPUs, que en general siguen una arquitectura similar a la que se muestra en la 
 Figura 7. 
 Figura 6. Arquitectura de los sistemas SoC FPGA. 
 Figura 7. Arquitectura de los primeros sistemas con FPGA y CPU. 
 Debido a sus ventajas, las placas que integran SoC FPGAs han ganado gran 
 popularidad entre los desarrolladores de sistemas embebidos. Esto ha llevado a los principales 
 fabricantes de FPGAs a incluir en su catálogo opciones SoC FPGA, abriendo así un gran 
 abanico de posibilidades para diferentes tipos de aplicaciones. 
 En las siguientes subsecciones se explican en detalle los principales componentes de 
 los SoC FPGAs: la lógica programable y el sistema de procesamiento. 
 16 
 2.2.4 Lógica Programable (PL) 
 Las FPGAs ( Field Programmable Gate Arrays ) son circuitos integrados cuya principal 
 característica es que su lógica puede ser reconfigurada para una aplicación particular. La lógica 
 puede ser programada (y reprogramada) para proveer soluciones sobre hardware que se 
 adecuen a los problemas propuestos, razón por la que a este componente se lo llama “lógica 
 programable” o PL por sus siglas en inglés. Las soluciones en lógica programable tienen ciertas 
 ventajas con respecto a las soluciones en software. 
 Al realizar programas en software, estos son compilados (o interpretados) y llevados a 
 instrucciones para ser ejecutadas secuencialmente por el CPU de la computadora. La PL, por 
 el contrario, representa la funcionalidad como un circuito, donde el circuito puede ser 
 reprogramado para cumplir los requisitos de una aplicación. La principal distinción es que la 
 funcionalidad es implementada como un sistema paralelo, más que secuencial [20]. Este 
 paralelismo se logra al plasmar la solución como un diseño de hardware específico para esta 
 aplicación (a diferencia del CPU, que se puede pensar como un hardware multipropósito), lo 
 que les brinda un gran rendimiento y los hace adecuados para la implementación de sistemas 
 embebidos. Además del paralelismo, con esta tecnología es sencillo segmentar en etapas el 
 procesamiento, logrando una segmentación (o pipeline) en el procesamiento para un mayor 
 rendimiento en la aplicación. 
 En cuanto a los problemas específicos de procesamiento de imágenes, esto es de gran 
 conveniencia, ya que muchas de las operaciones comunes de procesado de imágenes se 
 pueden paralelizar o segmentar. Un ejemplo es un algoritmo que requiera que dos operaciones 
 distintas se le realicen la misma imagen, para sumar luego los resultados, como se ilustra en la 
 Figura 8. Como estas operaciones son independientes una de otra, se pueden realizar al 
 mismo tiempo en hardware, aprovechando el paralelismo que ofrece a fin de conseguir un 
 mayor rendimiento. Otro ejemplo es un algoritmo compuesto por una serie de operaciones 
 secuenciales, cada una conformando una etapa, como se muestra en la Figura 9. Mientras la 
 información de una imagen está en una etapa, otra puede estar siendo procesada en la 
 siguiente, conformando un diseño segmentado (o paralelización temporal). 
 17 
 Figura 8. Algoritmo con operaciones que se pueden realizar en paralelo. 
 Figura 9. Algoritmo compuesto por etapas secuenciales. 
 Sin embargo, estas ventajas frente al software conllevan un precio. Comparado con un 
 microprocesador, estos dispositivos son varios grados de magnitud más rápidos y eficientes en 
 consumo, pero el tiempo de desarrollo es mayor [21]. 
 Por sus grandes prestaciones en cuanto a rendimiento se refiere, hoy en día esta 
 tecnología es muy común para aplicaciones de procesamiento de señales, aeroespaciales, 
 automotrices, procesamiento de imágenes, prototipado de ASICs, redes neuronales, y muchas 
 otras. Entre los principales fabricantes de FPGAs se encuentran Xilinx, Intel, Microsemi y 
 Lattice. 
 Como una descripción básica de las FPGAs, es importante mencionar que se compone 
 de muchos bloques lógicos configurables, llamados CLBs por sus siglas en inglés. Cada CLB a 
 su vez estácompuesto por Flip-Flops, Look-Up Tables. Cada instancia de las CLBs está 
 conectada con otras por interconexiones programables, llamadas PIs. Además, también 
 contienen bloques de entrada/salida llamados IOBs (también configurables), que sirven para 
 conectar el chip con el sistema exterior. En la Figura 10 se observa un esquema de los 
 18 
 componentes de la FPGA nombrados. De esta manera, la configuración o programación de 
 FPGAs consiste en darle valores a los CLBs, configurar las interconexiones entre estos bloques 
 lógicos y establecer las rutas de entrada y salida de con los IOBs. 
 Figura 10. Esquema de los componentes internos de una FPGA. 
 Con el avance de la tecnología, estos dispositivos comenzaron a incluir bloques 
 hardware internos disponibles para su utilización, como Block RAMs, buffers de clock globales, 
 recursos aritméticos especializados, buffers tri-estado, y son particulares a cada chip. Los 
 componentes internos específicos de los CLBs, PIs y IOBs varían con respecto a cada 
 fabricante y familia de chips. 
 2.2.5 Sistema de Procesamiento (PS) 
 El sistema de procesamiento, o PS por sus siglas en inglés, de un SoC FPGA está 
 formado principalmente por un CPU que permite ejecutar instrucciones de software. Esto le 
 provee al dispositivo de cierta flexibilidad, de la cual carecen los FPGA por sí solos. 
 Comúnmente este CPU permite ejecutar tanto aplicaciones individuales sin soporte ( bare 
 19 
 metal ) como correr sistemas operativos para el manejo de las aplicaciones requeridas, siendo 
 estos a menudo de bajo consumo de recursos (como, por ejemplo, PetaLinux). 
 El desarrollo de programas y algoritmos a ejecutar sobre ellos es más sencillo y rápido 
 que para la lógica programable, debido en parte a que no se tienen tantas restricciones de 
 diseño: el programa puede tener un manejo de memoria dinámico, permite con facilidad la 
 implementación de funciones recursivas, manejo de punteros a datos y funciones, fácil manejo 
 de conversiones de tipos; estas soluciones de software se vuelven mucho más complejas a la 
 hora de querer implementarlas o simularlas en hardware. 
 Sin embargo, en cuanto a tiempo de procesamiento, las soluciones en lógica 
 programable tienen una performance mucho mayor. El paralelismo y posibilidad de 
 segmentación hace que ciertos ciertos tipos de problemas sea conveniente resolverlos en 
 hardware. Este es el caso de los problemas de Machine Vision , que debido a su naturaleza en 
 general se obtiene mayor rendimiento que si se procesan por software. Para este tipo de 
 aplicaciones, a menudo se prefiere que en el PS se ejecuten programas de control, mientras 
 que en la PL se ejecutan los algoritmos de computación intensiva orientados al procesamiento 
 de imágenes. Estos programas de control pueden ser utilizados para configurar parámetros del 
 algoritmo, modificar resoluciones de video, configurar el sensor de obtención de imágenes, etc. 
 Por otro lado, debido al tipo de aplicaciones que se corren en el PS y la posibilidad de 
 usar bibliotecas ya desarrolladas de comunicación, se hace sencillo ejecutar programas para la 
 configuración de la PL en tiempo de ejecución a través de otros equipos, como por ejemplo 
 puede ser una PC. La comunicación entre el PS y el equipo externo se puede establecer por 
 una interfaz UART, Ethernet, WiFi o cualquier otra con la que cuente el SoC. Una vez 
 establecida la comunicación con el equipo, estas aplicaciones se suelen manejar de forma 
 similar a aplicaciones de consola. Además, si el problema lo requiere, se puede usar este 
 medio para informar al usuario sobre ciertas características de la imagen, como puede ser la 
 correcta identificación de un objeto. En la Figura 11 se ve un ejemplo de arquitectura de un 
 sistema de procesamiento de imágenes, donde las imágenes son procesadas en la PL y la 
 configuración de este procesamiento se realiza a través del PS y desde una PC. 
 20 
 Figura 11. Arquitectura de una aplicación de procesamiento de imágenes sobre un dispositivo SoC. 
 2.3 Diseño de lógica programable 
 2.3.1 Enfoque tradicional para diseño de lógica programable 
 Cuando se busca diseñar algoritmos soluciones en lógica programable, la forma típica 
 ofrecida por los fabricantes para realizarlo es partiendo de descripciones a nivel RTL 
 ( Register-transfer level o Nivel de Transferencia entre Registros), que son sucesivamente 
 transformadas bajando su nivel de abstracción hasta llegar al archivo binario de configuración 
 de la FPGA, como se muestra en la Figura 12. El proceso de traducción es similar a lo que 
 sucede en la compilación de software, cuando de un lenguaje de alto nivel se traduce a código 
 assembler, que finalmente se traduce a código máquina a ser ejecutado por un procesador. 
 21 
 Figura 12. Niveles de abstracción del diseño de FPGA. 
 El diseño a nivel RTL consiste en la codificación utilizando lenguajes de descripción de 
 hardware (que comúnmente son VHDL o Verilog) y el uso de módulos IP en un diagrama de 
 bloques, configurando adecuadamente cada módulo, definiendo sus interconexiones y las 
 señales de entrada y salida al sistema mediante archivos de configuración. Como ya se 
 mencionó, lo que se define es el diseño a nivel RTL, que involucra definir el hardware en 
 componentes como registros y lógica combinacional, señales de distintos anchos de bit y 
 transferencias de datos entre módulos [22]. 
 Una vez realizado el diseño a nivel RTL, se pasa a la etapa de síntesis, donde este 
 diseño es traducido a una representación a nivel de compuertas lógicas. Las herramientas de 
 desarrollo usualmente realizan la síntesis automáticamente con configuraciones por defecto, 
 pero se pueden definir ciertas directivas para controlar al sintetizador, como por ejemplo elegir 
 estrategias a utilizar, con lo que se puede indicar que se priorice el tiempo (que el diseño 
 sintetizado tarde menos en procesar las señales) o el área (que utilice menos recursos físicos 
 de la FPGA tales como block RAMs, LUTs y Flip-Flops). Una vez sintetizado el diseño, es 
 posible ver los reportes de síntesis que muestran datos como estimaciones de tiempo y el 
 esquema lógico generado. 
 La siguiente etapa es la de implementación, que consiste en, a partir del diseño a nivel 
 lógico obtenido luego de la síntesis, obtener el diseño a nivel de transistores ubicando los 
 recursos específicos del hardware seleccionado. En otras palabras, se obtiene el diseño final 
 de la configuración de la FPGA, donde se tiene en cuenta el chip seleccionado. La 
 implementación también la realizan automáticamente las herramientas, y tiene varios pasos 
 que incluyen optimizar el diseño lógico, optimizar el uso energético, ubicar el diseño en la 
 FPGA y rutear los componentes. Al igual que en la síntesis, se pueden especificar directivas 
 22 
 para guiar la implementación y lograr un resultado optimizado en tiempo, recursos, balanceado, 
 entre otras configuraciones. Una vez implementado el diseño, se pueden ver los reportes detiempos, clocks utilizados, energía, ruido del sistema, entre otra información relevante. 
 2.3.2 Síntesis de Alto Nivel 
 La Síntesis de Alto Nivel o High-Level Synthesis ( HLS ) es una tecnología para el diseño 
 de circuitos de hardware que se basa la programación con un nivel mayor de abstracción que al 
 nivel de los anteriormente nombrados VHDL y Verilog. Hace décadas que los sistemas 
 embebidos se hacen más y más complejos, razón por la que la síntesis de alto nivel se está 
 volviendo una necesidad para la industria. No solo la abstracción permite facilitar ciertas tareas 
 de la programación, sino que hace a la programación de circuitos de hardware un área más 
 accesible para desarrolladores no tan cercanos a la electrónica, como los ingenieros de 
 software o sistemas. 
 El gran potencial de la síntesis de alto nivel radica en dejar los detalles de 
 implementación a los algoritmos de diseño y herramientas, incluyendo la habilidad de 
 determinar precisamente los tiempos de operaciones, transferencias de datos y 
 almacenamiento [23]. De esta manera, la tarea del desarrollador se enfoca en el desarrollo del 
 algoritmo en sí, de forma más similar a cuando se codifica en software. Esto hace que el 
 desarrollo pueda ser más rápido y sencillo. 
 En cuanto a los lenguajes en los que se puede codificar para realizar síntesis de alto 
 nivel, depende de cada herramienta que realice la síntesis. La mayoría de compiladores de 
 HLS , tanto comerciales como académicos, se suelen basar en programas de entrada escritos 
 en lenguaje C o derivados. Por ejemplo, la herramienta Intel High Level Synthesis Compiler, de 
 Intel, acepta programas en C y C++; la herramienta Vivado HLS, de Xilinx, acepta programas 
 en C, C++ y SystemC. Como salida de los compiladores, en general es en VHDL o Verilog. 
 Además, las herramientas de HLS actuales ofrecen características que permiten hacer 
 un análisis del diseño obtenido con herramientas de profiling y estimaciones (brindan nociones 
 de tiempos, latencias, y recursos que utilizará el diseño), mejoran el rendimiento en tiempo o la 
 utilización de recursos de hardware, e incluso simulan de manera rápida el resultado por 
 software. Esto último es de gran importancia, ya que brinda la posibilidad de no requerir (en 
 una primera instancia) de configuración del hardware para ejecutar pruebas funcionales. 
 23 
 A continuación se presenta, se toma un ejemplo basado en el del manual de usuario de 
 Vivado High-Level Synthesis [24] que expone el funcionamiento de la Síntesis de Alto Nivel. El 
 mismo está escrito en C/C++, y se usará como ejemplo de entrada al compilador HLS. En la 
 Figura 13 se ve gráficamente el resultado de la compilación de éste código: 
 int calculo(int x, int a, int b, int c) { 
 int resultado; 
 resultado = x * a + b + c; 
 return resultado; 
 } 
 Figura 13. Representación gráfica de la ejecución en tiempo del programa compilado con Síntesis de Alto Nivel. 
 Como se puede apreciar, el compilador se encarga de inferir los elementos necesarios para 
 sintetizar la función dada, es decir, un multiplicador y dos sumadores, además del registro 
 (marcado en color gris en la Figura 13) para guardar el valor temporal de x * a + b . Este registro 
 se genera automáticamente, ya que al hacer la planificación de tiempos de las operaciones el 
 sintetizador detecta que no se podrán hacer las tres operaciones en un único ciclo de reloj. 
 El anterior fue un ejemplo simple, pero el algoritmo puede llegar a ser de gran 
 complejidad, según el hardware objetivo lo permita. Para otros casos, donde el tiempo de 
 24 
 procesamiento puede ser una restricción importante del problema o el área de lógica 
 programable es una limitante, a menudo se deben aplicar optimizaciones configuradas 
 manualmente para lograr el funcionamiento deseado. Estas optimizaciones pueden implicar 
 paralelizar el procesamiento, segmentar el circuito, o especificar cómo se debe sintetizar una 
 determinada estructura (por ejemplo, asignando un arreglo se utilice un tipo de recurso 
 particular). Las herramientas de HLS ofrecen maneras de indicar estas optimizaciones, como 
 puede ser el uso de directivas en código. 
 Sin embargo, a pesar de sus virtudes, la síntesis de alto nivel está generalmente sujeta 
 a distintas restricciones que se suelen deber al hecho de que el algoritmo se plasma en 
 hardware, y una vez este es programado no se puede reprogramar en tiempo de ejecución. Es 
 decir, una vez alojados los recursos, configuradas las rutas en el circuito, estos no se pueden 
 cambiar. El diseño en hardware es estático en el tiempo de ejecución. Esto lleva a que ciertas 
 prácticas y soluciones de software no sean posibles en la síntesis de alto nivel o se vean 
 limitadas, y por ende se deba seguir otras prácticas o estilos de código. Entre las prácticas de 
 software que se ven limitadas se encuentran: 
 ■ El uso de memoria dinámica : la asignación y liberación de memoria en tiempo de 
 ejecución ( malloc() , free() en lenguaje C) no es posible debido a que cada estructura 
 debe tener un espacio definido en el hardware, por lo que no se puede asignar y liberar 
 memoria durante la ejecución. 
 ■ Uso de arreglos semi-dinámicos : arreglos cuyos límites no están definidos hasta el 
 tiempo de ejecución no son soportados. Como reemplazo se suelen usar arreglos de 
 límites fijos, definiendo el tamaño de estos arreglos con un valor suficientemente grande 
 para almacenar elementos según el problema. 
 ■ Uso de punteros : en general no están permitidos los punteros a funciones, ya que se 
 vuelve complejo el manejo de la ruta de datos en el tiempo de ejecución. Otros tipos de 
 punteros pueden ser soportados, dependiendo del compilador. 
 ■ Definición de funciones recursivas : debido a la posibilidad de recursión infinita. Esto 
 entra en conflicto con el cálculo de tiempos y la planificación. 
 2.4 Síntesis de Alto Nivel para procesamiento de imágenes 
 Los algoritmos de procesamiento de imágenes se ven beneficiados por las 
 características de los diseños en hardware. El paralelismo inherente de la lógica programable 
 25 
 es de gran valor para estos algoritmos, ya que en muchos casos varias operaciones se pueden 
 hacer en el mismo momento. Además, la segmentación del diseño puede permitir procesar 
 varias imágenes, cada una en una etapa diferente del pipeline de procesamiento, mejorando 
 así la performance . 
 Por otro lado, las bibliotecas de procesamiento de imágenes de software de la 
 actualidad se encuentran bastante desarrolladas y difundidas, entre las que se destacan Image 
 Processing Toolbox , para utilizar en MATLAB, y OpenCV , una librería de código abierto para 
 utilizar en lenguajes C++, Python, Java o MATLAB que es ampliamente utilizada por la cantidad 
 de algoritmos que ofrece. Sin embargo, pese a la gran adopción de estas tecnologías por parte 
 de la comunidad y la cantidad de documentación existente para guiar su uso, las soluciones en 
 software pueden no adaptarse a problemas con restriccionesde tiempo real. Esto se debe a 
 que a grandes resoluciones, las operaciones de procesamiento de imágenes pueden ser 
 costosas, y la característica secuencial del software (en contraposición a las paralelas del 
 hardware) hacen que se genere cierto overhead en el procesamiento. 
 Viendo la oportunidad de llevar las ventajas del software hacia el hardware, los 
 fabricantes de FPGAs proveen soluciones aplicables en sus compiladores de HLS, entre los 
 cuales se destaca xfOpenCV, de la compañía Xilinx. xfOpenCV es una biblioteca de C++ de 
 operaciones sobre imágenes basada en OpenCV que contiene un subconjunto de las funciones 
 definidas en OpenCV. Estas funciones están listas para sintetizar, y están totalmente 
 optimizadas para su uso en hardware. Con la nomenclatura de las funciones en muchos casos 
 idéntica a su contraparte para software, la migración de algoritmos de OpenCV hacia 
 xfOpenCV es en general sencilla, y al estar las dos disponibles para C++ hace que sea posible 
 comparar resultados en el mismo programa de simulación. 
 Con soluciones como estas, más la adición de optimizaciones de performance a los 
 diseños en HLS hacen que el procesado de imágenes en hardware sea mucho más accesible 
 que en la programación a nivel RTL. A su vez el tiempo de procesamiento es mucho menor que 
 las soluciones en software, lo que hace a HLS una buena alternativa para la implementación de 
 soluciones a problemas de tiempo real. 
 26 
 3. Ambiente y metodología de desarrollo 
 En este capítulo se describen los materiales utilizados para el desarrollo, así como la 
 metodología que se sigue. En la Sección 3.1 se muestra el ambiente controlado en el que se 
 toman imágenes de prueba, y se incluye una descripción del aspecto de las baldosas 
 existentes. En la Sección 3.2 se definen los componentes de hardware disponibles para 
 implementar las soluciones. En la Sección 3.3 se describen los distintos softwares que se 
 utilizan en el trabajo. En la Sección 3.4 se explica de forma simplificada la plataforma de 
 procesamiento de video propuesta para utilizar de base en el desarrollo (plataforma que se 
 describe con mayor profundidad en el Apéndice: Plataforma ZYNQ), que se separa en la parte 
 de la Lógica Programable y el programa que se ejecuta en el procesador. Por último, en la 
 Sección 3.5 se explica la metodología a seguir para desarrollar cada algoritmo. 
 3.1 Ambiente de desarrollo 
 La captura de imágenes se realiza utilizando un ambiente controlado construido a 
 medida, el cual simula un ambiente real de producción. El mismo es llamado CEMVA 1.0 
 ( Controlled Environment for Machine Vision Applications 1.0 ), y en particular simula el paso de 
 una manufactura por una cinta transportadora. En la Figura 14 se puede observar este 
 ambiente, junto con una baldosa. En la Figura 15 se muestra una representación del exterior 
 del CEMVA , y en la Figura 16 el interior. 
 27 
 Figura 14. Fotografía del CEMVA 1.0 . 
 El CEMVA consiste en una caja grande construida en madera con una plataforma móvil 
 en uno de sus costados (indicada en la Figura 15). Esta plataforma se usa para colocar la 
 manufactura, y es la que, mediante la ejecución de un movimiento manual, simula el 
 movimiento de la cinta transportadora. Además, la plataforma está recubierta de un material 
 que simula la textura de una cinta transportadora. Por otro lado, en la cara superior del CEMVA 
 existe un orificio por el que se puede introducir la cámara del equipo elegido para realizar la 
 detección con la aplicación de Machine Vision (marcado en la Figura 15). 
 28 
 Figura 15. Representación del exterior del CEMVA 1.0 . 
 En cuanto a su interior, el CEMVA posee sus paredes pintadas de color negro mate, 
 para de esta manera evitar reflejos de luz indeseados. Por el lateral, para evitar la entrada de 
 luz por el orificio de la plataforma, tiene una goma negra adherida cortada en forma de flecos 
 (como se marca en la Figura 15), de esta manera no interfiere con el movimiento de la 
 plataforma. 
 En cuanto a la iluminación, en el interior en la tapa superior se colocan luces de 
 distintos tipos, con intensidad regulable. Se ha probado utilizar una tira de luces LED RGB, las 
 cuales se pueden configurar en distintos colores, que puede ser útil para algunas aplicaciones. 
 Sin embargo, la potencia lumínica de estas luces puede no ser suficiente. Como otra 
 alternativa, se instalan dos hileras de LED blancas de mayor potencia, que se colocan 
 paralelas, una a cada lado del orificio para la cámara, de la manera en las que se puede ver en 
 la Figura 16. 
 29 
 Figura 16. Representación del interior del CEMVA 1.0 . 
 El CEMVA se utiliza con baldosas cerámicas reales, provistas por la empresa Loimar, 
 cuya fábrica se ubica en la ciudad de Tandil. Las mismas fueron cedidas por la empresa para el 
 desarrollo de esta aplicación, y estas originalmente conforman un conjunto de 33 baldosas, 
 cada una con un defecto de fabricación particular. Los defectos de las baldosas son los 
 siguientes: 
 ■ Blobs (por la izquierda de la Figura 17): son gotas que se encuentran en la superficie de 
 la baldosa, que se ven más oscuras a comparación del color original de la baldosa. 
 ■ Defectos de bordes (por la derecha de la Figura 17): roturas en las aristas. 
 ■ Defectos de esquinas (por la izquierda de la Figura 18): esquinas rotas en la baldosa. 
 ■ Cracks (por la derecha de la Figura 18): son grietas, fisuras o cortes en la superficie de 
 la baldosa. 
 ■ Defectos de dimensión: son baldosas más grandes o más pequeñas de lo normal. 
 ■ Pinholes (por la izquierda de la Figura 19): agujeros o cráteres pequeños en la 
 superficie, que se ven más oscuras sobre la superficie. 
 ■ Splashes (por la derecha de la Figura 19): salpicaduras, conjuntos de manchas 
 agrupadas siguiendo un patrón. Se diferencian de los blobs en el sentido en que las 
 gotas de los blobs suelen presentarse de forma individual. 
 30 
 Figura 17. Detalle de defectos en baldosas. A la izquierda, defectos de gotas. A la derecha, rotura en un borde. 
 Figura 18. Detalle de defectos en baldosas. A la izquierda, defectos de cracks. A la derecha, rotura en una esquina. 
 31 
 Figura 19. Detalle de defectos en baldosas. A la izquierda, defecto de pinhole . A la derecha, defecto de salpicadura. 
 De este conjunto de baldosas, se seleccionan algunas para realizar las pruebas. De ellas se 
 toman fotografías con la plataforma de hardware, conformando así un dataset de imágenes de 
 baldosas para realizar las pruebas sobre ellas. Debido a que algunas de estas fotografías 
 tienen una iluminación no uniforme sobre su superficie, fueron ajustadas utilizando software de 
 manipulación de imágenes, obteniendo imágenes como las que se muestran en la Figura 20. 
 Figura 20. Imágenes de baldosas tomadas en el CEMVA . Por la izquierda, una baldosa con un pinhole . Por la 
 derecha, una baldosa con una rotura de borde. 
 32 
 3.2 Componentes hardware 
 Como sensor para la captura de imágenes, se utiliza la cámara Pcam 5C de Digilent 
 [25]. La misma cuentacon un sensor de imagen OV5640 con una montura de lente M12, que 
 permite acoplar e intercambiar una óptica de acuerdo a las necesidades específicas del 
 problema, y una interfaz de conexión MIPI CSI-2. Es un módulo de imagen pensado para su 
 uso con placas de desarrollo FPGA. El sensor de imagen es de 5 megapíxeles, obteniendo 
 imágenes a color. Además, este sensor incluye varias funciones internas para mejorar y/o 
 preprocesar los datos obtenidos, como por ejemplo ajuste de saturación, nitidez y color. La 
 información puede ser transmitida con suficiente ancho de banda como para lograr una señal 
 de video de 720p a 60 cuadros por segundo o 1080p a 30 cuadros por segundo. En la Figura 
 21 se puede ver la cámara Pcam 5C. 
 Figura 21. Pcam 5C de Digilent. Extraída de [25]. 
 Para el procesamiento de imágenes se utiliza el kit de desarrollo Zybo Z7-20 de Digilent 
 [26]. Cuenta con 6 puertos Pmod para posibilitar la conexión de sensores y actuadores, puertos 
 de entrada y salida de audio, un puerto HDMI para recepción y otro para transmisión de video, 
 conector MIPI CSI-2 (que es de utilidad para conectar con la Pcam 5C), entre otras 
 características. Además, la placa posee un System on Chip FPGA XC7Z020-1CLG400C de 
 33 
 Xilinx, perteneciente a la familia Zynq, el cual posee tanto una parte de lógica programable 
 (FPGA) como un procesador ARM Cortex-A9 de dos núcleos (PS). Debido a su amplia 
 conectividad en cuanto a video (puertos HDMI, MIPI CSI-2) y la inclusión del SoC FPGA, esta 
 placa es adecuada para soluciones embebidas de Computer Vision de alta complejidad, siendo 
 a su vez una alternativa relativamente económica. En la Figura 22 se puede ver una imagen de 
 la Zybo Z7-20. 
 Figura 22. Zybo Z7-20 de Digilent. Extraída de [26]. 
 Para la visualización de las imágenes procesadas se han utilizado tanto monitores de 
 computadora con resolución de 1080p, como una pantalla táctil LCD de 7 pulgadas con 
 resolución 1024x600 de la compañía SpotPear Electronics. En la Figura 23 se puede ver a la 
 Zybo Z7-20, la Pcam 5C y la pantalla LCD de SpotPear Electronics en conjunto. 
 34 
 Figura 23. Zybo Z7-20 con la cámara Pcam 5C y el display LCD conectados. 
 3.3 Software para desarrollo 
 En cuanto a las herramientas de software para el desarrollo, se utilizaron principalmente 
 las que están contenidas en Vivado Design Suite, de la compañía Xilinx. Estas son: 
 ■ Vivado 2018.2: Vivado® es un software desarrollado por Xilinx para analizar, sintetizar, 
 testear, implementar diseños de hardware a ser llevados a FPGAs. Se basa en la 
 utilización de módulos IP (unidades de lógica reusable con propiedad intelectual) y 
 diseños propios en algún lenguaje de descripción de hardware (ya sea VHDL o Verilog). 
 ■ Xilinx SDK 2018.2: Xilinx SDK es un Entorno de Desarrollo Integrado (IDE, por sus 
 siglas en inglés) para el desarrollo sobre los diseños de hardware de Vivado. En este 
 caso particular, esta herramienta sirve para desarrollar el software que se ejecutará en 
 la Zybo Z7-20. Además, se usa para subir el programa codificado y permite 
 comunicarse con la placa en tiempo de ejecución. 
 ■ Vivado HLS 2019.1: Vivado HLS ( High-Level Synthesis ) es un entorno incluido dentro 
 del paquete de software de Xilinx que permite acelerar el desarrollo de módulos IP 
 mediante la posibilidad de definir los algoritmos requeridos en lenguajes de 
 programación de más alto nivel que los lenguajes de descripción de hardware como 
 VHDL o Verilog. De esta manera, algoritmos se pueden desarrollar en C o C++ de forma 
 relativamente más ágil y probarse fácilmente. No sólo se facilita la codificación, sino que 
 35 
 es posible optimizar en utilización de recursos y/o tiempo mediante el uso de directivas 
 predefinidas. Además, Xilinx provee soporte para incluir interfaces comunes, tales como 
 AXI4, AXI4-Stream, FIFO. También provee la biblioteca xfOpenCV (llamada en 
 versiones anteriores como HLS Video Library), que contiene gran cantidad de 
 operaciones de procesado de imágenes similares a las de OpenCV, las cuales además 
 están optimizadas y son sintetizables en FPGA. Estas últimas en el presente caso serán 
 de especial utilidad para el procesado de las imágenes capturadas. 
 Por otro lado, en algunas de las etapas del desarrollo se busca encontrar nuevas 
 soluciones o algoritmos para resolver ciertas problemáticas con respecto al procesamiento de 
 imágenes. En estos casos se decide cambiar de herramienta, ya que el ambiente de desarrollo 
 de Vivado se enfoca directamente en la implementación para SoC FPGAs. Se busca entonces 
 otra forma más rápida y ágil para hacer pruebas y cálculos, con soporte para el procesamiento 
 de imágenes. 
 El otro ambiente de desarrollo seleccionado es el que ofrece Google en Google 
 Colaboratory, que está construido sobre Jupyter y permite ejecutar código en lenguaje Python. 
 Este código es escrito directamente desde un navegador web para ser procesado en los 
 servidores de Google, característica que permite procesar rápidamente un gran volumen de 
 datos. 
 Como ventajas de usar Python, dentro del ambiente de Colab, se tienen que: 
 ■ Es un lenguaje interpretado: se pueden ejecutar instrucciones según se necesite, sin 
 tener que recompilar y ejecutar todo el código cada vez. 
 ■ Es muy rápido para realizar grandes cálculos matemáticos. 
 ■ Es un lenguaje no tipado: las variables no requieren definir el tipo en su declaración, por 
 lo que no están ligadas a un único tipo de dato. Esto es útil, por ejemplo, para realizar 
 cálculos matemáticos sin preocupaciones sobre la precisión del tipo de dato, ya que el 
 intérprete lo ajusta automáticamente. 
 ■ Tiene soporte de bibliotecas de visualización de datos: esto facilita graficar funciones y 
 resultados matemáticos. La biblioteca más utilizada para estos fines es matplotlib [27]. 
 ■ Tiene soporte para OpenCV: al igual que para C y C++, Python tiene su versión de la 
 biblioteca OpenCV, que es fácil de asimilar debido a que ya se utiliza en Vivado HLS. 
 36 
 3.4 Plataforma de desarrollo 
 Una parte fundamental de este proyecto para la detección de fallas en baldosas es la 
 implementación de una plataforma en FPGA de procesamiento de video con la que se puedan 
 realizar pruebas rápidamente, evitando tener que lidiar con el diseño de hardware. Además, se 
 especifica también el programa que correrá en el procesador de la placa, con el que se pueden 
 configurar ciertos parámetros de video en tiempo de ejecución. Es decir, define el diseño 
 completo en SoC de la plataforma base de procesamiento de video que sirve para el desarrollo 
 sencillo de los algoritmos (así como para otros proyectos). 
 Profundizando un poco más en la definición de la plataforma, obtiene las señales crudas 
 de imágenes desde la Pcam 5C a través de la interfaz MIPI CSI-2 de la Zybo Z7-20, para 
 convertirlas a un espacio de color RGB estándar, para luego procesar la imagen según un 
 determinado algoritmo de detección de fallas, y finalmente realizar el tratamiento de la señalresultante para ser transferida a través de un HDMI y visualizada. Además de esto, permite 
 modificar los parámetros de resolución y cuadros por segundo, en tiempo de ejecución, 
 mediante la comunicación serial por el puerto USB de la Zybo. 
 A continuación se explica de forma general la plataforma propuesta para estas tareas. 
 En el Apéndice: Plataforma ZYNQ se describe la misma de forma exhaustiva. 
 3.4.1 Diagrama de bloques simplificado 
 Un esquema simplificado del diagrama de bloques se puede ver en la Figura 24. 
 37 
 Figura 24. Diagrama de bloques simplificado de la plataforma de procesamiento de imágenes, junto con las 
 comunicaciones con la Pcam 5C y una PC. 
 En la parte de lógica programable (PL), las señales de la imagen ingresan a la placa a 
 través de la interfaz MIPI, se convierten a un AXI-Stream, se pasan de un formato de Bayer 
 Pattern a un espacio de color RGB, se le realiza una corrección gamma, se almacenan en 
 memoria (con el bloque AXI VDMA) para el control de los parámetros del video, y finalmente se 
 pasan de AXI-Stream a una señal transmisible por el puerto de salida HDMI de la Zybo Z7-20. 
 Además, en el diseño se incluye también al Sistema de Procesamiento (PS) Zynq, el 
 procesador propio del chip, el cual se encargará de configurar ciertos parámetros de video en 
 tiempo de ejecución. Algunos de estos parámetros, como se ve en la Figura 24, son la 
 resolución y cuadros por segundo del video, y el factor de corrección gamma que se le aplica a 
 la imagen. Cabe destacar que estas configuraciones se podrán establecer al comunicarse con 
 la placa mediante UART, con una PC conectada al puerto USB de la placa por ejemplo. 
 Por último, esta configuración de diagrama de bloques permite incorporar los módulos 
 IP correspondientes a los algoritmos de detección de fallas. Esto se podrá hacer de forma 
 sencilla ubicando el o los módulos IP preferentemente entre el módulo de corrección gamma y 
 38 
 el AXI VDMA, y definiendo sus interfaces de entrada salida como AXI-Streams de imágenes en 
 espacio de color RGB, como se muestra en la Figura 25. Este módulo IP agregado puede estar 
 conectado al AXI Interconnect para que tenga comunicación con el microprocesador Zynq y 
 poder configurar sus parámetro en tiempo de ejecución. 
 Figura 25. Lugar de adición de módulo IP de algoritmo de detección de fallas en el pipeline de procesamiento de 
 imágenes. 
 3.4.2 Programación de PS 
 Para configurar los parámetros de video en tiempo de ejecución de la aplicación, se 
 codifica un programa en el IDE Xilinx SDK. A modo de menú de configuración, en el programa 
 se puede seleccionar la resolución y cuadros por segundo (720p a 60 cuadros por segundo, 
 1080p a 15 o 30 cuadros por segundo), factor gamma (1, 0,83, 0,66, 0,55, 0,45), y otras 
 configuraciones del sensor de la cámara para definir cómo se leen los valores lumínicos. 
 Esto se realiza cargando los archivos de drivers de HDMI y del sensor OV5640 que 
 contienen las direcciones de memoria para establecer los valores por AXI4-Lite, que es la 
 forma de comunicación entre el microprocesador y la FPGA. 
 Una vez compilado, desde Xilinx SDK se puede configurar la lógica programable, a 
 través de bitstream y programar el procesador para iniciar su funcionamiento en la Zybo Z7-20. 
 Además, utilizando una terminal de comunicación serial, como TeraTerm, es posible configurar 
 los parámetros anteriormente nombrados. 
 3.5 Metodología de desarrollo 
 Con Vivado HLS se busca desarrollar módulos IP de procesamiento de imágenes a 
 partir de una codificación en un lenguaje de alto nivel como C++. Para ello se parte de la 
 descripción de algoritmos del trabajo de Echeverz y Melograno [3], para finalizar en la 
 39 
https://app.diagrams.net/?page-id=dWZIHltL9wqawjVgOjfx&scale=auto#G1d0bD2yyyMFxUuPxod4oU4z1TSnlerzDu
 implementación de módulos IP que lleven a cabo esos algoritmos. Cabe aclarar que el proceso 
 que se describe a continuación de desarrollo de módulos IP con Vivado HLS se repetirá con 
 cada uno de los algoritmos de procesado de video. En la Figura 26 se puede ver un esquema 
 con las etapas del desarrollo de cada módulo IP. 
 Figura 26. Etapas de desarrollo de cada módulo IP de procesado de imágenes. 
 Dado que se parte de la descripción de los algoritmos de un trabajo anterior, lo primero 
 que se hace es analizar ese algoritmo y separarlo en partes. Se busca clasificar cada parte del 
 algoritmo en las etapas de procesamiento de imágenes clásicas, es decir, preprocesamiento, 
 segmentación, medición de características y clasificación (se omite la etapa de adquisición de 
 imágenes, ya que esto se realizará en la plataforma de procesado de video propuesta). Si bien 
 en algunas secciones del trabajo se nombran las funciones de MATLAB específicas que se 
 usan, en otras se describe solo qué se realiza (y no cómo), por lo que es importante identificar 
 esto. De esta manera se logra un entendimiento a nivel abstracto del algoritmo, lo que facilita la 
 migración a otro conjunto de funciones de biblioteca o a la implementación de funciones 
 personalizadas según los alcances de Vivado HLS y el hardware disponible. 
 En segundo lugar, a partir de esa descripción abstracta se hace una primera 
 implementación del algoritmo en C++, utilizando funciones propias de OpenCV y estructuras de 
 datos de uso común en C++ (vectores, listas, arreglos). Esto se realiza en Vivado HLS 2019.1, 
 aunque no se hace uso de las herramientas de síntesis y testing para desarrollo de módulos IP, 
 40 
 sino que se usa su compilador de C++ (GCC). En esta etapa, cada parte del algoritmo es 
 ajustada para su correcto funcionamiento sobre el dataset de imágenes utilizado en el trabajo 
 de Echeverz y Melograno [3]. 
 Una vez logrados los resultados buscados con OpenCV, se pasa a la tercera etapa, que 
 consiste en desarrollar la solución en HLS para ser exportada como un módulo IP. En esta 
 etapa sí se hace uso de las herramientas de Vivado HLS para desarrollo de hardware. Es 
 necesario migrar las funciones de OpenCV a su equivalente en xfOpenCV, y en caso de que no 
 exista implementación de alguna función específica, se debe realizar una solución 
 personalizada. El correcto funcionamiento de cada algoritmo es validado con el dataset de 
 imágenes tomadas en el CEMVA , mediante la simulación por software que provee Vivado HLS. 
 Por último, se hace la síntesis, análisis de resultados de tiempos y ocupación de 
 recursos del módulo IP sintetizado, y la co-simulación del diseño para verificar la equivalencias 
 entre los resultados obtenidos de las ejecuciones en software y las simulaciones del hardware 
 desarrollado. 
 Las últimas dos etapas hacen uso de Vivado HLS. El flujo de diseño propuesto por 
 Xilinx consta de las siguientes partes: 
 ■ Codificación en C/C++ : se codifica la función que se desea implementar como módulo 
 IP. 
 ■ Simulación en C/C++ : tras la codificación en lenguaje de alto nivel, Vivado HLS permite 
 hacer una simulación basada únicamente en software del módulo IP a partir deun 
 testbench definido por el usuario. Para ello se pueden hacer uso de todas las bibliotecas 
 y estructuras de datos disponibles en estos lenguajes sin ningún problema, ya que se la 
 compilación se hace con el compilador clásico GCC. La herramienta de simulación es 
 muy útil ya que posibilita hacer una ejecución y testeo rápido de la implementación. 
 Como punto débil se tiene que no se pueden verificar las restricciones propias del 
 sintetizador de HLS (lo que hace que se pierda tiempo en las siguientes etapas de 
 desarrollo). 
 ■ Síntesis : se sintetiza el código escrito en alto nivel. En esta etapa se traduce el código 
 en C/C++ hacia una implementación en RTL, teniendo en cuenta las restricciones para 
 diseñar en hardware (no se pueden usar bibliotecas no sintetizables como OpenCV 
 estándar, ni se pueden usar punteros o estructuras de datos dinámicas o 
 semi-dinámicas, entre otras). Además, esta etapa utiliza las directivas para la 
 41 
 aceleración u optimización de recursos, sumado a las optimizaciones automáticas que 
 realiza la herramienta. 
 ■ Análisis de resultados de síntesis : Vivado HLS provee herramientas para visualizado, 
 análisis de performance estimada y uso de recursos estimado (a estos últimos se les 
 dice estimados ya que el resultado posterior en hardware puede ser distinto al supuesto 
 en la síntesis). También contiene un visualizador de registros y operaciones del diseño 
 RTL obtenido en la síntesis. Por último, también posibilita la comparación de soluciones. 
 ■ Co-simulación : realiza la simulación en C/C++ del testbench (la misma que la anterior) 
 en conjunto con la simulación del diseño a nivel RTL obtenido de la síntesis para 
 verificar que ambos diseños retornan el mismo resultado. Es una herramienta muy útil, 
 ya que permite verificar que el resultado por software se condice con el resultado del 
 diseño RTL. Como desventaja, se tiene que en general toma mucho tiempo para 
 realizarse, pudiendo tardar horas para un módulo IP medianamente grande. Esta etapa 
 es opcional para la obtención del módulo IP exportado. 
 ■ Exportación del módulo IP: tras una síntesis exitosa, se puede exportar el módulo IP 
 para ser utilizado por otra herramienta de diseño de hardware (como por ejemplo 
 Vivado). 
 Este flujo de diseño se muestra gráficamente en la Figura 27. 
 Figura 27. Flujo de diseño en Vivado HLS. 
 42 
 4. Corrección de distorsión de lente 
 La distorsión de barril ( barrel distortion ) es un defecto ocasionado por las lentes que 
 hace que las líneas rectas se doblen hacia afuera y es más notable a lo largo de los bordes. La 
 distorsión puede ser corregida a través del software, por ejemplo utilizando la función 
 cv::remap() provista en OpenCV. Sin embargo, la implementación contenida dentro de 
 xfOpenCV presenta una gran demanda de recursos, impidiendo su utilización en el dispositivo 
 seleccionado. En este capítulo se explica el proceso de desarrollo de una aproximación de la 
 función Remap adecuada para la implementación en Lógica Programable, que es necesaria 
 para el correcto funcionamiento de los algoritmos de inspección de defectos. En la Sección 4.1 
 se hace una introducción a qué es la distorsión radial en imágenes, por qué es un problema y 
 cómo caracterizarla. En la Sección 4.2 se explica cómo fue la primera implementación con la 
 biblioteca xfOpenCV y los problemas que conlleva. En la Sección 4.3 se aborda una solución 
 basada en aproximaciones de funciones matemáticas, explicando el desarrollo del modelo 
 matemático y los resultados de las pruebas. En la Sección 4.4 se explica la segunda nueva 
 solución propuesta basada en vectores de valores precalculados, cómo se calcula y los 
 resultados de las pruebas. Por último, en la Sección 4.5 se exponen los resultados de la 
 implementación en HLS. 
 4.1 Distorsión radial 
 La distorsión radial es un tipo de aberración óptica (una desviación de la luz que genera 
 efectos muchas veces no deseados) provocada por los lentes de las cámaras. En particular, la 
 distorsión radial es un tipo de distorsión geométrica, que cambia la forma en la que se ven los 
 objetos. Se le llama radial porque esa es la manera en la que se presenta: en forma radial a 
 partir de un determinado punto de la imagen resultante. Los efectos más comunes producidos 
 por la distorsión radial son el efecto barril ( barrel distortion ) y efecto almohada ( pincushion 
 effect ). En la Figura 28 se puede ver cada uno de estos tipos de distorsión sobre una 
 cuadrícula, en comparación a la cuadrícula original. 
 43 
 Figura 28. Representaciones gráficas de los tipos de distorsión radial. 
 La cámara Pcam 5C, elegida para conformar la plataforma de procesado de imágenes, 
 introduce distorsión radial del tipo barrel effect , que genera problemas para los algoritmos, en 
 especial para el algoritmo de detección de defectos en bordes, esquinas y dimensión (Sección 
 5.1) que se basa en las características geométricas de las baldosas para decidir si tienen o no 
 defectos. En los algoritmos se asume que la baldosa se acerca a su forma real, es decir, 
 cuadrada. Sin embargo, al tomar imágenes con la plataforma, la forma de una baldosa se 
 observa como la silueta blanca en la Figura 29, mientras que la forma deseada se muestra en 
 color verde en la misma imagen. Lo que sobresale del cuadrado coloreado es un efecto no 
 deseado, provocado por la distorsión radial introducida por el lente. 
 44 
 Figura 29. Silueta de baldosa de imagen obtenida con la plataforma. En verde se marca la silueta deseada (sin 
 distorsión radial). 
 Para solucionar este problema, el primer paso es caracterizar la distorsión. Con el 
 objetivo de modelar la distorsión, el modelo más utilizado es el de Brown-Conrady [30], que se 
 basa en el cálculo de varios coeficientes, algunos correspondientes a la distorsión radial y otros 
 a la distorsión tangencial. Estos coeficientes son propios de cada lente. Las ecuaciones del 
 modelo son las que se muestran en las Ecuaciones 1. 
 𝑥 
 𝑢 
= 𝑥 
 𝑑 
+ ( 𝑥 
 𝑑 
− 𝑥 
 𝑐 
)( 𝐾 
 1 
 𝑟 2 + 𝐾 
 2 
 𝑟 4 +...)
+ ( 𝑃 
 1 
( 𝑟 2 + 2 ( 𝑥 
 𝑑 
− 𝑥 
 𝑐 
) 2 ) + 2 𝑃 
 2 
( 𝑥 
 𝑑 
− 𝑥 
 𝑐 
)( 𝑦 
 𝑑 
− 𝑦 
 𝑐 
)) ( 1 + 𝑃 
 3 
 𝑟 2 + 𝑃 
 4 
 𝑟 4 + ...)
 𝑦 
 𝑢 
= 𝑦 
 𝑑 
+ ( 𝑦 
 𝑑 
− 𝑦 
 𝑐 
)( 𝐾 
 1 
 𝑟 2 + 𝐾 
 2 
 𝑟 4 +...)
+ ( 2 𝑃 
 1 
( 𝑥 
 𝑑 
− 𝑥 
 𝑐 
)( 𝑦 
 𝑑 
− 𝑦 
 𝑐 
) + 𝑃 
 2 
( 𝑟 2 + 2 ( 𝑦 
 𝑑 
− 𝑦 
 𝑐 
) 2 )) ( 1 + 𝑃 
 3 
 𝑟 2 + 𝑃 
 4 
 𝑟 4 + ...)
 siendo: 
 45 
 un punto en la imagen distorsionada, ( 𝑥 
 𝑑 
, 𝑦 
 𝑑 
)
 el punto en la imagen no distorsionada, ( 𝑥 
 𝑢 
, 𝑦 
 𝑢 
)
 el punto del centro de distorsión, ( 𝑥 
 𝑐 
, 𝑦 
 𝑐 
)
 el n-ésimo coeficiente de distorsión radial, 𝐾 
 𝑛 
 el n-ésimo coeficiente de distorsión tangencial, 𝑃 
 𝑛 
 , y 𝑟 = ( 𝑥 
 𝑑 
− 𝑥 
 𝑐 
) 2 + ( 𝑦 
 𝑑 
− 𝑦 
 𝑐 
) 2 
 ... = una serie infinita. 
 Ecuaciones 1. Modelo de distorsión radial de Brown-Conrady. 
 De estos