Fecha actual Jue Nov 21, 2024 7:08 pm


Ingeniería inversa de procesado de imagen con red neuronal

El rincón de los hilos tecnofrikis

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

Ingeniería inversa de procesado de imagen con red neuronal

Notapor Guillermo Luijk » Mié Abr 03, 2019 1:18 am

Aprovechando que estoy aprendiendo sobre redes neuronales, estoy haciendo un ejercicio sobre procesado de imagen. Se trata de usar una red neuronal muy simple para modelar un procesado de imagen complejo. Este procesado lo he escogido a mala leche e incluye:
  • Curvas RGB no lineales
  • Desaturación de color
  • Rotación de tono

Ya he hecho en el pasado ejercicios de este tipo con curvas, pero solo sirven para procesados que respondan a una curva. Aquí vamos a por todas (cambios de saturación y color sin contemplaciones).

En definitiva es un procesado que convierte una foto así...
Imagen

...en este churro (lo bonito o feo de la imagen es lo de menos, se trata de ponérselo difícil a la red neuronal):
Imagen

El proceso es el siguiente: se le "enseña" a la red neuronal cómo se transforma cada combinación (R, G, B) de entrada en una combinación (R', G', B') de salida; este conjunto de datos es lo que se llama training set. Para ello he tomado una imagen que tiene todos los posibles colores de 8 bits (la original es de 17Mpx):
Imagen

Y le he aplicado el procesado anterior:
Imagen

Aunque hablemos de imágenes, la red neuronal no tiene ni idea de que está tratando con imágenes. Ella lo único que hace es un modelo de regresión para una función de R3 -> R3 (es decir, es un ejercicio puro de aproximación de funciones, un punto fuerte de las redes neuronales).

Entonces se entrena la red con ciertos parámetros (en concreto he usado una red de una sola capa oculta con 32 nodos, teniendo las capas de entrada y salida 3 nodos, los correspondientes a los canales RGB):

Código: Seleccionar todo
# NN training hyperparameters
regr = MLPRegressor(solver='adam',  # solver 'sgd', lbfgs'
                    alpha=0,  # no L2 (ridge regression) regularization
                    hidden_layer_sizes=32,  # nodes
                    activation='logistic',  # hidden layer activation function (default 'relu')
                                            # 'logistic' (sigmoid) seems more adequate to model continuous functions
                    max_iter=30,  # max epochs
                    tol=0.00001,  # tolerance for early stopping
                    n_iter_no_change=10,  # number of epochs to check tol
                    verbose=True)  # tell me a story
regr.out_activation_ = 'relu'  # output layer activation function (default 'identity')
                               # 'relu' seems a good idea since RGB values can only be positive


Ésta sería una red de solo 6 nodos en la capa oculta; en el ejercicio he usado 32 que sigue siendo una red muy simple para las barbaridades que se ven por ahí en otros ámbitos:

Imagen

Una vez entrenada queda configurada la red. Aunque el proceso que está modelando es muy complejo, la red se define de manera muy sencilla con apenas unos ~200 números (menos que una curva de Luminosidad de Photoshop). Hay que pensar que estamos modelando 17 millones de posibles transformaciones con solo esos 200 valores, es la magia de las redes neuronales que logran cosas bastante complejas con tan solo aplicar esta simple operación de sumatorio + función de activación en cada nodo (esos pesos wi son los valores numéricos que comentaba):

Imagen

El paso final es aplicar la red a imágenes que le son desconocidas (la red nunca las ha "visto"), lo que se llama un test set, para comparar la aproximación que hace la red con el procesado exacto que se obtiene en Photoshop y decidir cómo de bien hace la red neuronal su aproximación. Me queda por probar más cosas y optimizar, pero los resultados son prometedores (donde peor funciona es en las sombras profundas y también diluye contraste, pero los colores son muy próximos).

La precisión de los modelos se puede medir numéricamente con varios indicadores, pero como aquí se trata de imágenes es mucho más visual y divertido simplemente mirarlas para ver si la aproximación es buena o mala. 2 ejemplos:

Imagen original:
Imagen

Procesado exacto:
Imagen

Predicción de la red neuronal:
Imagen


Imagen original:
Imagen

Procesado exacto:
Imagen

Predicción de la red neuronal:
Imagen


Aplicaciones que se me ocurren:
  • Emular el procesado JPEG de cámara de cualquier modelo
  • Copiarle a fulanito ese procesado que deja las imágenes molonas y que fulanito no quiere contar
  • Hacer la ingeniería inversa de filtros de cine que dan ese look tan cinematográfico
  • Hacer ingeniería inversa de cualquier tipo de filtros (Instagram, NIK,...)
  • Emular películas antiguas (Kodachrome, Velvia,...)
  • Modelar procesos cruzados de película

Si tenéis algún procesado que os gusta mucho me lo podéis pasar; eso sí, necesito imagen con y sin el procesado (es lo que se llama aprendizaje supervisado: para poder modelar un sistema, necesitamos muestras de la salida exacta que producen determinadas combinaciones de las variables de entrada del sistema).

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

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Pau » Mié Abr 03, 2019 4:54 am

Has convertido a la chica del móvil en la increíble Hulk.
Avatar de Usuario
Pau
 
Mensajes: 7138
Registrado: Lun Dic 29, 2014 7:33 pm
Ubicación: Vulcano

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Fid » Mié Abr 03, 2019 6:32 am

La idea me parece muy buena, un poco en la línea de usar un programa de estadística para procesar una imagen con la que ya nos has sorprendido antes.

De las aplicaciones que sugieres, alguna es muy interesante pero dudo que puedan funcionar si se precisa de la imagen de partida. Si quieres "copiar" un procesado, dudo mucho que consigas la imagen sin procesar, lo mismo pasa con las películas antiguas. Las otras aplicaciones si parecen interesantes.

Aunque ibas a necesitar una red mucho mayor, y quizás una máquina dedicada, sería interesante que la red identificase las imágenes para procesarlas por zonas... mmm y también ibas a necesitar un buen montón de fotos para entrenar la red. Me da que para esto irían mejor dos redes conectadas, una para identificar zonas y otra para procesarlas.

Otro uso sería deshacer los artefactos de Flirk y otros para con las imágenes que se suben, quizás, hasta preparar las fotos para compensar esos cambios.

Podías probar a quitar halos, me parece un sistema muy bueno para eso. No tengo ninguna foto con y sin pero...

Enviado desde mi HUAWEI VNS-L31 mediante Tapatalk
Avatar de Usuario
Fid
 
Mensajes: 5028
Registrado: Vie Jun 01, 2012 8:32 pm
Ubicación: Madrid

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor rickydh » Mié Abr 03, 2019 6:33 am

Aunque las "matemáticas" no sean las mismas, me recuerda al módulo de simulación de película de Rawtherapee.

Al menos los ficheros de partida se parecen.

https://rawpedia.rawtherapee.com/Film_Simulation

Un saludo.

Saludos.
rickydh
 
Mensajes: 352
Registrado: Vie May 16, 2014 11:55 am

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Guillermo Luijk » Mié Abr 03, 2019 7:31 am

Fid escribió:De las aplicaciones que sugieres, alguna es muy interesante pero dudo que puedan funcionar si se precisa de la imagen de partida. Si quieres "copiar" un procesado, dudo mucho que consigas la imagen sin procesar, lo mismo pasa con las películas antiguas. Las otras aplicaciones si parecen interesantes.

Aunque ibas a necesitar una red mucho mayor, y quizás una máquina dedicada, sería interesante que la red identificase las imágenes para procesarlas por zonas.


Lo que comentas es otro nivel de red neuronal, este ejercicio es un básico, puramente una regresión multivariable no lineal. Para hacer cosas como las que dices se requiere que la red "tome conciencia" de que una imagen es una distribución de datos 2D, lo que implica redes neuronales convolucionales y entrenar con un set de imágenes. El ejercicio no llega a ese nivel (ni tardaría 5min en entrenarse con el portátil :D).

Respecto a disponer del antes/después, siempre que busques emular filtros de una aplicación o programa los tienes. Para películas clásicas es más complicado pero no imposible, necesitas poder tener la misma foto dos veces, una en digital con revelado neutro y otra con película. Si lo segundo no lo tienes, puedes buscar una foto de película con la máxima cantidad de colores y cuyo motivo sea replicable hoy en digital. Tengo pendiente hacer el ejercicio de acceder a las imágenes "latentes" que se forman en la capa intermedia, en ocasiones se han descubierto cosas muy interesantes estudiando a posteriori las tripas de una red neuronal.

rickydh escribió:Aunque las "matemáticas" no sean las mismas, me recuerda al módulo de simulación de película de Rawtherapee.

Al menos los ficheros de partida se parecen.

https://rawpedia.rawtherapee.com/Film_Simulation.


Es que el objetivo es exactamente el mismo, de hecho en el artículo que estoy escribiendo hablo de ello. La diferencia es que RAW Therapee lo hace a lo bruto: usa tres LUT's 3D de 8 bits, o sea necesita 17 x 3 millones de valores para codificar todas las combinaciones posibles, y a la red le bastan 200. Es decir la red es mucho más eficiente en relación resultado/complejidad, a costa de un cierto error. Digamos que los perfiles de RT ocupan lo que una imagen en color de 17Mpx, cuando la red consiste en 200 numeritos que puedes casi copiar a mano.

Otra desventaja de ir por LUT's es que no solo necesitas un antes/después, es que el antes debe ser forzosamente la imagen sintética de 17millones de colores, lo que limita la posibilidad de obtener la pareja. La red se puede entrenar con una sola foto de la que tengamos el antes/después (lo he hecho con el Mazinger y clava el resultado para el propio Mazinger, pero claro funcionará peor con fotos que tengan colores muy diferentes a la foto usada para entrenar la red).

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

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor TheGoOse » Mié Abr 03, 2019 10:11 am

Entiendo que para que el tema funcione tienes que aprender en base a imágenes iguales pixel a pixel pero con procesados distintos, ¿no?

Lo digo porque si de alguna manera pudieses aprender en base a determinados factores de la imagen (la media de tonos, la manera de transicionar de luces a sombras, etc.), sería relativamente fácil conseguir, por ejemplo, una misma escena captada en digital y con película, para sacar un perfil de emulación a esa película mucho más real que si copias un procesado que ya sea en sí mismo una emulación.

En cualquier caso, me parece la mar de interesante. Espero algún día poder ponerme las pilas en las matemáticas que hay detrás de esto, aunque me queda muuucho que aprender para entenderlo bien ;)
Es por culpa de una Leica
que me estoy volviendo loco
no puedo vivir sin ella
pero añoro el autofoco...
Avatar de Usuario
TheGoOse
 
Mensajes: 1574
Registrado: Mar Mar 30, 2010 5:07 pm
Ubicación: Sevilla

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor walito » Mié Abr 03, 2019 10:21 am

Que bueno!!
Muy muy interesante el tema, gracias por compartirlo.
Una foto no deja de ser una foto...
Dos dos... y así sucesivamente


https://500px.com/andasi_mai/galleries
http://www.flickr.com/photos/115790526@N08/
Avatar de Usuario
walito
 
Mensajes: 4797
Registrado: Mié Feb 23, 2011 10:40 pm

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Guillermo Luijk » Mié Abr 03, 2019 2:18 pm

TheGoOse escribió:Entiendo que para que el tema funcione tienes que aprender en base a imágenes iguales pixel a pixel pero con procesados distintos, ¿no?

Lo digo porque si de alguna manera pudieses aprender en base a determinados factores de la imagen (la media de tonos, la manera de transicionar de luces a sombras, etc.), sería relativamente fácil conseguir, por ejemplo, una misma escena captada en digital y con película, para sacar un perfil de emulación a esa película mucho más real que si copias un procesado que ya sea en sí mismo una emulación.


Eso es, las imágenes antes y después tienen que ser del mismo motivo y tener los píxeles en el mismo sitio. Tampoco es preciso que sean calcadas, pero la red va a ser entrenada por pares de píxeles que ocupan la misma posición en las dos imágenes, así que es importante que en un alto % casen.

Se me está ocurriendo que en cierto modo puede usarse para tareas de calibrado, o por ejemplo para emular en Sony los maravillosos tonos de piel Canon que todo el mundo sabe que son insuperables :D

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

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor walito » Mié Abr 03, 2019 2:22 pm

Guillermo Luijk escribió:
TheGoOse escribió:Entiendo que para que el tema funcione tienes que aprender en base a imágenes iguales pixel a pixel pero con procesados distintos, ¿no?

Lo digo porque si de alguna manera pudieses aprender en base a determinados factores de la imagen (la media de tonos, la manera de transicionar de luces a sombras, etc.), sería relativamente fácil conseguir, por ejemplo, una misma escena captada en digital y con película, para sacar un perfil de emulación a esa película mucho más real que si copias un procesado que ya sea en sí mismo una emulación.


Eso es, las imágenes antes y después tienen que ser del mismo motivo y tener los píxeles en el mismo sitio. Tampoco es preciso que sean calcadas, pero la red va a ser entrenada por pares de píxeles que ocupan la misma posición en las dos imágenes, así que es importante que en un alto % casen.

Se me está ocurriendo que en cierto modo puede usarse para tareas de calibrado, o por ejemplo para emular en Sony los maravillosos tonos de piel Canon que todo el mundo sabe que son insuperables :D

Salu2!
Dicho esto, se podrían conseguir las curvas que, por ejemplo, aplica olympus a sus RAW para sacar sus JPEG, no?

O más aún, sacando la misma imagen con dos cámaras de sensores diferentes, sacar las curvas de conversión de, por ejemplo, un RAW de Panasonic a un JPEG de Olympus.
¿Es así?
Una foto no deja de ser una foto...
Dos dos... y así sucesivamente


https://500px.com/andasi_mai/galleries
http://www.flickr.com/photos/115790526@N08/
Avatar de Usuario
walito
 
Mensajes: 4797
Registrado: Mié Feb 23, 2011 10:40 pm

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Guillermo Luijk » Mié Abr 03, 2019 2:25 pm

walito escribió:Dicho esto, se podrían conseguir las curvas que, por ejemplo, aplica olympus a sus RAW para sacar sus JPEG, no?

O más aún, sacando la misma imagen con dos cámaras de sensores diferentes, sacar las curvas de conversión de, por ejemplo, un RAW de Panasonic a un JPEG de Olympus.
¿Es así?

Sactamente, buena idea! Se puede modelar el procesado seguido para obtener JPEG's de cámara desde el RAW. Eso sí, tienes que tener claro el punto de partida, porque tú luego se los aplicarás a imágenes que estén en ese mismo punto de partida o el resultado no será igual. Como punto de partida el mejor que se me ocurre es un revelado neutro del RAW, para que el proceso sirva para cualquier cámara. Mira ya me has dado diversión para el finde (si te zumban los oidos es mi novia que te odia).

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

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor TheGoOse » Mié Abr 03, 2019 2:31 pm

Guillermo Luijk escribió:
TheGoOse escribió:Entiendo que para que el tema funcione tienes que aprender en base a imágenes iguales pixel a pixel pero con procesados distintos, ¿no?

Lo digo porque si de alguna manera pudieses aprender en base a determinados factores de la imagen (la media de tonos, la manera de transicionar de luces a sombras, etc.), sería relativamente fácil conseguir, por ejemplo, una misma escena captada en digital y con película, para sacar un perfil de emulación a esa película mucho más real que si copias un procesado que ya sea en sí mismo una emulación.


Eso es, las imágenes antes y después tienen que ser del mismo motivo y tener los píxeles en el mismo sitio. Tampoco es preciso que sean calcadas, pero la red va a ser entrenada por pares de píxeles que ocupan la misma posición en las dos imágenes, así que es importante que en un alto % casen.

Se me está ocurriendo que en cierto modo puede usarse para tareas de calibrado, o por ejemplo para emular en Sony los maravillosos tonos de piel Canon que todo el mundo sabe que son insuperables :D

Salu2!
Sería curioso: coger una batería de test como los de DPReview, que hacen un mismo encuadre con todas las cámaras, y sacar procedimientos para cambiar él estilo de tu cámara a la que más te guste [emoji4]
Es por culpa de una Leica
que me estoy volviendo loco
no puedo vivir sin ella
pero añoro el autofoco...
Avatar de Usuario
TheGoOse
 
Mensajes: 1574
Registrado: Mar Mar 30, 2010 5:07 pm
Ubicación: Sevilla

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor walito » Mié Abr 03, 2019 6:09 pm

Pues anda que no sería más que estupendo tener unos pressets de lightroon que emulen los JPEG de cualquier cámara partiendo del RAW de la tuya.
Incluso se podrían meter aquellos jpeg de algún modo particular de la cámara (vivido, el bn de la nueva gx9, etc)...
Buf!
Me parece un reto y un resultado, si sale, fantástico!
Una foto no deja de ser una foto...
Dos dos... y así sucesivamente


https://500px.com/andasi_mai/galleries
http://www.flickr.com/photos/115790526@N08/
Avatar de Usuario
walito
 
Mensajes: 4797
Registrado: Mié Feb 23, 2011 10:40 pm

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor rickydh » Mié Abr 03, 2019 6:09 pm

Guillermo Luijk escribió:Otra desventaja de ir por LUT's es que no solo necesitas un antes/después, es que el antes debe ser forzosamente la imagen sintética de 17millones de colores, lo que limita la posibilidad de obtener la pareja. La red se puede entrenar con una sola foto de la que tengamos el antes/después (lo he hecho con el Mazinger y clava el resultado para el propio Mazinger, pero claro funcionará peor con fotos que tengan colores muy diferentes a la foto usada para entrenar la red).


Pero si no partes de la imagen sintética, te sirve para esa transformación de esa foto.

No pongo en duda la mejora en tiempo/recursos/resultados del método, pero si no se analizan los cambios en todos (o el máximo) de colores,
lo que obtenemos no puede ser aplicable en todas la fotos.

Por reducción al absurdo, si partimos de una imagen con rojo puro, le aplicamos con un programa de edición reducción de verdes y azules,
el archivo final sería el mismo. Si se lo pasamos a la red neuronal, la función que se obtiene no es fiel a los cambios aplicados.
Pero supongo que eso ya lo sabes. ;)

Saludos.
rickydh
 
Mensajes: 352
Registrado: Vie May 16, 2014 11:55 am

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Guillermo Luijk » Mié Abr 03, 2019 6:14 pm

rickydh escribió:Pero si no partes de la imagen sintética, te sirve para esa transformación de esa foto.


Bueno y para algo más. Si no partes de la imagen sintética la red seguirá funcionando bien con imágenes que tengan colores parecidos a los de la imagen que usaste, y mal con imágenes que tengan colores que no existen en tu imagen de prueba, en cuyo caso el resultado será impredecible. La red se va a inventar siempre algo, nunca va a decir "esto no lo sé procesar".

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

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Guillermo Luijk » Vie Abr 05, 2019 12:08 am

Le he dado más caña a la red: dos capas ocultas de 64 nodos cada una. Tras entrenarla unos 20min el resultado ahora es casi indistinguible del procesado exacto. En las sombras profundas aún se nota un sutil cambio (la predicción las oscurece menos), pero para haber sido una red entrenada de manera genérica (es decir que con ella se puede procesar cualquier imagen con similar precisión) el resultado me parece cojonudo:

Imagen

Imagen

Si hay algún informático que quiere tocar el código está en GitHub.

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

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Fid » Vie Abr 05, 2019 6:18 am

Lo que me resulta curioso es que entrenes a la red con un solo par de imagenes, lo habitual es hacerlo con varias. De hecho, si quieres que la red funcione bien deberías probar con varios pares de imágenes, mejor si son muy diferentes. Es más, si ves que tú red falla con las sombras profundas deberías probar a darle un par de fotos con sombras muy profundas.

Respecto de lo que decía un compañero más arriba, se supone que estás entrenando a un programa, si pones una imagen muy particular, toda roja por ejemplo, no le vas a dar un buen entrenamiento.

Enviado desde mi HUAWEI VNS-L31 mediante Tapatalk
Avatar de Usuario
Fid
 
Mensajes: 5028
Registrado: Vie Jun 01, 2012 8:32 pm
Ubicación: Madrid

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Guillermo Luijk » Vie Abr 05, 2019 7:31 am

Fid escribió:Lo que me resulta curioso es que entrenes a la red con un solo par de imagenes, lo habitual es hacerlo con varias. De hecho, si quieres que la red funcione bien deberías probar con varios pares de imágenes, mejor si son muy diferentes. Es más, si ves que tú red falla con las sombras profundas deberías probar a darle un par de fotos con sombras muy profundas.


Lo explicaba al principio. Hay que entender el problema que se está abordando: esta red no es un ejercicio de procesado de imágenes (que requiere redes convolucionales, muchas imágenes de prueba y seguramente más potencia de proceso), y donde el resultado no sería tan preciso para este problema en concreto. Es un ejercicio puro de regresión de funciones, en este caso de R3 -> R3. La red aproxima una función de tres variables de entrada con tres salidas: {R, G, B} -> {R', G', B'}, es decir aprende correspondencias de color pero ni siquiera "sabe" que eso viene de una imagen o que se va a usar para imágenes (de hecho lo primero que hace el código es convertir la imagen de entrenamiento en 3 vectores donde el orden de las muestras es irrelevante).

Las redes neuronales son muy buenas aproximando funciones continuas requiriendo muy poca complejidad, y un procesado de imagen píxel a píxel (es decir aquel en el que el aspecto final de un píxel solo depende de ese mismo píxel en la imagen original), aunque pueda ser complejo visualmente esconde funciones que me atrevo a decir que son continuas y bastante suaves, y por tanto poco exigentes para una red neuronal. No estamos entrenando la red con una sola imagen, la estamos entrenando con más de 16 millones de muestras!.

Podría añadir más muestras en zonas de sombra para que fuera mejor en ellas, pero desbalancear el set de entrenamiento probablemente haría que la red fuese peor en otras zonas, quizá lo pruebe. En un ejercicio previo que hice con otra función R3 -> R3 mucho más simple (también está el código subido), bastó una sola capa de 9 nodos para que el ajuste fuera perfecto (a partir de 6 ya es muy bueno), pero si te fijas el extremo del 0 es el que más tarda en converger. Intuyo que puede tener relación con la función de activación de salida y quizá valga la pena probar con la identidad o con una softplus. Estoy usando una ReLU (rampa que solo permite salidas >=0), que quizá esté limitando la precisión en el extremo del 0. Esto son conjeturas, es mi primer ejercicio con redes neuronales y se me escapan muchas cosas.

Imagen

Si entrenas la red exactamente con la misma imagen que vas a procesar, será la mejor red para esa imagen pero perderá generalidad. Por eso he usado la imagen sintética. Y sí, cuando no se pueda tener el procesado de la red sintética la aproximación será menos generalizable dependiendo de cómo de general sea la imagen antes/después disponible.

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

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Fid » Vie Abr 05, 2019 8:01 am

Me temo que no me he explicado bien. Tu misma red (sin que intente tratar imágenes, tratando solo pixeles), si la entrenas con más de un conjunto de pixeles te va a dar unos valores más fiables (debería).

Lo que no tengo muy claro es, si con tu programa, puedes entrenar la red con más de una imagen, aunque tampoco creo que sea tan difícil cambiarlo.

Enviado desde mi HUAWEI VNS-L31 mediante Tapatalk
Avatar de Usuario
Fid
 
Mensajes: 5028
Registrado: Vie Jun 01, 2012 8:32 pm
Ubicación: Madrid

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Guillermo Luijk » Vie Abr 05, 2019 8:16 am

Fid escribió:Me temo que no me he explicado bien. Tu misma red (sin que intente tratar imágenes, tratando solo pixeles), si la entrenas con más de un conjunto de pixeles te va a dar unos valores más fiables (debería).

No hay más combinaciones de colores, la red actualmente ya "ve" todas las combinaciones de valores RGB que existen en 8 bits. Meter más sería duplicar valores de entrada/salida lo que es equivalente a iterar más veces el entrenamiento.

Pasarle muestras con más bits de precisión sí es una posibilidad, pero no sé si arreglaría el problema del extremo y en cualquier caso haría el entrenamiento eterno: 9 bits -> 512 x 512 x 512 = 134 millones de muestras. Cada bit de precisión adicional multiplica por 8 la longitud del set de entrenamiento. Quizá sea buena idea probar a suministrarle en 16 bits solo el tramo que va del nivel 0 al 1 en 8 bits, a ver qué pasa.

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

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Fid » Vie Abr 05, 2019 9:18 am

Partiendo de la base, fundamental, de que no tengo claro como funciona un revelador... ¿seguro que no se usan los valores de contorno?

A parte de eso, quizás sea una presunción aventuada pretender que, en una imagen, están representados todos los valores RBG, o del sistema de representación que sea. En cualquier caso, no creo que el problema esté ahí, si así fuera, te daría el mismo resultado al pasar de nuevo la imagen que has usado para entrenar y, según dices, eso no es así.

La estrategia de aumentar la precisión en los valores críticos puede ser buena pero, también puede originar artefactos.

En realidad, usar más de una foto de entrenamiento no tiene que ir mal, al fin y al cabo, la red lo que hace es estimar el valor más probable del cambio de un valor al nuevo, con un nuevo ejemplo se afina ese valor más probable (y si ya es muy significativo no ve a cambiar nada).

Enviado desde mi HUAWEI VNS-L31 mediante Tapatalk
Avatar de Usuario
Fid
 
Mensajes: 5028
Registrado: Vie Jun 01, 2012 8:32 pm
Ubicación: Madrid

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Guillermo Luijk » Vie Abr 05, 2019 9:31 am

Aunque me has dicho que has entendido la explicación, yo creo que no y te digo porqué. Sigues hablando de imagen de entrenamiento, y del número de éstas. No hay imagen de entrenamiento, la red no se entrena con una imagen se entrena con filas de una tabla donde se hace coincidir a un trío de números RGB su correspondiente trío de números de salida. Si he usado esas combinaciones en forma de imagen ha sido solo por comodidad, podrían ser datos en un Excel y daría lo mismo.

Y esos datos representan todas las posibles combinaciones de color RGB que la red tendrá que predecir, por lo tanto no vamos a predecir nada a lo que la red no haya sido expuesta durante su entrenamiento. Uniendo esto al hecho de que no hay ruido (la salida para cada combinación de entrada es justo la que debe ser, de forma determinista), el overfitting no solo no nos preocupa sino que es deseable porque buscamos que la red se aprenda lo más fielmente posible la función de transformación.

Salu2!


Enviado desde mi PRA-LX1 mediante Tapatalk
Avatar de Usuario
Guillermo Luijk
 
Mensajes: 9636
Registrado: Dom Ene 31, 2010 6:37 am
Ubicación: Madrid (a ratos Alicante)

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Fid » Vie Abr 05, 2019 10:15 am

Te lo digo de otra forma, ¿Estás seguro de que en tu conjunto de datos de partida están representadas todas las ternas de números? Yo tengo mis dudas.

Aparte de eso, que ya te dije antes que no puede ser, sólo, el problema. Si así fuera, al pasar de nuevo el conjunto inicial de datos de entrenamiento, está vez como problema, te tendría que dar la misma imagen.

En cualquier caso, cuando pasas el conjunto inicial hay ternas de números que se repiten muchas veces y otras ternas sin representación o poco representadas. Si le pasas otro conjunto de datos obtenido de una fuente distinta (en este caso una foto de algo distinto, un paisaje, por ejemplo), es de esperar que la distribución de ternas sea distinta, con ternas muy representadas distintas de la anterior y ternas poco representadas también distintas a la del otro conjunto.



Enviado desde mi HUAWEI VNS-L31 mediante Tapatalk
Avatar de Usuario
Fid
 
Mensajes: 5028
Registrado: Vie Jun 01, 2012 8:32 pm
Ubicación: Madrid

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor rickydh » Vie Abr 05, 2019 10:23 am

Si no me equivoco, está usando la imagen sintética. Y luego lo aplica a imágenes reales. [emoji6]

Saludos.
rickydh
 
Mensajes: 352
Registrado: Vie May 16, 2014 11:55 am

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Guillermo Luijk » Vie Abr 05, 2019 11:23 am

Fid escribió:Te lo digo de otra forma, ¿Estás seguro de que en tu conjunto de datos de partida están representadas todas las ternas de números? Yo tengo mis dudas.

Joe haber empezado por ahí! Claro que lo están, es la típica imagen sintética de 256x256x256 = 16777216 píxeles (4097 x 4096), y ni siquiera la he tenido que crear porque está en la web del astuto y amable Bruce Lindbloom:

http://www.brucelindbloom.com/index.htm ... llion.html

Si pintas su histograma en Photoshop verás que está completamente lleno (porque tiene todos los colores) y es totalmente plano (porque cada color sale una y solo una vez). OJO: tienes que darle al triangulito para que Photoshop muestre el histograma exacto.

rickydh escribió:Si no me equivoco, está usando la imagen sintética. Y luego lo aplica a imágenes reales. [emoji6]

Eso es. La red se "aprende" la imagen sintética de la mejor manera posible, y luego puedes aplicarla a cualquier imagen. Es una forma de tener en formato comprimido (la definición de la red es cortísima), el equivalente a tres LUT's de 50 millones de valores.

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

Re: Ingeniería inversa de procesado de imagen con red neuronal

Notapor Maldoror » Vie Abr 05, 2019 11:51 am

Guillermo Luijk escribió:[*]Emular el procesado JPEG de cámara de cualquier modelo
[*]Copiarle a fulanito ese procesado que deja las imágenes molonas y que fulanito no quiere contar
[*]Hacer la ingeniería inversa de filtros de cine que dan ese look tan cinematográfico
[*]Hacer ingeniería inversa de cualquier tipo de filtros (Instagram, NIK,...)
[*]Emular películas antiguas (Kodachrome, Velvia,...)
[*]Modelar procesos cruzados de película[/list]

Si tenéis algún procesado que os gusta mucho me lo podéis pasar; eso sí, necesito imagen con y sin el procesado (es lo que se llama aprendizaje supervisado: para poder modelar un sistema, necesitamos muestras de la salida exacta que producen determinadas combinaciones de las variables de entrada del sistema).

Salu2!


Aunque no me estoy enterando de nada en este hilo :roll: :roll: , al leer lo de "copiarle a fulanito ese procesado...", he recordado un programa que tengo y utilizo (ahora menos) desde hace tiempo, lo he encontrado, y ¡sorpresa! es de Guillermo, claro. Se trata del Tone Hacker, mi versión es de 2007. Era y es una aplicación interesantísima.
Olympus EM-1 II, EM-1, EM-5 II, EM-10
Maquinaria pesada: Nikon D70, Nikon D300.
FF: Petri TTL, Pentax P30, Pentax SFX

https://www.flickr.com/photos/148748416@N05/albums
Avatar de Usuario
Maldoror
 
Mensajes: 2751
Registrado: Sab Dic 13, 2014 9:54 pm

Siguiente

Volver a PhotoLab



¿Quién está conectado?

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