Detección de señales de tráfico
ITS Juan Carlos Espinosa Ceniceros
jc.espinosa.ceniceros@gmail.com
FIME - UANL
Propósito
El propósito es la creación de un sistema para la detección y clasificación de señales de tráfico en tiempo real utilizando técnicas básicas de visión computacional.
Justificación
Actualmente existen múltiples investigaciones orientadas a la creación de un automóvil inteligente, principalmente en la autonomía del mismo. Así mismo, existen diversos medios que sirven de asistentes para los conductores que les ayudan a trazar sus recorridos, evitar accidentes, evitar embotellamientos y proporcionar su ubicación en tiempo real.
Sin embargo, no existen asistentes que le indiquen a un conductor las reglas que deben seguir al conducir por una calle, avenida o carretera.
Es por ello que se decidió implementar un sistema de detección de señales de tráfico que sirva como base para la creación de un asistente para el conductor. Los objetivos detrás de éste proyecto están orientados a la seguridad de los automovilistas y a convertir las tráfico de una ciudad en un tráfico inteligente, algunos de dichos objetivos son:
- Advertir al conductor sobre posibles riesgos de una forma anticipada para que pueda tomar decisiones.
- Automatizar el automóvil y darle la capacidad de tomar decisiones de acuerdo a las señales detectadas.
Un asistente de éste tipo se considera necesario ya que con ello se puede contribuir a:
- Reducir accidentes
- Reducir el tráfico y optimizar su flujo
- Que los conductores estén más atentos durante su viaje
- Fabricar automóviles más inteligentes y seguros
Diseño del software

Flujo de procesos del sistema
El sistema hace uso de técnicas sencillas de visión computacional para el preprocesamiento del video, la entrada de datos pueden ser de 3 tipos:
- Imágenes fijas
- Archivo de video
- Video stream desde una webcam
Lo que se hace primeramente en tomar uno a uno los frames del video y cada uno se le aplican los siguientes tratamientos:
- Color Segmentation: Se filtran las imágenes por su color, primero es necesario convertir la imagen de RGB a HSV, después se utilizan 3 máscaras para filtrar tres colores principales, cada máscara contiene los rangos HSV mínimos y máximos válidos para cada color:
- Rojo: Se utilizan 2 rangos, uno alto y uno bajo, después se combinan para obtener un solo espacio alto, los rangos HSV son: [0,90,90] y [10,255,255]
- Amarillo: Los rangos son [20,95,95] y [30,255,255]
- Azul: Los rangos son [105,80,80] y [130,255,255]
El paso anterior nos regresará el frame dividido en 3, uno por cada color filtrado. Éste es el paso más importante del sistema, filtrar correctamente los colores nos permitirá identificar rápidamente las señales ya que los rangos de las máscaras coinciden con los colores de las señales más comunes. Gracias a la modularidad del código es posible en éste paso agregar más máscaras para filtrar más colores o ajustar los rangos para que sean compatibles con señales de tráfico de otros lugares.
- ROI Extraction: Con el paso anterior se resaltan las áreas de acuerdo a los colores detectados. En éste paso se identifican los objetos de mayor tamaño en la imagen. Hay 2 pasos intermedios:
- Detección de contornos: Para detectar un objeto primero deben detectarse los contornos, OpenCV contiene las rutinas necesarias para analizar una imagen mediante diferentes algoritmos que al final nos regresan la lista de los contornos hallados. Los contornos se encuentran por cada grupo de pixeles que sean continuos.
- Relleno de formas: Una vez hallados los contornos se necesita rellenar las formas completamente para que la detección sea más precisa, además, es necesario rellenar las figuras para poder extraer solo aquellas que cumplen con una área predefinida, así evitamos extraer objetos muy pequeños o muy grandes lo que sirve como un segundo filtro.
Una vez que se hace la identificación, los contornos detectados se convierten en un Bounding Rectangle, dicho rectángulo nos permite encerrar todo el objeto de una sola vez.
La zona dentro del rectángulo se conoce como ROI (Region of interest).
- Feature detection: La detección de características funciona como una red neuronal básica. El algoritmo se encarga de extraer las características principales de una imagen. Las características se almacenan en forma de arreglos de numpy. Se recomienda pasar varias imágenes (de un mismo tipo de señal) por el algoritmo. Posteriormente las características se pasan a un algoritmo KNN (K-Nearest neighbors), un algoritmo para la detección de patrones. El set de características debe contener un solo tipo de señal, y entre más grande sea el set, mejores resultados se obtendrán. El algoritmo regresará entonces un patrón, un tipo de firma por cada señal. Ésto se hace para cada una de las señales que se desean clasificar.
- Después se hace lo mismo con cada una de las regiones de interés, se extraen sus características, pero éstas no se mandan al algoritmo de entrenamiento, sino que se éstas se comparan con la firma resultante, si suficientes puntos coinciden con los puntos de la firma, entonces la región es una señal que se puede clasificar.
La detección de características es un método lento, ya que se necesitan tener las firmas de cada tipo de señal.
El sistema contiene un programa que permite extraer almacenar las características en archivos de numpy (*.npy), los archivos se pueden cargar posteriormente para entrenar el algoritmo KNN y obtener la firma de cada señal.
El sistema prepara cada una de las firmas al iniciar y las almacena en memoria por lo que no es muy eficiente en ese aspecto, además, cada región de interés se compara con las firmas disponibles una a una lo que consume mucho tiempo de ejecución.
Opcionalmente se pueden aplicar filtros de suavizado a la imagen para reducir el ruido en la misma, con ello se puede tener una detección más limpia y confiable. Se recomiendan dos tipos de filtros, incluidos ya en el sistema:
- Filtro mediano
- Filtro Gaussiano
A continuación se puede ver un frame, el original y los demás postprocesados en cada uno de los pasos antes descritos:

Imagen original | 
Espacio HSV | 
Suavizado |

Objetos rojos | 
Objetos amarillos | 
Objetos azules |
Visualización de los diferentes tratamientos que reciben los frames

Regiones de interés

Extracción de las características principales de una imágen,
en éste caso, una señal de alto
Librerías Utilizadas
Las librerías necesarias para que el sistema funcione correctamente son:
- Python: como lenguaje principal
- OpenCV: Contiene todas las rutinas necesarias para la manipulación de imágenes. El diseño se centro en utilizar la librería cv2.py que es mucho más eficiente al manipular las imagene en forma de arreglos de numpy.
- Numpy: Para la manipulación de los arreglos de las imágenes
- PIL: Para la conversión de las imágenes desde OpenCV
- Image: La rutina Image.fromstring para convertir la imagen desde OpenCV a PIL.
- ImageTk: Para mostrar las imágenes desde PIL a TKInter.
- Tkinter: Para generar la interfaz principal
- sys: argv para leer los parámetros desde terminal.
- time: time para cronometrar el rendimiento del sistema.
Evaluación del desempeño
Para las pruebas se utilizó un equipo Acer 5742G-6426, las especificaciones técnicas de interés son:
- CPU Intel Core i3-370M
- RAM 4GB
- Tarjeta gráfica nVidia Geforce GT 520M 1GB
- Sistema operativo Ubuntu 12.04
- El frame rate máximo que proporciona la webcam integrada en equipo es es de 20 frames por segundo
- Fueron procesados entre 8 y 10 frames
- Es decir que se procesa ente el 45 y el 50% del video
- Lo esperado era un 10% (2 o 3 frames)
- Toma mucho tiempo comparar cada ROI con cada template
- Los templates se precargan en memoria
- Consumo de memoria entre 23 - 28 MB
- Buena actividad en el CPU
Se realizaron pruebas adicionales en un equipo alternativo, cuyas especificaciones son:
- CPU Intel Xeon 8 núcleos
- RAM 20GB
- Tarjeta gráfica nVidia Quadro
- Sistema operativo Windows XP 64 bits
- Se leyó un archivo de video y se obtenierons los siguientes resultados:
- El frame rate máximo que proporciona el archivo de video es es de 30 frames por segundo
- Fueron procesados los 30 frames
- Es decir que se procesa el 100% del video
Es de esperarse que el desempeño del video se vea afectado por características del equipo que se está utilizando, así como la resolución de los frames a procesar.
Aún existen problemas con el filtrado de los colores, las señales pueden encontrarse obstruidas o despintadas lo que evita que no se filtren correctamente los colores.
Trabajo a futuro
- Mejorar el template matching.
- Mejorar el tiempo de procesamiento
- Arreglar un bug con el manejo de los arreglos
- Implementar una red neuronal para la clasificación de la señales.
- Probar Support Vector Machine que proporcionan un mejor rendimiento que las redes neuronales
Se quiere probar cual de las tres opciones anteriores resulta la más óptima para el sistema,.
- Implementar un sintetizador de voz para los mensajes de aviso al usuario
- Realizar pruebas reales exhaustivas y obtener mediciones con diferentes cámaras y velocidades del auto.
El objetivo es mejorar los tiempos de procesamiento y el desempeño en general
Referencias
Rahman, Abid. (June 2012). Countours. OpenCV Python Tutorials. Recuperado en Mayo de 2013 desde: http://opencvpython.blogspot.mx/2012/06/hi-this-article-is-tutorial-which-try.html
Sinha, Utkarsh. (July 2010). Tracking colored objects in OpenCV. AI Shack. Recuperado en Mayo de 2013 desde: http://www.aishack.in/2010/07/tracking-colored-objects-in-opencv/