Mostrando resultados del 1 al 12 de 12

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

  1. #1
    Fecha de Ingreso
    nov 2006
    Ubicación
    Madrid (a ratos Alicante)
    Mensajes
    4.177

    Predeterminado Ingeniería inversa de procesado de imagen con red neuronal



    Aprovechando que estoy aprendiendo sobre redes neuronales, estoy haciendo un ejercicio con 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í...


    ...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):


    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):


    Y le he aplicado el procesado anterior:


    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:
    # 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:



    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):



    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:


    Procesado exacto:


    Predicción de la red neuronal:



    Imagen original:


    Procesado exacto:


    Predicción de la red neuronal:



    Aplicaciones que se me ocurren:
    • Emular el procesado JPEG de cámara de cualquier modelo
    • Calibración del color en sensores
    • 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!
    Última edición por Guillermo Luijk; 03/04/19 a las 17:58:37

  2. #2
    Fecha de Ingreso
    ago 2007
    Ubicación
    Madrid
    Mensajes
    7.245

    Predeterminado

    Muy interesante, Guillermo, como todas tus aportaciones.
    Canon EOS 5D y 350D | Canon EF 50 1.8 MkI, EF 70-300 IS USM | Tamron SP AF 90 (172E), SP AF 24-135 (190D) | CZ Flektogon 2.4/35 MC, Planar 1.7/50 T* | Porst MC 2.8/35, 2.8/135 | Fuji X100S


  3. #3
    Fecha de Ingreso
    sep 2007
    Ubicación
    Valencia
    Mensajes
    2.807

    Predeterminado

    Gracias Guillermo por la información, como siempre muy didáctica, pero me he mareado

    Un abrazo y que no pares.
    CCX - No pienses que la gente sabe mas que tu, simplemente es que se han equivocado antes.

  4. #4
    Fecha de Ingreso
    ene 2007
    Ubicación
    Barcelona
    Mensajes
    2.768

    Predeterminado

    Creo que el mayor impedimento para hacer un uso general de esta técnica es el de tener que disponer de la foto no procesada, porque en la mayoría de las situaciones que has comentado no va a ser así.

    Por otra parte, se me ocurre un caso de uso, en el que sí se dispone de ambas fotos: que los programas de edición de RAWs puedan emular el tratamiento que hace la cámara a los JPEGs.

  5. #5
    Fecha de Ingreso
    oct 2008
    Mensajes
    648

    Predeterminado

    Cojo sitio que este tema es muy interesante

  6. #6
    Fecha de Ingreso
    nov 2006
    Ubicación
    Madrid (a ratos Alicante)
    Mensajes
    4.177

    Predeterminado

    Cita Iniciado por eduperez Ver Mensaje
    Creo que el mayor impedimento para hacer un uso general de esta técnica es el de tener que disponer de la foto no procesada, porque en la mayoría de las situaciones que has comentado no va a ser así.

    Por otra parte, se me ocurre un caso de uso, en el que sí se dispone de ambas fotos: que los programas de edición de RAWs puedan emular el tratamiento que hace la cámara a los JPEGs.
    Me lo acaban de decir en otro foro, es una excelente idea! así podría tener en mi Sony los colores de piel Canon :P :P :P

    Salu2!

  7. #7
    Fecha de Ingreso
    dic 2017
    Ubicación
    Madriz
    Mensajes
    6.029

    Predeterminado

    Me apunto.
    Esto se pone interesante!

    Gracias Guillermo.
    "Si el concepto del punto de vista original no es correcto, todos los procedimientos técnicos tienen poco valor", A. Adams


  8. #8
    Fecha de Ingreso
    nov 2006
    Ubicación
    Madrid (a ratos Alicante)
    Mensajes
    4.177

    Predeterminado

    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:





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

    Salu2!
    Última edición por Guillermo Luijk; 05/04/19 a las 00:26:34

  9. #9
    Fecha de Ingreso
    ene 2012
    Ubicación
    A un clic de ti...
    Mensajes
    8.045

    Predeterminado

    Gracias Guillermo. Me lo apunto, en cuanto me canse de programar Arduinos en C/C++ y de hacer el chorra con Python me pongo con esto...
    Clic, clic, clic...

  10. #10
    Fecha de Ingreso
    ene 2013
    Ubicación
    La Cistérniga (Valladolid)
    Mensajes
    493

    Predeterminado

    Muy interesante. No sabía lo que eran las redes neuronales. Espero que nos sigas enseñando tus resultados.

  11. #11
    Fecha de Ingreso
    abr 2008
    Ubicación
    Bilbao
    Mensajes
    6.210

    Predeterminado

    Hola,como puede ser que esto interese a alguien pues aqui queda,soy otro que le intereso,salu2 de Felipe ..con tu permiso Guillermo ..
    https://www.xataka.com/robotica-e-ia...stan-volviendo

  12. #12
    Fecha de Ingreso
    nov 2006
    Ubicación
    Madrid (a ratos Alicante)
    Mensajes
    4.177

    Predeterminado

    Cita Iniciado por NerveNet Ver Mensaje
    Gracias Guillermo. Me lo apunto, en cuanto me canse de programar Arduinos en C/C++ y de hacer el chorra con Python me pongo con esto...
    Pues esto lo he hecho en Python

Marcadores

Normas de Publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •