domingo, 6 de marzo de 2022

DxO PureRAW. Reducción de ruido con redes neuronales

A menudo en análisis de herramientas de reducción de ruido, se compara la imagen ruidosa con el resultado del procesado pero el autor no se preocupa de obtener una segunda captura de la escena sin ruido. Esta forma de proceder me supera, ya que sin dicha referencia no es posible determinar lo bien o mal que el reductor de ruido recupera los detalles y texturas inmersas en ruido, así como ver cuánto falso detalle fabrica el algoritmo.

La comparación cobra más relevancia si la reducción de ruido se basa en redes neuronales (a menudo llamadas IA, aunque la Inteligencia Artificial sea un concepto más amplio). Vamos a ver el motivo de forma simplificada:
  • Una red neuronal consiste en una estructura interconectada de cálculos numéricos sencillos realizados con valores precalculados tras un "entrenamiento" que ajusta la red.
  • Para dicho entrenamiento (que no hace tu ordenador sino que lo hizo previamente el fabricante del programa), a la red inicialmente no calibrada le fueron presentadas miles o millones de parejas de imágenes: una versión con ruido y otra versión sin ruido de la misma escena. Así fue capaz de "aprenderse" la forma que tienen los píxeles libres de ruido correspondientes a esos mismos píxeles o texturas cuando tienen ruido superpuesto.
  • Al suministrarle una imagen de entrada, la red ejecuta los cálculos predefinidos con nuestros valores RGB, entregando como salida los valores de la versión libre de ruido de aquella imagen ruidosa con que la red fuera entrenada y que más se pareciera a nuestra imagen. Este proceso aplica de forma local en cada parte de la escena.



En cierto modo lo que hace la red neuronal se aproxima a un copy&paste de versiones sin ruido de nuestra imagen con información procedente de un enorme banco de imágenes. Es por ello que el software basado en redes neuronales, y no solo el de reducción de ruido sino también y especialmente los de reescalado al alza de imágenes por ejemplo, son grandes candidatos a inventarse texturas y detalles que realmente no existían en la escena original. Según Luis Monje esto los descarta para uso científico o forense.

~~~

Vamos a ver cómo rinde un programa reductor de ruido basado en redes neuronales llamado DxO PureRAW, que trabaja directamente sobre archivos RAW generando una salida con mucho menos ruido. El planteamiento de su algoritmo DeepPRIME consiste en realizar la reducción de ruido y el demosaicing de los datos RAW en un único paso tal y como explican aquí:

"DxO harnessed its expertise in raw conversion, its unique dataset, and a substantial amount of computing power to train a deep neural network to jointly apply demosaicing and denoising. (...)

The idea of DeepPRIME was born. This extensive deep neural network is capable of transforming raw images directly into RGB images by applying defect pixel removal, demosaicing, and multi-scale denoising all at the same time. Rather than solve individual problems in an isolated way, as had been the norm for the past two decades, the technology approaches the problem holistically — a feat that was unimaginable before the advent of machine learning."



Si la interpolación Bayer ya se ha realizado, el procesado de la salida de DxO PureRAW tendrá la misma textura final usemos el revelador RAW que usemos para tratarlo. DxO da a entender que ningún programa convencional sería capaz de generar un resultado más próximo a lo que nuestro cerebro espera.

~~~

Tomamos el siguiente bodegón de prueba que contiene textos de reducido tamaño, objetos, texturas y parches de color uniforme (hacer clic para verlo con más detalle):


Hacemos dos capturas: una a ISO100 libre de ruido que usaremos como imagen de referencia para saber lo que realmente contenía la escena, y otra a ISO25600 (8 pasos menos de exposición) que usaremos para aplicar la reducción de ruido. El programa apenas tiene un switch de ajuste de enfoque y otro de corrección geométrica, los cuales dejamos desactivados. Esta simplicidad la considero un punto a favor.

DxO PureRAW devuelve un archivo DNG de gran tamaño porque se trata de un TIFF a color de 16 bits, ya que como hemos visto la red neuronal se encarga de realizar el demosaicing en paralelo a la reducción de ruido. Este DNG mantiene la linealidad y no tiene aplicado ningún balance de blancos ni gestión de color, por lo que a efectos de elasticidad es equivalente a un RAW genuino. Si lo abrimos sin procesado (dcraw -v -r 1 1 1 1 -o 0 -4 -T), tiene el típico aspecto verdoso de un RAW sin tratar:


Aquí se muestran tres recortes al 100% de distintos elementos de la escena: a la izquierda de la imagen sin ruido (ISO100), en el centro de la captura ruidosa (ISO25600) y a la derecha del procesado de ésta con DxO PureRAW (imprescindible hacer clic para tamaño real):


La reducción de ruido es impresionante. La forma del ruido que sobrevive (o genera?) DxO PureRAW es monocromático muy denso pero contenido, es decir afecta prácticamente a todos los píxeles pero sin alcanzar valores excesivamente altos en ninguno (más sobre esto después).

En cuanto a su tipología pareciera ser un ruido sin correlación espacial: aparece en cada píxel como un ruido fino independiente del que puedan tener píxeles contiguos, sin formar ningún tipo de "grano" o estructura como sí hacen algunos algoritmos de demosaicing.

En las zonas con menor exposición (ver sombras del recorte de Mazinger Z) se aprecian ciertas dominantes verdes que no existen en la captura de referencia, pero no son atribuibles al programa sino que la captura a ISO25600 ya las manifestaba como un promedio en sus píxeles más ruidosos.

Atendiendo a los 5 puntos marcados en la imagen anterior podemos hacer consideraciones interesantes:
  1. Cuando un texto está enmascarado por ruido, la red neuronal logra limpiarlo en gran medida pero no restaura los trazos del texto original porque no lo llega a descifrar como tal. Se limita a recomponer aquello que aún logra interpretarse a pesar del ruido.
  2. La red inventa sombras y aristas en el planeador de Koji Kabuto que no existen en la escena real, aunque si las buscamos en la imagen ruidosa vemos que son altamente compatibles con el resultado. También en las salidas de aire de la boca del robot se crean detalles que difieren de los originales.
  3. El ruido añadido en estructuras de cierta complejidad, como el ondulado del repujado de piel en la máscara, hace que la red neuronal las interprete de forma simplificada, como elementos más lineales que curvilíneos. Seguramente en su entrenamiento la red vio más estructuras de ese tipo.
  4. Respecto a las texturas más finas, cuando el ruido las hace totalmente irreconocibles en la imagen ruidosa, la red neuronal es incapaz de detectarlas generando una superficie lisa sin textura.
  5. Cuando no hay texturas, como en los parches de color, la red neuronal lo tiene mucho más fácil para restaurar el color original sin dominantes ni desviaciones, como por otro lado era esperable. Son zonas donde prácticamente cualquier algoritmo funciona muy bien.

En un uso real del programa no se dispondrá de una imagen libre de ruido con la que comparar, por lo que el resultado seguramente dejará satisfecho al usuario. Ante la imposibilidad de detectarlas, se darán por buenas las texturas y detalles inventados por la red neuronal, pero está bien saber que habrá una cierta dosis de ellas.

~~~

Vamos a cuantificar la mejora en ruido que logra DxO PureRAW. Para ello fotografiamos de nuevo la carta IT8 de colores a ISO25600 y calculamos la relación S/N sobre 24 parches neutros. Debemos hacer la captura algo fuera de foco y con una apertura cerrada, ya que cualquier textura o posible viñeteo sumarán como falso ruido empeorando el cálculo de relación S/N:


Tomamos el canal G de cada parche, una vez sobre el RAW original con un revelado lineal, neutro y sin balance de blancos ni gestión de color, y otra sobre el DNG producto de DxO PureRAW, que tiene la misma naturaleza.

Lo primero que notamos es que los niveles medios del DNG son algo mayores que los del RAW en los parches más oscuros. Es decir DxO PureRAW levanta sutilmente las sombras profundas, quizá fruto de sustraer un nivel de negro algo más bajo al exacto de la cámara (que es de 512):


De confirmarse esto no sería una buena noticia porque se estaría dejando de respetar la linealidad en las sombras, aunque por la desviación tampoco es algo demasiado grave.

La relación S/N en cada parche se calcula como el cociente entre el valor medio (S), y la desviación estándar (N) de los niveles G en el parche. Los resultados en función del nivel de exposición RAW (valor de S en escala logarítmica, siendo 0EV = saturación del sensor) son:



Las dos curvas de relación S/N mantienen una separación prácticamente constante, de lo que se deduce que la mejora es uniforme para todos los niveles de exposición RAW. Es decir DxO PureRAW actúa por igual en luces, tonos medios y sombras, proporcionando una mejora en ruido de +7,5dB o +1,25EV. Esto equivale a reducir el ruido visible al 40% del nivel original.

La ganancia se trasladará en un incremento de rango dinámico entre +1,25EV (domina ruido electrónico) y +2,5EV (domina ruido fotónico) que dependerá de la cámara en cuestión y del ISO usado. En concreto en la Sony A7 II de la prueba se traduce en una mejora en rango dinámico de +1,9EV, como se deriva del gráfico para un criterio de rango dinámico fotográfico con 12dB de relación S/N umbral. Así pasamos en esta cámara de poco más de 4 pasos de rango dinámico utilizable a ISO25600 a 6 pasos.

Pero que nadie se engañe: esto no es equivalente a tener un sensor con esa mejora de ruido y rango dinámico. Hemos visto cómo la red neuronal inventa parte del detalle y es además incapaz de recuperar ciertas texturas, así que siempre será preferible obtener el extra de calidad aumentando la exposición o con un sensor más prestacional.

~~~

Podemos validar nuestros cálculos con las curvas SNR de DxOMark para la A7 II, que nos proporcionan los siguientes valores (hacer clic para ampliar):

  • Relación S/N máxima a ISO25600: 25,6dB, que cuadra con la relación S/N de nuestra curva roja en saturación (0EV).
  • Rango dinámico a 12dB: 3,9EV, que cuadra con el valor ligeramente por encima de 4EV que medimos en nuestra gráfica.


~~~

Calculando los histogramas sobre parches individuales entendemos por qué percibíamos que el ruido de salida está acotado. Son histogramas más propios de una distribución uniforme que de la habitual distribución gaussiana de ruido en el sensor, pareciendo de hecho gaussianas truncadas artificialmente en sus extremos:



Recopilamos los histogramas antes y después de pasar por DxO PureRAW del canal G para los 24 parches. Podemos ver en la salida de DxO PureRAW (en salmón) el estrechamiento de niveles tras la reducción del ruido y la peculiar distribución "truncada" (hacer clic para ampliar):



El valor medio de cada parche en el resultado de salida está ligeramente por encima del original (los histogramas salmón no están 100% centrados en los grises), lo que tiene impacto en las sombras profundas como ya vimos.

~~~

Para terminar una comparativa rápida con otro programa reductor de ruido basado en redes neuronales, Topaz Denoise AI (imprescindible hacer clic para tamaño real):



Dejando de lado cuál de los dos aplique una reducción de ruido más potente, ya que Topaz permite ajustarse en este sentido, me quedo con DxO PureRAW por tener un resultado más natural. Topaz tiene un comportamiento más impredecible y una respuesta más orgánica y "acuarelada", algo muy propio de las redes neuronales, llegando más lejos en el rescate de texturas pero también generando mucho más falso detalle.

Además en los textos Topaz hace cosas difícilmente justificables generando líneas quasi horizontales inexistentes. Tampoco tiene sentido que procesando por igual los DNG, los textos de Topaz tengan más nitidez y contraste que en la imagen original, lo que denota procesados de enfoque internos adicionales a la pura reducción de ruido que lo alejan de una respuesta fiel.

~~~

Los archivos RAW utilizados en el estudio se pueden descargar de iso100.dng, iso25600.dng, iso25600dxopureraw.dng y iso25600topazdenoiseai.dng. Repositorio con el código R: GitHub.

2 comentarios:

  1. Tu inteligencia es mayor que el programa con mucha diferencia que envidia.
    JSCM
    Un saludo.

    ResponderEliminar
    Respuestas
    1. De hecho mi inteligencia se duplica cada día que pasa. Dos por cero, cero :D

      Eliminar

Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.