Open Image Denoise en GPU y CPU

Open Image Denoise en GPU y CPU. El sistema para eliminar el ruido del render se actualiza, el software de código permite el uso tanto en GPU como en CPU.

Una imagen tuiteada por el ingeniero principal senior de Intel, Jim Jeffers, muestra una versión experimental de OIDN. Dentro del renderizador Cycles de Blender en un ordenador portátil con una tarjeta gráfica Nvidia GeForce RTX 3080 Ti. Según Jeffers, la implementación es compatible con GPU de AMD y con la propia de Intel.

Un denoiser de renderizado impulsado por IA (inteligencia artificial), basado en CPU e independiente del hardware. Publicado por primera vez en 2019. Open Image Denoise es un conjunto de filtros que eliminan el ruido, ofreciendo un gran rendimiento y alta calidad para imágenes renderizadas con RayTrace.

La tecnología está integrada en una gama de herramientas y renderizadores DCC. Incluidos Arnold, el motor de renderizado Cycles de Blender; Cinema 4D, Houdini, Modo, V-Ray y Unity, donde se utiliza para eliminar los mapas de luz.

Open Image Denoise (OIDN) se basa en la biblioteca de redes neuronales oneDNN. Esto hace que, al igual que OptiX, la tecnología de la que estamos hablando, utiliza técnicas de IA para acelerar la eliminación de ruido.

Open Image Denoise en GPU y CPU comparativa
Open Image Denoise en GPU y CPU comparativa

Open Image Denoise en GPU y CPU funciona con AMD e Intel

A diferencia de OptiX, Open Image Denoise (OIDN) no es específico del hardware. Si bien fue diseñado para CPU Intel 64, admite arquitecturas compatibles. Incluidas las CPU AMD y, a partir de la actualización 1.4 del año pasado; los nuevos procesadores M1 de Apple.

La funcionalidad no está disponible en la versión pública actual, Open Image Denoise (OIDN) 1.4.3. Pero la imagen de demostración de Intel, incluida en la parte superior de esta historia, muestra que se implementa dentro del renderizador Cycles de Blender.

La imagen muestra la salida de Open Image Denoise (OIDN); ejecutándose en una GPU portátil Nvidia GeForce RTX 3080 Ti y una CPU Intel Core i9-12900H. Junto con la de OptiX que se ejecuta solo en la GPU.

Existen compilaciones públicas

Si se implementa en compilaciones públicas de software; el cambio debería permitir a los desarrolladores aprovechar toda la potencia para procesar las máquinas de los usuarios. Admite eliminar nombres de CPU y GPU con una sola base de código.

El propósito de Intel Open Image Denoise es proporcionar una biblioteca Denoise abierta, de alta calidad; eficiente y fácil de usar que permita reducir significativamente los tiempos de render en aplicaciones de render basadas en RayTrace.

Filtra el ruido de Monte Carlo inherente a los métodos estocásticos de RayTrace, reduciendo la cantidad de muestras necesarias por píxel. Incluso por múltiples órdenes de magnitud (dependiendo de la cercanía deseada a la verdad del suelo).

API sencilla pero flexible

Una API de C/C++ sencilla pero flexible; garantiza que la biblioteca se pueda integrar fácilmente en la mayoría de las soluciones de renderizado existentes o nuevas.

En el corazón de la biblioteca de Open Image Denoise hay una colección de filtros eficientes basados en el aprendizaje profundo. Que fueron entrenados para manejar una amplia gama de muestras por píxel (spp), desde 1 spp hasta casi completamente convergentes.

Por lo tanto, es adecuado tanto para la vista previa como para la representación final del fotograma. Los filtros pueden mejorar imágenes utilizando únicamente el búfer de color ruidoso (belleza), o, para conservar tanto detalle como sea posible. Opcionalmente también pueden utilizar búferes de características auxiliares (por ejemplo, albedo, normal).

Estos búferes son compatibles con la mayoría de los renderizadores como variables de salida arbitrarias (AOV) o normalmente se pueden implementar con poco esfuerzo.

Biblioteca de modelos Open Image Denoise en GPU y CPU

Aunque la biblioteca se suministra con un conjunto de modelos de filtro pre-entrenados, no es obligatorio usarlos. Para optimizar un filtro para un representador específico, recuento de muestras, tipo de contenido, escena, etc. Es posible entrenar el modelo utilizando el kit de herramientas de entrenamiento incluido y los datasets de imágenes proporcionados por el usuario.

Open Image Denoise se basa internamente en la biblioteca de redes neuronales profundas (oneDNN) de Intel oneAPI. Que explota automáticamente conjuntos de instrucciones modernos como Intel SSE4, AVX2 y AVX-512 logrando un alto rendimiento.

Disponibilidad y requisitos del sistema Open Image Denoise (OIDN) está disponible para Windows, Linux y macOS de 64 bits bajo una licencia Apache 2.0. Tanto el código fuente como las versiones compiladas están disponibles.

El propósito de Intel Open Image Denoise es proporcionar una biblioteca de denoising abierta, de alta calidad; eficiente y fácil de usar que permita reducir significativamente los tiempos de renderizado en aplicaciones de renderizado basadas en trazado de rayos.

Open Image Denoise en GPU y CPU comparativa 3
Open Image Denoise en GPU y CPU comparativa 3

Filtra el ruido de Monte Carlo

Lo hace inherente a los métodos de RayTrace estocásticos como el trazado de caminos. Reduciendo la cantidad de muestras necesarias por píxel incluso en múltiples órdenes de magnitud (dependiendo de la cercanía deseada a la verdad del suelo).

En el corazón de la biblioteca Intel Open Image Denoise se encuentra una colección de filtros de denoising eficientes basados en aprendizaje profundo. Que fueron entrenados para manejar una amplia gama de muestras por píxel (spp), desde 1 spp hasta casi completamente convergentes.

Por lo tanto, es adecuado tanto para la vista previa como para la representación final del fotograma. Los filtros pueden eliminar el ruido de las imágenes utilizando solo el búfer de color ruidoso (belleza). O para preservar la mayor cantidad de detalles posible, también pueden utilizar opcionalmente búferes de características auxiliares (por ejemplo, albedo, normal).

La mayoría de los renderizadores admiten dichos búferes como variables de salida arbitrarias (AOV) o generalmente se pueden implementar con poco esfuerzo.

Aunque la biblioteca se envía con un conjunto de modelos de filtro previamente entrenados, no es obligatorio usarlos. Para optimizar un filtro para un renderizador específico, recuento de muestras, tipo de contenido, escena, etc. Es posible entrenar el modelo utilizando el kit de herramientas de entrenamiento incluido y los conjuntos de datos de imágenes proporcionados por el usuario.

Repleto y potente gracias a una colección de filtros

En el corazón de la biblioteca Intel Open Image Denoise se encuentra una colección de filtros de denoising eficientes basados en aprendizaje profundo. Que fueron entrenados para manejar una amplia gama de muestras por píxel (spp), desde 1 spp hasta casi completamente convergentes.

Por lo tanto, es adecuado tanto para la vista previa como para la representación final del fotograma. Los filtros pueden eliminar el ruido de las imágenes utilizando solo el búfer de color ruidoso (belleza) o, para preservar la mayor cantidad de detalles posible. Se pueden utilizar opcionalmente búferes de características auxiliares (por ejemplo, albedo, normal).

La mayoría de los renderizadores admiten dichos búferes como variables de salida arbitrarias (AOV) o generalmente se pueden implementar con poco esfuerzo.

Kit de entrenamiento de IA (inteligencia artificial)

Aunque la biblioteca se envía con un conjunto de modelos de filtro previamente entrenados, no es obligatorio usarlos. Para optimizar un filtro para un renderizador específico, recuento de muestras, tipo de contenido, escena, etc. Es posible entrenar el modelo utilizando el kit de herramientas de entrenamiento incluido y los conjuntos de datos de imágenes proporcionados por el usuario.

Intel Open Image Denoise es compatible con CPU compatibles con la arquitectura Intel 64 y Apple Silicon, y se ejecuta en cualquier cosa. Desde computadoras portátiles hasta estaciones de trabajo y nodos de cómputo en sistemas HPC. Es lo suficientemente eficiente como para ser adecuado no solo para la representación fuera de línea; sino, dependiendo del hardware utilizado, también para el trazado de rayos interactivo.

Intel Open Image Denoise se basa internamente en Intel oneAPI Deep Neural Network Library (oneDNN); y explota automáticamente los conjuntos de instrucciones modernos como Intel SSE4; AVX2 y AVX-512 para lograr un alto rendimiento de eliminación de ruido. Se requiere una CPU con soporte para al menos SSE4.1 o Apple Silicon para ejecutar Intel Open Image Denoise.

Open Image Denoise en GPU y CPU comparativa 2
Open Image Denoise en GPU y CPU comparativa 2

Compilaciones de Open Image Denoise en GPU y CPU

Las últimas fuentes de Intel Open Image Denoise siempre están disponibles en el repositorio de GitHub de Intel Open Image Denoise. La rama predeterminada siempre debe apuntar a la última versión de corrección de errores probada.

Compilación en Windows

En Windows, el uso de la GUI de CMake () es la forma más conveniente de configurar Intel Open Image Denoise; y crear los archivos de solución de Visual Studio. Ve a los orígenes de Intel Open Image Denoise y especifica un directorio de compilación (si aún no existe, CMake lo creará).

Haces clic en configurar y selecciona como generador la versión de Visual Studio que tiene. Intel Open Image Denoise necesita Visual Studio 14 2015 o posterior. Para Windows 64 (no se admiten compilaciones de 32 bits), por ejemplo, Visual Studio 15 2017 Win64.

Si la configuración falla porque no se pudieron encontrar algunas dependencias, sigue las instrucciones dadas en el mensaje de error. Por ejemplo, establece la variable en la carpeta donde se instala TBB.TBB_ROOT

Opcionalmente, cambia las opciones de compilación predeterminadas y, a continuación, haces clic en generar para crear los archivos de proyecto en el directorio de compilación. Abre lo generado en Visual Studio, selecciona la configuración de compilación y compila el proyecto.

Alternativamente, Intel Open Image Denoise también se puede construir sin ninguna GUI, completamente en la consola.

En el símbolo del sistema de Visual Studio, escribe el siguiente código:

cd path\to\oidn
mkdir build
cd build
cmake -G "Visual Studio 15 2017 Win64" [-D VARIABLE=value] ..
cmake --build

Api de ruido de imagen abierta

Open Image Denoise proporciona una API C99 (también compatible con C++) y una API contenedora de C++11 también. Para simplificar, este documento se refiere principalmente a la versión C99 de la API.

La API está diseñada de manera orientada a objetos, por ejemplo, contiene objetos de dispositivo (tipo), objetos de búfer (tipo) y objetos de filtro (tipo). Todos los objetos se cuentan con referencias, y los controladores se pueden liberar llamando a la función de liberación adecuada. Por ejemplo, retenerse incrementando el recuento de referencias.

Un aspecto importante de los objetos es que la configuración de sus parámetros no tiene un efecto inmediato (con algunas excepciones). En su lugar, los objetos con parámetros actualizados están en un estado inutilizable hasta que los parámetros se confirman explícitamente en un objeto determinado.

La semántica de confirmación permite agrupar por lotes varios cambios pequeños y especifica exactamente cuándo se producirán los cambios en los objetos.

Todas las llamadas a la API son seguras para subprocesos, pero las operaciones que utilizan el mismo dispositivo se serializarán. Por lo que se debe minimizar la cantidad de llamadas a la API desde diferentes subprocesos.

Open Image Denoise en GPU y CPU comparativa 5
Open Image Denoise en GPU y CPU comparativa 5

Parámetros adicionales para dispositivos solo con CPU

Ten en cuenta que el dispositivo de CPU depende en gran medida de la configuración de las afinidades de subprocesos para lograr un rendimiento óptimo. Por lo que se recomienda encarecidamente dejar esta opción habilitada.

Sin embargo, esto puede interferir con la aplicación si también establece las afinidades de subprocesos, lo que podría causar una degradación del rendimiento. En tales casos, la solución recomendada es deshabilitar la configuración de las afinidades en la aplicación o en Intel Open Image Denoise. O establecer/restablecer siempre las afinidades antes/después de cada región paralela de la aplicación.

Manejo de los errores en Open Image Denoise en GPU y CPU

Cada subproceso de usuario tiene su propio código de error por dispositivo. Si se produce un error al llamar a una función de API. Este código de error se establece en el error que se ha producido si no almacena ningún error anterior. El error almacenado actualmente puede ser consultado por la aplicación a través de un puntero a una cadena C; que se establecerá en un mensaje de error más descriptivo.

Esta función también borra el código de error. Lo que asegura que el código de error devuelto es siempre el primer error que se ha producido desde la última invocación de en el subproceso actual. Tenga en cuenta que la cadena de mensaje de error devuelta opcionalmente sólo es válida hasta la siguiente invocación de la función.

Investigar en los posibles errores

Para recibir notificaciones cuando se produzcan errores. Solo se puede registrar una sola función de devolución de llamada por dispositivo. Otras invocaciones sobrescriben la función de devolución de llamada establecida anteriormente, que no requieren llamar también a la función.

Pasar como puntero de función deshabilita la función de devolución de llamada registrada. Cuando se invoca la función de devolución de llamada registrada; se le pasa la carga útil definida por el usuario (argumento especificado en el momento del registro). El código de error (argumento) del error producido, así como una cadena (argumento) que describe con más detalle el error.

El código de error siempre se establece incluso si se registra una función de devolución de llamada de error. Se recomienda establecer siempre una función de devolución de llamada de error, para detectar todos los errores.

Cuando se produce un error en la construcción del dispositivo, se devuelve como dispositivo. Para detectar el código de error de una construcción de dispositivo fallida de este tipo, pasa como dispositivo a la función. Para todas las demás invocaciones se debe especificar un identificador de dispositivo adecuado.

Los siguientes errores son utilizados actualmente por Intel Open Image Denoise:

  • OIDN_ERROR_NONE: No se ha producido ningún error.
  • OIDN_ERROR_CANCELLED: El usuario canceló la operación.
  • OIDN_ERROR_UNKNOWN: Se ha producido un error desconocido.
  • OIDN_ERROR_INVALID_OPERATION: La operación no está permitida.
  • OIDN_ERROR_INVALID_ARGUMENT: Se especificó un argumento no válido.
  • OIDN_ERROR_OUT_OF_MEMORY: No hay suficiente memoria para ejecutar la operación.
  • OIDN_ERROR_UNSUPPORTED_HARDWARE: El hardware (por ejemplo, CPU) no es compatible.

Filtro RT de Open Image Denoise en GPU y CPU

El filtro para RayTracing es un filtro genérico eliminar el ruido en el RayTrace que es adecuado para denoizar imágenes renderizadas con métodos de RayTrace Monte Carlo. Como el trazado de trayectoria unidireccional y bidireccional.

Admite la profundidad de campo y el desenfoque de movimiento, pero no es estable a estas alturas. El filtro se basa en una red neuronal convolucional (CNN). Tiene como objetivo proporcionar un buen equilibrio entre el rendimiento de denoising y la calidad. El filtro viene con un conjunto de modelos CNN entrenados que funcionan bien con una amplia gama de renderizadores basados en trazado de rayos y niveles de ruido.

Imagen renderizada con ruido mediante RayTrace de trazado unidireccional con 4 muestras por píxel
Imagen renderizada con ruido mediante RayTrace de trazado unidireccional con 4 muestras por píxel.
Imagen renderizada con el filtro activo
Imagen renderizada con el filtro activo.

Mejorar la calidad y conservar los detalle

Para eliminar el ruido de las imágenes de belleza, acepta una imagen de bajo rango dinámico (LDR). O de alto rango dinámico (HDR) () como imagen de entrada principal. Además de esto, también acepta imágenes de características auxiliares, y , que son entradas opcionales que suelen mejorar significativamente la calidad de denoising, conservando más detalles.

Es posible eliminar el ruido de las imágenes auxiliares, en cuyo caso solo se debe especificar la imagen auxiliar respectiva como entrada. En lugar de la imagen de belleza. Esto se puede hacer como un paso de filtrado para mejorar aún más la calidad de la imagen sin ruido.

El filtro tiene ciertas limitaciones con respecto a las imágenes de entrada admitidas. En particular, no puede eliminar el ruido de las imágenes que no se representaron con trazado de rayos. Otra limitación importante está relacionada con los filtros anti-aliasing.

El filtro para reconstruir píxeles

La mayoría de los renderizadores utilizan un filtro de reconstrucción de píxeles de alta calidad en lugar de un filtro de caja trivial para minimizar los artefactos de aliasing. Por ejemplo, Gaussian, Blackman-Harris.

El filtro admite dichos filtros de píxeles, pero solo si se implementa con muestreo importante. El muestreo de píxeles ponderado (a veces llamado splatting) introduce correlación entre los píxeles vecinos. Lo que hace que la eliminación de ruido falle (el ruido no se filtrará), por lo que no es compatible.

El filtro se puede crear pasando a la función como el tipo de filtro. El filtro admite los parámetros enumerados en la tabla siguiente. Todas las imágenes especificadas deben tener las mismas dimensiones. La imagen de salida puede ser una de las imágenes de entrada (es decir, se admite la eliminación de ruidos en el lugar).

Parámetros admitidos por el filtro

El uso de imágenes de características auxiliares como albedo y normal ayuda a preservar los detalles finos y las texturas en la imagen. Por lo que puede mejorar significativamente la calidad de denoising. Estas imágenes normalmente deben contener valores de característica para el primer golpe (es decir, la superficie que es directamente visible) por píxel.

Esto funciona bien para la mayoría de las superficies, pero no proporciona ningún beneficio para los reflejos y objetos visibles a través de superficies transparentes. En comparación con solo usar el color como entrada). Sin embargo, este problema generalmente se puede solucionar almacenando los valores de las características para un golpe posterior. Es decir, la reflexión y/o refracción en lugar del primer golpe.

Trayectorias especulares en Open Image Denoise en GPU y CPU

Por ejemplo, generalmente funciona bien seguir trayectorias especulares perfectas (delta); y almacenar características para el primer golpe de superficie difuso o brillante en su lugar. Por ejemplo, para dieléctricos y espejos especulares perfectos. Esto puede mejorar en gran medida la calidad de los reflejos y la transmisión. Describiremos este enfoque con más detalle en las siguientes sub-secciones.

Las imágenes de características auxiliares deben estar lo más libres de ruido posible. No es un requisito estricto, pero demasiado ruido en las imágenes de la función puede causar ruido residual en la salida. Idealmente, estos deben estar completamente libres de ruido. Si este es el caso, esto debe insinuarse al filtro utilizando el parámetro para garantizar la mayor calidad de imagen posible.

Open Image Denoise en GPU y CPU comparativa 4
Open Image Denoise en GPU y CPU comparativa 4

No todos los ruidos molestan o deben ser eliminados

Pero este parámetro debe usarse con cuidado: si se habilita; cualquier ruido presente en las imágenes auxiliares terminará también en la imagen denoizada, como ruido residual. Por lo tanto, debe habilitarse solo si se garantiza que las imágenes auxiliares estén libres de ruido.

Por lo general, es difícil proporcionar imágenes de características limpias, y algo de ruido residual puede estar presente en la salida incluso con la desactivación. Para eliminar este ruido e incluso para mejorar la nitidez de los detalles de textura, las imágenes auxiliares deben denoizarse primero en un paso de filtrado previo. Como se mencionó anteriormente.

Luego, estas imágenes auxiliares denoizadas podrían usarse para denoizar la imagen de belleza. Dado que ahora están libres de ruido, el parámetro debe estar habilitado. Consulte la sección Denoising con filtrado previo (C++11 API) para obtener un ejemplo de código sencillo.

Reutilizar imágenes filtras previamente

El filtrado previo hace que el denoising sea mucho más costoso, pero si hay varios AOV de color para eliminar; las imágenes auxiliares filtradas previamente se pueden reutilizar para denoizar múltiples AOV, amortizando el costo del paso de filtrado previo.

Por lo tanto, para la eliminación final del fotograma, donde se requiere la mejor calidad de imagen posible. Se recomienda filtrar previamente las características auxiliares si son ruidosas y habilitar el parámetro. La eliminación de ruido con características auxiliares ruidosas debe reservarse para vistas previas y representación interactiva.

Todas las imágenes auxiliares deben usar el mismo filtro de reconstrucción de píxeles que la imagen de belleza. El uso de una imagen de belleza correctamente suavizada pero con alias albedo o imágenes normales probablemente introducirá artefactos alrededor de los bordes.

Albedo en Open Image Denoise en GPU y CPU

La imagen de albedo es la imagen de característica que generalmente proporciona la mayor mejora de calidad. Debe contener el color aproximado de las superficies independientemente de la iluminación y el ángulo de visión.

Imagen con albedo y un solo pase - Open Image Denoise en GPU y CPU
Imagen con albedo y un solo pase – Open Image Denoise en GPU y CPU

Albedos de superficies transparentes

Imagen de albedo de ejemplo obtenida utilizando el primer golpe difuso o brillante (no delta). Ten en cuenta que los albedos de las superficies transparentes especulares perfectas (delta); se calculan como la mezcla de Fresnel de los albedos reflejados y transmitidos.

Para superficies mate simples, esto significa usar el color/textura difusa como albedo. Para otras superficies más complejas, no siempre es obvio cuál es la mejor manera de calcular el albedo. Pero el filtro denoising es flexible hasta cierto punto y funciona bien con albedos calculados de manera diferente. Por lo tanto, no es necesario calcular los valores de albedo estrictos y exactos, sino que siempre deben estar entre 0 y 1.

Para las superficies metálicas, el albedo debe ser la reflectividad a incidencia normal. Por ejemplo, del modelo de Fresnel metálico amigable con el artista o la reflectividad promedio. O si estos son constantes (no texturizados) o desconocidos, el albedo puede ser 1.

Superficies dieléctricas para Open Image Denoise en GPU y CPU

El albedo para las superficies dieléctricas (por ejemplo, vidrio) debe ser 1 o, si la superficie es perfectamente especular. Es decir, tiene un delta BSDF, la mezcla de Fresnel de los albedos reflejados y transmitidos. Este último suele funcionar mejor pero solo si no introduce demasiado ruido o el albedo está filtrado previamente.

Si el ruido es un problema, recomendamos dividir el camino en un camino reflejado y uno transmitido en el primer golpe; y tal vez volver a un albedo de 1 para los golpes dieléctricos posteriores. El albedo reflejado en sí mismo también se puede usar para superficies similares a espejos.

El albedo para superficies en capas se puede calcular como la suma ponderada de los albedos de las capas individuales. Las capas de capa transparente no absorbente pueden simplemente ignorarse. También se puede usar el albedo de la reflexión especular perfecta, pero se debe tener en cuenta la absorción.

Tienes más artículo sobre Open Image Denoise aquí. En el foro puedes encontrar toda la información agrupada, sigue leyendo…