1.- INTRODUCCIÓN
El procesado digital de imágenes es un campo con múltiples aplicaciones en sectores de la industria, la robótica, la salud, el transporte y la seguridad [1-5]. Muchas de estas aplicaciones emplean cámaras inteligentes, las cuales se encargan del procesado inicial de las imágenes para reducir la carga computacional y el flujo de comunicación con un centro de control.
Una cámara o sensor inteligente consiste en la trasformación de una cámara convencional a la que se le añade un sistema de procesado y control el cual realiza, como principales tareas, la detección y estimación de movimiento, la localización y reconocimiento de patrones, y la extracción de características en las imágenes capturadas. A pesar de la complejidad de los algoritmos, muchas de estas tareas deben realizarse en tiempo real. Sin embargo, las estrictas restricciones en términos de consumo de potencia, dimensiones y peso, no hacen viable su implementación mediante sistemas de visión portables con arquitecturas basadas en computadoras personales convencionales [1, 2, 6-8].
Los sistemas embebidos cumplen con las restricciones anteriormente descritas, especialmente los basados en arreglos de compuertas programables (FPGA: Field-Programmable Gates Array) y los novedosos SoC FPGA (System-on-Chip Field-Programmable Gates Array) son particularmente interesantes por la capacidad para explotar el paralelismo del algoritmo sobre el hardware, la posibilidad de combinar componentes hardware y software para la implementación del mismo, la flexibilidad para interconectar diferentes dispositivos internos y externos, y la facilidad de reconfiguración para adaptar la arquitectura a una amplia variedad de aplicaciones [1, 4, 6-9].
La detección de objetos en movimiento en una secuencia de imágenes es, en muchos casos, el primer paso para la extracción de información relevante en aplicaciones de visión computacional [10-12]. Esta operación permite reducir el área de interés del fotograma, concentrando el flujo de procesado exhaustivo sobre los píxeles en movimiento.
Las diferentes técnicas para la detección de movimiento se distinguen por los métodos para identificar las diferencias entre dos fotogramas. Estos métodos abarcan, desde técnicas tan sencillas como la sustracción matemática entre un fotograma y un modelo, hasta otras más complejas, como la obtención de los gradientes del desplazamiento mediante métodos diferenciales [13]. Para seleccionar un método de detección de movimiento se deben analizar distintos factores, tales como la ubicación de los elementos de captura y las características del entorno de muestreo. También se deben considerar los requisitos de la aplicación, como la velocidad de procesado necesaria y el consumo de recursos computacionales.
Este artículo describe el diseño e implementación en FPGA de los módulos para detección de movimiento basados en el detector de movimiento elemental (EMD: Elementary Motion Detection) de Reichardt y Hassenstein (R&H) que han sido incorporados a la biblioteca de procesado de imágenes y vídeos XIL XSGImgLib para incrementar su funcionalidad. En la sección 2 se introducen las diferentes técnicas de detección de movimiento, así como sus principales ventajas y desventajas. La sección 3 describe la implementación del detector de movimiento elemental y sus principales variantes, mientras que en la sección 4 se ilustra la implementación de un sistema de procesado espaciotemporal de detección de movimiento para una cámara inteligente basada en un FPGA, a partir del empleo de varios bloques de la biblioteca XIL XSGImgLib. Por último, se presentan las conclusiones de este trabajo.
2.- DETECCIÓN DE MOVIMIENTO
Las técnicas de detección de movimiento se basan en encontrar las diferencias entre dos fotogramas de una escena, obtenidos en diferentes instantes de tiempo con un mismo sensor óptico, con el objetivo de clasificar las regiones de las imágenes en frente o fondo [10]. En el frente se asocian las regiones de píxeles que sufren cambios, indicando la ocurrencia de movimiento, mientras que el resto de los píxeles, los cuales no presentan modificaciones relevantes, se clasifican como fondo [13].
Existen tres propuestas convencionales para detectar movimiento, la sustracción de fondo, el análisis del flujo óptico y la diferenciación temporal [3, 13-17].
2.1.- TÉCNICAS DE SUSTRACCIÓN DE FONDO
Las técnicas basadas en sustracción de fondo construyen un modelo de la escena estática para luego compararlo con cada fotograma de una secuencia, discriminando las regiones de interés frente a aquellas que permanecen estáticas o presentan movimientos repetitivos (como el de las hojas de los árboles o las masas de agua) [13]. Estas técnicas son simples en general, encontrándose la mayor dificultad en la búsqueda de un modelo adecuado, estático o adaptativo, que permita darle robustez al algoritmo [11].
La implementación de algoritmos básicos de substracción de fondo sobre dispositivos de hardware reconfigurable ha sido la más difundida por su simplicidad en los métodos de detección, que permiten operación en tiempo real empleando una reducida cantidad de los recursos lógicos disponibles [1, 3, 4, 11, 14, 16, 17].
El principal inconveniente de estas técnicas es su sensibilidad a los cambios en la escena, ya sea por las variaciones de iluminación o por las condiciones ambientales. Además, no son factibles para su uso en aplicaciones con cámaras móviles ya que la actualización del modelo complica el sistema de procesado. Por último, la información que brindan estas técnicas está orientada solamente a la presencia de diferencias entre el frente y el fondo, no permitiendo conocer ni la velocidad, ni la orientación del desplazamiento del objeto que atraviesa la escena muestreada [4].
2.2.- TÉCNICAS DE ANÁLISIS DEL FLUJO ÓPTICO
El movimiento bidimensional en una secuencia de fotogramas y su proyección en el plano de la imagen, respecto a un sensor visual, es la base de la estimación de flujo óptico. El análisis de las secuencias ordenadas en el tiempo posibilita la estimación del movimiento en la imagen obteniendo la velocidad instantánea o el desplazamiento discreto de los objetos. Este análisis permite conocer la dirección y magnitud del desplazamiento de los píxeles entre dos fotogramas [17-20].
Los métodos principales para el cálculo del flujo óptico utilizan técnicas diferenciales y técnicas de coincidencia. Ambos métodos requieren la realización de cálculos intensivos y amplios recursos computacionales, dificultando su implementación para operar en tiempo real sobre plataformas embebidas secuenciales.
2.3.- TÉCNICAS DE DIFERENCIACIÓN TEMPORAL
Las técnicas de diferenciación temporal emplean fotogramas de la escena en instantes anteriores como modelos de comparación, destacándose entre las más populares la diferencia entre fotogramas adyacentes y el análisis de la frecuencia espaciotemporal.
La primera técnica consiste en detectar variaciones entre la imagen de estudio y otras capturadas con anterioridad mediante la sustracción de las mismas. Teniendo en cuenta que los cambios entre fotogramas consecutivos en una secuencia de vídeo no presentan diferencias significativas, la selección del intervalo de tiempo entre ambas imágenes influye en la variación de los valores de la intensidad de los píxeles para detectar el movimiento en la escena [15]. Para eliminar este inconveniente se emplea un valor de umbral que ajusta la sensibilidad de la técnica, considerando el movimiento para valores del resultado de la sustracción que sobrepasen el umbral [1, 15]. Las ventajas de esta técnica con respecto a la sustracción de fondo son la posibilidad de ser empleada en cámaras en movimiento y su menor sensibilidad a los cambios de las condiciones ambientales de la escena. Sin embargo, la información que se obtiene a partir de su aplicación se limita a la ocurrencia de cambios en la escena [15].
Por otra parte, el método basado en el análisis de la frecuencia espaciotemporal utiliza un conjunto de filtros que son activados selectivamente en función del movimiento presente en la imagen [21]. El detector de movimiento elemental de Reichardt y Hassenstein, propuesto en 1956, es un ejemplo conocido de estos filtros, el cual emplea la correlación de las señales de dos fotorreceptores para obtener una respuesta sensible al desplazamiento. En aplicaciones de procesado de imágenes se utilizan conjuntos de filtros EMD alineados en la dirección del movimiento que se desea detectar, precisando de la sintonización y ajuste de los parámetros del modelo para la detección de distintos movimientos y velocidades. [21-23].
El detector de movimiento elemental de Reichardt y Hassenstein emplea un reducido número de operaciones matemáticas simples, facilitando su implementación. Este es el caso del desarrollo propuesto en [24] para la detección de movimiento elemental mediante un detector basado en el análisis de la frecuencia espaciotemporal. El sistema, implementado sobre un FPGA Stratix EP1S4 de Altera (actualmente Intel Corp.), procesa fotogramas en tiempo real con resoluciones de 256×256 píxeles. Otra implementación de estas técnicas se presenta en [25] para estudiar modelos bioinspirados de detección de movimiento y desarrollar un sistema inteligente autónomo para diversas aplicaciones. El algoritmo de detección de movimiento se desarrolla sobre un FPGA Stratix II S60 de Altera para una resolución de 127×100 píxeles, ocupando el 13% de los recursos lógicos y el 39% de la memoria interna del dispositivo.
Las técnicas de análisis de la frecuencia espaciotemporal permiten una estimación de la orientación y la velocidad de los objetos que atraviesan la escena a través de los filtros de movimientos, siendo factible su implementación en aplicaciones con movimientos de la cámara [24, 26].
3.- DETECCIÓN DE MOVIMIENTO ELEMENTAL
La biblioteca de procesado XIL XSGImgLib proporciona un conjunto de módulos hardware reconfigurables para facilitar la rápida creación de prototipos de sistemas de procesado de imágenes y vídeos sobre un FPGA desde un ambiente de desarrollo amigable e idóneo para la comprobación de los algoritmos. Esta biblioteca ha incrementado progresivamente sus funcionalidades mediante la incorporación de nuevos elementos de procesado, como módulos de cálculo de histogramas [27] o bloques de convolución genéricos que usan el procedimiento de reconfiguración automática descrito en [6] para facilitar la utilización de la biblioteca y optimizar el consumo de recursos del FPGA [28].
Los nuevos bloques para detección de movimiento que han sido incorporados en la biblioteca XIL XSGImgLib se basan en el detector de movimiento elemental mostrado en la Figura 1. Este dispositivo realiza el análisis de la frecuencia espaciotemporal de dos imágenes mediante el cálculo de la correlación entre los píxeles (
Esta correlación es máxima (Figura 2) si el tiempo que tarda una señal en moverse de un fotorreceptor a otro es igual al tiempo causado por la demora del filtro de primer orden. A velocidades de desplazamiento, frecuencias y dirección del movimiento diferentes a las parametrizadas en el modelo, la respuesta del detector se reduce [24].
La implementación del algoritmo de detección de movimiento elemental para dispositivos programables (Figura 3) recibe los flujos de píxeles de los fotogramas por las entradas
3.1- MODIFICACIONES AL DETECTOR DE MOVIMIENTO ELEMENTAL
La salida del detector de movimiento elemental puede verse afectada por las condiciones del entorno, como la iluminación y el ruido, precisando de modificaciones para mejorar su respuesta. Estas modificaciones añaden elementos de filtrado pasa alto (HP en la Figura 4) en diferentes etapas del detector de movimiento básico de Reichardt y Hassenstein, con el objetivo de filtrar las señales de entrada, suprimir las diferencias de iluminación constantes y aumentar la ganancia a la salida [25, 29, 30].
La modificación propuesta por Harris y O’Carroll (Figura 4a) añade un filtro pasa alto (HP) entre los fotorreceptores y el filtro pasa bajo, con el objetivo de filtrar las señales de entrada, suprimiendo las diferencias de iluminación constantes presentes en algunos entornos, que causan falsas detecciones u omisiones (Figura 5a) [29, 30]. Otra variación del modelo original es la planteada por Kirschfeld (Figura 4b), que añade el filtro pasa alto en las ramas interiores del modelo, presentando una mejor ganancia a la salida (
La implementación de los módulos de detección modificados es similar a la del módulo básico, añadiendo los filtros pasa alto. La implementación de estos filtros se realiza mediante el uso de filtros específicos de realce (Sharp), en unión con bloques almacenadores de líneas (Line Buffer) para el procesado de una ventana de píxeles contiguos.
La variación de Harris y O’Carroll (Figura 6), también disponible en la biblioteca XIL XSGImgLib, aplica los filtros pasa alto (Sharp) a ambos fotogramas, para luego continuar con la arquitectura del EMD básico. En cambio, la modificación de Kirschfeld (Figura 7) solo emplea un filtro de realce (Sharp) en la rama del fotograma actual, no presentándolo para el fotograma anterior. En esta última arquitectura se emplea un bloque de retardo configurado para una latencia (
4.- IMPLEMENTACIÓN DE UN SISTEMA DE DETECCIÓN DE MOVIMIENTO PARA CÁMARAS INTELIGENTES
La utilización de detectores de movimiento en cámaras inteligentes para aplicaciones de monitorización de tráfico, vigilancia o seguimiento facilita la identificación de regiones de píxeles que presentan un desplazamiento en la secuencia de imágenes para señalar y, si es necesario, segmentar la región en movimiento para entregársela a la siguiente etapa de procesado, la cual concentra el análisis sobre esta área en vez de emplear la imagen en su totalidad. Este mecanismo permite reducir el tiempo de procesado exhaustivo dedicado a la detección de características y la identificación de los objetos de interés en la secuencia.
El sistema de procesado espaciotemporal de la Figura 8 se emplea en la creación de un detector de movimiento elemental para una cámara inteligente en un punto de control de tráfico con límite de velocidad de circulación de los vehículos de 60 km/h. Las imágenes son capturadas por una cámara, almacenando varios fotogramas en memoria, de los cuales son extraídos tres para ser analizados por el sistema de procesado y señalar en el fotograma de salida la región en movimiento. El sistema ha sido implementado sobre una placa de desarrollo Atlys, con un FPGA Spartan-6 XC6SLX45 de Xilinx, a la cual se conecta una cámara estereoscópica del fabricante Digilent Inc. (VmodCAM - Stereo Camera Module) mediante un módulo de control, desde la cual se toma la secuencia de fotogramas de resolución 640×480 y se almacenan en memoria externa al FPGA disponible en la placa de desarrollo.
El sistema de control de fotogramas está integrado por un bloque de escritura en memoria (Módulo de Escritura1), el controlador de memoria externa del FPGA (MPMC) y tres módulos de lectura (Módulo de Lecturax) para entregar los tres fotogramas necesarios a la unidad de procesado hardware (Procesado HW). El resultado de las operaciones es enviado directamente al controlador de vídeo (Control de Vídeo) para su visualización. Para esto es preciso que la unidad de procesado presente una frecuencia de trabajo mayor o igual a la empleada por el sistema de visualización, garantizando que la frecuencia de refrescamiento del monitor no sea afectada.
La memoria externa almacena varios fotogramas de la secuencia de vídeo (Figura 9) en dependencia de la configuración del desplazamiento temporal del bloque de detección de movimiento (
La unidad de procesado (Figura 10) analiza los fotogramas en memoria
La unidad de procesado se compone de diez bloques disponibles en la biblioteca de procesado XIL XSGImgLib. Los módulos de conversión (XIL RGB2Gray) reciben, a través de los módulos de entrada, fotogramas en colores correspondientes a una trama de vídeo capturada por una cámara con resolución de 640×480 píxeles (Figura 11a y b), transformándolos a escala de grises (Figura 11c y d).
Los fotogramas t-2 y t-1 son ajustados a la región de interés (ROI: Region of Interest), eliminando un 15% de ambos laterales de los fotogramas (Figura 11e y f), zona por donde es menos probable ocurra el desplazamiento de un automóvil al pasar por el punto de control de tráfico. Los bloques de región de interés (XIL ROI) generan las nuevas señales de activación de la imagen (LVo1 y FVo1) que ajustan el procesado al 70% de la imagen.
El bloque de detección de movimiento (XIL EMD R&H) se basa en el diseño básico del detector de movimiento elemental planteado por Reichardt y Hassenstein, configurado para la dirección vertical, suprimiendo cualquier movimiento en la dirección horizontal. El bloque recibe los dos fotogramas a analizar (frmROI1 y frmROI2) y las nuevas señales de activación (LV y FV) desde los bloques de región de interés. Además, emplea las señales de sincronismo (hsync y vsync) generadas por el VTC, las cuales se incluyen, a partir de este bloque, al flujo de procesado. La salida del bloque de detección de movimiento (
La operación de cierre que se lleva a cabo en la siguiente etapa del sistema elimina los puntos aislados de la detección de movimiento (Figura 11h). En esta operación se emplea un bloque almacenador de líneas, para paralelizar los píxeles, y un operador morfológico avanzado (XIL Line Buffer & XIL Adv. MO).
El resultado de la operación de cierre es analizado por el bloque de análisis de coordenadas (XIL Coordinates Analisys) para obtener las coordenadas de los puntos superior izquierdo e inferior derecho que limitan la zona de la imagen en la que se detecta movimiento. Para incluir el dibujo de un rectángulo en la imagen, este bloque entrega las coordenadas de los puntos (coord), junto con el fotograma actual (frmt0), al bloque de segmentado de regiones (XIL Sketcher/Cropper). El resultado del sistema de procesado (pxlo) es, por último, enviado al controlador de vídeo para su visualización, en conjunto con las señales de sincronismo (synco). La imagen resultante (Figura 12) muestra un rectángulo que abarca el automóvil en movimiento.
El consumo de recursos de la unidad de procesado hardware, empleando un FPGA Spartan-6 LX45, se muestra en la Tabla 1. El consumo de recursos lógicos supone un 8,54% de los registros y un 21,64% de las tablas de búsquedas disponibles en el FPGA, siendo el módulo de detección de movimiento configurado para la orientación vertical el de mayor consumo, incluyendo dos multiplicadores dedicados (3,45 %). La unidad de procesado opera a una frecuencia de 57,60 MHz con un rendimiento de procesado normalizado de 17,35 ns/píxel, permitiendo el análisis de una imagen de alta definición (HD) con refrescamiento a 60 Hz. En este aspecto, la implementación propuesta es más eficiente que otras reportadas en la literatura empleando el mismo principio de detección de movimiento, como el desarrollado por Zhang et al. en [24] el cual alcanza un rendimiento de 43,59 ns/píxel (implementado sobre un FPGA Stratix EP1S4 para resoluciones de 256×256 píxeles a 450 fps) o el presentado por Köhler et al. en [25] con un rendimiento de 393,70 ns/píxel (implementado sobre un FPGA Stratix II S60 para resoluciones de 127×100 píxeles a 200 fps). En comparación con la implementación de otros algoritmos de detección de movimiento sobre FPGA reportados en la literatura consultada, la unidad de procesado hardware presenta un rendimiento ligeramente superior al sistema de diferenciación temporal presentado por Kau et al. en [15] con rendimiento de 18,38 ns/píxel (implementado sobre un FPGA Ciclone II 2C70 para resoluciones de 640×480 píxeles a 177,08 fps), mientras que es inferior al sistema de sustracción de fondo reportado por Kapude et al. en [3], con rendimientos de 4,91 ns/píxel y 9,52 ns/píxel (implementado sobre un FPGA Virtex-6 LX75T y un FPGA Spartan-6 LX75T para resoluciones de 256×256 píxeles a 3097 fps y 1602 fps respectivamente), y al sistema de estimación de flujo óptico obtenido por Allaoui et al. en [17], con rendimiento de 3,74 ns/píxel (desarrollado sobre un FPGA Virtex-6 LX75T para resoluciones de 640×480 píxeles a 870 fps).
Recursos (Spartan-6 LX45) | Detección de movimiento | ||
---|---|---|---|
Tipo | Disponibles | Ocupados | Por ciento |
4 569 | 8,54% | ||
5 904 | 21,64% | ||
2 | 3,45% |
El sistema completo de procesado espaciotemporal para detección de movimiento emplea el 15,06% de los registros y el 44,12% de las tablas de búsqueda de un FPGA Spartan-6 LX45 (Tabla 2). El 5,17% de los bloques de multiplicación (DSP48A) son utilizados en el cálculo de la dirección inicial donde se posicionan los módulos de escritura y lectura cuando los mismos son desplazados, mientras que los bloques de memoria de 16 bits implementan las estructuras de sincronismo necesarias para las interfaces con la memoria externa de la placa (MCB: Memory Controller Block).
5.- CONCLUSIONES
La detección de movimiento, como primera etapa de procesado en los sistemas de cámaras inteligentes, permite concentrar la ejecución del algoritmo en el área en movimiento, reduciendo el tiempo de procesado.
Los métodos de detección de movimiento analizados presentan ventajas y desventajas. Los métodos de substracción de fondo no son factibles para aplicaciones con cámaras en movimiento y no brindan información sobre la velocidad de cambio de los objetos y la dirección del movimiento. Los métodos de substracción de fotogramas adyacentes solucionan el primer inconveniente, manteniendo los restantes, mientras que el análisis del flujo óptico requiere sistemas de procesado muy complejos. Las técnicas de análisis frecuencial, como el detector de movimiento elemental descrito en este trabajo, presentan un adecuado compromiso entre la complejidad de la implementación sobre dispositivos embebidos y la información resultante del procesado.
El sistema de detección de movimiento desarrollado, que utiliza el detector de Reichardt y Hassenstein junto a otros bloques de procesado de imágenes disponibles en la biblioteca XIL XSGImgLib, permite el procesado de fotogramas en alta definición a 60 Hz. El consumo de recursos de la implementación del sistema ocupa 15,06% de los registros, un 44,12% de las tablas de búsquedas y un 8,62% de los multiplicadores dedicados, la mitad de estos empleados en el detector de movimiento, además del 29% de los bloques de memoria de un FPGA Spartan-6 LX45, lo cual permite la inclusión de otras funciones a la unidad de procesado.