Fecha actual Jue Nov 21, 2024 5:23 pm


Calibración de cámara usando una red neuronal

El rincón de los hilos tecnofrikis

Moderadores: IOM60, laucsap60, klomp, Siniestro, Guillermo Luijk, Pablo Valido

Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Mar May 07, 2019 11:01 pm

Para los que os hayáis metido en el farragoso mundo de la calibración de cámara, quizá me podáis ayudar. Sorry que lo dejo en inglés pero me da pereza traducir:

In order to practice with NN I have thought of doing a camera calibration exercise, to find out if a simple NN can perform similarly or even better than classical ICC profiles based on LUT's. I have no much idea about how ICC profiles and calibration in general work so here are some questions:

  • In a regular calibrated pipeline, I guess white balance is applied BEFORE the ICC profiling conversions take place. Is that correct?
  • To measure the performance of a calibration workflow, a standard procedure is to measure L*a*b deviations (deltaE) over different patches using some colour card, correct?
  • Let's assume we use an IT8 card for being the card with more patches (that is good in order to train the NN): the L*a*b values with which we need to compare our calibrated output are standard (synthetic) expected values or are Lab values measured (spectrophotometer) over the specific IT8 card used?
  • To do proper WB before training the network, I guess we just need to use the gray patches on the card, correct? later on the white balanced RAW RGB values will be used to train the network.


This is the structure of the NN I plan to implement. Will try different number of nodes since overfitting could lead to very precise colour reproduction for the patches but undesired behaviour for colours unseen by the NN. From a ML point of view, we should preserve some patches in the card as validation set, but on the other hand even an IT8 has very few samples to properly train a NN so I'm not sure what's the best approach here to prevent overfitting.

Imagen

Regards
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Jue May 16, 2019 7:18 pm

Le he podido dar un nuevo empujoncillo a este tema, y como el interés que ha despertado ha sido masivo comento avances:
  • Hugo Rodríguez ha tenido la amabilidad de enviarme una captura RAW hecha en condiciones óptimas de su carta IT8, junto a los valores de color medidos sobre ella (espectrofotómetro) que deberían obtenerse tras el perfilado, así que la usaré para perfilar su cámara y comparar con el rendimiento del perfil ICC que obtuvo él
  • He decidido que la red neuronal no genere valores Lab, sino valores XYZ, que son el paso intermedio ideal y fácilmente convertibles tanto a Lab (para medir desviaciones de color delta E), como a sRGB para tener una imagen visualizable en un perfil estándar
  • Las fórmulas para hacer todo lo anterior las he sacado de la Biblia de las matemáticas del color, y obtengo las mismas conversiones que las calculadoras de Lindbloom y EasyRGB, así que no usaré Photoshop para ninguna etapa del proceso de revelado + perfilado + conversión a espacio de salida

El esquema de perfilado va a ser así:

Imagen

Ésta es la distribución de colores (medida con espectrofotómetro) de la carta IT8 de Hugo: en el gráfico a-b las componentes de color de los parches de color, y en la curva el valor L de los parches grises:

Imagen

Imagen

Imagen


SOBRE LA RED NEURONAL

La red neuronal no es más que una aproximación de una función: para cada terna de valores RGB del RAW con WB que le suministres, ella generará los valores XYZ calibrados de salida. La idea es entrenar la red neuronal dándole como:
  • Valores de entrada: las medianas (he visto que la carta tiene algún arañazo, la mediana los eliminará mucho mejor que una media y ahorra tener que andar clonando imperefecciones) de los valores RAW en cada parche de tu RAW, una vez hecho el WB.
  • Valores de salida: los valores XYZ que me pasas en tu tabla y que son los ideales que deberían tenerse en cada parche.

Eso hace que la red neuronal sepa convertir cualquier terna de valores RAW con WB a los valores XYZ esperables. Luego esos valores XYZ:
  • Se convierten a Lab para medir desviaciones delta E respecto a los valores ideales de salida
  • Se convierten a sRGB para tener una imagen visualizable estándar y poderla comparar con otras obtenidas por otros métodos
Una vez la red ha sido entrenada sirve para obtener una imagen calibrada de cualquier archivo RAW (obtenido en similares condiciones de iluminación, usando el mismo WB, etc...)


SOBRE LA VALIDACIÓN DE PERFILES

Le he hecho a Hugo la siguiente reflexión, que me parece importante al menos para tomar conciencia de las limitaciones del perfilado de una cámara (o escáner) en base a una carta de colores: una carta tiene un conjunto de parches que es solo una muestra de los millones de colores posibles que la cámara va a fotografiar. Cómo se garantiza la precisión del perfil ICC al convertir un color que NO esté en la carta? por ejemplo un color intermedio entre dos parches. Entiendo que se asume que la interpolación que harán las LUTs del perfil será buena, pero en realidad no se comprueba, solo se asume, no?.

En los algoritmos de inteligencia artificial (en este caso redes neuronales), es una práctica imprescindible analizar cómo de bueno es el algoritmo a la hora de predecir valores de salida para entradas que nunca ha visto. Imagina que un algoritmo que predice bajas de clientes, acierta al 100% al predecir la baja sobre esos mismos clientes con los que ha sido entrenado, pero falla estrepitosamente al predecir las posibles bajas de otros clientes que nunca ha "visto"; ese algoritmo le sirve de poco a la empresa. Esto se soluciona reservando una parte de tu set de datos, de manera que el algoritmo no los "vea" durante su entrenamiento, y luego se analiza cómo de bueno es el algoritmo prediciendo esos datos descartados en la fase de entrenamiento.

Traducido a la IT8 sería equivalente a reservar ciertos parches (por ejemplo un 20% de total), y entrenar la red solo con los restantes 80%. La precisión de la red neuronal no se medirá como lo bien que genere el color de los parches con que ha sido entrenada (donde ya te digo que si se quiere puede dar el valor exacto con todos los decimales que se quiera), sino precisamente por lo buena que sea prediciendo el color en parches que no ha usado en su entrenamiento. Si veo que la precisión en los parches "no vistos" por la red es buena, quizá haga un entrenamiento final con todos los parches; obviamente cuantos más parches se tengan mejor. Por eso los pseudo "perfiles" generados con cartas Colorchecker, que solo tienen 24 parches, me parecen toda una temeridad (aunque pueda ser mejor que no hacer nada).

Salu2!
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Calibración de cámara usando una red neuronal

Notapor pardal » Vie May 17, 2019 10:17 am

Guillermo Luijk escribió:La red neuronal no es más que una aproximación de una función: para cada terna de valores RGB del RAW con WB que le suministres, ella generará los valores XYZ calibrados de salida.


Eso en realidad y para este caso concreto no seria el uso adecuado o tipico de una red neuronal (NN), si es que lo he entendido bien :roll: . A una NN tipicamente le pasarias una imagen entera y el resultado seria algo que reconoce en ella. Por ejemplo le pasas la imagen de un 'captcha' de esos para ver si eres una persona y te devuelve los caracteres que reconoce. O le pasas imagenes de frutas y te devuelve el nombre de las frutas que reconoce. O un audio y te devuelve el texto.

Lo que comentas seria una funcion mapeada (si sabes el resultado para todos los valores), o interpolada (si la diferencia entre los valores que no sabes es gradual, lineal o no), o de 'nearest neighbor' (por proximidad), de clustering (si los resultados se agrupan en zonas o regiones a descubrir). La mayor parte de todo esto tiene poco de inteligencia artificial, en cambio las redes neuronales o el deep learning si.

Que le pases la imagen entera a la NN creo que en este caso tampoco tiene sentido, por que entiendo que para un pixel concreto R,G,B el valor de salida siempre ha de ser el nuevo color calibrado, XYZ, independientemente del resto de la foto o de los pixeles vecinos, no? Osea, como dices no es mas que una funcion con 3 valores de entrada y 3 de salida.

Si puedes tener una tabla con todos los valores posibles de RGB=>XYZ, seria un simple mapeo (para 8 bits seria 2^(8*3) unos 16M de lineas).
Si no posiblemente la mejor solucion seria una tabla con los valores que tengas pero bien distribuidos, los de la carta o algunos mas, y con eso se interpola o se calculan los mas 'cercanos' con algun criterio, asumiendo que las variaciones hacia los valores que faltan son progresivas. Cuantos mas valores de referencia bien distribuidos mejor, obviamente.

Es cierto que si que puedes montar la red neuronal con solo 3 entradas y 3 salidas para que intente descubrir un patron subyacente a causa del sensor o algun efecto desconocido. Pero eso solo seria util si entre los valores de entrada y salida no hubiera ninguna correlacion facil de ver, si fueran aparentemente aleatorios pero se sospecha que hay un patron oculto.
Si entre una tonalidad de rojo y otra el resultado son tambien tonalidades cercanas y esta claro que van correladas, para eso no hace falta red neuronal sino programar la interpolacion que mejor se adapte y con el maximo de puntos de referencia.
Eso si he entendido bien lo que se pretende.
pardal
 
Mensajes: 222
Registrado: Mar May 15, 2012 1:28 pm

Re: Calibración de cámara usando una red neuronal

Notapor pardal » Vie May 17, 2019 10:27 am

Guillermo Luijk escribió:En los algoritmos de inteligencia artificial (en este caso redes neuronales), es una práctica imprescindible analizar cómo de bueno es el algoritmo a la hora de predecir valores de salida para entradas que nunca ha visto.
(...)
Si veo que la precisión en los parches "no vistos" por la red es buena, quizá haga un entrenamiento final con todos los parches; obviamente cuantos más parches se tengan mejor. Por eso los pseudo "perfiles" generados con cartas Colorchecker, que solo tienen 24 parches, me parecen toda una temeridad (aunque pueda ser mejor que no hacer nada).


Realmente ese el objetivo de una NN, que aprenda a generalizar mas alla de los valores de entrenamiento.

Si pasa lo que comentas, que solo es buena con los valores de entrenamiento, a eso se le llama 'overfitting' y significa que la red no ha sido capaz de ajustarse para generalizar correctamente, osea, no ha encontrado el patron subyacente y por tanto no funciona, no sirve.

O bien la entrenas mas a ver si se ajusta, tal vez lo valores de entrenamiento no eran suficientemente representativos o bien distribuidos. O tienes que replantear todo el tema.
O bien, los valores son realmente aleatorios y no hay patron que encontrar, tambien puede ser.
pardal
 
Mensajes: 222
Registrado: Mar May 15, 2012 1:28 pm

Re: Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Vie May 17, 2019 12:44 pm

pardal escribió:(...)
Que le pases la imagen entera a la NN creo que en este caso tampoco tiene sentido, por que entiendo que para un pixel concreto R,G,B el valor de salida siempre ha de ser el nuevo color calibrado, XYZ.


Claro, no le voy a pasar ninguna imagen a la NN, lo explicaba arriba. Incluso hablaba de usar la mediana en cada parche por robustez frente a las rayaduras en lugar de la media.

Las NN tienen muchos usos, no hay que pensar solo en la IA del autopilot de Tesla. De hecho el primero de ellos cuando se descubrieron y en el que son más cercanas a una solución determinista es en aproximar funciones matemáticas, y de eso se trata aquí. No es un ejercicio de tratamiento de imágenes, en ningún momento le voy a dar a la NN la foto de la carta. Le voy a dar pares de ternas de valores (tantos como parches tiene la carta IT8): como entrada los valores RGB del archivo RAW (con el balance de blancos ya hecho) promediados en cada parche, y como salida los valores XYZ normalizados de la carta de color de Hugo.

El handicap es que son pocos valores, pero son los mismos pocos con los que se construyen los perfiles ICC clásicos. La parte buena es que las correspondencias RGB-XYZ que le voy a pasar no tienen ruido así que no existe posible overfitting al ruido. La clave pienso que va a ser usar una red lo más simple posible para que las interpolaciones sean suaves, manteniendo alta precisión en los parches (valores 'vistos' por la NN). Puede salir un churro, pero quiero probarlo.

Salu2!
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Calibración de cámara usando una red neuronal

Notapor pardal » Vie May 17, 2019 1:24 pm

Guillermo Luijk escribió:
pardal escribió:(...)
No le voy a pasar ninguna imagen a la NN, lo he explicado arriba. Incluso hablaba de usar la mediana en cada parche por robustez frente a las rayaduras en lugar de la media.


Eso ya lo he entendido, es lo que te pongo en la explicacion. En tu caso lo que quieres conseguir seria f(R,G,B)=X,Y,Z. Si que es posible montar una NN para eso, ya lo he puesto.
Lo que digo es que no es adecuado usar una NN para hacer algo que se puede conseguir por ejemplo interpolando. No se si es el caso aqui, pero tiene pinta, se tendria que comprobar.

En parte lo que dices es cierto, las NN se pueden usar para aproximar funciones complejas. Pero han de ser funciones que no se pueden aproximar de otra forma ya conocida, matematicamente. Funciones que tienen patrones ocultos que no es posible deducir y programar estilo 'tradicional' o bien que es extremadamente complejo. Interpolar es algo bien conocido y que funciona perfectamente, no se si en este caso seria aplicable, pero si lo es no hace falta una NN para nada. En el mejor de los casos conseguirias lo mismo.

La cuestion es si los valores no conocidos son interpolables para un color dado (RGB) desde los conocidos cercanos y sus valores calibrados. Osea, si la diferencia con el valor calibrado varia de forma progresiva entre dos o mas valores calibrados conocidos cercanos o si no tiene nada que ver y no se sabe como varia o el patron es tan complejo que no se puede programar. Si es progresivo lo suyo es interpolar y listo.
pardal
 
Mensajes: 222
Registrado: Mar May 15, 2012 1:28 pm

Re: Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Vie May 17, 2019 1:31 pm

pardal escribió:En parte lo que dices es cierto, las NN se pueden usar para aproximar funciones complejas. Pero han de ser funciones que no se pueden aproximar de otra forma ya conocida, matematicamente.


Es justo el caso. Es una función de transformación de los valores RAW capturados por el sensor a los colores exactos que refleja la carta IT8 en la realidad medidos con espectrofotómetro. Esa transformación no tiene una fórmula cerrada conocida por eso solo podemos aproximarla, ya sea con una matriz 3x3 (revelado estándar de los reveladores RAW), con un perfil ICC (solución más elaborada basada en LUTs) y yo quiero probar la NN. Los perfiles ICC son LUTs, es decir pura fuerza bruta. Aquí se trata de con un modelo más sencillo intentar obtener un resultado similar.

Salu2!
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Calibración de cámara usando una red neuronal

Notapor pardal » Vie May 17, 2019 2:14 pm

Guillermo Luijk escribió: Esa transformación no tiene una fórmula cerrada conocida por eso solo podemos aproximarla, ya sea con una matriz 3x3 (revelado estándar de los reveladores RAW), con un perfil ICC (solución más elaborada basada en LUTs) y yo quiero probar la NN. Los perfiles ICC son LUTs, es decir pura fuerza bruta. Aquí se trata de con un modelo más sencillo intentar obtener un resultado similar.


Ya, pero mirandomelo un poco me temo que no vas a conseguir algo mejor que una buena interpolacion.

Por lo que he visto leyendo por ahi eso de las LUT son 'look up tables', osea tablas de mapeo A,B,C=>X,Y,Z de distintos tipos. Y entiendo que si no tienen todos los posibles colores en la tabla lo que hacen es interpolar entre los mas cercanos. En los ejemplos graficos que ponen la variacion si que es claramente progresiva, asi que eso no lo vas a mejorar con ninguna NN, yo diria.

A no ser, que entre dos valores conocidos haya unas extrañas fluctuaciones de colores que hacen que la interpolacion sea poco precisa y la NN consiga encontrar el patron oculto de esas fluctuaciones. Pero a mi me parece que los colores si que varian de forma bastante uniforme, con lo que lo mas simple y preciso seria interpolar. Pero no se, son suposiciones, vaya.
Lo unico que igual se consigue es que la NN se mas 'pequeña' que la tabla (LUT) a igual precision, o mas rapida, pero probablemente ni eso.
pardal
 
Mensajes: 222
Registrado: Mar May 15, 2012 1:28 pm

Re: Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Vie May 17, 2019 2:40 pm

pardal escribió:Lo unico que igual se consigue es que la NN se mas 'pequeña' que la tabla (LUT).


Ésa es la idea precisamente, obviar la fuerza bruta de las LUTs y tener un modelo mucho más compacto. Aquí con una red de 2x64 nodos (son solo 4600 parámetros) se tiene el mismo resultado que con una LUT de 50 millones de valores, es un problema similar de interpolación. Para la transformación de RAW -> XYZ creo que lo mejor será ni siquiera usar una red con tantos nodos precisamente para tener transiciones suaves.

Salu2!
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Calibración de cámara usando una red neuronal

Notapor pardal » Vie May 17, 2019 7:38 pm

Si, ya lo habia visto hace dias y me parece un ejercicio muy interesante. Aunque algunos conceptos,sin dejar de ser correctos, me parecen algo cogidos por los pelos en lo que respecta a las redes neuronales. No te lo tomes como una critica, es muy interesante y creo que abre interesantes opciones.

Pero por ejemplo, como ya tu mismo comentas, el hecho de aplicar la NN ya entrenada a diversas fotos es irrelevante, puede ayudar visualmente o como curiosidad, pero nada mas. Un color pasado por la NN va a ser el mismo da igual en que imagen este, los pixeles que tenga al lado, gradientes, contrastes y cualquier otro efecto visual. La validacion correcta y objetiva seria simplemente alguna medida del error sobre todos los posibles colores. Lo de las fotos de hecho podria llevar a engaño visualmente, al no poder revisar en una foto concreta todos los posibles colores, puede que los que predominen sean pocos y sean los que mejor funcionan, etc.

El hecho de entrenarla con todos los posibles valores no es un problema, se hace en algunos casos aunque tarde dias. Pero en este caso la transformacion tiene un claro patron que se puede expresar con algunas funciones simples, concretamente las 3 que has aplicado inicialmente con photoshop. Asi que lo que estas consiguiendo diria que no es mas que modelar esas 3 funciones con la NN. Es un caso muy particular, para eso tampoco haria falta una tabla de mapeo de 16 millones de entradas, solo las 3 funciones. Es logico que la NN mejore los 16 millones de opciones en tamaño.

Pero si la transformacion no fuera asi sino un caso real calibrando color por color, veriamos como de efectiva o pequeña se quedaria la NN y si seria tan precisa comparada con una LUT. Puede que si, no digo que no, puede que encontrara los patrones ocultos si los hay, pero eso esta por ver.

Y por ultimo comentas: "...Sin embargo al aplicarla a imágenes que contengan colores que la red nunca ha "visto", el resultado puede ser impredecible." Pero es que ese seria tipicamente el objetivo de una red neuronal, que aprenda y luego la puedas aplicar a entradas desconocidas y te de un buen resultado. Si no es que algo falla, posiblemente por la misma naturaleza de la operacion o los datos mismo.
Pero ya digo, es interesante igualmente.
pardal
 
Mensajes: 222
Registrado: Mar May 15, 2012 1:28 pm

Re: Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Sab May 18, 2019 12:19 am

pardal escribió:La validacion correcta y objetiva seria simplemente alguna medida del error sobre todos los posibles colores.
(...)
la transformacion tiene un claro patron que se puede expresar con algunas funciones simples, concretamente las 3 que has aplicado inicialmente con photoshop. Asi que lo que estas consiguiendo diria que no es mas que modelar esas 3 funciones con la NN. Es un caso muy particular, para eso tampoco haria falta una tabla de mapeo de 16 millones de entradas, solo las 3 funciones.


Creo que no has entendido del todo la motivación del ejercicio. No puedes tener las tres funciones, de eso se trata, de que tienes un sistema caja negra que cuando le metes una imagen te proporciona un procesado. No sabes qué hacen sus tripas pero quieres modelar esa caja negra de algún modo. Por fuerza bruta sería la LUT, con la red neuronal tienes una aproximación muy buena con 50.000.000/4.600=11000 veces menos parámetros que la LUT y muy poco error. Por ejemplo RAW Therapee usa este tipo de LUTs para aplicar filtros que imitan películas. Con una red tendrías una definición mucho más compacta de todos esos filtros.

Y sí que validé la red sobre todos los colores posibles, hay tres imágenes precisamente donde se comentan las diferencias. Existen, pero a nivel visual (es decir para un fotógrafo) serían irrelevantes pues afectan a una ínfima parte del total de colores que podemos encontrar en una imagen.

Salu2!
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Dom May 19, 2019 10:44 pm

Pocos avances:
- Práctica con librería para leer/guardar imágenes en 16 bits (imageio)
- Extracción RAW lineal con balance de blancos sobre parches grises
- Carta leída, recortada y calculada la mediana en cada parche

Imagen

El código aquí

Salu2!
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Mar May 21, 2019 9:16 pm

Para la muchedumbre seguidora del hilo, hoy he entrenado las primeras redes neuronales para convertir los valores RGB que resultan al extraer los datos del RAW (solo aplicando balance de blancos) al espacio XYZ. XYZ es el espacio intermedio que suele usarse como salto a cualquier espacio de salida. Desde él llegaré (esta vez con fórmulas exactas cerradas) a:
  • Lab para medir la precisión del color
  • sRGB/ProPhoto RGB para tener una imagen de salida visualizable

Red neuronal 1: es una red sin etapas ocultas, es decir, es equivalente a la matriz 3x3 de conversión que usan los reveladores RAW básicos. Al comparar los valores XYZ teóricos con las predicciones de la red se tiene:

Imagen

Si la conversión fuera perfecta todas las pelotitas caerían perfectamente alineadas en la diagonal.

Red neuronal 2: es una red densa de dos etapas y 200 neuronas por etapa. El resultado mejora mucho aunque esperaba que fuese perfecto.

Imagen

En el siguiente rato que saque haré la conversión a Lab para medir las desviaciones de color de cada red, y cómo comparan sus salidas.

El código aquí.

Salu2!
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Jue May 30, 2019 10:27 pm

Recopilación de las tres redes probadas hasta ahora (se ha añadido red con salida Lab, que mejora la salida XYZ + conversión a Lab):

"""Delta E calculation
ΔE Quality:
<1 = Excellent (imperceptible)
1-2 = Good
2-4 = Normal
4-5 = Sufficient
>5 = Bad
"""

  • Red neuronal RGB_RAW -> XYZ sin etapas ocultas (equivalente a matrix 3x3):
() NN:
ΔE_max = 29.579874621089253 and ΔE_mean = 3.4460693382616014
Imagen

  • Red neuronal RGB_RAW -> XYZ con dos etapas ocultas de 200 neuronas cada una:
(200, 200) NN:
ΔE_max = 7.035319348235826 and ΔE_mean = 1.035222151090219
Imagen

  • Red neuronal RGB_RAW -> Lab con dos etapas ocultas de 200 neuronas cada una:
(200, 200) NN:
ΔE_max = 5.659828256166601 and ΔE_mean = 0.8287066247766278
Imagen

La más exacta es la que convierte directamente a valores Lab, que llega a tener un Delta E promedio muy bueno: inferior a 1. Puede verse que es más precisa en color (a, b) que en Luminosidad (L). Quiero ver si puedo mejorar esto con unos consejos que me han dado.

Aquí los histogramas de los Delta E de los 288 parches:
De las primeras dos redes (RGB_RAW -> XYZ):

Imagen

De la última (RGB_RAW -> Lab):

Imagen

Salu2!
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Lun Jun 03, 2019 10:45 pm

Tras entrenar 20 redes neuronales combinando hiperparémetros:

MLP_XYZ_()_relu_identity : ΔE_max = 29.5782 , ΔE_mean = 3.4459 , ΔE_median = 2.4032
MLP_Lab_()_relu_identity : ΔE_max = 82.2025 , ΔE_mean = 28.3684 , ΔE_median = 21.2329
MLP_XYZ_()_logistic_identity : ΔE_max = 29.5782 , ΔE_mean = 3.4459 , ΔE_median = 2.4032
MLP_Lab_()_logistic_identity : ΔE_max = 82.2578 , ΔE_mean = 28.3821 , ΔE_median = 21.2219
MLP_XYZ_(3, 3)_relu_identity : ΔE_max = 108.3430 , ΔE_mean = 41.8331 , ΔE_median = 37.0897
MLP_Lab_(3, 3)_relu_identity : ΔE_max = 112.5269 , ΔE_mean = 42.6017 , ΔE_median = 39.5577
MLP_XYZ_(3, 3)_logistic_identity : ΔE_max = 23.9131 , ΔE_mean = 4.5645 , ΔE_median = 2.9977
MLP_Lab_(3, 3)_logistic_identity : ΔE_max = 77.6024 , ΔE_mean = 25.7275 , ΔE_median = 20.5809
MLP_XYZ_(50, 50)_relu_identity : ΔE_max = 13.7616 , ΔE_mean = 2.1762 , ΔE_median = 1.6024
MLP_Lab_(50, 50)_relu_identity : ΔE_max = 12.9015 , ΔE_mean = 3.6170 , ΔE_median = 3.1430
MLP_XYZ_(50, 50)_logistic_identity : ΔE_max = 22.5918 , ΔE_mean = 4.0708 , ΔE_median = 2.6891
MLP_Lab_(50, 50)_logistic_identity : ΔE_max = 6.0237 , ΔE_mean = 0.9943 , ΔE_median = 0.6923
MLP_XYZ_(200, 200)_relu_identity : ΔE_max = 7.0373 , ΔE_mean = 1.0364 , ΔE_median = 0.6827
MLP_Lab_(200, 200)_relu_identity : ΔE_max = 7.4150 , ΔE_mean = 1.1333 , ΔE_median = 0.8822
MLP_XYZ_(200, 200)_logistic_identity : ΔE_max = 14.8826 , ΔE_mean = 2.7814 , ΔE_median = 1.8480
MLP_Lab_(200, 200)_logistic_identity : ΔE_max = 5.6598 , ΔE_mean = 0.8287 , ΔE_median = 0.4912
MLP_XYZ_(200, 200, 200)_relu_identity : ΔE_max = 6.3270 , ΔE_mean = 1.2530 , ΔE_median = 0.7609
MLP_Lab_(200, 200, 200)_relu_identity : ΔE_max = 7.3421 , ΔE_mean = 0.9603 , ΔE_median = 0.7042
MLP_XYZ_(200, 200, 200)_logistic_identity : ΔE_max = 14.4747 , ΔE_mean = 2.7297 , ΔE_median = 1.9047
MLP_Lab_(200, 200, 200)_logistic_identity : ΔE_max = 5.6715 , ΔE_mean = 0.7346 , ΔE_median = 0.3988

Me he quedado por compromiso entre complejidad y bajo error la de 2 etapas con 50 nodos/etapa. He definido varias conversiones:
  • XYZ (D50) to Lab conversion
  • Lab to XYZ (D50) conversion
  • XYZ (D50) to sRGB (D65) conversion
  • XYZ (D50) to ProPhoto RGB (D50) conversion
  • DeltaE 1976 calculation

Imagen

Con lo que he podido obtener la primera comparación (es decir, por primera vez la red neuronal genera una imagen calibrada de salida, en este caso en ProPhoto RGB):

Imagen

El lado derecho de cada parche es el valor ideal que la red debería haber generado. La predicción de color es excelente, tengo que entender porqué el error se concentra en la luminosidad de los parches grises.

Salu2!
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Mié Jun 05, 2019 11:02 pm

Hablado con Hugo, resulta que en la tabla que me pasó un parche gris estaba duplicado y por eso todos se corrieron una posición dando lugar al desaguisado. Me ha pasado los valores correctos y de paso he probado con una nueva función de activación (tangente hiperbólica) que funciona mejor que las otras dos probadas (relu y sigmoide). El resultado para los parches de entrenamiento es excelente:

MLP_XYZ_()_tanh_identity : ΔE_max = 33.6562 , ΔE_mean = 3.2097 , ΔE_median = 1.8020
MLP_Lab_()_tanh_identity : ΔE_max = 82.1350 , ΔE_mean = 28.3336 , ΔE_median = 21.5002
MLP_XYZ_()_logistic_identity : ΔE_max = 33.6562 , ΔE_mean = 3.2097 , ΔE_median = 1.8020
MLP_Lab_()_logistic_identity : ΔE_max = 82.1906 , ΔE_mean = 28.3471 , ΔE_median = 21.4991
MLP_XYZ_(3, 3)_tanh_identity : ΔE_max = 15.3840 , ΔE_mean = 2.4645 , ΔE_median = 1.8418
MLP_Lab_(3, 3)_tanh_identity : ΔE_max = 43.0895 , ΔE_mean = 11.6182 , ΔE_median = 9.2091
MLP_XYZ_(3, 3)_logistic_identity : ΔE_max = 18.1560 , ΔE_mean = 3.8059 , ΔE_median = 2.2673
MLP_Lab_(3, 3)_logistic_identity : ΔE_max = 77.2547 , ΔE_mean = 25.7759 , ΔE_median = 20.7278
MLP_XYZ_(4, 4)_tanh_identity : ΔE_max = 11.2728 , ΔE_mean = 2.0082 , ΔE_median = 1.5386
MLP_Lab_(4, 4)_tanh_identity : ΔE_max = 37.5632 , ΔE_mean = 8.2402 , ΔE_median = 6.7438
MLP_XYZ_(4, 4)_logistic_identity : ΔE_max = 16.7437 , ΔE_mean = 2.3609 , ΔE_median = 1.6683
MLP_Lab_(4, 4)_logistic_identity : ΔE_max = 68.0552 , ΔE_mean = 17.6988 , ΔE_median = 12.4104
MLP_XYZ_(16, 16)_tanh_identity : ΔE_max = 13.7044 , ΔE_mean = 2.0632 , ΔE_median = 1.2234
MLP_Lab_(16, 16)_tanh_identity : ΔE_max = 3.9206 , ΔE_mean = 1.0084 , ΔE_median = 0.8693
MLP_XYZ_(16, 16)_logistic_identity : ΔE_max = 13.1919 , ΔE_mean = 1.9344 , ΔE_median = 1.2701
MLP_Lab_(16, 16)_logistic_identity : ΔE_max = 6.1042 , ΔE_mean = 1.3190 , ΔE_median = 1.0214
MLP_XYZ_(50, 50)_tanh_identity : ΔE_max = 14.7397 , ΔE_mean = 2.4049 , ΔE_median = 1.6943
MLP_Lab_(50, 50)_tanh_identity : ΔE_max = 3.9451 , ΔE_mean = 0.6966 , ΔE_median = 0.5313
MLP_XYZ_(50, 50)_logistic_identity : ΔE_max = 26.3273 , ΔE_mean = 3.5872 , ΔE_median = 2.1889
MLP_Lab_(50, 50)_logistic_identity : ΔE_max = 4.0815 , ΔE_mean = 0.7272 , ΔE_median = 0.5018
MLP_XYZ_(100, 100)_tanh_identity : ΔE_max = 9.9610 , ΔE_mean = 1.5248 , ΔE_median = 1.0915
MLP_Lab_(100, 100)_tanh_identity : ΔE_max = 3.3160 , ΔE_mean = 0.5003 , ΔE_median = 0.3757
MLP_XYZ_(100, 100)_logistic_identity : ΔE_max = 29.8789 , ΔE_mean = 3.7231 , ΔE_median = 2.1818
MLP_Lab_(100, 100)_logistic_identity : ΔE_max = 3.7744 , ΔE_mean = 0.6649 , ΔE_median = 0.4671
MLP_XYZ_(200, 200)_tanh_identity : ΔE_max = 8.4625 , ΔE_mean = 1.4752 , ΔE_median = 0.9700
MLP_Lab_(200, 200)_tanh_identity : ΔE_max = 3.3737 , ΔE_mean = 0.4059 , ΔE_median = 0.2591
MLP_XYZ_(200, 200)_logistic_identity : ΔE_max = 16.8308 , ΔE_mean = 1.8797 , ΔE_median = 1.1590
MLP_Lab_(200, 200)_logistic_identity : ΔE_max = 4.2315 , ΔE_mean = 0.6553 , ΔE_median = 0.4166

El delta E medio para el modelo MLP_Lab_(50, 50)_tanh_identity está por debajo de 1, lo que en palabras de Hugo Rodríguez "nunca he visto una desviación tan baja en un ICC". El error máximo también está muy contenido, por debajo de 4.

Imagen

En la anterior imagen, la mitad izquierda es la predicción (=perfilado) hecha por la red neuronal, y la mitad derecha el color teórico exacto. En la mayoría de parches no se distinguen, lo cual es bueno lógicamente.

Ahora queda validar el perfilado con colores que no estén en la carta. Si las interpolaciones entre colores no vistos por la red neuronal no son suaves, esta calibración no sirve de nada aunque funcione bien en los parches de la IT8. Fingers crossed.

Salu2!
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Calibración de cámara usando una red neuronal

Notapor Guillermo Luijk » Dom Jun 16, 2019 1:39 pm

Ya casi terminando el ejercicio, lo decoramos con un poco de infografía. Éstas son las mediciones del espectrofotómetro de Hugo en 3D:

Imagen

Salu2!
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)


Volver a PhotoLab



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 14 invitados