Escalado de imágenes usando redes neuronales: Waifu2x

Siempre he tenido un gran interés en lograr formas de reescalado con una pérdida de calidad mínima. En ciertos casos me es suficiente vectorizando la imagen y queda en condiciones para hacer cualquier reescalado,

Escalado de imágenes usando redes neuronales: Waifu2x
Muestra comparativa entre dos opciones de escalado tradicional (Nearest neighbour y Lanczos3) y el método usado en Waifu2x.

Siempre he tenido un gran interés en lograr formas de reescalado con una pérdida de calidad mínima. En ciertos casos me es suficiente vectorizando la imagen y queda en condiciones para hacer cualquier reescalado, pero hay casos donde hay tal cantidad de colores que es imposible hacer esto (pierdo colores). Buscando alternativas, hallé este método de reeescalado bastante interesante.

Bajo el nombre de waifu2x, es una implmentación en LUA de redes neuronales convolucionales con el objetivo de reescalar imágenes realizado por @nagadomi (Github). Está basado en un paper académico de Chao Dong, Chen Change Loy, Kaiming He y Xiaoou Tang de 2015.

También es capaz de limpiar ruido y artefactos de las imágenes, otro punto a tener en cuenta.

El requisito más restrictivo que tiene es la obligatoriedad de usar tarjetas gráficas NVIDIA, ya que usa CUDA como lenguaje de computación por GPU.

Por último, adjunto una pequeña muestra al principio del artículo, donde se puede ver una comparativa de escalado a doble de tamaño en distintos métodos: usando píxeles vecinos (next neighbour), lanczos y waifu2x.

Probando con vídeos

Un pregunta que llegué a hacerme era si podía hacer funcionar esto con vídeos, ya que daría lugar a poder escalar vídeo en 1080p a 4K o vídeo en resolución 480p a algo situado entre 720p y 1080p. Sobre todo vendría de perlas para contenido en que no pueda realizarse trabajos de reescalado analógico (un VHS no es posible pero sí es viable volver a leer un film cinematográfico en mayor resolución).

En teoría waifu2x no funciona con vídeos directamente, sino que hay que procesar los fotogramas de este para lograr el objetivo. Para ello, me aprovecho de ffmpeg para extraer los fotogramas tal como explican en el README del proyecto.

Ejemplo de cómo proceder

Primero, extraemos los fotogramas y el audio.

mkdir frames
avconv -i data/raw.avi -r 24 -f image2 frames/%06d.png
avconv -i data/raw.avi audio.mp3

Generamos el listado de fotogramas.

find ./frames -name "*.png" |sort > data/frame.txt

Se ejecuta waifu2x. En este caso, solo está haciendo limpieza de ruido.

mkdir new_frames
th waifu2x.lua -m noise -noise_level 1 -resume 1 -l data/frame.txt -o new_frames/%d.png

Por último, se genera el vídeo.

avconv -f image2 -framerate 24 -i new_frames/%d.png -i audio.mp3 -r 24 -vcodec libx264 -crf 16 video.mp4

Ejemplo de vídeo

Tras ello, podemos evaluar el resultado que, en mi opinión, es bastante decente teniendo en cuenta que los fotogramas en un vídeo tienen cierto ruido debido al uso de códecs con pérdida. Yo he hecho un experimento con ello y os lo muestro a continuación (aunque incluye también el tema de la interpolación, cosa que hablaré en otro artículo).

En conclusión, ya tengo otra forma de reescalar imágenes y que me queden bastante mejor que usando bicúbica o lanczos.

Nota adicional: No es necesario instalarse el software, el creador del mismo tiene un portal web para escalar imágenes. Dadle euros para que pueda seguir manteniéndolo si os gusta el resultado.