2017-09-04 46 views
1

我正在开发超解析度的CNN。培训顺利,不存在过度拟合,但是当我尝试低分辨率图像上训练的网络,输出图像已经改变了颜色:超分辨率期间的颜色变化


输入图像

The original image

输出图像

The output image


即使经过较长时间的训练,结果也保持不变。有人曾经遇到类似的问题吗?

我的第一个想法是将输出激活函数更改为从0到1(sigmoid)而不是ReLu,但没有任何改进。

这里是我的网络中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

你介意解释一下目标是什么吗?你究竟在做什么优化? –

+0

该网络将上采样的低分辨率图像作为输入,并带来高分辨率。它已经用低分辨率/高分辨率图像对进行训练,但是当我尝试使用我的测试装置进行测试时,结果面临颜色变化 –

+0

只看示例图片,看起来RGB范围正在倾斜,正在移动绿色变成黄色(意味着绿色维度的值高于预期值)。这可能是此特定图像的人造物 - 在包含不同颜色的图像上是否存在类似的倾斜?你有没有尝试过使用不同的损失 - https://keras.io/losses/? –

回答

0

在大多数报纸的人首先将图像转换为YCrCb的格式,并且仅处理Y通道(其中包含所有相关的图像细节)与CNN。然后将重建的Y通道与使用传统双三次插值(或您选择的插值)上采样的Cr和Cb通道相连,然后将图像转换为RGB。试试这个,它可能会更好。