UNIVERSIDAD DE CHILE FACULTAD DE CIENCIAS FÍSICAS Y MATEMÁTICAS DEPARTAMENTO DE CIENCIAS DE LA COMPUTACIÓN INCORPORACIÓN DE CORRECCIÓN DE ERRORES Y MÉTRICAS DE CALIDAD AL CODEC DE TRANSMISIÓN DE VIDEO TOLERANTE A FALLAS MEMORIA PARA OPTAR AL TÍTULO DE INGENIERO CIVIL EN COMPUTACIÓN FELIPE IVAN LALANNE ROJAS PROFESOR GUÍA: JOSE MIGUEL PIQUER GARDNER MIEMBROS DE LA COMISIÓN: PATRICIO INOSTROZA FAJARDIN ERIC PIERRE TANTER SANTIAGO DE CHILE ABRIL 2007 RESUMEN DE LA MEMORIA PARA OPTAR AL TÍTULO DE INGENIERO CIVIL EN COMPUTACIÓN POR: FELIPE LALANNE R. FECHA: 16/04/2007 PROF. GUÍA: Sr. JOSÉ MIGUEL PIQUER "INCORPORACIÓN DE CORRECCIÓN DE ERRORES Y MÉTRICAS DE CALIDAD AL CODEC DE TRANSMISIÓN DE VIDEO TOLERANTE A FALLAS" Durante el trabajo realizado se estudiaron métricas de calidad de video y técnicas de corrección de errores de imagen, para su incorporación a una aplicación de transmisión de video. El objetivo principal del estudio es el de aumentar la tolerancia de dicha aplicación a pérdidas de red, entregando resultados numéricos formales que demuestren las mejoras alcanzadas. La distribución de contenido multimedia sobre Internet debe considerar las pérdidas de paquetes como un factor fundamental e ineludible. Las aplicaciones de transmisión de video actuales realizan una gran labor en términos de compresión de datos, pero presentan importantes falencias en términos de tolerancia a pérdidas. Durante trabajos realizados por memoristas anteriores se ha ido desarrollando una aplicación de distribución de video, la cual ha mostrado grandes avances en términos de minimizar el impacto producido por pérdidas de paquetes durante la transmisión. En la última versión se obtuvo una escena identificable aún bajo condiciones de 30% de pérdidas. La degradación producida en el video recibido toma la forma de pixeles erróneos claramente distinguibles del resto de la imagen. El problema actual consiste en encontrar una forma de corregir los errores producidos por pérdidas en la imagen recibida, demostrando el incremento de calidad logrado a través de resultados formales. Tales cambios tendrán como resultado un aumento de la tolerancia de la aplicación a pérdidas de red. Se desarrolló una técnica de corrección de errores, en donde cada píxel erróneo es reemplazado por el valor de sus vecinos cercanos. Para evaluar la mejora obtenida por este método, se diseño e implementó una métrica de calidad, en base a detección de errores en la imagen, analizando las variaciones del valor de los pixeles en la imagen recibida. Los resultados retornados por la métrica mostraron una mejora significativa en la calidad de la imagen como causa de la corrección efectuada. La métrica, por su parte, mostró consistencia con los errores observados en el video, demostrando ser una buena herramienta de evaluación. Se concluyó que es posible realizar corrección de errores satisfactoriamente, sin necesidad de agregar datos adicionales o redundancia a la transmisión. A mis Padres, por su eterno apoyo. Índice general 1. Agradecimientos 1 2. Introducción 2 2.1. Justificación / Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2. Situación Actual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.3. Objetivo General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.4. Objetivos Específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.5. Trabajo Realizado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.6. Estructura de la Memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3. Revisión Bibliográfica 8 I 3.1. Trabajo Previo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.2. Métricas de calidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.3. Transmisión tolerante a fallas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4. Desarrollo 13 4.1. Configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.2. Descripción del codec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4.2.1. Servidor de Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4.2.2. Cliente de Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.3. Optimizaciones Iniciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 4.3.1. Incorporación de herramientas autoconf y automake . . . . . . . . . . . . 19 4.3.2. Reestructuración de código . . . . . . . . . . . . . . . . . . . . . . . . . . 20 4.4. Desarrollo de métricas de calidad . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.4.1. Métricas de parámetros de red . . . . . . . . . . . . . . . . . . . . . . . . 23 II 4.4.2. Métricas de calidad perceptual de video . . . . . . . . . . . . . . . . . . . 24 4.5. Corrección de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.5.1. Aplicación de prueba de técnicas . . . . . . . . . . . . . . . . . . . . . . . 33 4.5.2. Corrección de errores por promedio . . . . . . . . . . . . . . . . . . . . . 34 4.5.3. Corrección de errores por mediana de módulo . . . . . . . . . . . . . . . . 35 4.5.4. Corrección de errores por mediana de componentes . . . . . . . . . . . . . 36 4.5.5. Corrección de errores probabilística . . . . . . . . . . . . . . . . . . . . . 37 4.5.6. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 4.6. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 5. Análisis 41 5.1. Métodos de corrección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.2. Métrica de Calidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.3. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 6. Mejoras finales y trabajo relacionado 53 III 6.1. Detección de movimiento en YUV . . . . . . . . . . . . . . . . . . . . . . . . . . 54 6.2. Limitación de tasa de captura de video . . . . . . . . . . . . . . . . . . . . . . . . 55 6.3. Cliente Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 6.4. Cliente J2ME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 7. Conclusiones 62 8. Trabajo Futuro 64 8.1. Compresión de imagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 8.2. Retro-alimentación de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 A. Glosario 69 IV Capítulo 1 Agradecimientos Gracias a NIC Chile y Entel PCS por proveer el financiamiento necesario para llevar a término la actual memoria. Gracias a mi familia y amigos por el apoyo que me han dado en éstos meses de trabajo. 1 Capítulo 2 Introducción Con el avance de la tecnología, la necesidad de información en tiempo real se ha hecho cada vez más inminente. La distribución de contenido multimedia en internet, en particular de video, ha alcanzado cada vez un mayor auge. Sin embargo, aún en la actualidad no existen aplicaciones que realicen esta tarea en tiempo real de manera satisfactoria. La dificultad principal de este tipo de aplicaciones, radica en la gran cantidad de información que es necesario transmitir, y en la imposibilidad de asegurar la correcta transmisión de ésta desde el servidor al cliente. Es por eso que la propiedad de tolerancia a pérdidas adquiere relevancia. La presente memoria pretende extender el trabajo realizado por memoristas anteriores [11, 1, 4], en el área de transmisión en tiempo real sobre redes IP tolerante a fallas. La intención es desarrollar una aplicación que aproveche la plataforma de trabajo desarrollada por las investigaciones anteriores, agregando mayor tolerancia a la pérdida de datos en la transmisión y conservando lo mejor posible la calidad del video original. Se pretende incorporar corrección de errores producidos por pérdidas en la imagen recibida por el cliente, y definir métricas de calidad perceptual del video para evaluar las mejoras producidas por dicha corrección. 2 2.1. Justificación / Motivación Con el creciente aumento de las velocidades de conexión en Internet, la distribución de contenido multimedia, y en particular de video en tiempo real, ha alcanzado cada vez un mayor auge. Este tipo de aplicaciones presentan un gran desafío en términos de desarrollo e investigación, debido a que la calidad del servicio está determinada no sólo por la eficiencia en la transmisión de los datos, sino que por la calidad de la imagen percibida por el usuario. En la actualidad las técnicas de compresión utilizadas se enfocan principalmente en la primera parte: transmitir la mayor cantidad de información en un corto tiempo. Sin embargo, de acuerdo a la estructura actual de Internet, es fundamental considerar las pérdidas de datos durante la transmisión para alcanzar el segundo objetivo. Es necesario entonces tener en cuenta dos puntos: definir cuál es la forma más eficiente de transferencia de datos para disminuir el porcentaje de degradación de la imagen percibido por el usuario, y estudiar una estrategia a seguir en caso de pérdidas de datos para establecer en qué casos es posible corregir los defectos en la imagen final de manera de proveer una mejor calidad de servicio para el usuario final. El desarrollo de estos dos puntos es lo que motiva este trabajo. 2.2. Situación Actual Las aplicaciones de transmisión de video en tiempo real sobre Internet, en particular sobre redes IP, son altamente demandantes de recursos de red, debido a la gran cantidad de información que es necesario transmitir. Distintas tecnologías se han desarrollado en el último tiempo para satisfacer las crecientes necesidades de los usuarios de este tipo de contenido. Entre éstas se encuentran el desarrollo de redes de mayor ancho de banda y de dispositivos de almacenamiento de mayor velocidad [20], junto con el mejoramiento de las técnicas de compresión de datos. El concepto inherente de estas últimas es el de disminuir la cantidad de información transmitida a través de la red mediante la reducción de redundancias en los datos enviados. Por ejemplo, durante la reproducción de un video, se puede decidir enviar sólo los bits de información que han cambiado entre cuadros consecutivos. Uno de los grandes problemas de la transferencia de datos a través de Internet es la pérdida de paquetes entre el emisor y el receptor. En aplicaciones de video en tiempo real esto es aún más crítico, ya que no es factible esperar la retransmisión de dichos paquetes sin afectar la calidad del servicio percibido por el usuario. La solución entonces es desplegar los datos conforme se van re3 cibiendo, ya que para el usuario es menos molesto ver un video de manera continua pero de calidad deteriorada que tener que esperar para ver una imagen completa. El enfoque actual es entonces definir métricas de calidad [6, 18] , de manera de poder determinar de forma más específica cuáles son las condiciones bajo las que el servicio se ve mejorado o deteriorado y además en qué medida se pueden reparar los errores ocasionados por pérdida de datos. Una métrica de calidad de video se encarga de estimar la calidad de la imagen percibida por el usuario final. Dentro del desarrollo de métricas, se pueden distinguir dos enfoques distintos [18]: a) Unos utilizan modelos computacionales de la visión humana. Generalmente estos son bastante precisos, sin embargo son de gran complejidad y costo computacional, debido a que muchas de las características de la visión humana aún no son completamente claras. b) Otras métricas aprovechan el conocimiento de los algoritmos y métodos utilizados para compresión y transmisión de video. De esta forma se puede determinar cuales son los errores que el usuario percibe y realizar una medición sobre estos para análisis posteriores. Una vez recibidos los datos en el cliente, si se detectan pérdidas de paquetes durante la transmisión, se debe buscar entonces una forma de corregir dichas pérdidas. Existen distintos enfoques para realizar esto, uno de las cuales es incorporar redundancia de datos a los paquetes enviados. De esta manera, en caso de existir una pérdida, es posible reconstruir parte o la totalidad de la información faltante. Uno de los protocolos más utilizados para esto es el de FEC (Forward Error Correction). Éste utiliza álgebra binaria, particularmente el uso de O exclusivo (XOR), para calcular los datos redundantes y recuperar la información faltante. Sobre este protocolo se han realizado modificaciones para adaptar el nivel de redundancia de manera consistente con la congestión en la red [7]. Dentro de este último, denominado AFEC, se pone de manifiesto la importancia de los mecanismos de control de redundancia, ya que superando un cierto punto puede volverse contraproducente, resultando en un aumento de la congestión de la red. 2.3. Objetivo General El objetivo de este trabajo es complementar los resultados del trabajo de título realizado por Cristian Junge [4]. En particular se desea estudiar más a fondo la forma de distribuir de la información de video en paquetes para disminuir la degradación en la calidad de la imagen percibida por el usuario. Además se espera determinar bajo qué nivel de pérdidas es posible realizar correccio4 nes sobre la imagen final e implementar dichas correcciones en una aplicación. Para realizar esto se estudiarán algunas métricas de calidad de servicio (QoS) definidas actualmente para entregar resultados formales en la investigación. 2.4. Objetivos Específicos Complementar el trabajo realizado en las memorias de título de Fermín Uribe [11], Alvise Bolsi [1] y Cristian Junge [4], tomando como base sus resultados y realizar experimentos sobre éstos para estudiar cuáles son los puntos que requieran una mejora y implementar éstas en una aplicación posterior. Estudiar algunas métricas de calidad de servicio en sistemas de video sobre Internet para entregar resultados formales de la calidad de servicio provista por la aplicación de video bajo distintas configuraciones y distintas condiciones de red. Estudiar la mejor forma de distribuir la información en paquetes para disminuir el efecto producida por las pérdidas en la calidad de la imagen final. Estudiar formas de corregir los errores en la imagen desplegada, ocasionados por pérdidas de red e implementar dichas correcciones en la aplicación final. Desarrollar una aplicación de demostración que integre los resultados de las investigaciones realizadas para mostrar de manera empírica los avances obtenidos. Concluir sobre los resultados obtenidos, entregando recomendaciones basadas en la experiencia adquirida durante el proyecto. 2.5. Trabajo Realizado En la primera etapa se realizó una revisión bibliográfica y del estado del arte actual, en particular con respecto a técnicas de corrección u ocultamiento de errores en imágenes. Se decidió trabajar con el codec de Cristian Junge, por la importancia de los resultados obtenidos en el área de transmisión de paquetes, con el objetivo de minimizar la degradación perceptual 5 por causa de pérdidas. Este codec distribuye de manera aleatoria en paquetes los pixeles de los bloques de imagen a transmitir, con el fin de minimizar el impacto producido por pérdidas en la imagen final. Para lograr familiarización con el código y modo de funcionamiento del codec, la primera tarea realizada fue reordenar el programa en capas de captura de video, detección de movimiento, transmisión y recepción de paquetes. Junto con esto se procedió a documentar todo el código para mejorar la mantenibilidad de este en futuras versiones. Esta tarea requirió prácticamente de una re-escritura completa del programa, pero permitió a la vez lograr un entendimiento cabal del funcionamiento de cada una de las capas del códec. Una vez logrado este objetivo se procedió a implementar cambios enfocados a medir la calidad del video recibido por el cliente y a ocultar los pixeles perdidos durante la transferencia. Para esto se efectuaron las siguientes tareas: 1. Se incorporó un módulo de recolección de estadísticas por cuadro de video. A partir de éste se pueden almacenar datos de cantidad de bytes, paquetes y bloques enviados y recibidos por la aplicación bajo distintas configuraciones y distintos niveles de pérdidas de paquetes. Esta información se hace necesaria como complemento a las métricas de calidad de video. 2. Con el fin de detectar degradación en la imagen recibida, se implementó un módulo de detección de errores. Éste se encarga de detectar diferencias de cada pixel con sus vecinos cercanos mediante distintas técnicas. Entre estas se pueden destacar, comparación de distancia entre colores con los vecinos directos, diferencia con el promedio de colores de los vecinos, diferencia con la mediana de los vecinos. En cada uno de los casos citados, si la diferencia es mayor que un cierto margen obtenido experimentalmente, entonces se considera que el pixel esta perdido y se aumenta el valor de la degradación de la imagen. Para realizar una evaluación del funcionamiento de las distintas técnicas, se agregó un módulo de visualización de errores. Éste permitió ver en línea los errores detectados a través de una ventana adicional la cual los desplegaba en un color distinto al del fondo. Con los datos obtenidos, se definió como métrica de calidad el porcentaje de error de la imagen. 3. Para mejorar la calidad final de la imagen ante pérdidas, se procedió a corregir los pixeles perdidos a partir de la información de los vecinos, es decir, el color de cada pixel perdido se reemplazó por un valor obtenido a partir de los pixeles cercanos. Para obtener dicho valor se realizaron pruebas con distintas técnicas: promedio de los vecinos, mediana de los vecinos, mediana de componentes de vecinos y corrección probabilística. Para apreciar de manera efectiva las mejoras introducidas por cada técnica, se implementó una aplicación de prueba que simulaba pérdidas en una imagen, para posteriormente corregirlas utilizando alguno de 6 los métodos antes mencionados. Una vez determinada la mejor técnica, se procedió a incorporarla al programa para corregir los errores en tiempo real, debido a esto se observaron mejoras considerables en la calidad final de la imagen, incluso para altas tasas de pérdidas. Se llevaron a cabo diversos experimentos bajo distintos niveles de pérdidas para comparar la degradación de la imagen determinada por la métrica de la imagen con y sin corrección de errores. Dichos experimentos se realizaron de manera controlada, utilzando clips de video en cada caso para asegurar que los resultados fueran comparables. 2.6. Estructura de la Memoria El capítulo 1 contiene una introducción sobre el los objetivos y justificación del trabajo realizado. El capítulo 2 contiene una revisión bibliográfica de los conceptos relevantes para el desarrollo de la memoria. El capítulo 3 describe en detalle las características del codec implementado y el trabajo realizado. El capítulo 4 detalla las pruebas realizadas con la aplicación y los resultados obtenidos. El capítulo 5 describe algunas modificaciones finales realizadas a la aplicación y algún trabajo relacionado con la misma. El capítulo 6 corresponde a las conclusiones. El capítulo 7 entrega algunas pautas para la continuación del trabajo. 7 Capítulo 3 Revisión Bibliográfica 3.1. Trabajo Previo Existe una gran cantidad de material disponible en el área de video sobre IP. Extensa investigación se ha realizado en los temas de Streaming de video, calidad de servicio, adaptabilidad a condiciones de red, etc. Un buen ejemplo de esto se puede encontrar en [20]. En éste se realiza una descripción de las seis áreas claves en el desarrollo de un sistema de transmisión de video: compresión de video, calidad de servicio (QoS) en nivel de aplicación, servicios de distribución continua de contenido multimedia, servidores de transmisión de contenido multimedia, sincronización de medios y protocolos de transmisión. Para cada una de estas áreas se explica la función que cumplen dentro del sistema y se describen algunas de las técnicas utilizadas actualmente para su implementación. La lectura de este documento sirve como introducción al tópico de transmisión de video sobre internet y es una buena fuente de referencias, en particular para el tema de calidad de servicio, el cuál es uno de los objetivos de esta memoria. Para el desarrollo del tema se ha tomado como punto de partida el trabajo realizado previamente en las memorias de Fermín Uribe, Alvise Bolsi y Cristian Junge, descritas a continuación: 8 Codificación y decodificación de video tolerante a fallas [11] En éste se realiza un estudio de los técnicas de codificación de video vigentes en la actualidad y su tolerancia a fallas. El resultado más importante obtenido durante este trabajo es el desarrollo de un codec para la transmisión de video en tiempo real. Para el desarrollo de éste se utilizó una técnica denominada detección de movimiento, descrita en el documento, la cual consiste en transmitir sólo los bloques de la imagen que cambian, incorporando un límite temporal sobre los bloques para evitar que un bloque no recibido por el cliente nunca se refresque. También se analiza la importancia del espaciamiento temporal de los paquetes para evitar ráfagas de estos que no podrán ser procesadas. Optimización de codec de video tolerante a fallas utilizando compresión espacial [1] En éste se realiza un estudio de técnicas de compresión de video con el objetivo de disminuir el uso de ancho de banda del codec desarrollado por Fermín Uribe [11]. El resultado más importante de este trabajo es la disminución del ancho de banda en un orden de magnitud (de 2700 Kb/s a 210 Kb/s en movimiento normal) para la transmisión de video. Esto se logró aplicando compresión JPEG a los bloques de video y descomprimiéndolos en el lado del cliente. Además, se logró mejorar la eficiencia del codec utilizando el espacio de colores YUV en vez de RGB para las imágenes capturadas, lo cual evita el costo producido por las múltiples transformaciones de espacio de color necesarias para la detección de movimiento en RGB. Transmisión Eficiente y Tolerante a Fallas de Video sobre Redes IP [4] En éste se detalla la experimentación realizada sobre la distribución de los pixeles en los paquetes IP en el codec de video. Uno de los resultados más importantes obtenidos en este último punto es que la distribución de pixeles de manera aleatoria minimiza el daño producido por la pérdida de paquetes, ya que se evita que se vean tramas de pérdidas en la imagen del receptor, sin embargo presenta un problema con algunos algoritmos de compresión de imágenes, lo que hace que la integración con [1] no sea posible. 3.2. Métricas de calidad Entre los objetivos de la investigación a realizar se encuentra el de aplicar métricas de calidad de servicio a aplicaciones de video IP. Dentro de este tema existen diversas perspectivas respecto a cómo se deben realizar las mediciones, ya que la calidad del video depende principalmente de la percepción del usuario final, pero ésta se ve afectada por otros factores. La discusión entonces 9 está en el enfoque, mientras que algunas métricas se preocupan de medir la calidad perceptual de la imagen, otras se enfocan en los factores que ocasionan la disminución de ésta. En [6] se puede encontrar un ejemplo de este último. En este documento se presenta una visión general de los puntos a considerar en el diseño de una métrica de calidad. Se establece un modelo de trabajo en el cuál se relacionan los requerimientos dados por los usuarios para el servicio, con parámetros de análisis de calidad y los recursos asociados a dichos parámetros. En particular, se presenta el desarrollo de una métrica, la cual analiza la relación entre el uso de recursos (ancho de banda, espacio en disco, carga de CPU) con la satisfacción del usuario medida a través de parámetros como jitter, delay, tasa de pérdidas y variaciones en la sincronización, dando como resultado una ecuación de calidad que involucra todos los factores mencionados anteriormente. Otro enfoque posible es considerar que la calidad de la imagen de video depende, a fin de cuentas, de la percepción de fallas en ésta por el ojo humano. Algunas métricas ignoran este punto y utilizan mediciones basadas en diferencias a nivel de pixeles entre la imagen original y recibida por el cliente. Según este último enfoque, sin embargo, puede ser de mayor utilidad medir la calidad de la imagen como un todo. En [17] se describen distintos factores de calidad tomando el punto de vista del usuario considerando el modo de funcionamiento de la visión humana. Entre estos factores se encuentran: sensibilidad al color, al brillo, a las diferencias de luz, a la naturalidad de la imagen. Algunos de éstos son analizados desde el punto de vista de la fisonomía de la visión humana, entregando pautas para la incorporación a un sistema de medición de calidad perceptual de video. En general existe poca investigación en este última línea debido a la gran complejidad que presenta el modelamiento de la visión humana. En el trabajo actual se ha optado por simplificar el problema, considerando la pérdida de paquetes IP como factor principal en la degradación de la imagen final. En la aplicación desarrollada durante las memorias anteriores [11, 1, 4], se pueden observar patrones de error en la imagen asociados directamente con las pérdidas de red. Este comportamiento se debe a la forma de implementación de la detección de movimiento mediante división en bloques, con lo cual la pérdida de paquetes se traduce en pérdida de bloques de imagen. En [18] se describen y comparan tres métricas de calidad perceptual de video para el análisis de errores para este tipo de implementación. Estas métricas tienen en común que no requieren de la imagen original para realizar las mediciones. Una de las técnicas citadas es descrita en mayor profundidad en [14]. Para realizar la medición, esta métrica modela los patrones de pérdidas por bloques como una interferencia en la transmisión y luego mide la intensidad de dicha interferencia. Esta medición se realiza en los ejes X e Y de la imagen, para luego obtener un promedio entre ambas. Durante el trabajo realizado se estudió, entre otras cosas, la integración de esta última al codec de transmisión de video. 10 3.3. Transmisión tolerante a fallas Otro objetivo del estudio realizado es analizar la posibilidad de aplicar corrección de errores en el video recibido por el cliente. En este ámbito existen diversas técnicas desarrolladas, una de las cuales es la de incorporación de redundancia en los datos enviados. En [8] se describe la aplicación de un protocolo que utiliza Forward Error Correction (FEC) denominado AFEC (Adaptative Forward Error Correction), en la transmisión de video para disminuir el nivel de error en el video recibido por el cliente. En éste se muestran también los resultados de la aplicación de este protocolo como capa de transporte para video de compresión MPEG. En [7] se describe en mayor profundidad el funcionamiento del protocolo AFEC, que se adapta al nivel de congestión de la red, incrementando el nivel de redundancia de datos si se detecta que el comportamiento de la red es inestable. En aplicaciones de video en tiempo real, la retransmisión de datos no es una posibilidad. Se hace necesario entonces incorporar redundancia en los paquetes transferidos para permitir la corrección de errores en la imagen. Sin embargo, se debe tener un buen control en el nivel de redundancia para evitar generar tráfico excesivo en la red. Una variante a las técnicas descritas previamente involucra aplicar distintos niveles de redundancia para información de distinta prioridad dentro de la transmisión. En [5] se realiza primero una descripción en profundidad del protocolo FEC y propone AdFEC Adaptable Forward Error Correction. Esta modificación aplica FEC con baja redundancia a información que no es crítica para el video, pero cuya pérdida ocasiona molestias en el lado receptor (por ejemplo datos de pixeles de imagen) y utiliza alta redundancia a información crítica para el funcionamiento de la aplicación, tal como segmentos de control, información de formatos y tablas de colores. La revisión de este documento permite entender la base matemática del protocolo FEC, transformándola en una fuente importante de información para su posible aplicación en el trabajo a realizar. Otra opción para corrección de errores es la de reconstruir bloques o pixeles perdidos durante la transmisión a través de técnicas de interpolación espacial o temporal. En la interpolación espacial, la información de un pixel perdido se reconstruye a partir de la información de sus pixeles vecinos más cercanos. De manera similar, la información de un bloque puede ser reconstruida a partir de la información obtenida de los bordes de los bloques más cercanos a éste. En interpolación temporal, se reconstruye la información de bloque utilizando la información del bloque anterior equivalente más cercano. En [9, 13] se describen algunos métodos de interpolación temporal y espacial para disimulación de errores (Error Concealment). Durante el trabajo realizado se estudió la integración de técnicas de interpolación espacial al codec de transmisión de video. 11 3.4. Resumen Diversas técnicas y protocolos han sido desarrollados para cubrir los temas de medición de calidad de video y corrección de errores, algunas de las cuales han sido descritos en la actual revisión. En general, se aprecia un amplio nivel de interés y de profundización en estas áreas, pero a pesar de la clara relación entre ambas, existe poco trabajo en que se vea una asociación directa. Sería deseable, por ejemplo, utilizar una métrica de calidad para medir qué tan bueno es el algoritmo de corrección de errores, utilizándola para analizar los parámetros bajo los cuales se obtienen mejores resultados. Este es precisamente el enfoque de trabajo que se utilizará durante la memoria. 12 Capítulo 4 Desarrollo En el capítulo anterior se revisaron conceptos relacionados con el ámbito de trabajo y el estado del arte actual. El presente capítulo describe el trabajo realizado durante el transcurso de la presente memoria. En primer lugar se describe la plataforma utilizada para el desarrollo. A continuación se describe el funcionamiento del sistema en términos generales y los pasos efectuados para lograr una familiarización con el modo de funcionamiento de éste, así como las optimizaciones iniciales realizadas al programa. Finalmente se explican los cambios y desarrollos incorporados concernientes al ámbito de la memoria actual. 4.1. Configuración La plataforma de hardware utilizada para el desarrollo consistió en un computador con un procesador AMD Sempron 2600+ con un Gbyte de memoria RAM. Para la captura de video se usó una cámara analógica Sony, modelo Handycam Video8 CCD-TR380. Para la digitalización de las imágenes obtenidas se empleó una tarjeta capturadora de video Prolink PixelView PlayTV. Esta tarjeta fue escogida por utilizar el chipset BT878, el cual es soportado por linux mediante la API 13 de Video4Linux (V4L) [12]. El sistema operativo seleccionado fue la distribución de Linux Fedora Core 5. Este sistema posee una avanzada capacidad de reconocimiento de hardware y además incluye las bibliotecas de la API de V4L, lo cual facilitó el proceso de configuración del software para su utilización. El lenguaje de programación utilizado para el desarrollo es C, principalmente por motivos de eficiencia, pero también por ser el lenguaje de implementación original del programa. Como se podrá ver mas adelante, también fue posible desarrollar una aplicación cliente en lenguaje Java, obteniendo una eficiencia satisfactoria, lográndose despliegue de video recibido a 30 cuadros por segundo, similarmente a lo obtenido por la aplicación en C. 4.2. Descripción del codec Previamente a la descripción del trabajo realizado, es necesario detallar brevemente el modo de funcionamiento de la aplicación, previamente a lo agregado durante el transcurso de la memoria actual. El codec posee dos partes. Un servidor que captura el video, lo procesa y transmite a través de la red, y un cliente que recibe el flujo de datos y lo procesa para poder desplegarlo en el lado receptor. 4.2.1. Servidor de Video La aplicación realiza cuatro etapas para la transmisión de los datos, tal como se muestra en la figura 4.1(a). Éstas son, captura de datos de video (desde una archivo o una cámara), detección de bloques de movimiento en la imagen, distribución de información en paquetes IP y envío de paquetes. 14 (a) Servidor (b) Cliente Figura 4.1: Diagrama de flujo de cliente y servidor Capturar cuadros de video Se lleva a memoria un cuadro de imagen obtenido desde alguna fuente, la cual puede ser algún dispositivo conectado al PC, tal como una cámara web o una tarjeta capturadora de video, obteniendo datos mediante la interfaz de Video for Linux, o un archivo guardado en memoria. Cada cuadro de imagen es guardado como un arreglo de bytes, utilizando 4 bytes para describir cada pixel, utilizando el modelo de color RGB32 [15]. Detectar bloques con movimiento Cada cuadro capturado se compara con el inmediatamente anterior para detectar si ha habido movimiento dentro de la imagen. Para realizar esto, se considera la imagen como un conjunto de bloques cuadrados de 8x8 pixeles, denominados macro-bloques, cada uno de éstos es comparado con su equivalente en el cuadro anterior utilizando la varianza de las componentes del color en el sistema RGB como indicador, considerando los 64 pixeles, las diferencias entre dos cuadros consecutivos se calculan de la siguiente forma, para el cuadro i. 15 64 ! j=1 (Ri,j − Ri−1,j )2 + (Gi,j − Gi−1,j )2 + (Bi,j − Bi−1,j )2 (4.1) Si dicho valor supera un cierto umbral, determinado experimentalmente [11], entonces se considera que el macro-bloque ha cambiado y este debe ser marcado para envío. Además, de manera periódica, los bloques deben ser marcados para envío incluso si no se han registrado cambios. Esto es necesario, ya que podría ocurrir que un bloque no recibido nunca volviera a cambiar en el servidor, lo cual ocasionaría un error persistente en el cliente. Como no existe una retroalimentación de los bloques recibidos efectivamente, la utilización de esta estrategia es indispensable. El fin de esta etapa es disminuir la cantidad de datos necesarios a enviar por cada cuadro de video al cliente. Esto es logrado transmitiendo solo la información de imagen que cambia en el tiempo, de manera que el receptor perciba el movimiento ocurrido. Este proceso es comúnmente usado por aplicaciones de distribución de video en Internet y se denomina compresión temporal. Distribuir información en paquetes IP Los bloques marcados para envío son ordenados aleatoriamente y agrupados en una macrounidad denominada bloque virtual. El máximo tamaño de una de estas unidades es de 255 macrobloques, con lo cual puede contener no más de 64 ∗ 255 = 16320 pixeles. De acuerdo al tamaño del bloque virtual, se define una distribución aleatoria de pixeles. Éstos son divididos en cuatro paquetes IP, de manera que el primer pixel de la secuencia aleatoria se agrega al primer paquete, el segundo al segundo paquete y así sucesivamente hasta recorrer la secuencia completa. Dado que se utiliza la misma función de aleatorización tanto en el cliente como en el servidor, entonces no es necesario enviar el orden de los pixeles al cliente. Utilizando esta estrategia de distribución, se logra disminuir el impacto ocasionado en la imagen por causa de pérdidas de paquetes. El resultado producido por éstas es la pérdida de sólo algunos pixeles del bloque, con lo cual el contenido de la imagen recibida aún es identificable por el usuario. En la figura 4.2 [4], se puede ver la imagen recibida aplicando este método bajo condiciones de pérdidas, se observa una degradación de la calidad, pero el contenido aún es distinguible. 16 Figura 4.2: Imagen recibida utilizando distribución aleatoria de pixeles Enviar paquetes Una vez llenados los paquetes, éstos son enviados al cliente mediante el protocolo de transmisión UDP. 4.2.2. Cliente de Video La aplicación realiza tres etapas para poder mostrar el video recibido, tal como se muestra en la figura 4.1(b). Recibir paquetes IP, obtener información de imagen de éstos y desplegar imagen actualizada. Recibir paquetes Los paquetes IP son recuperados desde la red, utilizando protocolo de transmisión UDP. El cliente escucha constantemente en un puerto y procesa los paquetes en la medida que los recibe. 17 Reconstruir imagen Cada vez que se recibe un paquete, se procesa para obtener la información de imagen de éste. El proceso es posible gracias a los headers incluidos en el paquete, éstos contienen información respecto al cuadro al que pertenecen los datos, tamaño, bloques contenidos en la sección de datos, etc. La misma secuencia aleatoria de pixeles del servidor es generada también en esta etapa, de manera que al recibir un paquete de la secuencia de cuatro detallada en la sección anterior, es posible obtener la información de color y posición exacta de los pixeles recibidos. Una vez recuperados los pixeles, son actualizados en una imagen almacenada en memoria para su posterior despliegue. De la misma forma, también es posible saber qué paquetes se perdieron y los pixeles contenidos en ellos. Este conocimiento es crucial para los objetivos de la memoria actual, ya que los algoritmos de corrección de errores se aplican en esta etapa. Desplegar imagen Una vez recibida la información completa de un cuadro de imagen, la versión en memoria de ésta es desplegada en una ventana utilizando el entorno X11. 4.3. Optimizaciones Iniciales La primera etapa del trabajo realizado fue de familiarización con la implementación realizada anteriormente. Para ello se partió de la aplicación desarrollada por Fermín Uribe [11], realizando algunas optimizaciones y re-estructuración del código para mejorar la mantenibilidad de la aplicación. En base al nuevo esquema se procedió a incorporar las mejoras introducidas por Cristian Junge en su trabajo de memoria [4], para hacer uso de esos avances como punto de partida del trabajo actual. En la actual sección se describirá en detalle cada una de las modificaciones realizadas. 18 4.3.1. Incorporación de herramientas autoconf y automake Autoconf y Automake son herramientas de apoyo al desarrollo de aplicaciones en entornos *nix. Éstas permiten la generación automática de archivos de configuración y compilación de código. Tal esquema posee numerosas ventajas: Detección de dependencias de la aplicación en la plataforma destino y adaptación de la misma a la configuración existente. Generación de archivos Makefile para compilación simple mediante el comando make. Gestión y documentación de cambios realizados al código. Control de versiones. Generación de ejecutables (y/o bibliotecas) e instalación de los mismos en directorios comunes de distribuciones *nix. Creación de paquetes comprimidos fácilmente distribuibles a través de Internet para su instalación en otras máquinas. Utilización de licencias de software. Para hacer uso de estas herramientas fue necesario crear los siguientes archivos: configure.in: Este archivo define entre otras cosas: versión de la distribución, programa de compilación, dependencias de la aplicación (headers C, funciones requeridas) y mensajes de alerta. Es utilizado por la aplicación autoconf para generar el fichero ejecutable de configuración. Makefile.am: Debe ser definido en cada carpeta para especificar las subcarpetas necesarias de acceder y los ejecutables o bibliotecas a crear. Junto con cada ejecutable se debe detallar cada uno de los archivos necesarios para la compilación exitosa. COPYING: Cuando se utiliza algún tipo de licencia en la aplicación, se debe agregar este archivo para definir los términos de la misma. ChangeLog: Define cambios realizados por cada versión de la aplicación. 19 AUTHORS, README, INSTALL: Información útil para el usuario, contacto de los desarrolladores, instrucciones de instalación y otras que puedan ser necesarias. Una vez incorporados los archivos señalados, se pueden generar los archivos necesarios para la configuración y compilación, utilizando el siguiente comando. > autoheader & autoconf & automake Cuando se ha generado una distribución estable, un usuario cualquiera puede configurar y compilar el programa realizando la siguiente secuencia de pasos. > > > > tar xvfx <programa>-<version>.tar.gz cd <programa>-<version> ./configure make 4.3.2. Reestructuración de código El primer paso realizado fue estudiar el código de la aplicación para comprender a cabalidad el funcionamiento de la misma. Dado que, para el trabajo realizado por Cristian Junge, numerosas versiones habían sido desarrolladas, la mantenibilidad del código había sido perdida en parte, por lo cual se optó por reestructurar el mismo. Del análisis realizado pudo detectarse las siguientes sub-funcionalidades en la aplicación. Captura de video: Consiste en el proceso de llevar a memoria un cuadro de imagen obtenido desde una fuente de video particular. Dicha fuente puede ser obtenida desde un dispositivo de captura (tarjeta capturadora, cámara web), como desde un archivo en disco. El cuadro capturado se representa en memoria de acuerdo al modelo de color escogido. En el caso actual se utilizo el modelo RGB32 [15], por lo que la imagen se representa como un arreglo de bytes, donde se utilizan 4 bytes por pixel (indicando transparencia, rojo, verde y azul). 20 Detección de movimiento Esta funcionalidad toma la información de la imagen almacenada en memoria y determina si ha hubo algún cambio con respecto al cuadro anterior. Para lograr esto, la imagen completa se divide en cuadrados de 8x8 pixeles o macro-bloques. La información de color de cada uno de éstos, es comparada con la información del bloque respectivo del cuadro inmediatamente anterior. Si se detectan diferencias que superan un umbral determinado, entonces significa que dicho bloque debe ser actualizado (o transmitido). Esta funcionalidad permite realizar compresión temporal sobre los datos de video, es decir, sólo los cambios en la imagen son transmitidos, disminuyendo el ancho de banda requerido por la aplicación. Distribución de información en paquetes: La información de la imagen debe ser luego procesada para ser enviada al cliente, esta funcionalidad se encarga de distribuir los datos en paquetes para su transmisión. La información puede ser distribuida de distintas formas para disminuir el impacto producido por las pérdidas. En el caso del trabajo de Fermín Uribe, los macro-bloques son distribuidos en forma de grilla, para evitar que segmentos completos de imagen puedan perderse. Envío de paquetes: El último paso de transmisión consiste en enviar cada paquete al receptor utilizando un socket UDP, este proceso es bastante simple, y equivale a escribir datos en un archivo. Recepción de paquetes: Esta funcionalidad permite a la aplicación cliente recibir la información enviada por el servidor, para su posterior procesamiento. Recuperación de información en paquetes: La información de la imagen contenida en los paquetes es recuperada y actualizada en memoria para su posterior despliegue. Despliegue de imágenes: Consiste en mostrar en pantalla la imagen tanto transmitida como recibida. Es equivalente a dibujar cada uno de los pixeles almacenados en memoria en un área específica de la pantalla. Debe considerarse, sin embargo, como una funcionalidad aislada del resto. Utilidades Varias: Dentro de la aplicación se pudo encontrar también otras funcionalidades para realizar diversas tareas, como transformaciones de espacio de color y generación de arreglos aleatorios, entre otras. Estas pueden ser consideradas aisladas del resto, de manera de permitir su utilización en distintas partes de la aplicación. En base a las funcionales encontradas, se definió un modelo de capas para el lado servidor de la aplicación, que es el que más tareas debe realizar. Dicho modelo puede verse en la figura 4.3(a). Por la simplicidad de la capa de envío y por eficiencia de implementación se optó por integrarla a la capa de procesamiento de información. 21 (a) Servidor (b) Cliente Figura 4.3: Estructura de capas de la aplicación. Interacción entre las distintas etapas de transmisión y recepción de video. Un modelo de capas similar fue definido para el lado cliente de la aplicación (figura 4.3(b)). Por la simplicidad de la capa de recepción y su relación directa con la etapa de procesamiento de paquetes (recuperación de información), se optó por unir ambas. La reestructuración realizada consistió en separar cada una de esas capas en un módulo independiente del resto, de esta manera fue posible reutilizar funcionalidades en nuevas aplicaciones, además de permitir modificar el modo de funcionamiento de una capa sin afectar al resto, posibilitando que la entrada y salida de cada una se mantenga. Ambas mejoras mostraron ser útiles en etapas posteriores del trabajo. En la figura indicada anteriormente, se puede apreciar en detalle la separación de módulos y los archivos asociados a cada uno. Una vez finalizada la reestructuración, se procedió a incorporar las mejoras introducidas por Cristian Junge a la aplicación. Para esto fue necesario modificar la capa de Procesamiento, ya que dichas mejoras estaban relacionadas principalmente con la distribución de la información de video en los paquetes. Dadas las modificaciones realizadas anteriormente, sólo hubo necesidad de alterar 22 un archivo para poder apreciar los resultados en la aplicación. Con la culminación de esta primera etapa, se logró el objetivo inicial de la misma: comprender a cabalidad el modo de funcionamiento de la aplicación, y la interoperabilidad de las distintas partes de su código. Esto permitió dar inicio el trabajo en los aspectos concernientes a la memoria actual. 4.4. Desarrollo de métricas de calidad En la sección anterior se presentaron las optimizaciones y modificaciones realizadas a la aplicación como preludio al inicio del trabajo en los objetivos particulares de la memoria. En la presente sección se detalla el esfuerzo realizado para lograr dichos objetivos. La primera etapa del trabajo consistió en incorporar mediciones a la funcionalidad de la aplicación. Los esfuerzos se concentraron en recolectar información de dos tipos diferentes: valores de red, como ancho de banda del servidor y cliente y tasa de pérdidas de paquetes; y valores de calidad perceptual de video. Para esto último se desarrolló una métrica que permitiera medir el nivel de degradación del video obtenido en el lado cliente, tomando en cuenta las diferencias de colores entre pixeles vecinos. 4.4.1. Métricas de parámetros de red La recolección de estadísticas se desarrolló en base a un módulo especial de recopilación de datos, cuyo propósito es almacenar información de apoyo a la experimentación, es decir, obtener cifras y estimadores que permitan evaluar de manera objetiva el desempeño y mejoras alcanzadas por la aplicación en la medida que se observan avances. El tipo de información recopilada difiere de acuerdo a si se está transmitiendo o recibiendo video. El cuadro 4.1 detalla cada uno de los datos considerados. Distintos tipos de datos son obtenidos en distintas etapas del procesamiento. Por ejemplo, el tiempo de recepción de un cuadro sólo puede ser actualizado una vez que se haya recibido toda 23 Dato Frame Time Transmisión Sí Sí Recepción Sí Sí Bytes Packets Sí Sí Sí Sí Packet Loss Virtual Block Loss Frame Loss No No No Sí Sí Sí Detalle Último cuadro transmitido o recibido Tiempo transcurrido para la transmisión o recepción del último cuadro Cantidad de bytes transmitidos o recibidos Cantidad de paquetes transmitidos o recibidos Cantidad de paquetes perdidos. Cantidad de bloques virtuales perdidos. Cantidad de cuadros perdidos. Cuadro 4.1: Detalle recolección estadísticas la información de este último, pero la cantidad total de paquetes o bytes recibidos puede ser actualizada inmediatamente tras enviar o recibir un nuevo paquete. Debido a ésto, se desarrolló una serie de funciones para actualizar la información de la aplicación, las cuales pueden ser invocadas en cualquier parte del procesamiento. El cuadro 4.2 enumera cada una de estos procedimientos y detalla su modo de funcionamiento. La información capturada por cuadro puede ser almacenada en disco para su posterior análisis. Cabe mencionar que existe otra forma de determinar la pérdida de paquetes en la aplicación de forma posterior a cada experimento. Combinando la información de número de paquetes enviados con el número de paquetes recibidos, es posible determinar con exactitud la pérdida ocurrida. La adición del módulo de estadísticas permitirá en experimentos posteriores, mostrar cifras representativas del avance (o retroceso) obtenido al probar distintas técnicas de transmisión. 4.4.2. Métricas de calidad perceptual de video La calidad del video depende, a fin de cuentas, de la percepción del usuario que se encuentra en el lado receptor del mismo. Bajo este concepto, no es posible medir de forma objetiva la mejora o deterioro producido por cambios realizados a la aplicación durante el proceso de experimentación. El enfoque de esta etapa del trabajo en la memoria actual fue precisamente lograr ese fin, desarrollar una métrica de calidad de video que permita comparar resultados de transmisión. 24 Función stats_update_bytes Descripción Actualiza la cantidad de bytes recibidos de acuerdo a la información contenida en el header length del paquete. Dicho valor considera tanto el tamaño del header como el de los datos contenidos en el paquete. stats_update_packets Actualiza la cantidad de paquetes recibidos. Es equivalente a incrementar un contador cada vez que se recibe un nuevo paquete. stats_update_packet_loss Actualiza la cantidad de paquetes perdidos. Esta información se obtiene utilizando la secuencia del paquete contenida en el header del mismo. Si la diferencia entre el paquete actual y el recibido anteriormente es mayor que 1 entonces se determina que se perdieron paquetes y se realiza esta invocación. stats_update_v_blk_loss Actualiza la cantidad de bloques virtuales perdidos. Dentro de los datos de cada paquete se incluye información respecto a la secuencia en el cuadro del bloque virtual que se está recibiendo actualmente. De la misma forma que la función anterior, si la diferencia entre dos paquetes consecutivos es mayor que 1, entonces se considera el bloque virtual como perdido y se realiza este llamado. stats_update_frame Realiza varios procedimientos: calcula el tiempo de procesamiento del cuadro completo, determina si hubo pérdida de cuadros desde la última actualización y decide qué hacer con los datos recolectados desde ésta, ya sea desplegarlos en pantalla o almacenarlos en un archivo CSV. Por último, vuelve los valores a cero para la siguiente recolección. Cuadro 4.2: Detalle procedimientos de recopilación de datos Existen trabajos desarrollados en términos de métricas de calidad. Particularmente interesante es el descrito en el documento Blind Measurement of Blocking Artifacts in Images [14]. Este propone un algoritmo de medición de blockiness (defecto producido en la imagen por aproximaciones realizadas durante la compresión). Este algoritmo sólo requiere del flujo recibido de video para operar y simula el deterioro del video como la interferencia de una señal en la recepción (blocky signal). Utilizando FFT (Fast Fourier Transform) mide la intensidad de esa señal entregando un valor de calidad de video. Durante esta etapa del trabajo, se realizó un estudio sobre transformada de Fourier para analizar su posible aplicación a una métrica. Se investigó acerca de la aplicación de transformada discreta de Fourier y tranformada discreta de coseno al procesamiento y compresión de imágenes [2]. Debido a que las técnicas de compresión y distribución de contenido incorporadas al codec desarrollado, son distintas de las utilizadas para otras aplicaciones del mismo tipo, se determinó que no era posible aplicar tales herramientas al desarrollo actual en un corto plazo y sin salirse del alcance 25 Figura 4.4: Ejemplo de errores producidos por pérdidas de un trabajo de memoria. Por esta razón se decidió estudiar otras alternativas que se detallarán a continuación. Detección de errores en la imagen Con el algoritmo de transmisión utilizado, las pérdidas generadas en la imagen son claramente identificables como un haz de pixeles, los cuales presentan un color distinto al del fondo de la imagen. En la figura 4.4, se puede apreciar que un movimiento brusco del sujeto deja como consecuencia un halo de pixeles del color del objeto en movimiento (las manos en este caso). Utilizando este conocimiento, es posible desarrollar un algoritmo de escaneo de la imagen, que detecte los pixeles que presentan alguna diferencia con sus vecinos superior a algún umbral. Es decir, para detectar errores se puede partir de la hipótesis, de que la distribución de valores entre pixeles vecinos en una imagen es relativamente uniforme. Este enfoque fue el utilizado para el desarrollo de una métrica de calidad. 26 (a) Imagen (b) Grafico Figura 4.5: Ejemplo de gráfico de errores en la aplicación Graficación de errores Con el propósito de determinar el modo de funcionamiento de una técnica de detección de errores, fue necesario incorporar al cliente de video un módulo que permitiera graficar cada uno de los errores detectados. Para lograr esto se utilizó la biblioteca libplot que forma parte del proyecto GNU plotutils [3]. Con el algoritmo desarrollado, es necesario recorrer todos los pixeles de la imagen para detectar cuáles son los erróneos. En una ventana externa a la de video, utilizando libplot, se pinta cada uno de estos errores detectados de un color diferente al del fondo, de esta manera, si la detección es satisfactoria, el patrón producido por el error en la ventana de video, debe ser similar o idéntico al producido en la ventana de errores. En la figura 4.5, se observa la detección de errores con una de las técnicas probadas y su correspondiente gráfico. El valor numérico en el gráfico corresponde al porcentaje de error entregado por la métrica para el cuadro desplegado. Como el esquema utilizado se basa en comparación de pixeles con vecinos, es posible que puedan ocurrir algunos falsos positivos. Si se tiene un objeto que presenta mucho contraste con el fondo, como un cuadrado negro sobre un fondo blanco, al comparar colores en los bordes del cuadrado, estos serían detectados como pixeles erróneos por un algoritmo muy simplista. Uno de los factores considerados al probar distintas técnicas fue la cantidad de falsos positivos generados por cada una, de manera que al menos éstos puedan ser despreciados. Asimismo, se consideraron también los falsos negativos, o errores no detectados, dentro de la evaluación de las mismas. 27 Tres técnicas distintas fueron evaluadas para la comparación entre pixeles: Distancia promedio a vecinos, distancia a mediana de los vecinos y distancia a vecinos más cercanos. A continuación se explicará y detallará cada una de éstas. Distancia promedio a los vecinos Para esta implementación se definió el concepto de distancia de colores. El concepto es bastante intuitivo, la distancia en colores entre dos pixeles corresponde a "la suma de los cuadrados de las diferencias entre sus respectivas componentes", es decir, es equivalente a: (Y1 − Y2 )2 + (U1 − U2 )2 + (V1 − V2 )2 (4.2) Y, U, V corresponden a los valores de componentes de color del pixel en el espacio YUV. Para calcular la distancia entre pixeles, primero es necesario convertir dichas componentes desde RGB. En el sistema YUV se separa color (U, V) de la luminancia Y. El ojo humano es mucho mas sensible a las variaciones de luz que de color. La razón por la cual se escogió YUV en vez de RGB, fue para evitar que el resultado de la métrica se viese alterado por variaciones poco sensibles al ojo humano (U,V). En la técnica de distancia promedio, para cada pixel de la imagen se calcula la distancia de color con cada uno de sus vecinos, si el promedio de estas distancias supera un cierto valor umbral (11000), entonces se considera el pixel como erróneo. Dicho umbral fue escogido como el que generara menor cantidad de falsos positivos, determinados a partir de la observación del gráfico. En la figura 4.6 se observa el resultado obtenido por este método. El mayor problema detectado fue que, si la diferencia en intensidad entre los pixeles erróneos y la imagen no es suficientemente grande, se producen falsos negativos, es decir, pixeles no reconocidos como erróneos. 28 (a) Imagen (b) Gráfico Figura 4.6: Distancia promedio a los vecinos Distancia a mediana de los vecinos Para esta técnica fue necesario definir el concepto de módulo de color. De manera similar a la distancia de colores, este consiste en la "suma de los cuadrados de los componentes de color", es decir, equivale a: R 2 + G2 + B 2 (4.3) R, G, B corresponden a los valores de los componentes de color del pixel en el espacio RGB. El nombre módulo de color tiene relación con que si se interpreta el color del pixel como un vector de 3 componentes, entonces el valor retornado por esta fórmula corresponde al largo del vector (módulo) elevado al cuadrado. En la técnica de distancia a mediana, para cada pixel de la imagen se obtienen los vecinos y se calcula el módulo de color de cada uno de éstos. Utilizando estos valores se obtiene la mediana del conjunto, es decir se extrae el valor en el punto medio de grupo, ordenando numéricamente los pixeles. Si la diferencia de la mediana con el módulo del pixel evaluado es mayor que un cierto umbral (55000), entonces se considera como un error. En la figura 4.7 se pueden observar los resultados obtenidos por este método. 29 (a) Imagen (b) Gráfico Figura 4.7: Distancia a mediana de los vecinos El mayor defecto de esta técnica, es que, a pesar de detectar de mejor manera los errores que el método anterior, de acuerdo a la observación de los gráficos, presenta demasiados falsos positivos para ser ignorado, incluso modificando el valor umbral. Haciendo un análisis más profundo del funcionamiento de este algoritmo, se llega a la conclusión que el módulo no es un buen factor de comparación. Esto se debe a que, particularmente en RGB, muchas combinaciones retornan el mismo valor. Por ejemplo, si se calcula el módulo para los valores extremos de este modelo, rojo, verde y azul, se obtiene: |R|2 = 2552 + 02 + 02 = 65025 |G|2 = 02 + 2552 + 02 = 65025 |B|2 = 02 + 02 + 2552 = 65025 (4.4) (4.5) (4.6) Los valores resultado son idénticos, lo que implica además la alta probabilidad de falsos negativos, es decir, considerar que colores totalmente diferentes tienen una diferencia nula, de acuerdo a este método. 30 (a) Posible pixel erróneo (b) Posible falso positivo Figura 4.8: Casos posibles de evaluación Distancia a vecinos más cercanos Esta técnica corresponde a la más simple de las evaluadas, funciona calculando las distancias del pixel evaluado con sus vecinos inmediatamente superior e izquierdo, respectivamente. Cada distancia es comparada independientemente con un valor umbral, si ambas superan dicho umbral a la vez, entonces se considera que el pixel es erróneo. Este método es equivalente a evaluar diferencias en cada fila y cada columna de pixeles de la imagen, en caso de encontrar una desviación muy grande de la curva obtenida, tal como se muestra en la figura 4.8(a), es razonable considerar al pixel como posibilidad de error. Para obtener un grado de certeza en la evaluación es necesario entonces, intersectar la fila y columna correspondiente a este punto. Si se considerase sólo un eje se podrían observar casos de mucho contraste, como el mostrado en la figura 4.8(b), la cual generaría un falso positivo. Los resultados obtenidos con este algoritmo, mostrados en la figura 4.9, son los más satisfactorios de las tres técnicas probadas, de acuerdo a las observaciones de los gráficos, aunque aún puede observarse cierta cantidad de falsos positivos, éstos pueden ser considerados despreciables. 31 (a) Imagen (b) Gráfico Figura 4.9: Distancia a vecinos más cercanos Definición de Métrica De acuerdo a las pruebas realizadas, el método con mejores resultados fue el de distancia a vecinos cercanos. El nivel de degradación de la imagen es calculado entonces como la razón entre la cantidad de pixeles erróneos detectados, a la cantidad de pixeles totales de la imagen, es decir: Calidad = 1 − Errores Ancho ∗ Alto (4.7) En cada una de las imágenes de demostración de las técnicas se puede observar un valor en la esquina superior derecha, ese valor corresponde a la degradación porcentual del video calculada mediante el método correspondiente. Con la determinación de una métrica de calidad de video, es posible entonces realizar experimentos y comparaciones entre las distintas versiones de la aplicación y demostrar el avance efectivo en ésta. Este criterio será el utilizado de aquí en adelante. 32 4.5. Corrección de errores El último objetivo del trabajo de memoria actual, consiste en desarrollar un método satisfactorio para corrección (ocultamiento) de errores. Dentro de esta etapa del trabajo, se estudiaron diversas investigaciones actuales con tal enfoque, en particular destaca [10] en donde se presentan algunas técnicas de interpolación de pixeles y bloques para flujos de video. De la misma manera que con métricas de calidad, el esquema de procesamiento y transmisión utilizado en el codec actual hace que la aplicación de estas técnicas sea poco factible. Para ocultar efectivamente los errores de la imagen recibida, se probaron varias técnicas distintas, que funcionan bajo el mismo concepto. Al momento de reconstruir la imagen a partir de los paquetes recibidos, es fácil saber cuáles pixeles no fueron posibles de actualizar, por no tener disponible el paquete correspondiente. Cada uno de estos pixeles no actualizados, es calculado a partir del valor sus vecinos, a la manera de un filtro de imagen. Para el cálculo realizado, no es necesario saber si los pixeles colindantes son correctos, ya que los filtros se enfocan en calcular el valor más probable para el pixel perdido. 4.5.1. Aplicación de prueba de técnicas Con el fin de observar con mayor facilidad el funcionamiento de cada técnica, se desarrolló una aplicación de pruebas. Esta aplicación captura video desde la cámara o un archivo y permite observar una imagen en tres estados distintos: 1. Imagen Original: Es equivalente a pausar la transmisión (tomar una fotografía de la captura de video), el propósito es permitirle al usuario observar la imagen ideal a recibir. 2. Imagen con pérdidas: Simula pérdidas sobre un porcentaje de bloques y pixeles por bloque indicado inicialmente. Los pixeles perdidos pueden ser reconocidos como puntos negros en la imagen, para permitir observar correctamente el deterioro causado. 3. Imagen corregida: Se corrigen los errores generados anteriormente en la imagen, utilizando alguna de las técnicas indicadas al iniciar la aplicación. Los pixeles perdidos son determinados y recorridos tal como se hace en el programa cliente. Finalmente muestra el resultado de la corrección. 33 La aplicación fue desarrollada para poder comparar de manera visual las mejoras introducidas por cada una de las técnicas de corrección, ya que tal comparación no era posible de realizar de manera confiable y en el nivel de detalle deseado, al mirar una imagen con movimiento. 4.5.2. Corrección de errores por promedio Reemplaza el valor del pixel por el color promedio de los pixeles colindantes. Las componentes del rojo, verde y azul en el espacio RGB de cada uno de los vecinos son sumadas y divididas por el total de pixeles para obtener el valor de cada componente del pixel perdido. La justificación para este método es que la variación de valor entre pixeles colindantes es, en general, suficientemente pequeña, por lo que es posible reemplazar el valor de un pixel determinado por el del promedio de sus vecinos. En la figura 4.10 se pueden observar los resultados de aplicar el filtro a una imagen con errores. En la imagen 4.10(b) se simularon pérdidas de bloques del 50 % y 25 % de pixeles por paquete, lo que es equivalente a una pérdida de datos de un 25 %. Bajo las condiciones mencionadas, el resultado obtenido es aceptable, pero los errores nunca son ocultados completamente, incluso en pruebas con menores niveles de pérdidas, el efecto observado es similar a difuminar (blur) los errores de la imagen. 34 (a) Original (b) Pérdidas (c) Corregida Figura 4.10: Resultados corrección por promedio 4.5.3. Corrección de errores por mediana de módulo En esta técnica, el valor del pixel perdido es reemplazado por el valor del pixel cuyo módulo es la mediana de los vecinos. Los pixeles colindantes son ordenados de acuerdo a su módulo de color y las componentes R, G y B del pixel perdido son reemplazadas por las componentes R, G y B del punto medio del conjunto. Este método puede ser justificado, a partir de la suposición de que los valores escalares (módulos) entre pixeles vecinos son similares, por lo que sería factible reemplazar el pixel perdido por el del punto medio de los pixeles circundantes a éste. En la figura 4.11 se pueden observar los resultados obtenidos por el filtro. El efecto obtenido no es tan bueno como con el filtro de promedio. Se puede observar que no sólo los errores persisten después de la corrección, sino que éstos son agrupados en áreas mas densas, siendo aún mas 35 notorios en la imagen final. En pruebas experimentales, se pudo observar que tal efecto es aún mas dramático si se aumentan los porcentajes de pérdidas de pixeles. Este resultado induce a descartar la suposición inicial. Como se mencionó anteriormente, el módulo de color no es una buena medida de comparación, ya que varios distintos combinaciones de componentes retornan el mismo valor (por ejemplo rojo, verde y azul). (a) Original (b) Pérdidas (c) Corregida Figura 4.11: Resultados corrección por mediana de módulo 4.5.4. Corrección de errores por mediana de componentes En esta técnica, cada componente del espacio RGB es calculada para el pixel perdido como la mediana de la componente respectiva de los pixeles colindantes. Este método es inspirado en el filtro de mediana utilizado para reducción de ruido en algunas aplicaciones de edición de imágenes. En la figura 4.12 se pueden observar los resultados de aplicar esta técnica. Se puede notar que los errores son casi totalmente corregidos, sólo quedando algunos defectos en la imagen donde había 36 mayor concentración de éstos. Bajo mayores niveles de pérdidas de pixeles se obtienen resultados parecidos a los de mediana de módulo, sin embargo, a simple vista este método muestra mejoras considerables respecto a los anteriores. (a) Original (b) Pérdidas (c) Corregida Figura 4.12: Resultados corrección por mediana de componentes 4.5.5. Corrección de errores probabilística Este método utiliza el concepto de histograma de color. Se considera una matriz de 5x5 pixeles centrada en el pixel perdido. La información de color de los 24 pixeles escogidos es agrupada en conjuntos de acuerdo a la tabla 4.3. El conjunto con más elementos es el que tiene mayor probabilidad de contener al pixel perdido. Las componentes de color de éste, son reemplazados respectivamente por la componente promedio de los pixeles en el conjunto escogido. Esta técnica es inspirada por el filtro de reducción de ruido basado en histograma descrito en [19]. 37 Azul (B) Rojo (R) 0 - 127 0 - 127 5 128 - 255 8 128 - 255 9 2 Cuadro 4.3: Agrupación de pixeles En la figura 4.13 se puede observar que la mayoría de los errores son ocultados correctamente por este método, retornando resultados satisfactorios. El mayor problema observado se produce en las partes de la imagen en que hay un cambio drástico de colores, como en los bordes de alguna figura. Debido al modo de funcionamiento del algoritmo, el color en esas secciones no puede ser bien definido por lo que se produce una pérdida de información en éstas. El efecto se hace más drástico cuando se aumentan las pérdidas de pixeles. (a) Original (b) Pérdidas (c) Corregida Figura 4.13: Resultados corrección probabilística 38 4.5.6. Resultados En términos comparativos, se encontraron dos técnicas que sobresalen del resto en términos de la calidad obtenida en el video tras la corrección de errores. Éstas son corrección de errores probabilística y corrección de errores por mediana de componentes. Ambas técnicas logran corregir errores casi completamente bajo condiciones de 25 % de pérdidas. Sólo análisis más profundos podrán determinar cuál se comporta mejor utilizada en la recepción de video y bajo distintas condiciones. En el siguiente capítulo precisamente se realizarán dichos análisis. 4.6. Resumen Durante el desarrollo del trabajo de la memoria se hicieron diversas modificaciones al código fuente de la aplicación con diversos propósitos. Lo primero fue agregar mantenibilidad y modularidad al código para una mayor facilidad de modificación. A continuación se incorporaron las herramientas autoconf y automake para hacer más sencilla la compilación y versionamiento de la aplicación. En lo que respecta al trabajo en los objetivos de la memoria, se incorporó metricas de calidad de red y de calidad perceptual de video a la aplicación para ser utilizadas como apoyo a la experimentación. En el último tipo de métrica, diferentes técnicas fueron probadas, en base a detección de pixeles perdidos (ver cuadro 4.4), destacándose la de distancia a vecinos cercanos, la cual detecta errores en la imagen comparando cada pixel con sus vecinos cercanos detectando variaciones en sus distancias. También se incorporó un módulo de corrección de errores a la aplicación, este permite ocultar los errores producidos por pérdidas de paquetes de hasta 25 %. Diversas técnicas fueron probadas (ver cuadro 4.5) , encontrándose dos que entregaban resultados similarmente satisfactorios: corrección de errores probabilística y corrección de errores por mediana de componentes. Análisis más profundos permitirán determinar cuál de las dos funciona mejor en la mayor cantidad de condiciones. 39 Métrica Distancia promedio a vecinos Resultados satisfactorios No Distancia a mediana de vecinos No Distancia a vecinos más cercanos Si Detalles Pocos falsos positivos. Falsos negativos donde diferencia de color no es significativa Detección satisfactoria de errores. Cantidad de falsos positivos muy alta para ser ignorada. Mejores resultados. Detección satisfactoria de errores. Cantidad de falsos positivos despreciable. Cuadro 4.4: Comparación de resultados entre técnicas de detección de errores Técnica Promedio Resultados satisfactorios No Mediana de módulo No Mediana de componentes Si Probabilística Si Detalles Errores no son ocultados completamente. Efecto difuminación de errores. Errores no son ocultados completamente. Efecto de agrupación de errores en áreas mas densas. Corrección satisfactoria, errores eliminados casi completamente. Corrección satisfactoria, errores eliminados casi completamente. Perdida de información en zonas donde hay cambio drástico de color. Cuadro 4.5: Comparación de resultados entre técnicas de corrección de errores 40 Capítulo 5 Análisis Se realizaron diversas pruebas locales para analizar las mejoras en la calidad de la imagen, incorporadas por las técnicas de corrección de errores y para realizar una comparación efectiva entre ellas. El parámetro de análisis considerado fue el nivel calidad de video, valor obtenido a partir de la utilización de la métrica definida. Para mantener las mismas condiciones de ejecución durante las diversas pruebas a realizar, se capturaron dos secuencias de video para ser utilizadas reiteradamente en las evaluaciones. Cada una tiene una duración aproximada de 25 segundos. La primera secuencia contiene movimiento lento, principalmente de la boca del sujeto en video conferencia, se requiere poco ancho de banda, por lo que hay poca posibilidad de pérdidas. La segunda contiene una mayor cantidad de movimientos rápidos, principalmente mucha expresión con las manos, se demanda gran cantidad de ancho de banda y de capacidad de procesamiento por lo que hay mayor posibilidad de pérdidas. Debido a que las pruebas son locales, no se producen pérdidas de red y sólo se producen algunas debido a la capacidad de procesamiento del equipo. Para simular ambientes de pérdidas controlados, la aplicación puede descartar paquetes al momento de envío con una cierta probabilidad, para alcanzar algún nivel establecido. La probabilidad de perder un paquete es uniforme, es decir, se calcula sin dependencia de paquetes anteriores. Por ejemplo, si se desea obtener pérdidas de 30 %, entonces al momento de enviar un paquete particular, este es descartado con esa probabilidad (aproximadamente 1/3 de las veces). Una simulación más realista podría ser realizada a partir del desarrollo de un modelo de pérdidas para el estado actual de Internet, sin embargo, tal estudio 41 se encuentra fuera del ámbito de esta memoria. Con el fin de realizar gran cantidad de pruebas, se creó una pequeña aplicación en Perl que se encarga de ejecutar el cliente y el servidor para distintos niveles de pérdidas y almacenar los datos en una ubicación específica para su posterior análisis. La configuración utilizada fue considerada para pérdidas entre 0 % y 35 %. El tamaño del video de prueba es 352x240, tamaño que permite un consumo de ancho de banda razonable (1 MByte/s) a 30 cuadros por segundo. Entre las pruebas realizadas no se tomó en cuenta la cantidad de información transmitida, por no tener reelevancia para los objetivos esperados de la memoria actual. 5.1. Métodos de corrección Se evaluó la calidad del video utilizando la métrica definida para pérdidas entre 0 y 35 % para 3 casos distintos: recepción de video sin corrección, utilizando técnica probabilística de corrección y utilizando técnica de mediana de componentes. Dicha comparación fue realizada para las dos secuencias de video mencionadas anteriormente. En las figuras 5.1 y 5.2 se puede observar los resultados del experimento realizado. Se puede notar una clara diferencia entre los porcentajes de error detectados para las 3 evaluaciones distintas. El método mediana de componentes, resulta ser el que retorna mejores resultados, pero claramente el método probabilístico introduce grandes mejoras a la visualización de la imagen, confirmando lo esperado de acuerdo a experiencias anteriores. El valor retornado por la métrica en general es pequeño, sin embargo, un error de 1,71 %, como el máximo de la prueba sin corrección de errores (figura 5.2), significa que 1,71 ∗ 352 ∗ 240/100 = 1444,6 pixeles fueron encontrados erróneos. Si se realiza el cálculo para el mismo punto utilizando corrección por mediana, se obtiene que 0.48 % de error corresponde a 411 pixeles erróneos, es decir se obtuvo una mejora de al menos un 60 %. El mismo valor puede obtenerse al aproximar las curvas por una recta, tal como se muestra en la figura 5.3. La pendiente de la recta indica la razón de aparición de errores para cada nivel de pérdidas, esto implica que a menor pendiente, es menor el efecto de las pérdidas sobre el video recibido. El cambio de la pendiente desde 0.0452 (sin corrección) a 0.0129 (corrección por mediana) indica una mejora de más de un 60 % en la calidad general del video. 42 Al examinar el video recibido simulando pérdidas sobre 25 %, se puede observar una pérdida de precisión en el funcionamiento del algoritmo de corrección. Esto ocurre porque en la medida que las pérdidas aumentan, también aumenta el porcentaje de pixeles no actualizados sobre los macrobloques, llegando incluso a producirse pérdidas de macro-bloques completos. Como las técnicas de corrección utilizan la información de los vecinos cercanos para realizar la interpolación, entonces grandes pérdidas de pixeles implican que no se pueda realizar este proceso correctamente, produciéndose un efecto de atenuación de límites entre bloques, lo cual contribuye de manera negativa a la calidad final de la imagen. Bajo 25 % de pérdidas, sin embargo, los resultados obtenidos por la técnica son satisfactorios para el objetivo de la memoria actual. 43 Figura 5.1: Comparación entre técnicas de corrección para secuencia lenta Figura 5.2: Comparación entre técnicas de corrección para secuencia rápida 44 Figura 5.3: Aproximación de curvas de error por rectas. 45 5.2. Métrica de Calidad A partir de la información obtenida para la evaluación de calidad de video, se puede también realizar un análisis de la métrica de calidad. En los gráficos se puede observar que para 0 % de pérdidas, el valor retornado por la métrica es distinto de cero, tal como era esperado de acuerdo al modo de funcionamiento de la misma. Los valores obtenidos, 0.091 % para la secuencia lenta y 0.042 % para la secuencia rápida, corresponden a los falsos positivos detectados por la métrica para cada video. Como la aplicación está pensada principalmente para video conferencia, el entorno dentro de la imagen nunca cambia completamente, por lo que se puede asumir que los falsos positivos son, en general, constantes y por lo tanto despreciables. Para analizar el comportamiento de la métrica a lo largo de una secuencia de video, se comparó el valor retornado por ésta para cuatro niveles de pérdidas distintos: 10 %, 15 %, 20 % y 25 %, a lo largo de cada una de las secuencias de video (utilizando corrección). En las figuras 5.4 y 5.6 se muestran los resultados obtenidos para la secuencia rápida y lenta, respectivamente. A partir del gráfico y la observación del video, se puede notar que el comportamiento de la métrica es consistente con los niveles de movimiento en la imagen. En la secuencia lenta, hay una cantidad considerable de movimiento al inicio y luego sólo movimiento de los labios del sujeto. En el gráfico correspondiente (5.6), se observa el mismo comportamiento, un alza importante en el valor de la métrica al inicio y un comportamiento relativamente uniforme a continuación. Este efecto también puede ser apreciado para la secuencia rápida, las alzas mostradas en el gráfico, coinciden con segmentos de video con mayor cantidad de movimiento. Esto es de esperar por el modo de funcionamiento de la aplicación. Las pérdidas producen un daño mayor en secuencias con cambios muy repentinos, debido a que las diferencias entre cuadros consecutivos son muy grandes. Al estabilizarse la escena, la calidad mejora lentamente en la medida que los macro-bloques faltantes van llegando. Este comportamiento puede observarse al hacer un acercamiento en el gráfico para un error particular, como el ocurrido para la secuencia rápida a los 12.2 segundos, tal como se muestra en la figura 5.5. En los gráficos mencionados anteriormente, puede observarse tambien, que tal como es esperable, el valor de la métrica aumenta en la medida que el nivel de pérdidas es incrementado. Dicho aumento muestra ser bastante uniforme para distintos niveles, mostrando sólo algunas variaciones que pueden ser explicadas por cambios en el uso del procesador de la máquina. En la figura 5.7 se puede ver el comportamiento de la métrica durante el tiempo con y sin corrección, para un nivel de pérdidas de 20 %, para la secuencia rápida. Como es de esperarse, las curvas son bastante similares, presentando alzas semejantes en los mismos instantes de tiempo, pero desfasadas en los valores de error como causa de la corrección. 46 Para pérdidas superiores a 25 %, la probabilidad de perder bloques completos aumenta. Debido al modo de funcionamiento de la métrica, esto resulta en pérdida de confiabilidad de los resultados retornados por ésta, ya que sólo son detectados como erróneos los pixeles en los bordes de los bloques perdidos, adicionalmente a los pixeles no actualizados de manera individual. Sin embargo, para el propósito de la memoria actual, un nivel de 25 % es considerado como pérdidas masivas ya que implica que uno de cada cuatro paquetes no pudo ser recibido, lo cual supera los umbrales actuales en Internet. Con respecto al rendimiento, el procedimiento para calcular la métrica resulta ser muy demandante de recursos, ya que se debe analizar la imagen completa, pixel por pixel, 30 veces por segundo. Esto presenta un aspecto negativo sobre la técnica utilizada. Durante la recepción, si se despliega la imagen en pantalla y a la vez se analiza la misma, el tiempo que se tarda en realizar ambos procedimientos resulta en un aumento de las pérdidas de paquetes, por no poder procesarlos en la medida que son recibidos. Para realizar los análisis, fue necesario omitir el despliegue de imagen, y trabajar sólo sobre los datos almacenados tras la ejecución. La incorporación de la métrica, en el estado actual de la capacidad de procesamiento, tiene utilidad para fines de experimentación, pero no realmente para su uso permanente. 47 Figura 5.4: Comparación entre errores a 4 niveles de pérdidas en secuencia rápida 48 Figura 5.5: Amplificación de un error detectado por la métrica a 4 niveles de pérdidas en secuencia rápida 49 Figura 5.6: Comparación entre errores a 4 niveles de pérdidas en secuencia lenta 50 Figura 5.7: Valores de métrica para secuencia rápida con y sin corrección para pérdidas de 20 % 51 5.3. Resumen Se realizaron pruebas para determinar la calidad del video mediante la métrica utilizando niveles de pérdidas entre 0 y 35 % para tres casos distintos: sin efectuar corrección, corrección por técnica probabilística y corrección por método de mediana de componentes. Las pruebas fueron realizadas utilizando dos secuencias de video, una con gran cantidad de movimiento y otra con movimiento moderado. Los resultados obtenidos fueron los esperados de acuerdo a las hipótesis iniciales. La técnica de corrección por mediana introdujo una mejora en la calidad de aproximadamente un 60 % y la técnica probabilística de aproximadamente un 30 %. Se determinó también que ambos resultados son confiables bajo niveles de pérdidas de 25 %, lo que resulta altamente satisfactorio para los objetivos de la memoria. La métrica desarrollada también mostró ser congruente con lo esperado. El valor retornado por ésta aumenta en la medida que se detectan más pérdidas, tanto en promedio, como durante el transcurso de una secuencia de video particular. Como lado negativo, se observó que la aplicación de esta medición resulta en un gran consumo de recursos, lo cual tiene el efecto contraproducente de generar pérdidas cuando se combina su uso con el despliegue de video. Sin embargo, para propósitos experimentales, los resultados retornados por ésta mostraron ser de gran utilidad para los análisis. En términos generales, se puede considerar que los resultados obtenidos son congruentes de manera satisfactoria con los objetivos deseados. Es posible, de manera simple, disminuir el impacto producido por pérdidas de paquetes en la recepción de video. Sin agregar redundancia ni información extra en los datos enviados. 52 Capítulo 6 Mejoras finales y trabajo relacionado Tras la realización de los análisis de calidad, se procedió a realizar algunos cambios en la aplicación de video con el fin de mejorar otros aspectos de la misma. En particular se concentraron los esfuerzos en disminuir de alguna forma el ancho de banda requerido para la transmisión de video. En este aspecto, se hicieron algunas modificaciones a la detección de movimiento en el servidor, así como agregar la posibilidad de limitar la tasa de captura de cuadros de video. Ambas secciones del procesamiento tienen relación directa con el uso de ancho de banda. Una mejor detección de movimiento permite transmitir sólo la información efectivamente modificada durante la captura y tal como fue estudiado en trabajos de memoria anteriores, la tasa de captura tiene una razón directamente proporcional con el ancho de banda utilizado [4]. Trabajo adicional fue realizado, en términos de poder estudiar el funcionamiento de la aplicación en otras plataformas de software y de hardware. Con este fin se desarrolló una versión del cliente en el lenguaje Java para portabilidad entre plataformas. Utilizando este código, se desarrolló una versión empleando J2ME para estudiar el funcionamiento del cliente en dispositivos portátiles como teléfonos celulares. 53 6.1. Detección de movimiento en YUV El modelo de colores YUV, basado en las componentes de luminosidad y crominancia del color visible, tiene su fundamento de manera muy cercana a la fisiología de la visión humana. El trabajo realizado por Alvise Bolsi [1], demostró que realizar detección de movimiento utilizando este modelo retornaba mejores resultados en términos de cantidad de macro-bloques transmitidos, incurriendo en una disminución del ancho de banda requerido por la aplicación. La explicación de esto es que el ojo humano es mucho más sensible a los cambios de luminosidad que de color, con lo que la detección de movimiento utilizando este sistema se hace mucho más precisa. Con el fin de incorporar algunas de las mejoras alcanzadas en dicho trabajo, se efectuaron modificaciones al módulo de detección de movimiento de la aplicación. Una conversión de espacio de color desde RGB fue realizada, con el fin de obtener la componente Y (luminancia) del modelo, la fórmula general para la transformación de componentes desde RGB a YUV es la siguiente. Y = +0,299 ∗ R + 0,587 ∗ G + 0,114 ∗ B U = −0,14713 ∗ R − 0,28886 ∗ G + 0,436 ∗ B V = +0,615 ∗ R − 0,51499 ∗ G − 0,10001 ∗ B (6.1) (6.2) (6.3) Dicha fórmula requiere del uso de coeficientes de punto flotante para la conversión, lo cual resulta en una disminución del desempeño de la aplicación completa, por la ineficiencia en general de los procesadores para manejar este tipo de valores. Sin embargo es posible realizar dicha conversión sin la necesidad de utilizar valores decimales. A partir de la siguiente fórmula es posible realizar dicho procedimiento, haciendo uso sólo de valores enteros [16]. Y = min(abs(R ∗ 2104 + G ∗ 4130 + B ∗ 802 + 4096 + 131072) >> 13, 235) U = min(abs(R ∗ −1214 + G ∗ −2384 + B ∗ 3598 + 4096 + 1048576) >> 13, 240) V = min(abs(R ∗ 3598 + G ∗ −3013 + B ∗ −585 + 4096 + 1048576) >> 13, 240) (6.4) (6.5) (6.6) Para realizar detección de movimiento, sólo es necesario tener la componente Y de cada pixel. 54 Utilizando la fórmula descrita, se logró realizar la detección de movimiento sin afectar de manera notoria el rendimiento del servidor de video. La fórmula utilizada para detectar movimiento en RGB (ecuación 4.1) se convierte entonces en: 64 ! j=1 (Yi,j − Yi−1,j )2 (6.7) En donde i es el número del cuadro de video capturado y j es el número de pixel dentro de un macro-bloque. Con el cambio realizado se logró reducir el uso de ancho de banda en aproximadamente un 60 %, de un promedio de 3 MBytes/segundo se disminuyó a 1MByte/segundo, con un mínimo de 300 KBytes/seg para secuencias con bajo movimiento, sin alterar la calidad del resultado final. 6.2. Limitación de tasa de captura de video La tasa de captura de cuadros de video (framerate) tiene una relación lineal con el ancho de banda requerido por la aplicación, tal como fue estudiado en el trabajo realizado por Cristián Junge. Aunque la tasa de reproducción de video más congruente con el modo de funcionamiento de la visión humana es 30 cuadros por segundo, pueden haber casos en donde sea razonable sacrificar fluidez de video por ancho de banda. Se realizó una modificación al servidor de video, la cual a partir de un parámetro definido en el archivo de configuración de la aplicación, permite bajar la tasa de captura de cuadros, introduciendo un tiempo de espera al final del procesamiento de cada imagen. El resultado obtenido fue satisfactorio, una reducción de la tasa de captura en un 50 %, tiene como resultado la reducción del ancho de banda requerido por la aplicación en un 50 %. Esta modificación tiene especial importancia si se desea utilizar la aplicación bajo otras redes, tales como GSM (GPRS o EDGE), donde los anchos de banda soportados son mucho menores, y la capacidad de los procesadores en los terminales es muy baja, en cuyo caso sería factible sacrificar 55 algo de fluidez de video para mejorar la calidad general del mismo, al disminuir las pérdidas de paquetes. 6.3. Cliente Java Para aplicaciones de transmisión multimedia, en particular para video-conferencia, portabilidad entre distintas plataformas se transforma en una ventaja importante, más aún si se desea realizar una versión utilizable por el público general. Con el propósito de analizar el funcionamiento en otras plataformas, se desarrolló una versión del cliente utilizando lenguaje de programación Java, el cual permite la ejecución de la aplicación de manera casi independiente de la plataforma de hardware y software utilizada. Como dicho lenguaje es de más alto nivel que C, por consiguiente incurriendo en una degradación de eficiencia, se hace interesante estudiar el comportamiento de los algoritmos de recepción de video en esta nueva versión. El desarrollo del cliente fue relativamente directo, el algoritmo utilizado para reconstruir el video a partir de los paquetes recibidos, es relativamente simple de implementar utilizando Java. Sin embargo se encontraron varios desafíos con los que fue necesario lidiar durante el desarrollo. Extracción de información desde paquetes: De acuerdo a la forma en que se arman los paquetes en el servidor, primero se crea una estructura de datos en C, con la información en la cabecera del paquete, incluyendo un puntero a la sección en memoria que contiene la información propiamente tal de la imagen, para luego concatenar dicha información en el cuerpo del paquete. Esto tuvo la consecuencia que, para implementar la recepción, fue necesario realizar algunas pruebas para determinar qué partes de los datos recibidos correspondían a la cabecera y qué partes al cuerpo paquete. De dichas pruebas, se determinó que era necesario ignorar algunos bytes del mensaje para poder interpretarlo de manera exacta a como fue enviado. Aleatorización de pixeles Uno de los fundamentos de la aplicación desarrollada en C, es que el método de generación de números aleatorios es exactamente el mismo en el servidor que en el cliente, esto evita que se tenga que transmitir información respecto al orden de los pixeles dentro del paquete. Esta propiedad, sin embargo, no se cumple al cambiar el lenguaje de programación. Para mantener dicho fundamento, fue necesario implementar una función de números pseudo-aleatorios, incorporándola tanto al servidor como al cliente. Con esta modificación se logró extraer la información de orden de los pixeles en el cliente. 56 Conversión de RGB565 a RGB32: En el servidor, para disminuir la cantidad de bytes necesarios a enviar, se realiza una conversión de espacio de colores desde RGB32 a RGB565, de manera previa al envío. Esto tiene como resultado disminuir de 4 a 2 la cantidad de bytes necesarios para describir cada pixel. Al realizar la conversión inversa en Java, se observó que los colores verde y azul aparecían intercambiados en la imagen resultante. Se determinó que esto tiene relación con una diferencia en el orden de los bytes utilizados por el lenguaje, con el orden utilizado por la arquitectura del servidor. El problema fue resuelto fácilmente al intercambiar ambas componentes de color. Despliegue de imagen: A pesar que existe una biblioteca de Java especializada para multimedia, es una desventaja conocida que ésta no permite la reproducción de video a más de 15 cuadros por segundo, lo cual entra en conflicto con lo deseado para el cliente. Además, dado que el formato de video utilizado por la aplicación es distinto de cualquier formato conocido, entonces tampoco existe una forma de desplegar las imágenes utilizando tal biblioteca. Para lograr este propósito, se utilizaron algunas clases de bajo nivel de de Java (Canvas, Graphics) para crear una ventana y luego dibujar el contenido (el cuadro) directamente sobre ésta. Con esto se logró desplegar imágenes a la tasa deseada. La aplicación final desarrollada mostró bastante eficiencia en el despliegue de video en tiempo real, produciéndose sólo algunas pérdidas por capacidad de procesamiento del lenguaje, pero el resultado final es satisfactorio. En la figura 6.1 se puede ver la aplicación ejecutándose en el sistema operativo Mac OS X. De acuerdo a lo observado, es posible desarrollar una aplicación multi-plataforma utilizando el lenguaje Java. Cabe mencionar que no se incorporó corrección de errores a este cliente, sin embargo no se descarta la posibilidad de agregarlo. 57 Figura 6.1: Cliente Java ejecutándose en Mac OS X 6.4. Cliente J2ME Como se mencionó, evaluar el funcionamiento de la aplicación en distintas plataformas plantea un punto de vista interesante sobre los límites del funcionamiento y rendimiento de la aplicación cliente. De particular interés es probar la aplicación funcionando sobre dispositivos móviles, los cuales presentan capacidades de procesamiento y memoria más limitados que un computador de escritorio. Además presenta la posibilidad de ver el comportamiento del algoritmo de transmisión sobre otro tipo de redes, como la red celular (GSM). Con este fin se desarrolló una aplicación utilizando J2ME con MIDP 2.0 y CDLC 1.1. Debido al modo de funcionamiento del cliente Java, fue posible reutilizar la mayor parte de las componentes de software de éste para el desarrollo del cliente móvil. Sólo fue necesario realizar algunos cambios en la forma de recepción y de despliegue de video. Se requirió, sin embargo, realizar algunos cambios a la configuración por omisión de la aplicación. El máximo tamaño de bloque virtual fue modificado de 255 a 32, para disminuir el tamaño de los paquetes enviados. El tamaño de captura de video se redujo a 160x120, ya que no se necesita una resolución mayor para dispositivos móviles. Dentro de la aplicación cliente se incorporó una pantalla para modificar los valores de la configuración. Además se agregó una característica para permitir escalar el video a la pantalla en caso de recibirse un tamaño menor. Para probar el funcionamiento del cliente, se contó con dos equipos móviles Nokia, modelos 58 N73 y N91. Ambos cuentan con procesadores ARM compatible de 200 y 315 Mhz respectivamente, sistema operativo Symbian Series 60 3era edición y conectividad con redes GSM. Además el equipo N91 cuenta con conectividad via Wireless LAN. Utilizando conectividad por red inalámbrica, se pudo recibir el video en tiempo real, a 30 cuadros por segundo, sólo presentando algunos errores por pérdidas menores. Como era de esperar, al utilizar conectividad EDGE, se produjeron gran cantidad de pérdidas debido a las limitaciones de ancho de banda, mostrando que las limitaciones para ejecutar el cliente en equipos móviles, están asociadas a la velocidad de la conexión, más que a la capacidad de procesamiento. En la figura 6.2 se puede ver la pantalla de configuración de la aplicación. En 6.3 se puede ver el equipo recibiendo video desde el servidor utilizando red inalámbrica. Puede apreciarse que la transmisión es en tiempo real. En la figura 6.4 se puede ver el equipo recibiendo video desde el servidor utilizando red EDGE, se puede observar que la transmisión presenta un retraso con respecto a la imagen capturada en el servidor. 59 Figura 6.2: Pantalla de configuración funcionando en el equipo móvil Figura 6.3: Recepción de video en el equipo móvil utilizando red inalámbrica 60 Figura 6.4: Recepción de video en el equipo móvil utilizando EDGE 61 Capítulo 7 Conclusiones En este trabajo, se logró exitosamente ocultar errores producidos por pérdidas de paquetes IP, por consecuencia, aumentando la tolerancia de la aplicación a las mismas, sin aumentar la información transmitida. Con el fin de obtener datos formales para comparación a partir de las pruebas, se incorporó un módulo de estadísticas tanto a la aplicación servidor como cliente. Dicho módulo permitió recolectar información útil con respecto a cada cuadro desplegado, para su posterior análisis. Como la calidad del video recibido depende, a fin de cuentas, de la percepción del usuario final de errores en la imagen, no era posible realizar una comparación objetiva entre versiones de la aplicación de video. Este problema fue solucionado mediante el desarrollo de una métrica de calidad perceptual de video, basada en detección de errores por comparación entre pixeles. Ésta permitió asociar un valor numérico a la degradación en la imagen recibida, con lo cual fue posible evaluar las mejoras alcanzadas por el trabajo realizado. Para ocultar efectivamente los errores se requirió probar distintas técnicas. Cada una de éstas funciona mediante calcular el valor de un pixel no actualizado en base a la información de los pixeles circundantes a éste. Los métodos de corrección evaluados fueron: promedio de vecinos, mediana de módulo de vecinos, mediana de componentes de vecinos y probabilística. De acuerdo a una aplicación de pruebas realizada, las mejores resultaron ser las dos últimas. 62 Al ejecutar la aplicación bajo múltiples niveles de pérdidas y utilizando secuencias de video constantes, se obtuvo como resultado que la técnica de corrección por mediana de componentes producía una mejora de calidad mayor que la corrección probabilística. Se determinó incremento de calidad de aproximadamente 60 % con respecto a no utilizar corrección de errores, para pérdidas inferiores a 25 %. Como trabajo lateral, en términos de uso de ancho de banda, se logró reducir en 2/3 los requerimientos de red de la aplicación, mediante la utilización de detección de movimiento en el espacio de color YUV. Se logro una reducción desde 3 MBytes/s a 1 MByte/s promedio. Además se logró desarrollar una versión del cliente de la aplicación en Java para su utilización en diferentes plataformas. Se desarrolló también un cliente J2ME para su utilización en teléfonos celulares. El rendimiento mostrado por ambas aplicaciones fue satisfactorio, lográndose recibir video a 30 cuadros por segundo, al igual que con versiones anteriores. En definitiva se demostró que es posible corregir u ocultar errores de manera satisfactoria dentro de flujos de video, sin la necesidad de incorporar algún tipo de redundancia de datos, y sólo tomando como base la información ya existente en la imagen recibida. Este sistema fue instalado y demostrado en Entel PCS, generando muchas expectativas de parte de las áreas de ingeniería, y generando un proyecto de trabajo conjunto entre el DCC y Entel PCS en ésta área. 63 Capítulo 8 Trabajo Futuro Durante los diversos trabajos en la materia de estudio actual, numerosos avances han sido logrados, incluyendo los mostrados durante el trabajo actual. Sin embargo, aún quedan muchas posibilidades de mejoramiento, las que plantean desafíos interesantes de estudiar. Entre éstas se detallará particularmente compresión de imagen, para disminuir el ancho de banda requerido por la aplicación y la retro alimentación de información desde el cliente al servidor, para adaptar el algoritmo de acuerdo a las condiciones de red. 8.1. Compresión de imagen Tal como se explicó en el trabajo de Cristian Junge, el algoritmo de aleatorización de pixeles presenta un gran avance en tolerancia a pérdidas y cuando es combinado con corrección de errores aún más, tal como se explicó en el trabajo actual. Sin embargo, este procedimiento presenta una gran desventaja, la cuál es hacer imposible la incorporación de técnicas de compresión lossy, como JPEG. Dichas técnicas realizan compresión aprovechando la correlación de colores entre pixeles, es decir, disminuyen la cantidad de información de la imagen mediante una simplificación de las diferencias entre pixeles colindantes. Al aleatorizar los puntos a transmitir, dicha correlación se pierde, con lo cual aplicar compresión resulta en una pérdida de la información de color de la imagen. 64 Otras técnicas de compresión se declaran lossless (PNG, GIF), es decir que la información de color de la imagen puede ser recuperada completamente al descomprimir la imagen. Sin embargo éstas demandan gran cantidad de tiempo de procesamiento, con lo cual, no se hace posible obtener tasas de despliegue mayores a 20 cuadros por segundo. La compresión PNG, en términos simples, se compone de tres etapas. La primera etapa realiza una transformación aritmética sobre los datos, para hacer la información más compresible. En la segunda etapa, se comprimen los datos utilizando un algoritmo denominado como Ziv-Lempel. La información es luego comprimida aún más utilizando el algoritmo de Huffman en la tercera fase del procedimiento. En el algoritmo de transmisión utilizado por la aplicación, debido a la aleatorización realizada, no existe una correlación entre los pixeles enviados en un mismo paquete, por lo que no tiene sentido utilizar PNG, ya que algunas etapas no efectuarán un aporte en el resultado final. Sin embargo, no se puede descartar la aplicación de alguno de los algoritmos de compresión a los datos. Técnicas de compresión como Huffman o Codificación Aritmética, se basan en la detección de ocurrencias de caracteres en el texto a comprimir, con el fin de generar un nuevo diccionario que utilice menor cantidad de información para codificar los caracteres más usados. Tales técnicas tienen también sus versiones adaptativas, en donde se adapta el diccionario de la misma forma tanto para comprimir como para descomprimir los datos, evitando de esta manera la necesidad de transmitirlo. En la aplicación, durante la distribución en paquetes, se simplifica la información color mediante una transformación de RGB32 a RGB565. Si se considera el conjunto de información como una secuencia de caracteres, dicha simplificación aumenta la probabilidad de repetición de éstos dentro de la cadena, haciendo factible la aplicación de una de las técnicas mencionadas anteriormente. Un problema interesante, entonces, se plantea en adaptar alguna de las técnicas de compresión para su uso particular dentro de la aplicación y evaluar los niveles de compresión posibles de alcanzar mediante su utilización y su combinación con otras técnicas como interlineado de imágenes. 65 8.2. Retro-alimentación de datos El funcionamiento de la aplicación en la actualidad no contempla diferencias en capacidades de red entre el servidor y el cliente. Es decir, cada una de las partes transmite o recibe a la máxima capacidad que lo permite su conexión de red. Esto es un factor importante a considerar, ya que si la velocidad de transmisión es mucho mayor que la de recepción, entonces se producirán pérdidas en el lado cliente, por no poder recibir con suficiente rapidez los paquetes transmitidos. El modo de implementación actual no permite al servidor obtener información alguna respecto a las capacidades de los clientes conectados, más aún, no posee ningún medio para saber que la información esté siendo efectivamente recibida, o de la calidad de la imagen en el cliente. Una solución interesante, se presenta entonces en implementar un canal de comunicación de forma paralela a la transmisión de video, utilizando protocolo TCP/IP, de manera de que el servidor pueda obtener una retro-alimentación acerca del funcionamiento del cliente, tal como cantidad de paquetes perdidos, bytes recibidos, etc. Esto permitiría al servidor adaptar el algoritmo de transmisión, introduciendo pausas entre el envío de paquetes, por ejemplo, para mejorar la calidad de recepción de video. La implementación de dichas mejoras, resultaría en un incremento general del nivel del algoritmo completo, abriendo la posibilidad para su incorporación dentro de aplicaciones de uso masivo. 66 Bibliografía [1] Alvise Bolsi. Optimización de codec de video tolerante a fallas utilizando compresión espacial. Memoria de Ingeniería Civil en Computación. Universidad de Chile, 2004. [2] Hany Farid. Fundamentals of image processing. http://www.cs.dartmouth.edu/ farid/tutorials/fip.pdf. [3] GNU. The plotutils package. http://www.gnu.org/software/plotutils/. [4] Cristian Junge. Transmisión Eficiente y Tolerante a Fallas de Video sobre Redes IP. Memoria de Ingeniería Civil en Computación. Universidad de Chile, 2005. [5] Bernd Lamparter, Otto Boehrer, Wolfgang Effelsberg, and Volker Turau. Adaptable forward error correction for multimedia data streams. Technical Report TR-93-009, 1, 1993. http: //citeseer.ist.psu.edu/lamparter93adaptable.html. [6] Nalini Venkatasubramanian and Klara Nahrstedt. An integrated metric for video QoS. In MULTIMEDIA ’97: Proceedings of the fifth ACM international conference on Multimedia, pages 371–380, New York, NY, USA, 1997. ACM Press. [7] K. Park. Afec: an adaptive forward error-correction protocol and its analysis, 1997. K. Park. AFEC: an adaptive forward error-correction protocol and its analysis. Technical Report CSDTR97 -038, Department of Computer Sciences, Purdue University, 1997. [8] Kihong Park and Wei Wang. QoS-Sensitive Transport of Real-Time MPEG Video Using Adaptive Forward Error Correction. In ICMCS, Vol. 2, pages 426–432, 1999. [9] P. Salama, N. Shroff, E. Coyle, and E. Delp. Error concealment techniques for encoded video streams, 1995. P. Salama, N. B. Shroff, E. J. Coyle, and E. J. Delp, Error Concealment Techniques for Encoded Video Streams, in IEEE Int’l Conf. on Image Processing, vol. 1, pp. 9–12, 1995. [10] P. Salama, N. Shroff, and E. Delp. Error concealment in encoded video, 1999. P. Salama, N. Shroff, and E. J. Delp, Error concealment in encoded video, submitted to IEEE Transactions on Image Processing, 1999. 67 [11] Fermin Uribe. Codificación y decodificación de video tolerante a fallas. Memoria de Ingeniería Civil en Computación. Universidad de Chile, 2003. [12] Video4Linux WIKI. Video for linux. http://www.linuxtv.org/v4lwiki/index. php/Main_Page. [13] Y. Wang and Q. Zhu. Error control and concealment for video communication: A review, 1998. Y. Wang and Q.-F. Zhu, Error control and concealment for video communication: A review, Proceedings of the IEEE, vol. 86, no. 5, pp. 974-997, May 1998. [14] Z. Wang, A. Bovik, and B. Evans. Blind measurement of blocking artifacts in images, 2000. Z. Wang, A. C. Bovik, B. L. Evans: Blind measurement of blocking artifacts in images. in Proc. ICIP, vol. 3, pp. 981–984, Vancouver, Canada, 2000. [15] Wikipedia. RGB color model. http://en.wikipedia.org/wiki/RGB#32-bit_mode. [16] Wikipedia. YUV color model. http://en.wikipedia.org/wiki/YUV#Converting_ from_YUV_to_RGB. [17] S. Winkler. Issues in vision modeling for perceptual video quality assessment, 1999. S. Winkler: Issues in vision modeling for perceptual video quality assessment. Signal Processing 78(2), 1999. [18] S. Winkler, A. Sharma, and D. McNally. Perceptual video quality and blockiness metrics for multimedia streaming applications, 2001. Stefan Winkler, Animesh Sharma, David McNally: Perceptual video quality and blockiness metrics for multimedia streaming applications. in Proceedings of the International Symposium on Wireless Personal Multimedia Communications, pp. 547–552, Aalborg, Denmark, September 9–12, 2001. [19] A. Wrangsjö and H. Knutsson. Histogram filters for noise reduction. In Proceedings of the SSAB Symposium on Image Analysis, March 2003. [20] D. Wu, Y. Hou, W. Zhu, Y. Zhang, and J. Peha. Streaming video over the internet: Approaches and directions, 2001. http://citeseer.ist.psu.edu/wu01streaming.html. 68 Apéndice A Glosario API: Application Programming Interface - Interfaz de Programación de Aplicaciones, es un conjunto de especificaciones de comunicación entre componentes de software. Blockiness: Efecto en imágenes normalmente debido a simplificación en compresión. Normalmente en compresión JPEG la imagen es dividida en bloques de 8x8, sobre los cuales se realiza algún tipo de simplificación de colores, para disminuir la cantidad de información a procesar, de manera independiente del resto de la imagen. Cuando se utiliza compresión muy alta, los bordes de los bloques se hacen demasiado evidentes al descomprimir, produciendo este efecto. Bloque Virtual: Conjunto de macro-bloques de tamaño máximo 255, utilizado en la técnica de aleatorización de pixeles. Una secuencia aleatoria de pixeles es creada a partir de este conjunto, la cual es distribuida en distintos paquetes para minimizar el impacto producido por pérdidas. Codec: (Codificador/Decodificador) Tecnología capaz de codificar y decodificar una secuencia de datos, utilizado generalmente en multimedia para video y audio. Compresión Temporal: Técnica de compresión de video, en donde se minimiza la cantidad de datos a enviar, transmitiendo sólo los cambios detectados entre cuadros consecutivos de la secuencia de video. FFT: Fast Fourier Transform - Transformada Rápida de Fourier, es un algoritmo de gran eficiencia para realizar el cálculo de la transformada discreta de Fourier y su inversa. Es de gran importancia en una gran variedad de aplicaciones, en particular en procesamiento digital de imágenes. 69 GSM: Global System for Mobile Communications, es el estándar de comunicación entre teléfonos móviles mas utilizado en la actualidad. J2ME: Java 2 Platform Micro Edition, es una colección de APIs de Java para la ejecución de programas en dispositivos de bajos recursos, como PDAs y teléfonos móviles. Macro-bloque: Sección de una imagen, de tamaño 8x8 pixeles, utilizada para detección de movimiento entre cuadros consecutivos de video. MIDP: Mobile Information Device Profile, versión de J2ME integrada en el hardware de teléfonos móviles que permite el ejecución de aplicaciones Java en estos. Modelo de color: Simplificación del espectro de colores visible. A partir de éste se puede representar cada color posible como una combinación de varias variables. Es particularmente útil en computación, para disminuir la cantidad de información necesaria para representar una imagen. RGB: Modelo de color que representa cada valor del espectro como una combinación de rojo, verde y azul (Red, Green, Blue). Cada color puede tomar un valor entre 0 y 255, lo cual define un espectro de 16 millones de colores. Un color se puede describir utilizando 3 bytes, uno para cada componente, aunque modelos como ARGB incluyen un valor Alpha para definir transparencia. Este es el modelo utilizado por los monitores de los computadores. UDP: User Datagram Protocol, protocolo de transporte de datos a través de la red, basado en el intercambio de datagramas. No requiere de establecer una conexión. No posee confirmación de recepción ni control de flujo de paquetes. Video4Linux (V4L): API para linux desarrollada para interacción con dispositivos de captura de video y televisión, tales como cámaras web y tarjetas capturadoras. YUV: Modelo de color que representa cada valor posible como una combinación de una componente de luminancia y dos componentes de crominancia. Es una representación mas fiel de la forma de percibir colores por el ojo humano que RGB, pero más alejada del modo de funcionamiento de los monitores. 70