Proyecto de mejora del streaming y grabaciones de las clases
Abstract
En este proyecto de fin de grado buscamos mejorar el video que se está ofreciendo a los alumnos desde las aulas, bien en tiempo real en una sesión de Google Meet, o bien en las grabaciones de estas. Para ello usaremos un sistema basado en Nvidia Jetson Nano y GStreamer/DeepStream. En concreto, este proyecto se centra en el estudio del procesamiento del stream de vídeo a fin de mejorar la distorsión de la imagen debida a la posición de la cámara y de facilitar su visualización. Se analizarán los algoritmos de optimización más adecuados para cada uno de estos objetivos y se implementarán en un servidor multimedia en tiempo real.
Full text
Grado en Ingeniería de Sistemas Audiovisuales Proyecto de ingeniería PROYECTO DE MEJORA DEL STREAMING Y GRABACIONES DE LAS CLASES Alumno: Shulei Huang Director del proyecto: Sisco Vallverdu Bayes Codirector del proyecto: Pere Montolio Aranda Fecha: 22/06/2021
Proyecto de mejora del streaming y grabaciones de las clases 2 Agradecimientos En este momento, mirando atrás en mis estudios en la Universidad Politécnica de Cataluña, he ganado mucho y he crecido mucho. Durante este período, es necesario agradecer a muchas personas. En primer lugar, quiero agradecer a mi director, Sisco Vallverdu, y a mi codirector, Pere Montolio, gracias por su gran ayuda y el tiempo dedicado durante el desarrollo de este trabajo final de grado. En segundo lugar, quiero agradecer a todos los profesores y los compañeros por lo que me han enseñado durante mis estudios. Por último, quiero agradecer a mi familia y a mis amigos por haberme ayudado en mi vida y en mi estudio, y gracias por su continua compañía. ¡Muchas gracias de nuevo a todos!
Proyecto de mejora del streaming y grabaciones de las clases 3 Resumen En este proyecto de fin de grado buscamos mejorar el video que se está ofreciendo a los alumnos desde las aulas, bien en tiempo real en una sesión de Google Meet, o bien en las grabaciones de estas. Para ello usaremos un sistema basado en Nvidia Jetson Nano y GStreamer/DeepStream. En concreto, este proyecto se centra en el estudio del procesamiento del stream de vídeo a fin de mejorar la distorsión de la imagen debida a la posición de la cámara y de facilitar su visualización. Se analizarán los algoritmos de optimización más adecuados para cada uno de estos objetivos y se implementarán en un servidor multimedia en tiempo real. Palabras clave: procesamiento de vídeo, corrección de distorsión perspectiva, eliminación de ruido, Nvidia Jetson Nano, GStreamer, DeepStream, tiempo real
Proyecto de mejora del streaming y grabaciones de las clases 4 Abstract In this final degree project, we are looking to improve the video that is being offered to students from the classrooms, either in real time in a Google Meet session, or in the recordings of these. For this we will use a system based on Nvidia Jetson Nano and GStreamer/DeepStream. Specifically, this project focuses on the study of video stream processing in order to improve image distortion due to camera position and to facilitate its visualization. The most suitable optimization algorithms for each of these objectives will be analyzed and implemented in a real-time multimedia server. Keywords: video image processing, perspective distortion correction, denoising, Nvidia Jetson Nano, GStreamer, DeepStream, real-time
Proyecto de mejora del streaming y grabaciones de las clases 5 Declaración de honor I declare that, the work in this Degree Thesis is completely my own work, no part of this Degree Thesis is taken from other people’s work without giving them credit, all references have been clearly cited, I’m authorised to make use of the company’s Llocer S.L. and research group TSC of the UPC related information I’m providing in this document. I understand that an infringement of this declaration leaves me subject to the foreseen disciplinary actions by Universitat Politècnica de Catalunya. Shulei Huang 22/06/2021 Student Name Signature Date
Proyecto de mejora del streaming y grabaciones de las clases 6 Índice Agradecimientos ....................................................................................................... 2 Resumen ................................................................................................................... 3 Abstract ..................................................................................................................... 4 Declaración de honor ................................................................................................ 5 1 Introducción ........................................................................................................ 9 1.1 Objetivo .................................................................................................... 9 1.2 Alcance .................................................................................................. 10 1.3 Requerimiento ......................................................................................... 11 1.4 Justificación y utilidad .............................................................................. 11 2 Antecedentes y estado del arte ........................................................................ 13 3 Planteamiento y selección de alternativas ........................................................ 15 4 Descripción de la tecnología utilizada ............................................................... 17 4.1 NVIDIA Jetson Nano .............................................................................. 17 4.2 Gstreamer .............................................................................................. 19 4.3 NVIDIA DeepStream .............................................................................. 20 5 Desarrollo ......................................................................................................... 22 5.1 Instalación y configuración de hardware y software ................................ 22 5.2 Desarrollo del algoritmo de corrección de distorsión .............................. 24 5.2.1 Implementación del algoritmo de corrección de distorsión ............ 34 5.3 Desarrollo del algoritmo de para acentuar los escritos en la pizarra ....... 39 5.3.1 Implementación del algoritmo para acentuar los escritos en la pizarra ..................................................................................................... 42 5.4 Pipelines GStreamer/DeepStream .......................................................... 45 5.5 Pruebas experimentales ......................................................................... 47 6 Resultados esperados ...................................................................................... 51 7 Conclusiones y trabajos futuros ........................................................................ 53 8 Presupuesto ..................................................................................................... 55 9 Bibliografía ....................................................................................................... 57 Licencias ................................................................................................................. 59
Proyecto de mejora del streaming y grabaciones de las clases 7 Índice de tablas Tabla 1 Características técnicas de NVDIA Jetson Nano ......................................... 18 Tabla 2 Comando Unix para comprobar la librería GStreamer ................................ 23 Tabla 3 Comando Unix para comprobar el uso del acelerador gráfico ..................... 23 Tabla 4 Comando Unix para instalar el complemento v4l2loopback ........................ 23 Tabla 5 Comando Unix para configurar el complemento v4l2loopback .................... 24 Tabla 6 Librerías importado para codigo fuente del filtro deproject.cu ..................... 34 Tabla 7 Definición del tamaño del bloque ................................................................ 34 Tabla 8 Código de función cuda_mirror con implementación de reproyección ......... 37 Tabla 9 Código de función cudaMirrorKernel ........................................................... 38 Tabla 10 Kernel del filtro 3x3 ................................................................................... 41 Tabla 11 Matriz de filtrado identidad ........................................................................ 42 Tabla 12 Filtro de la media ...................................................................................... 42 Tabla 13 Matriz de filtro ........................................................................................... 42 Tabla 14 Definición del tamaño de la máscara y las expresiones necesarias. ......... 42 Tabla 15 Código de función f1Kernel ....................................................................... 44 Tabla 16 Comando GStreamer ................................................................................ 45 Tabla 17 Comando GStreamer utilizado una cámara virtual .................................... 46 Tabla 18 Comando GStreamer utilizado una cámara física ..................................... 46 Tabla 19 Comando GStreamer con argumento fargs ............................................... 47 Tabla 20 Cálculo de costes del equipamiento necesario ......................................... 55 Tabla 21 Cálculo de costes de ejecución por contrata ............................................. 56
Proyecto de mejora del streaming y grabaciones de las clases 8 Índice de figuras Figura 1 Imagen capturada a la clase grabada.......................................................... 9 Figura 2 Kit de desarrollo de Nvidia Jetson Nano .................................................... 17 Figura 3 Arquitectura general de GStreamer ........................................................... 20 Figura 4 Ejemplo de una pipeline de análisis del video con DeepStream ................ 21 Figura 5 Conjunto de pipelines ................................................................................ 21 Figura 6 Inserción de la tarjeta microSD .................................................................. 23 Figura 7 Modelo geométrico de formación de imágenes ......................................... 24 Figura 8 Imagen capturada que sufre una distorsión de la perspectiva ................... 26 Figura 9 Relación plana entre los vectores P1 y P1’................................................ 27 Figura 10 Simulación de la distorsión de la perspectiva de la pizarra ...................... 28 Figura 11 Pixelación de la pizarra ............................................................................ 32 Figura 12 Definición del vector P ............................................................................. 32 Figura 13 Relación plana entre los vectores P1 y P1’ de la pizarra ......................... 33 Figura 14 Simulación antes del filtrado .................................................................... 39 Figura 15 Resultado de aplicar el filtro de paso bajo ............................................... 39 Figura 16 Resultado final de la simulación .............................................................. 40 Figura 17 Trazos de tiza en la pizarra ..................................................................... 41 Figura 18 Imagen capturada de vídeo procesado ................................................... 48 Figura 19 Imágenes capturadas de vídeos procesados usando diferentes tamaños de máscara ........................................................................................................... 48 Figura 20 Imágenes capturadas de vídeos procesados usando diferentes valores de constantes ........................................................................................................ 49 Figura 21 Imagen capturada de vídeo procesado en streaming .............................. 50 Figura 22 Comparación entre el vídeo original y el vídeo resultante ........................ 51
Proyecto de mejora del streaming y grabaciones de las clases 9 1 Introducción 1.1 Objetivo Incluir una cámara de video como un elemento de las aulas proporciona un conjunto de ventajas para la enseñanza. En la situación excepcional de crisis por pandemia COVID-19, la mayoría de las universidades han recurrido a la enseñanza en línea. En este sistema de enseñanza, los profesores pueden enseñar a través de los dos modos principales de impartir la enseñanza en línea, clase en directo online y grabación de video. El objetivo principal de este proyecto es mejorar la calidad del video que se obtiene en el aula, sea para su transmisión en tiempo real clase online) o para su almacenamiento (grabación). La Figura 1 muestra una imagen capturada por una de las cámaras existentes en el campus de la UPC. Se puede observar que existe una importante distorsión de la perspectiva en la imagen, especialmente en la pizarra. Además, la pizarra está compuesta por escritos blancos sobre un fondo verde no uniforme y dónde manchas previas de tiza dificultan su visualización. Figura 1 Imagen capturada a la clase grabada
Proyecto de mejora del streaming y grabaciones de las clases 16 Cuando nos familiarizamos con Nvidia Jetson Nano y GStreamer/Deepstream, hay que realizar una instalación y configuración Nvidia Jetson Nano para conseguir un entorno de trabajo, también hay que realizar algunas pruebas iniciales para comenzar y confirmar su rendimiento de trabajo. En la segunda fase, se analiza el vídeo de grabación de clase y se estudia el algoritmo para optimizar el vídeo. El proyecto requiere el desarrollo de dos algoritmos, empezando por la corrección de distorsión de la perspectiva, que requiere la transformación de la imagen. Una vez implementado y aplicado este algoritmo, se puede desarrollar el algoritmo para acentuar los escritos en la pizarra y convertir el color de la imagen. Se analizan las ventajas y desventajas del algoritmo, y se plantean las posibles soluciones para la optimización del algoritmo en este proyecto. Por último, se indica cómo estas técnicas pueden aplicarse en los distintos escenarios objetivo: la clase online, grabación, ….
Proyecto de mejora del streaming y grabaciones de las clases 17 4 Descripción de la tecnología utilizada 4.1 NVIDIA Jetson Nano Jetson Nano de Nvidia[1] es una arquitectura hardware que puede soportar sistemas de procesado audio, video e inteligencia artificial, permite ejecutar varias redes neuronales en paralelo para aplicaciones como la clasificación de imágenes, el reconocimiento de imágenes, la manipulación de vídeos, la detección de objetos y el procesamiento de voz. Integra una GPU Nvidia Maxwell con 128 núcleos CUDA, es capaz de ejecutar la librería de procesado de datos CUDA-X AI, una CPU ARM Cortex-A57 MPCore de 64 bits de cuatro núcleos, una memoria 4 GB LPDDR4, 16 GB de almacenamiento Flash y 4 puertos USB 3.0. También es compatible con las cámaras de la interfaz MIPI CSI- 2 y la E/S de alta velocidad PCIe Gen2 para conectar tarjeta de red inalámbrica. Es capaz de proporcionar 472 gigaflops de potencia, mientras sólo consume entre 5 y 10W. El sistema operativo recomendado es Linux con distribución Ubuntu. Para facilitar el desarrollo de programas de software, NVIDIA JetPack SDK incluye las bibliotecas y API aceleradas CUDA-X para aprendizaje profundo, visión artificial, computación acelerada y multimedia. Figura 2 Kit de desarrollo de Nvidia Jetson Nano
Proyecto de mejora del streaming y grabaciones de las clases 18 Elementos de la Jetson Nano: 1. Ranura para tarjeta microSD para almacenamiento principal 2. Cabezal de expansión de 40 pines 3. Puerto micro-USB para entrada de alimentación de 5V o para datos 4. Puerto Gigabit Ethernet 5. Puertos USB 3.0 (x4) 6. Puerto de salida HDMI 7. Conector DisplayPort 8. Conector Barril DC para entrada de alimentación de 5V 9. Conectores de cámara MIPI CSI (compatible con la PiCam) La característica de la Jetson Nano son: GPU Arquitectura NVIDIA Maxwell™ con 128 núcleos NVIDIA CUDA® CPU Procesador ARM® Cortex®-A57 de cuatro núcleos a 1.43 GHz Memoria 4 GB LPDDR4 de 64-bit a 25.6 GB/s Almacenamiento microSD (no incluido) Codificación de vídeo 4K a 30 cuadros (H.264/H.265) Decodificación de vídeo 4K a 60 cuadros (H.264/H.265) Cámara 1 carril MIPI CSI-2 DPHY Conectividad Gigabit Ethernet, clave M.2 E Monitor HDMI 2.0 y eDP 1.4 USB 4x USB 3.0, USB 2.0 Micro-B Dimensiones 100 mm x 80 mm x 29 mm Tabla 1 Características técnicas de NVDIA Jetson Nano
Proyecto de mejora del streaming y grabaciones de las clases 19 4.2 Gstreamer GStreamer[3], creado en 1999, es un framework multimedia libre, escrito en el lenguaje de programación C e integrado en Gnome. Es el core de muchos sistemas profesionales para aplicaciones multimedia y media servers tales como Kurento. Dentro de sus posibilidades está el tratamiento de vídeo y sonido, grabación, transmisión, edición, codificación, etc. GStreamer se estructura como un conjunto de plugins, los cuales pueden proveer de Códecs u otras funcionalidades. La función principal de GStreamer es proporcionar un framework para complementos, flujo de datos y negociación de diferentes tipos de medios. GStreamer está diseñada para ser multiplataforma y es compatible con varias arquitecturas básicas de hardware, incluyendo x86, SPARC, PPC, ARM, y puede ejecutarse en casi todos los sistemas operativos, incluyendo Linux, MacOS, Windows, Solaris, Android y iOS. Se proporcionan APIs (interfaces de programación) para lenguajes como Python, c/C++, Perl, GNU Guile (guile) y Ruby. GStreamer se basa en secuencias de elementos funcionales, llamadas pipelines. Una secuencia ejemplo puede comenzar por los elementos necesarios para la recepción y decodificación de un stream de video, seguido de su procesado y acabada en la codificación y envío hacia un usuario final. Cada elemento es proporcionado por un plugin (librería cargada dinámicamente). Considerando el audio y video como flujos, los flujos de audio y video fluyen desde la fuentes a través de una serie de módulos hasta que llegan al receptor y terminan. La arquitectura general de GStreamer[4] se muestra en la Figura 3.
Proyecto de mejora del streaming y grabaciones de las clases 20 Figura 3 Arquitectura general de GStreamer Cada uno de los módulos realiza una tarea específica y colaboran entre sí dentro del pipeline global para alcanzar el objetivo final. Basándose en este diseño de arquitectura, los usuarios pueden desarrollar y añadir fácilmente complementos personalizados para satisfacer sus necesidades. 4.3 NVIDIA DeepStream Nvidia DeepStream[5] es el software desarrollado por Nvidia para permitir el procesado de audio y video en su arquitectura hardware Jetson, incluidos aquellos que utilizan técnicas de deep learning. Deepstream añade a Gstreamer más de una decena de complementos para codificar, decodificar o procesar en forma acelerada aprovechando los componentes hardware que las tarjetas Jetson llevan incorporados (GPU, encoders/decoders MPEG, …).
Proyecto de mejora del streaming y grabaciones de las clases 21 La figura siguiente muestra un ejemplo de pipeline de análisis de vídeo, desde la entrada del vídeo hasta la salida de los datos. Figura 4 Ejemplo de una pipeline de análisis del video con DeepStream Para generar los resultados, DeepStream ofrece varias funcionalidades: renderizar la salida, guardar la salida en los archivos locales, transmitirla mediante RTSP o enviar sólo los metadatos a la nube. Figura 5 Conjunto de pipelines
Proyecto de mejora del streaming y grabaciones de las clases 22 5 Desarrollo 5.1 Instalación y configuración de hardware y software Para el desarrollo del proyecto, el primer paso es instalar la Jetson Nano[6]. Antes de la instalación, hay que preparar el hardware necesario: ⚫ Tarjeta microSD, Jetson Nano utiliza una tarjeta microSD como dispositivo de arranque y almacenamiento principal. Dado que nuestro proyecto se basa en el procesamiento multimedia, es muy conveniente utilizar una microSD de 64 GB o más. Esta vez se ha optado por una tarjeta microSD de SanDisk de 128 GB con una velocidad de lectura de hasta 160 MB/s y una velocidad de escritura de hasta 90 MB/s. ⚫ Fuente de alimentación micro-USB, debe alimentarse con una fuente de alimentación que pueda proporcionar 5V y un mínimo de 2A. ⚫ Red, se ha optado por un adaptador de red USB de TP-LINK. ⚫ Teclado y ratón USB ⚫ Monitor con conector HDMI Cuando lo anterior está preparado, se utiliza un ordenador convencional con un lector/grabador de tarjetas microSD para escribir la imagen del sistema operativo en la tarjeta microSD. La imagen del sistema operativo se descarga de la página de NVIDIA Developer y se selecciona la versión correspondiente a nuestro modelo de Jetson Nano[6]. Después de preparar la tarjeta microSD, se conectan los dispositivos periféricos a la Jetson Nano y se inserta la tarjeta microSD en la Jetson Nano, entonces se puede encender la alimentación.
Proyecto de mejora del streaming y grabaciones de las clases 23 Figura 6 Inserción de la tarjeta microSD Al arrancar por primera vez, hay que seguir las instrucciones en pantalla para la configuración inicial. Al seleccionar el idioma del sistema, la disposición del teclado y la zona horaria, crear el nombre de usuario, contraseña y el nombre de ordenador, etc. Una vez se ha completado la instalación y configuración del sistema operativo, como Jetson Nano tiene instalado GStreamer, por lo que no es necesario instalarlo. Puede usar los comandos Unix para verificar la disponibilidad de la librería GStreamer y el uso del acelerador gráfico[7]: gst-launch-1.0 videotestsrc ! ximagesink Tabla 2 Comando Unix para comprobar la librería GStreamer gst-launch-1.0 -e filesrc location=filename.mp4 ! qtdemux name=demux ! h264parse ! omxh264dec ! nvoverlaysink Tabla 3 Comando Unix para comprobar el uso del acelerador gráfico También es necesario configurar el complemento DeepStream mediante el comando Unix: apt install v4l2loopback-dkms Tabla 4 Comando Unix para instalar el complemento v4l2loopback
Proyecto de mejora del streaming y grabaciones de las clases 24 rm /usr/lib/aarch64-linux-gnu/libv4l/plugins/nv/libv4l2_nvargus.so modprobe v4l2loopback exclusive_caps=1 max_buffers=2 Tabla 5 Comando Unix para configurar el complemento v4l2loopback El complemento v4l2loopback permite crear dispositivos de vídeo virtuales. 5.2 Desarrollo del algoritmo de corrección de distorsión La cámara de vídeo es un dispositivo que captura imágenes en secuencia, utilizando una lente óptica para conseguir la imagen. Cuando la cámara está capturando un objeto, la posición de un punto en el plano de la imagen está relacionada con la posición geométrica del punto correspondiente en el espacio, y la interrelación de estas posiciones está determinada por el modelo geométrico de formación de imágenes de la cámara. El modelo geométrico de formación de imágenes más utilizado es el modelo de proyección por perspectiva, cuyo modelo matemático se describe a continuación[8]. Figura 7 Modelo geométrico de formación de imágenes El centro de proyección se puede ver como el foco de cámara. Como puede verse en la Figura 7, un punto P1 en el espacio, después de la proyección, es mapeado en el punto P1’ del plano de la imagen (plano del sensor), de modo que cualquier objeto que esté delante de la cámara, dejará una imagen en el sensor. En concreto, para
Proyecto de mejora del streaming y grabaciones de las clases 25 conocer la ubicación de los puntos capturados en el plano la de imagen, se traza una línea desde el punto del espacio hasta el foco de cámara, y la intersección entre el plano sensor y la línea es el punto capturado. En el ejemplo que se muestra en la Figura 7, el objeto u objetos capturados se encuentran dentro de un plano paralelo al sensor de la cámara (plano de imagen de la cámara), por lo que el objeto en el espacio simplemente se escala al plano de la imagen, y no sufre ninguna distorsión. En la realidad de la transmisión de una clase, que es el objetivo de este proyecto, la posición, la orientación y el campo de visión de la cámara acabarán afectando al resultado de la proyección ya que la cámara no estará situada justo delante y paralela respecto al objeto (la pizarra del aula, en nuestro caso), sino que estará situada en un soporte cercano al techo a paredes laterales del aula. Esta distorsión se debe a que el eje de foco de la cámara no es perpendicular al plano en el que se encuentra el objeto, lo que significa que el plano de la imagen no es paralelo al plano en el espacio del objeto que está capturando, lo que puede causar distorsión de la perspectiva. Por ejemplo, en nuestro proyecto, la pizarra del aula se puede dibujar como un rectángulo y se captura con una cámara de video del aula que está colocada en el techo, lo que hace que el plano en el espacio no sea paralelo al plano de la imagen, provocando así el efecto de distorsión. Por consiguiente, el objetivo del algoritmo es corregir esta imagen para que el plano de la imagen de la cámara parezca paralelo a la pizarra.
Proyecto de mejora del streaming y grabaciones de las clases 32 Figura 11 Pixelación de la pizarra Figura 12 Definición del vector P Donde x e y se pertenecen al intervalo 0 y 1, permitiendo recorrer toda la retícula, esto es, toda la pizarra. Es decir, si x es igual a 0 e y es igual a 0, entonces el vector P es igual al vector A, esquina superior izquierda de la pizarra. En cambio, si x es igual a 0 e y es igual a 1, el vector P es igual al vector C.
Proyecto de mejora del streaming y grabaciones de las clases 33 Figura 13 Relación plana entre los vectores P1 y P1’ de la pizarra Concretamente puede observar la Figura 13, hay una cámara en la parte superior y una pizarra en la parte inferior, las vértices de la pizarra son A, B, C y D, y las imágenes correspondientes son A’, B’, C’ y D’. Cualquier vector en la pizarra se llama P y el vector proyectado en la cámara se llama P’. De acuerdo con la ecuación (20) y el sistema de proyección en perspectiva, el vector P’ de imagen capturada es: 𝑃 =𝜑𝑃′ =𝐴 +𝑥(𝐵 −𝐴 )+𝑦(𝐶 −𝐴 ) (21) Sustituyendo obtenemos: 𝜑𝑃′ =𝛼𝐴′ +𝑥(𝛽𝐵′ −𝛼𝐴′ )+𝑦(𝛾𝐶′ −𝛼𝐴′ ) (22) Como todos los vectores del plano sensor tiene el mismo componente de z, 𝜑 se puede escribir como: 𝜑=𝛼+𝑥(𝛽−𝛼)+𝑦(𝛾−𝛼) (23) Al sustituir la ecuación (23) en la ecuación (22) obtenemos: 𝑃′ =𝛼𝐴′ +𝑥(𝛽𝐵′ −𝛼𝐴′ )+𝑦(𝛾𝐶′ −𝛼𝐴′ ) 𝛼+𝑥(𝛽−𝛼)+𝑦(𝛾−𝛼) (24)
Proyecto de mejora del streaming y grabaciones de las clases 34 Finalmente, dividiendo numerador y denominador por 𝛼, el vector P’ es: 𝑃′ =𝐴′ +𝑥(𝛽 𝛼𝐵′ −𝐴′ )+𝑦(𝛾 𝛼𝐶′ −𝐴′ ) 1+𝑥(𝛽 𝛼−1)+𝑦(𝛾 𝛼−1) (25) Con queda definido el algoritmo de corrección de distorsión perspectiva. Según la ecuación (25), a medida que los valores de x e y cambian, se recorre toda la pizarra y se puede calcular el valor P’. El valor P’ es la posición en la imagen entrada capturada, su color será el que asignaremos al punto (x, y) de la imagen de salida. En el siguiente apartado veremos su implementación software. 5.2.1 Implementación del algoritmo de corrección de distorsión Para implementar el algoritmo de corrección de la perspectiva se utiliza la programación en lenguaje C con extensión CUDA, que permite la ejecución paralela en la/s GPUs del sistema Jetson. A continuación, se muestran las funciones necesarias para implementar el código del filtro. El fichero principal es deproject.cu, que contiene el código fuente del algoritmo para corregir la proyección de la pizarra. Las librerías que se utilizarán se importan con el siguiente código, donde cuda.h y cudaEGL.h son los archivos de cabecera de programación en CUDA. #include <stdio.h> #include <stdlib.h> #include <math.h> #include <cuda.h> #include <cudaEGL.h> Tabla 6 Librerías importado para codigo fuente del filtro deproject.cu Debido a que la imagen está dividida en bloques, se define el tamaño del bloque. #define BOX_W 16 #define BOX_H 8 Tabla 7 Definición del tamaño del bloque
Proyecto de mejora del streaming y grabaciones de las clases 35 El código del filtro es vinculado a la función cuda_mirror, que tiene dos frames (imágenes del video) como parámetros de la función, correspondientes respectivamente al frame de entrada que se va procesar y al frame de salida donde se guarda el resultado. Un frame se compone de una o varias capas, dependiendo si la imagen de entrada es en blanco y negro o en color y del esquema de codificación. En nuestro video, la imagen es en color con el esquema NV12, por lo tanto, cada frame tiene dos capas. Como se ha definido anteriormente, se declara que se procesa en bloques de 16x8, es decir, se ejecutan 128 píxeles en paralelo a la vez. Después, teniendo en cuenta el alto y el ancho de la imagen entrada y el tamaño del bloque, se calcula el número de bloques necesarios para procesar la imagen completa. Dentro de la función cuda_mirror, se utiliza este paralelismo para ejecutar diversas instancias del procedimiento cudaMirrorKernel en paralelo, cada una de las cuales procesa un punto de la imagen de salida. Así, si se supone que la imagen de salida es de 1024𝑥768, con un total de 786432 píxeles, cudaMirrorKernel se ejecuta 128 veces en paralelo, cuando todas estas ejecuciones están finalizadas, se repite este paso, lanzando otras 128 ejecuciones en paralelo, hasta un total de 786432 (64𝑥96) veces. Al implementar el código de fuente del filtro de la corrección de la distorsión, es necesario introducir los valores de las coordenadas de los cuatros vértices de la pizarra. Una método es introducir los valores de las coordenadas en el código fuente, pero es ineficaz porque cuando cambia los valores de las coordenadas, debe cambiarse en el código fuente. Por lo tanto, otro método es introducir los valores de las coordenadas de los cuatros vértices de la pizarra en el comando Unix al crear el pipeline de GStreamer. La ventaja de esto es que podemos modificar directamente los valores de las coordenadas desde el exterior sin hacer cambios en el código fuente. La función cuda_mirror tiene un argumento llamado args, que corresponde al valor fags pasado en el comando Unix, permitiendo la entrada de las coordenadas de los
Proyecto de mejora del streaming y grabaciones de las clases 36 cuatros vértices de la pizarra. Una vez obtenidas las coordenadas de los vértices, se pueden utilizar las ecuaciones (14) y (19) para calcular los valores de los coeficientes 𝛽 𝛼 ⁄ y 𝛾 𝛼 ⁄. En la implementación de reproyección, los cálculos de los coeficientes son los mismos para todos los puntos de la pizarra, así solo se calculan una vez en la función cuda_mirror. static int cuda_mirror( const char *args, CUeglFrame* eglInputFrame, CUeglFrame* eglOutputFrame ) { // parse board positions int board_positions[8]; char *s = strdup( args ); // writable int *idx = board_positions; for( char *is = strtok( s, "," ); is != NULL; is = strtok( NULL, "," ) ) { *idx = atoi( is ); idx++; } free(s); double ax = board_positions[0]; double ay = board_positions[1]; double bx = board_positions[2]; double by = board_positions[3]; double cx = board_positions[4]; double cy = board_positions[5]; double dx = board_positions[6]; double dy = board_positions[7]; double a00 = dx-bx; double a01 = dx-cx; double a10 = dy-by; double a11 = dy-cy; double b0 = dx-ax; double b1 = dy-ay; double detm = a00*a11-a01*a10; double betta = (a11*b0-a01*b1)/detm;
Proyecto de mejora del streaming y grabaciones de las clases 37 double gamma = (-a10*b0+a00*b1)/detm; dim3 threadsPerBlock(BOX_W, BOX_H); dim3 blocks(eglOutputFrame->width/BOX_W, eglOutputFrame -> height/BOX_H ); cudaMirrorKernel<<<blocks,threadsPerBlock>>>( ax, ay, bx, by, cx, cy, betta, gamma, (char *)eglInputFrame->frame.pPitch[0], (char *)eglInputFrame->frame.pPitch[1], eglInputFrame->pitch, (char *)eglOutputFrame->frame.pPitch[0], (char *)eglOutputFrame->frame.pPitch[1], eglOutputFrame->pitch, eglOutputFrame->width, eglOutputFrame->height); return 0; } Tabla 8 Código de función cuda_mirror con implementación de reproyección La función cudaMirrorKernel se declara con la etiqueta global, lo que indica que el código es para la GPU, es decir, la función se ejecuta en la GPU y puede ser llamada desde la CPU o GPU. Dentro de ella, para todo punto (x, y) de la imagen de salida, calculamos las coordenadas x’ e y’ del punto P’ mediante la ecuación (25), que son las coordenadas del punto en la imagen de entrada. Por último, se copia el color del punto desde el frame y las coordenadas de origen hasta el frame y las coordenadas de salida utilizado la función cudaCopyPixelNV12. La función cudaCopyPixelNV12 es una función que permite copiar un pixel desde la imagen de entrada a la imagen de salida cuando el frame está en formato NV12. __global__ void cudaMirrorKernel( int ax, int ay, int bx, int by, int cx, int cy, double betta, double gamma, char *inFrame0, char *inFrame1, int inPitch, char *outFrame0, char *outFrame1, int outPitch, int outputWidth, int outputHeight ){
Proyecto de mejora del streaming y grabaciones de las clases 38 int ox = blockIdx.x*blockDim.x + threadIdx.x; int oy = blockIdx.y*blockDim.y + threadIdx.y; double x = (double)ox/outputWidth; double y = (double)oy/outputHeight; double px = (1-x-y)*ax + x*betta*bx + y*gamma*cx; double py = (1-x-y)*ay + x*betta*by + y*gamma*cy; double div = x*(betta-1) + y*(gamma-1) + 1; int ix = (int)round(px/div); int iy = (int)round(py/div); cudaCopyPixelNV12( inFrame0, inFrame1, inPitch, outFrame0, outFrame1, outPitch, ix, iy, ox, oy ); } Tabla 9 Código de función cudaMirrorKernel Además, se incluye una función do_cuda_process que contiene varios pasos previos para ejecutar el filtro.
Proyecto de mejora del streaming y grabaciones de las clases 39 5.3 Desarrollo del algoritmo de para acentuar los escritos en la pizarra Los pasos en el proceso de realce de los escritos en la pizarra usado en este proyecto son: Figura 14 Simulación antes del filtrado 1. Aplicar un filtro de paso bajo con una máscara de tamaño adecuado en la imagen de video para que desaparezcan los trazos de tiza, dejando solo el fondo de la pizarra que, por problemas de iluminación o de suciedad en la pizarra no tiene un color uniforme. La simulación resultante se muestra en la Figura 15, donde la letra A se convierte en una pequeña mancha, más o menos en forma de A, pero muy borrosa. Figura 15 Resultado de aplicar el filtro de paso bajo 2. A la imagen del vídeo original se le resta la imagen anterior. De esta forma, los puntos de píxel del fondo de la pizarra tiene un valor de 0 (negro), mientras que la letra se conserva y los puntos de pixeles de la tiza tiene un valor de 255 (blanco). El resultado ideal se muestra en la Figura 16.
Proyecto de mejora del streaming y grabaciones de las clases 40 Figura 16 Resultado final de la simulación Como se muestra en la Figura 17, por lo general, los trazos de tiza se ocupan 2 o 3 píxeles de grosor, es decir, si se define una máscara de 20𝑥20 y calcular el valor promedio, se puede obtener una pizarra sin tiza. Es una manera de estimar el color de la pizarra en la zona determinada. Dicho de otra forma, aplicamos un filtro paso bajo a fin de eliminar el foreground (escritos) de la imagen y dejar tan solo el background (pizarra). Como filtro paso bajo usaremos una convolución de la imagen original con un kernel de tamaño 𝑀𝑥𝑁 y valor constante 1 (𝑀𝑥𝑁) ⁄, lo que lleva a obtener el promedio de los pixeles alrededor del actual. Así, la ecuación que describe a este filtro es[9]: 𝑔(𝑥,𝑦)=1 𝑀𝑥𝑁∑𝑓(𝑛,𝑚) (𝑛,𝑚)∈𝑆 (26) donde f(n, m) denota el valor original del píxel en la posición (n, m), g(x, y) denota el valor del píxel después de asignar el valor medio, S es el conjunto de coordenadas de los puntos vecinos a (x, y) dentro de un rectangulo de tamaño 𝑀𝑥𝑁, incluyendo el propio (x, y). Por ejemplo, para el caso de 𝑀=𝑁=3, la ecuación que describe el filtro es: 𝑔(𝑥,𝑦)=1 9{𝑓(𝑥−1,𝑦−1)+𝑓(𝑥,𝑦−1)+𝑓(𝑥+1,𝑦−1)+𝑓(𝑥−1,𝑦)+ 𝑓(𝑥,𝑦)+𝑓(𝑥+1,𝑦)+𝑓(𝑥−1,𝑦+1)+𝑓(𝑥,𝑦+1)+𝑓(𝑥+1,𝑦+1)} (27)
Proyecto de mejora del streaming y grabaciones de las clases 41 y su kernel es: 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 Tabla 10 Kernel del filtro 3x3 De lo anterior se desprende que el filtro de media consiste en tratar por igual los puntos de los píxeles en cualquier posición de la imagen, lo que permite suavizar la imagen, es decir, reducir la cantidad de variación de intensidad entre los píxeles adyacentes. También conseguir que las intensidades de los objetos pequeños se mezclen con el fondo con el fin de detectar los objetos de mayor tamaño. Figura 17 Trazos de tiza en la pizarra Los pasos 1 y 2 se pueden combinar en un solo paso, a la imagen del vídeo original se le resta el resultado de pasarle un filtro de la media. Así que, se puede calcular el resultado mediante un único filtro, que es la matriz de filtrado identidad restando el filtro de la media, que se muestra en la Tabla 13. La máscara resultante es igual a - 1/9 de todas las partes, excepto la central, que es 1-1/9.
Proyecto de mejora del streaming y grabaciones de las clases 48 Figura 18 Imagen capturada de vídeo procesado Para la prueba anterior se ha utilizado una máscara de tamaño 20x20 y se ha utilizado dos constantes de 𝑘1=−1.3 y 𝑘2=265. Ya que en diferentes pruebas también utilizamos diferentes tamaños de máscara (5x5, 15x15, 20x20, 25x25, 30x30). La siguiente figura muestra los diferentes resultados. En base a los resultados, finalmente elegimos la máscara de 20x20 mediante análisis subjetivo. Figura 19 Imágenes capturadas de vídeos procesados usando diferentes tamaños de máscara
Proyecto de mejora del streaming y grabaciones de las clases 49 Además, hemos definido previamente dos constantes k1 y k2, que nos permite convertir el color de la imagen, por lo que dependiendo del cambio en el valor de las dos constantes, se renderizan diferentes efectos de imagen. Viene dada por la siguiente fórmula, vY es el valor de luminancia: 𝑣𝑌=𝑘1×𝑣𝑌+𝑘2 (28) Al igual que antes, también probamos a utilizar diferentes valores de constantes, cuyos resultados puede verse en la siguiente figura: Figura 20 Imágenes capturadas de vídeos procesados usando diferentes valores de constantes Una vez se da por acabada la ejecución del procesamiento con el vídeo grabado, es de vital importancia realizar pruebas en tiempo real. Una prueba es crear un pipeline cuyo elemento fuente es el vídeo de clase grabado y se reenvía a Google Meet. Entonces, los participantes de Meet pueden ver el video de clase en directo.
Proyecto de mejora del streaming y grabaciones de las clases 50 Figura 21 Imagen capturada de vídeo procesado en streaming
Proyecto de mejora del streaming y grabaciones de las clases 51 6 Resultados esperados En el campo del procesamiento digital de imágenes y videos, los métodos de evaluación de la calidad de la imagen generalmente se dividen en análisis subjetivo y análisis objetivo. El análisis subjetivo de la imagen es una forma de evaluar la calidad de la imagen directamente por el observador para reflejar realmente el efecto visual de la imagen. El análisis objetivo utiliza los análisis matemáticos que reflejan cuantitativamente la calidad de la imagen. En este proyecto, adoptamos el análisis subjetivo para evaluar el vídeo resultante. Observando la imagen global, la pizarra es un rectángulo perfecto y el contenido de la pizarra se presenta en negro, lo que hace que el contenido sea más obvio. En las pruebas de acentuar los trazos de tiza y convertir los colores de la imagen, la imagen de vídeo procesado se aparece algunos bordes que no están del todo bien ajustados, además se pueden ver algunas marcas verdes. La comparación entre el vídeo original y el vídeo procesado es la siguiente: Figura 22 Comparación entre el vídeo original y el vídeo resultante En términos de tiempo de ejecución, debido a la característica de Jetson Nano, su tiempo de procesamiento del vídeo es rápido y el tiempo de procesamiento es la mitad de la duración del vídeo original. Y no hay mucho retraso en la distribución del streaming. Otra ventaja relacionada con el vídeo procesado es que los archivos no son pesados, es decir, el vídeo de 10 minutos que ocupan un total de 277 MB después del
Proyecto de mejora del streaming y grabaciones de las clases 52 procesamiento. En el siguiente enlace, se podrá apreciar el vídeo del resultado final. Todo los archivos de programación del código y ejecución se podrán ver en GitHub, el enlace de GitHub es el siguiente.
Proyecto de mejora del streaming y grabaciones de las clases 53 7 Conclusiones y trabajos futuros En conclusión, este proyecto ha obtenido resultados satisfactorios ya que se han cumplido mis expectativas iniciales. Desde la instalación de Jetson Nano, el desarrollo del algoritmo, la implementación de algoritmos y otras fases se han completado uno por uno. Por un lado, es necesario corregir el ángulo de enfoque de la pizarra desarrollado por el algoritmo. Por otro lado, es necesario eliminar las marcas de tiza y convertir los colores de la imagen de vídeo utilizado en otro algoritmo. Lo más importante es que se aplica en tiempo real en el aula. Todo esto es posible gracias a Nvidia Jetson Nano y GStreamer/DeepStream. Gracias a este proyecto he podido conocer a Nvidia Jetson Nano, GStreamer y DeepStream, dos herramientas que, sin duda, tienen una gran versatilidad y rendimiento. Debido a que el procesamiento de las imágenes de vídeo se puede realizar directamente a partir del vídeo sin esperar a que se produzcan tiempos de ejecución excesivos, esto es útil en el procesamiento en tiempo real, lo que significa una baja latencia en la transmisión y el procesamiento de vídeo. Nvidia Jetson Nano, como microprocesador, permite la potencia de la inteligencia artificial con total programabilidad de software, y GStreamer/DeepStream simplifican el desarrollo de aplicaciones de audio/vídeo. Así que a partir de ellos, en el mundo audiovisual, he descubierto un mundo más amplio. Por supuesto, el desarrollo de este proyecto también ha ayudado a profundizar en mis conocimientos sobre el procesamiento de imágenes de vídeo, lo que sin duda es útil para mi desarrollo futuro, pero aún queda mucho recorrido y experiencia en el mundo audiovisual. Considero que este proyecto ha sido un éxito, sin embargo, todavía se pueden implementar futuras mejoras para optimizar el procesamiento: ⚫ En lugar de los cuatros vértices predefinidos de la pizarra, los cuatro vértices de la pizarra podrían posicionarse mediante el reconocimiento de imágenes y la detección de objetos.
Proyecto de mejora del streaming y grabaciones de las clases 54 ⚫ La imagen del vídeo será más clara y los bordes de la imagen de vídeo se pueden ajustar.
Proyecto de mejora del streaming y grabaciones de las clases 55 8 Presupuesto Las tablas representan los costes de la realización del proyecto: Coste del equipamiento Descripción Unidades Coste unidad (€/euros) Coste total (€) Kit de desarrollo NVIDIA Jetson Nano 1 114,42 114,42 Tarjeta microSD de 128 GB 1 20,82 20,82 Fuente de alimentación micro- USB 1 10,99 10,99 Adaptador WiFi USB 1 12,69 12,69 Cable de red Ethernet de 5 metros 1 11,99 11,99 Teclado y Ratón Inalámbrico 1 21,99 21,99 Monitor 1 98,34 98,34 Cámara para Kit de desarrollo NVIDIA Jetson Nano 1 33,35 33,35 Total 269,25 Tabla 20 Cálculo de costes del equipamiento necesario
Proyecto de mejora del streaming y grabaciones de las clases 56 Coste de ejecución por contrata Descripción Duración (horas) Coste hora (€/euros) Coste total (€) Redacción del proyecto 400 8 3.200,00 Ejecución del proyecto 220 8 1.760,00 Total 4.960,00 Tabla 21 Cálculo de costes de ejecución por contrata El coste total del proyecto es de 5.229,25 euros.
Proyecto de mejora del streaming y grabaciones de las clases 57 9 Bibliografía [1] NVIDIA. (2019). NVIDIA Jetson Nano Developer Kit | NVIDIA Developer. Nvidia. Retrieved April 13, 2021, from https://developer.nvidia.com/embedded/jetsonnano-developer-kit [2] Nvidia. (2020). Jetson Nano. Retrieved April 13, 2021, from https://www.nvidia.com/es-la/autonomous-machines/jetson-store/ [3] GStreamer_ developers. (n.d.). Retrieved April 21, 2021, from https://gstreamer.freedesktop.org/dev/ [4] Fluendo | ¿Qué es GStreamer? (n.d.). Retrieved April 23, 2021, from https://fluendo.com/es/what-is-gstreamer/ [5] Welcome to the DeepStream Documentation — DeepStream 5. (n.d.). Retrieved June 1, 2021, from https://docs.nvidia.com/metropolis/deepstream/devguide/text/DS_Overview.html [6] Learning, D. (2019). Getting Started With Jetson Nano Developer Kit | NVIDIA Developer (pp. 1–34). pp. 1–34. Retrieved May 1, 2021, from https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit [7] gst-launch-1. (n.d.). Retrieved May 1, 2021, from https://gstreamer.freedesktop.org/documentation/tools/gst-launch.html?gilanguage=c [8] Santana-Cedrés, D., Gomez, L., Alemán-Flores, M., Salgado, A., Esclarín, J., Mazorra, L., & Alvarez, L. (2017). Automatic correction of perspective and optical distortions. Computer Vision and Image Understanding, 161, 1–10. https://doi.org/10.1016/j.cviu.2017.05.016 [9] Wesley, A.-. (1996). Filtrado de imágenes. 25–48.