Práctica 3 Codificación de vídeo en formato MPEG-1 3.1. Objetivo de la práctica La práctica tiene los siguientes objetivos: Conocer en detalle la estructura de un GOP (Group of Pictures) en codificación MPEG-1. Evaluar la influencia de la composición del GOP en la calidad de la trama de vídeo codificada en MPEG-1, para una tasa binaria fija, a través del análisis de la relación señal/ruido de pico (PSNR). Evaluar la influencia del tamaño de los macrobloques en los cuadros B y P en la calidad de la trama de vídeo codificada en MPEG-1, también para una tasa binaria fija dada. Como resultado de la práctica, el alumno deberá mostrar, mediante gráficas generadas con MATLAB, la forma de las curvas que se solicitan, acompañadas de los comentarios que el alumno considere oportunos como consecuencia del análisis de los resultados. 3.2. Material necesario El material necesario para la realización de la práctica es el siguiente: Un ordenador, con las siguientes aplicaciones instaladas: • MATLAB (incluyendo el toolbox de Image Processing) • La aplicación LSX-MPEG Encoder, encargada de realizar la codificación en formato MPEG-1. 23 3.3. RESULTADOS DE LA PRÁCTICA • La aplicación Video Editor, de MediaStudio Pro, para extraer imágenes de las secuencias AVI y MPEG-1, y almacenarlas como ficheros independientes, en formato BMP (legible para MATLAB). Una secuencia de prueba, en formato AVI. 3.3. Resultados de la práctica Como resultado de la práctica se debe entregar una memoria que incluya: El programa MATLAB. Las gráficas que muestran la evolución de la calidad de la secuencia codificada con las diferentes estructuras de GOP y de tamaño de macrobloque en los cuadros P y B en el proceso de optimización. Las gráficas que muestran la evolución de la relación señal/ruido de pico (PSNR) para la secuencia final codificada en MPEG-1 con las condiciones óptimas halladas. 3.4. Descripción técnica previa Tal como se comentó en la asignatura de teoría, el sistema de codificación MPEG1 está estructurado en seis niveles: 1. Nivel de secuencia. 2. Nivel de GOP. 3. Nivel de imagen. 4. Nivel de tira. 5. Nivel de macrobloque. 6. Nivel de bloque. 3.4.1. El nivel de GOP La función que permite el nivel de GOP es acceder de manera aleatoria a los diferentes cuadros de vídeo de la secuencia, que se agrupan en estructuras con entidad independiente: los GOP. Todo GOP comienza con un cuadro B (predicción bidireccional) o I (predicción intraframe), y termina con un cuadro B o un cuadro P (predicción interframe). Ejemplos de posibles GOP son: 24 Lab. de Tecnologías de Audio y Vídeo. SSR-ETSIT-UPM PRÁCTICA 3. CODIFICACIÓN DE VÍDEO EN FORMATO MPEG-1 . . . BP BBBP BBIBBBP BBBP BBBP BBIBBBP B . . . GOP . . . BP BB IBBP BBP BBP BB IBBP B . . . GOP En el caso del primer ejemplo, los dos cuadros B anteriores al I pueden depender: a) Exclusivamente de los cuadros I y P del GOP al que pertenecen, denominándose en este caso GOP cerrado. b) De los cuadros I y P tanto del GOP al que pertenecen, y del cuadro P del GOP anterior, denominándose GOP no cerrado. Habitualmente, la trama MPEG-1 incluye la transmisión periódica de un GOP cerrado cada cierto intervalo de tiempo para permitir la resincronización completa de la trama. El tamaño mínimo de GOP es 1 (un cuadro I), en tanto que el tamaño máximo no está especificado, y depende del número de cuadros B, P o D1 . Habitualmente, los codificadores MPEG admiten la especificación de alguno de sus parámetros, entre los cuales se encuentra: El número de cuadros B consecutivos en cada GOP. El número de cuadros P en cada GOP. El máximo valor de los vectores de movimiento utilizados en la predicción y compensación de movimiento. La tasa binaria sostenida de salida. Etc. Por ejemplo, especificando un número de cuadros B consecutivos en cada GOP de 3, y un número total de cuadros P por GOP de 2 se obtienen estructuras cíclicas del tipo: . . . BP BBB IBBBP BBBP BBB IBBBP B . . . GOP Resulta evidente que la alteración de los valores de los parámetros anteriores afecta a la capacidad de compresión del codificador y, con ello, a la calidad de la secuencia codificada. En este sentido, uno de los parámetros más comúnmente utilizados para 1 Esquema en el que sólo se codifica el coeficiente DC de cada bloque transformado DCT de 8 × 8 píxeles. Lab. de Tecnologías de Audio y Vídeo. SSR-ETSIT-UPM 25 3.4. DESCRIPCIÓN TÉCNICA PREVIA evaluar la calidad de la señal resultante es la relación señal/ruido de pico PSNR, definida como: FIL-1 COL-1 (NIV − 1)2 PSNR = 10 log i=0 FIL-1 COL-1 i=0 j=0 j=0 [dB] |Iorig (i, j, t) − Icod (i, j, t)|2 donde FIL es el número de filas de cada cuadro de imagen, COL el número de columnas, NIV el número de niveles de gris, Iorig (i, j, t) el píxel situado en la posición espacial (i, j) en la imagen original (sin codificar) en el instante temporal t, e Icod (i, j, t) igual, pero para la imagen ya codificada. Por tanto, la expresión anterior evalúa la cantidad de errores cometidos en el proceso de codificación (denominador), normalizado a una imagen con todos sus píxeles a blanco (NIV − 1) para independizar la medida de la SNR del nivel de luminosidad de la imagen. 3.4.2. El nivel de macrobloque El macrobloque es la unidad utilizada en las tareas de estimación y compensación de movimiento. Típicamente, cada macrobloque se compone de un bloque de 16×16 píxeles de luminancia Y, y de un bloque de 8×8 píxeles para cada una de las crominancias Cr y Cb, de acuerdo con el esquema de muestreo utilizado de 4:2:0. La idea básica de todo sistema de compensación de movimiento es la identificación de las partes de una imagen que incluyen algún tipo de modificación entre dos cuadros de una secuencia de vídeo (bien consecutivos, o bien distanciados entre sí un cierto intervalo temporal), con el fin de transmitir exclusivamente la información referente a dicho cambio, no transmitiendo nada de las zonas que no han experimentado ninguna modificación. El receptor, pues, reconstruye la imagen a partir de la información de los cuadros anteriores, ya disponibles en recepción, y de la información recibida respecto a los cambios, representada por los vectores de desplazamiento y el error de predicción. El procedimiento habitual para compensar movimiento es por bloques: se dividen las imágenes de la secuencia de vídeo en bloques de tamaño regular y prefijado (típicamente 8 × 8). Para cada uno de los bloques de la imagen actual It se realiza una búsqueda para encontrar el bloque más parecido en una imagen anterior It−n (estimación de movimiento hacia adelante) o en una imagen posterior It+n (estimación de movimiento hacia atrás), utilizadas como referencia (imagen de referencia). Obviamente, la búsqueda se realiza en un entorno limitado y cercano a la posición del bloque bajo análisis, ya que la probabilidad de que el bloque haya sufrido un gran desplazamiento es muy baja (trabajando a 50 o 60 Hz de velocidad de refresco), y el coste computacional se eleva de manera muy importante a medida que se aumenta la zona de búsqueda. En codificación MPEG, la zona de búsqueda es, precisamente, el macrobloque. Una vez obtenido el bloque más parecido, el desplazamiento se indica mediante un 26 Lab. de Tecnologías de Audio y Vídeo. SSR-ETSIT-UPM PRÁCTICA 3. CODIFICACIÓN DE VÍDEO EN FORMATO MPEG-1 vector de desplazamiento (también denominado vector de movimiento). Con ello, se logra codificar toda la información de un bloque mediante dos valores enteros: las dos coordenadas del vector, cuyas cifras son enteras al indicar, simplemente, el número de filas y columnas en que se ha desplazado. El tamaño de la zona de búsqueda de los vectores de desplazamiento se puede hacer variar, persiguiendo con ello mejorar la calidad de la imagen codificada. Para una tasa binara fija dada, el aumentar o disminuir la zona de búsqueda puede permitir compensar mejor el movimiento, logrando con ello reducir la cantidad de información necesaria para codificar el error de predicción y, con ello, una posible mayor calidad de la imagen decodificada. 3.5. Procedimiento a seguir en la práctica Cada grupo dispondrá de una secuencia de vídeo, en formato AVI, sin comprimir. Dicha secuencia ha sido digitalizada según la recomendación UIT-R BT.601, con formato de muestreo 4:4:4 y 8 bits/muestra en cada componente (24 bits/píxel en total), con 25 cuadros/segundo y reducida en tamaño posteriormente a cuadros de 352 × 288 (formato SIF – Source Input Format). Se pretende evaluar la dependencia de la calidad obtenida en el proceso de codificación en formato MPEG-1 en función de la estructura de GOP prefijada, y del tamaño del área de búsqueda de los vectores de movimiento. Para ello, se va a hacer uso de la aplicación LSX-MPEG Encoder, capaz de codificar secuencias originales AVI, generando como salida secuencias en formato MPEG-1. La aplicación permite especificar algunos de los parámetros del codec, suministrando cierta información de la calidad media y mínima alcanzada en la secuencia codificada final. Los pasos a seguir en la práctica son los siguientes: 1. Arrancar la aplicación LSX-MPEG Encoder. Para ello, seleccionar en el menú Inicio la opción Programas – LSX-MPEG Encoder – LSX-MPEG Encoder. En la pantalla de presentación pulse Try Now. 2. Definir el perfil con el que se va a realizar la codificación. Para lograrlo, seleccionar en el menú File la opción Profile Manager. Aparecerá una nueva ventana, con el gestor de perfiles de codificación, en el que es necesario seleccionar la opción MPEG-1 (Recommended for SIF, 352×288 PAL). Dicho perfil genera un flujo de datos de 1519 kbs, divididos en 1280 kbs para vídeo y 224 kbs para audio. A continuación, pulsar Load Profile. 3. Seleccionar el fichero de entrada, en formato AVI, que va a ser codificado en MPEG-1. Para ello, pulsar Browse de la opción INPUT FILE:. Se mostrará una ventana que permite seleccionar el fichero AVI con la secuencia asignada al grupo. Una vez seleccionada, se puede visualizar pulsando el botón situado a la izquierda del nombre de la secuencia, con un triángulo verde. Lab. de Tecnologías de Audio y Vídeo. SSR-ETSIT-UPM 27 3.5. PROCEDIMIENTO A SEGUIR EN LA PRÁCTICA 4. En la ventana OUTPUT FILE: se muestra el lugar donde se sugiere el almacenamiento del fichero codificado en MPEG-1 resultante. Modifique esta opción para que el fichero resultante se guarde en el directorio asignado al grupo. Pulse, para ello, Browse de la opción OUTPUT FILE: y seleccione el directorio de destino y el nombre que se asignará al fichero. Por defecto, la aplicación asigna el mismo nombre del fichero original, sustituyendo su extensión por m1v. 5. Pulse el botón Advanced. Aparecerá una ventana donde se muestran varias pestañas que permiten seleccionar diferentes opciones de codificación. Para esta práctica, sólo se van a modificar las opciones Sequence, para especificar la estructura del GOP, y Motion Vectors, para especificar el tamaño del área de búsqueda de los vectores de movimiento. 6. Seleccione la pestaña Sequence. Se mostrará la estructura de GOP sugerida, que se compone de 3 cuadros P en el GOP, y 2 cuadros B entre cada par de cuadros P. Acepte esta sugerencia, pulsando Aceptar. A continuación, seleccione en el menú Action la opción START Encoding (la codificación también se puede lanzar pulsando el icono de rápido acceso que contiene una flecha verde). Durante el proceso de codificación, se mostrará la secuencia en proceso de codificación. Bajo esta ventana, se muestra una barra azul que indica la progresión de la codificación y, bajo esta barra, se muestran otras dos barras verdes que suministran información de la calidad media e instantánea que se va obteniendo en la secuencia resultante. El parámetro de calidad Q suministrado por la aplicación LSX-MPEG Encoder está relacionado con la PSNR mediante la expresión: PSNR = k log 100 ; Q ∈ ; Q ⊂ (0, 100) 100 − Q Tras codificar completamente la secuencia, se muestran en una ventana algunos datos finales del fichero obtenido. Anotar los siguiente valores: Calidad media. Calidad mínima. Grado de compresión alcanzado. 7. Repetir los dos puntos anteriores, incrementando en una unidad el número de cuadros P presentes en el GOP. Repita el proceso, hasta que observe que la calidad media de la secuencia resultante no mejora al incrementar en número de cuadros P. Dibuje en una gráfica la evolución conjunta de la calidad media, calidad mínima y grado de compresión en función del número de cuadros P presentes en el GOP. 28 Lab. de Tecnologías de Audio y Vídeo. SSR-ETSIT-UPM PRÁCTICA 3. CODIFICACIÓN DE VÍDEO EN FORMATO MPEG-1 ¡Nota importante: No es necesario que guarde en fichero independiente cada una de las secuencias codificadas con diferentes valores de número de cuadros P. Simplemente, anote los valores de calidad media y mínima, y el grado de compresión alcanzado.! 8. Una vez determinado el número óptimo de cuadros P en la estructura del GOP, incremente en una unidad el número de cuadros B entre cada dos P. Repita el proceso, hasta que observe que la calidad media de la secuencia resultante no mejora al incrementar en número de cuadros B entre cada dos P. Dibuje en una gráfica la evolución conjunta de la calidad media, calidad mínima y grado de compresión en función del número de cuadros B entre cada dos P para el valor de número de cuadros P óptimo averiguado. 9. Una vez determinado el número óptimo de cuadros P y B para la secuencia de trabajo, se debe proceder a determinar el tamaño óptimo de área de busqueda de los vectores de movimiento. Para ello, pulsar Advanced y seleccionar la pestaña Motion Vectors. Anotar los valores de calidad media, mínima y grado de compresión alcanzado cuando se trabaja con un área de búsqueda de N ×N, con N =, 8, 16, 24, . . . , 56, 64 simultáneamente tanto en los cuadros P como en los B. Dibuje en una gráfica la evolución conjunta de la calidad media, calidad mínima y grado de compresión en función del valor de N. ¿Observa algún efecto en el proceso de codificación al aumentar el tamaño del área de búsqueda? 10. Almacene en un fichero la secuencia codificada en MPEG-1 para el valor óptimo de número de cuadros P y B, así como para el tamaño óptimo del área de búsqueda de los vectores de movimiento. Sobre dicha secuencia, codificada pseudo-óptimamente, se va a proceder a analizar la evolución del parámetro PSNR sobre los cuadros que componen la secuencia. Escriba un programa MATLAB que, para cada cuadro, determine el valor de PSNR de la señal de luminancia Y . Dado que MATLAB es incapaz de decodificar fichero con formato MPEG-1, es necesario, previamente, convertir el fichero MPEG-1 en AVI. Para ello, utilice la aplicación Adobe Premiere, capaz de realizar dicha conversión, mediante los siguientes pasos: Modifique la extensión *.m1v de la secuencia a *.mpg para que la aplicación Adobe Premiere sea capaz de leer la secuencia codificada en MPEG-1. Arranque la aplicación Adobe Premiere. Para ello, seleccione en el menú Inicio la opción Programas – Adobe – Premiere 6.5 – Adobe Premiere 6.5. Al arrancar, la aplicación mostrará un menú de posibles plantillas de Lab. de Tecnologías de Audio y Vídeo. SSR-ETSIT-UPM 29 3.5. PROCEDIMIENTO A SEGUIR EN LA PRÁCTICA codificación, en el que es necesario seleccionar DV - Pal — Standard 48 kHz. Importe la secuencia de vídeo a la barra de tiempos. Para ello, en la ventana Project, pulse el botón derecho y seleccione en el menú de Import la opción File. Seleccione la secuencia a convertir, y posteriormente colóquela en la pista Video 1A. En el menú File, seleccione Export Timeline – Movie. Aparece una ventana para asignar un nombre y directorio a la secuencia que se va a crear. Una vez asignado nombre y directorio, pulse el botón Settings. Aparecerá una nueva ventana denominada Export Movie Settings. En dicha ventana, seleccionar: • • • • • File Type: Microsoft AVI. Embedding Options: None. Verificar que la casilla Export video está marcada. La casilla Export audio NO es necesario que esté marcada. En el desplegable donde pone General, seleccionar Video. En la nueva ventana, seleccionar: ◦ Compressor: None. ◦ Depth: Millions. ◦ Frame Size: escribir el tamaño original de la secuencia codificada en MPEG-1. • Pulsar OK. • Pulsar Guardar para que se genere la secuencia AVI. • Salir de la aplicación Adobe Premiere. El programa MATLAB realizado debe mostrar la evolución del PSNR de la señal de luminancia de cada cuadro en una gráfica PSNR [dB]-tiempo[mseg]. Dado que las imágenes están almacenadas en formato true-colour (24 bits/píxel), con 8 bits por cada primario de color RGB, es necesario hacer uso de la ecuación: Y = 0, 3R + 0, 59G + 0, 11B Para manejar las secuencias AVI (tanto la secuencia original como la codificada), MATLAB dispone de funciones que permiten averiguar datos de la secuencia, leer cuadros de imagen específicos, y acceder a valores concretos de puntos de la imagen. El siguiente código muestra un ejemplo de líneas de programa que manejan secuencias AVI: function ejemploLTAV(NomSecuCod) %Ejemplo de funcion que lee informacion de una secuencia, 30 Lab. de Tecnologías de Audio y Vídeo. SSR-ETSIT-UPM PRÁCTICA 3. CODIFICACIÓN DE VÍDEO EN FORMATO MPEG-1 %verifica que su longitud es superior a 10 cuadros y que su tipo %es TrueColor, calcula y muestra la imagen de luminancia de toda la %secuencia. InfoCod = aviinfo (NomSecuCod); if InfoCod.NumFrames < 10 error (’Secuencia menor de 10 cuadros’); end if InfoCod.ImageType ~= ’truecolor’ error (’La secuencia codificada no es TrueColor’); end for i=1:InfoCod.NumFrames fprintf (’Procesando cuadro %d de %d \r’, i, InfoCod.NumFrames); SecuCod = aviread (NomSecuCod,i); ImaCod = SecuCod.cdata; % Y = 0,3 R + 0,59 G + 0,11 B Luminancia = 0.3.*double(ImaCod(:,:,1)) + 0.59.*double(ImaCod(:,:,2)) + 0.11.*double(ImaCod(:,:,3)); imshow (uint8(Luminancia)); end Para calcular la gráfica del parámetro PSNR puede hacer uso de la función siguiente, que proporciona el valor de PSNR para dos imágenes (original y codificada) que se le suministra (asumiendo 8 bits/píxel): function [psnr] = Calcula_psnr(ImaOrigY, ImaCodY) [fil,col] = size (ImaOrigY); error = abs (ImaOrigY-ImaCodY); error2 = error.^2; errorsum = sum ((sum(error2))’); psnr = 10 * log10 ((fil*col*255*255)/(errorsum)); 11. Explique la evolución del PSNR a la vista de la gráfica obtenida, y vincúlela a la estructura de GOP que ha utilizado en la codificación. 12. A la vista de los valores de PSNR obtenidos, y teniendo en cuenta los valores de Q medio y mínimo anotados para la secuencia analizada, ¿se puede determinar el valor de k en la relación PSNR-Q? Lab. de Tecnologías de Audio y Vídeo. SSR-ETSIT-UPM 31