Superresolución con DNNs.

Hoy quiero mostrales algo que he estado probando desde hace un tiempo. Entre otras cosas lo he tomado como una de las referecnias de ejemplo de una de las tesis que tutoreo y entregan ahora.

Es un procedimiento de superresolucion basado en redes neuronales. Está presente en la biblioteca OpenCV de funciones de procesamiennto de imagen y video. La funcionalidad básica es similar y lo que se diferencia en que red se carga y ejecuta.

Estas redes son algunas del tipo autoencoder, otras son Generative Adversarial Networks (GAN). Aqui veremos las del tipo autoencoder.

Explicandolas de manera simplificada, esta dividida en dos partes. Una mitad descompone las estructuras de los datos, en este caso, una región de pixeles. Estos componentes se almacenan en “el medio” de la red. Luego la segunda mitad debe tomar estas estructuras y recontruir los datos. Como la mayoria de los entrenaminto de redes neuronales, esta salida (los datos recontruidos) se comparan con unos datos reales de referenci. Las diferencias (error) se le “enseñan” a la red para que vaya reajustando el como se deben descomponer y reconstruir los datos. Se le dan nuevas entradas y referencias y repite el proceso. Así muchas veces, hasta cierto nivel de calidad (similitud) de la reconstrucción con los datos reales.

Las cuatro redes que incluye la biblioteca han sido entrenadas con imágenes reales.

Estas son las referencias, si alguien quiere leerlas
• EDSR https://arxiv.org/abs/1707.02921
• ESPCN https://arxiv.org/abs/1609.05158
• FSRCNN https://arxiv.org/abs/1608.00367
• LapSRN https://arxiv.org/abs/1710.01992

Aquí estaré usando el modelo EDSR. Es el mayor, de mejores resultados, pero tambien el másssss lento. Esta es su estructura:

También, la ejecución será a puro CPU. Estoy usando OpenCV 4.3.0, compilada por mi para añadir esta funcionalidad, pues en la compilación oficial no se incluye, y no tienen aceleración en GPU (parte del modulo DNN si lo tiene, pero el SRDNN no). Al parecer en la más actual 4.4.0 hay soporte acelerado con GPUs via CUDA y OpenCL, asi que puedo probar con cualquier hardware. Cuando migre a esta versión (debo compilarla) ya lo haré.

Ejemplos de reconstrucción. (No se como poner aquí las imagenes una al lado de la otra, en la PC se verian mejor, pero creo que en un movil seria algo más incomodo)
Tener en cuenta que las imagenes se comprimieron con JPG (Q=85) para ahorrar datos, asi que algunos detalles finos se pierden y aparecen defectos de compresion en otras partes. Las originales son PNG sin perdida, pero consumen más.
La imagen original se redujo cuatro veces y re-escaló al tamaño original

Original 512×512

Baja resolucion 128×128

Super-resolucion

Con Photoshop

La imagen original se redujo dos veces y re-escaló al tamaño original

Original 512×512:

Baja resolucion 256×256:

Superesolucion:

Con Photoshop:

Estas tecnicas las estan empleando los modders para mejorar las texturas de los juegos de manera rápida, siempre con revisión posterior, pero aún así manera, muchisimo más rápido que tener que redibujarlas. Aunque en este caso usan GAN pues no se tienen referencias del tipo esperado, las redes tienen que generar resultados a partir de otras fuentes al menos similares. Algunos ejemplos:

Si todo esto les suena, debe ser porque han visto, leído o escuchado sobre la tecnología NVIDIA DLSS (Deep Learning Super Sampling). Basicamente, esta tecnolgia es lo mismo, pero con especificidades.

Nvidia provee a los desarrolladores el servicio de entrenamiento en una supercomputadora propia. Ahi se generan imágenes de los juegos a muy alta resolución, con hasta 64 muestras por pixel para el suavizado (antialiasing). A la red se le entregan imágenes a una menor resolución especificada y se realiza el proceso que describí antes. La red aprenderá como llevar los pixeles de menor resolución a una mayor resolución.

Esto se realiza por cada juego distinto, se genera una red especifica para el juego. Esto ha sido asi en la primera versión de DLSS. En la segunda versión la red es más generalista, además que tiene en cuenta los cambios temporales (entre cuadros).

Luego en los juegos se dibujan las imágenes a una resolución menor en el framebuffer, de ahí se toma y se pasa por el procedimiento de escalado-reconstrucción y el resultado es el que se muestra al final en pantalla.

La inferencia (la ejecución de la red) nvidia la realiza acelerándola en los llamados “nucleos tensor”. Estos nucleos basicamente su funcion es acelerar la operación D = A * B + C, donde A, B y C son unas pequeñas matrices. Estas matrices son parte de las estructuras matemática que describe el funcionamiento de una “neurona” de la red. Sin esta aceleración, la ganancia del uso de DLSS seria entre nula a negativa.

En algunos juegos (como el Death Stranding) el DLSS tiene modos de uso, que pueden ser enfocado en calidad o en rendimiento. El primer caso lo que hace es mantener una resolución de dibujo base más alta, por ejemplo al 75%, asi que el resultado es mejor a costa del posible rendimiento ganado. En el segundo caso se dibuja a menor resolución, digamos la mitad, el resultado es algo inferior, pues se pierden mas detalles finos, pero hay mucha mayor ganancia de rendimiento.

¿Podremos usar estas redes como un ejemplo de lo que hace el NVIDIA DLSS? Veamos que tal. Pero tener en cuenta que estas serán imágenes sintéticas y las redes de OpenCV se entrenaron con imágenes reales.

En los siguientes ejemplos las imagenes de entrada son regiones de las originales de 1920×1080. Las de baja resolución estan justo a la mitad de la resolución de las de entrada, es decir, sería como estar el juego a 960×540. Doy un ejemplo adicional de como queda el escalado haciéndolo lo mejor posible con Photoshop. El orden de las imágenes será el mismo en todo los casos.

The Witcher 3

Entrada:

Baja resolución:

Reescalado con la red:

Reescalado con Photoshop




Mass Effect Andromeda







Metro Exodus
El Metro Exodus tiene DLSS.




Fallout 4




Tambien se puede emplear como un suavizador, si la escala se mantiene igual, es decir, no hay que aumentar el tamaño de la imagen. Pero esto aqui tengo que hacerlo con truco. Escalo la imagen original cuatro veces mayor y luego la reduzco a la resolución de entrada con un filtro de alta calidad. Creo que sería algo similar a un antialiasing de supermuestreo x4:

Básicamente, esto puede hacerlo cualquiera, un autoencoder es simple de hacer, al menos uno básico. El tema es como hacerlo eficaz y eficiente para el contexto donde se quiere utilizar. Esto va desde su estructura, los tipos de datos utilizados y si se mapea a una arquitectura computacional específica para ejecutarse tán rapido como se pueda. Microsoft provee el API DirectML en las ultimas versiones de DirectX 12. Con esta base estan trabajando AMD y al parecer tambien Intel, en colaboracion con Microsoft. De manera que pueda usarse esta tecnica de manera estandarizada y no especifica de un hardware como el DLSS de NVIDIA

Ejemplo de una presentación sobre DirectML

Quizas me dedique a buscar las fuentes de estas redes (estan creadas en Tensorflow) y probar un entrenaminto con algún juego especifico. Sacar muchas imagenes representatvias y entrenar la red. En teoria, si se hace bien, los resultados serían mejores que los que les mostré aqui.

Update 1.
Ya vi las fuentes. de dos de las redes. Codigos para Tensorflow descargados de github. vere luego que tal, cuando la PC acabe con otras cosas que tengo procesando. Actualizare sobre el tema entonces

Update 2.
Compile OpenCV 4.4.0 con los modulos extras añadidos.

6 respuestas a «Superresolución con DNNs.»

  1. esta muy bueno eso yo en mi caso juego con un TV KONKA de 32¨ activo en los driver AMD la Super resolucion virtual y al juego lo pongo en 2560×1440 seria 2K y caballero eso es otra cosa los que lean y tengan la posibilidad de aserlo hagalo yo lo juego los battlefield 3 y 4 de la red DOTA es otra cosa las texturas los paisaje los uniformes de los jugadores cambia la calidad del juego totalmente claro comsume ami me corre en ultra con eso a 2K de 120 -150 fps a 1920×1080 me corre de de 170 a 200 fps la temperatura de la targeta sube de 50- 55 grados me sube a 60- 68 grados.La bentaja de actibarle esoal juego y ponerlo a 2K es que le quitarias al juego el antialiasing. los filtro anisotropicos.la oclusion ambiental no ase falta eso se ve muy pero muy bien PRUEBENLO

    1. la “superresolucion virtual” lo que hace basicamente es un supersampling antialiasing. este tipo de AA es el mas simple pero tambien el mas potente, de mas calidad y mas consumo de recursos, y fue de los primeros usados en juegos (en render offline es casi el default), pero se dejo de usar por su consumo y se usan otros pasables mucho mas rapdios. no lo tiene muchos juegos por su consumo mucho mayor (el caso extremo en su epoca era el “Ubershading” del Witcher 2).
      dibujan el juego internamente a mayor resolucion, hasta el doble de la resolucion especificada en el juego (o del monitor), luego se escala hacia abajo con un filtro de alta calidad, a la resolucion que le tengas especificada. seria un SSAA 2x o 4X

      en otras palabras, es lo contrario de lo que explico aqui.

      es como lo que explico en el antepenultimo parrafo, pero sin usar una red, solo puro dibujo y escala

  2. Esto es hecho con Deep Learning, tengo que actualizar mi OpenCV para poder probarlo, en DotCSV lo vi y con ejemplos en peliculas del 19xx pero viejas en blanco y negro y aplicaban esta tecnologia y quedaba super cool, el mismo tambien presenta otros ejemplos, como a traves de las mismas redes neuronales profundas, le daban color a una imagen en blanco y negro y tambien suvian los fraps por segundos de un video

    1. el primer caso es con esto mismo. se puede aplicar fotograma a fotograma. pero lo mejor es con uno que tenga en cuenta el flujo optico, es decir la informacion temporal entre cuadros y el como se mueven los pixeles. este ejemplo que pongo aqui, au el mejor es con solo una imagen, pro los autores dicen que estan trabajando en uno espacio-temporal.

      Los otros dos casos son tambien con autoencoders, pero de otros tipos y con otros ajustes.

      Los de coloreal las imagens usualmente lleva primero una red con segmentacion semantica, para definir las distintas areas de la imagen, lo mejor posible, y que es cada cosa, al menos lo principal.

      El de subir las imagens por segundo, lo que hace es una interpolacion temporal muy buena. Este se puede hacer con otros tipos de redes

      Ahora, opencv tiene un motor DNN que puede cargar redes de varias fuentes, como Tensoflow, Caffe, ONNX, Torch, OpencVINO. pero esto que presento aqui no esta incluido, es parte del modulo contrib que viene separado. no esta incluido en la compilacion oficial. debes descargarlo y compilar opencv con el incluido.

      Si queires aceleracion con CUDA, debe tener tambien el SDK de cuda, aunque de manera estandar tiene el opencl que pueden funcionar en los gpu de amd, nvidia e intel.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *