2017-09-04 5 views
1

Je travaille sur un CNN qui fait de la super-résolution. La formation va bien, il n'y a pas overfitting mais lorsque je tente le réseau formé sur une image à faible résolution, l'image de sortie a changé sa couleur:Changement de couleur pendant la super-résolution


L'image d'entrée

The original image

L'image de sortie

The output image


Même avec un entraînement plus long, le résultat reste le même. Est-ce que quelqu'un a déjà fait face à un problème similaire? Ma première idée était de changer la fonction d'activation de sortie en quelque chose qui va de 0 à 1 (sigmoïde) au lieu d'un ReLu mais il n'y a pas d'amélioration.

Voici mon réseau mis en œuvre en Keras:

input_img = Input(shape=(None,None,3)) 

c1 = Convolution2D(64, (3, 3))(input_img) 
a1 = Activation('relu')(c1) 

c2 = Convolution2D(64, (3, 3))(a1) 
a2 = Activation('relu')(c2) 
b2 = BatchNormalization()(a2) 

c3 = Convolution2D(64, (3, 3))(b2) 
a3 = Activation('relu')(c3) 
b3 = BatchNormalization()(a3) 

c4 = Convolution2D(64, (3, 3), strides=(2,2), padding='same')(b3) 
a4 = Activation('relu')(c4) 
b4 = BatchNormalization()(a4) 

c5 = Convolution2D(64, (3, 3))(b4) 
a5 = Activation('relu')(c5) 
b5 = BatchNormalization()(a5) 

d1 = Conv2DTranspose(64, (3, 3))(b5) 
a6 = Activation('relu')(d1) 
b6 = BatchNormalization()(a6) 

m1 = add([a4, b6]) 
a7 = Activation('relu')(m1) 

d2 = Conv2DTranspose(64, (3, 3), strides=(2,2), padding='same')(a7) 
a8 = Activation('relu')(d2) 
b8 = BatchNormalization()(a8) 

d3 = Conv2DTranspose(64, (3, 3))(b8) 
a9 = Activation('relu')(d3) 
b9 = BatchNormalization()(a9) 

m2 = add([a2, b9]) 
a10 = Activation('relu')(m2) 

d4 = Conv2DTranspose(64, (3, 3))(a10) 
a11 = Activation('relu')(d4) 
b10 = BatchNormalization()(a11) 

d5 = Conv2DTranspose(3, (3, 3))(b10) 
a12 = Activation('relu')(d5) 
b11 = BatchNormalization()(a12) 

m3 = add([input_img, b11]) 
a13 = Activation('relu')(m3) 

out = Convolution2D(3, (5, 5), activation='sigmoid', padding='same') (a13) 

model = Model(input_img, out) 
model.compile(optimizer='adam', loss='mae') 
+0

Pourriez-vous nous expliquer quel est le but ici? Pour quoi optimisez-vous exactement? –

+0

Ce réseau prend une image basse résolution sur-échantillonnée en entrée et apporte une haute résolution. Il a été formé avec des paires d'images basse résolution/haute résolution mais quand j'essaie de le faire avec mon test, les résultats ont été confrontés à un changement de couleur –

+0

En regardant les images d'exemple, il semble que la plage RVB soit inclinée, en mouvement verts en jaunes (ce qui signifie que la dimension verte a une valeur plus élevée que prévu). Cela peut être un artefact de cette image particulière - existe-t-il un biais similaire sur les images contenant des couleurs différentes? Avez-vous essayé d'utiliser une perte différente - https://keras.io/losses/? –

Répondre

0

Dans la plupart des papiers gens d'abord convertir l'image en format YCrCb, et le processus que le canal Y (qui contient tous les détails pertinentes de l'image) avec le CNN. Le canal Y reconstitué est ensuite joint aux canaux Cr et Cb qui sont suréchantillonnés en utilisant l'interpolation bicubique traditionnelle (ou l'interpolation de votre choix) et l'image est ensuite convertie en RVB. Essayez ceci, cela pourrait fonctionner mieux.