Ejercicio de perfilado de cámara con red neuronal y carta IT8
Tras un ejercicio previo en el que usaba con éxito una red neuronal sencilla para emular un procesado de imagen:
Ingeniería inversa de procesado de imagen con redes neuronales
Estoy tratando de extender el ejercicio al perfilado de una cámara. Se trata de ver si entrenando una red neuronal con las capturas hechas sobre parches de una carta IT8 normalizada, se puede hacer un perfilado con un modelo (la red neuronal) más simple que los perfiles ICC basados en LUTs:
- 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 (idea inicial), 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í:
http://guillermoluijk.com/misc/esquema.jpg
É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:
https://www.hugorodriguez.com/articu...partes_it8.gif
http://guillermoluijk.com/misc/abpatches.png
http://guillermoluijk.com/misc/lpatches.png
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!