图像分割网络-输出范围很小

时间:2018-08-04 09:21:28

标签: machine-learning

我正在训练用于视频序列屏蔽的网络。输入是176 * 132 * 1深度图像(剪切为0-1),输出是二进制(0-1图像)。

下面是代码。在Conv-LSTM网络之前,还有另一个网络旨在将(60,1)数组适合图像大小(使用Deconv),并将其添加为深度。我认为它不会对结果产生太大影响,但是如果没有它,我将尝试尝试。

from keras.models import Sequential,load_model,Model
from keras.layers.convolutional_recurrent import ConvLSTM2D
from keras.layers.convolutional import Conv3D,Conv2D,Conv1D,Conv3DTranspose
from keras.layers.normalization import BatchNormalization
from keras.layers import Input,Concatenate,Reshape,Softmax
from keras.callbacks import TensorBoard
import keras

import numpy as np
import pylab as plt
import h5py
import os 
from DatasetGeneration import dataset_generator


os.environ['MKL_NUM_THREADS'] = '16'
os.environ['GOTO_NUM_THREADS'] = '16'
os.environ['OMP_NUM_THREADS'] = '16'
os.environ['openmp'] = 'True'



def main(time_steps=5,N_filters_CLSTM=40,kernel_size_CLSTM=(3,3),
          Nr_CLSTM=5, kernel_size_FinalConv=(3,3),batch_size_training = 5,
          N_samples_training = 250,epochs = 20,batch_size_validation=5,
          N_samples_validation=50):




    print("--Args--")
    print("time_steps:%i"%time_steps)
    print("N_filters_CLSTM:%i"%N_filters_CLSTM)
    print("kernel_size_CLSTM:%s"%(kernel_size_CLSTM,))
    print("kernel_size_FinalConv:%s"%(kernel_size_FinalConv,))
    print("Nr_CLSTM:%i"%Nr_CLSTM)
    print("batch_size_training:%i"%batch_size_training)
    print("batch_size_validation:%i"%batch_size_validation)
    print("N_samples_training:%i"%N_samples_training)
    print("N_samples_validation:%i"%N_samples_validation)
    print("Epochs:%i"%epochs)
    print("--Args--")


    occs = Input(shape = (time_steps,60,1),dtype = 'float32',name='InputOcclusionsVector')
    images = Input(shape = (time_steps,132,176,2),dtype = 'float32',name='InputImages')


    occs_image = Conv2D(filters = 81,kernel_size = (1,1),data_format = 'channels_last')(occs)

    occs_image = Reshape((time_steps,60,81,1))(occs_image)
    occs_image = Conv3DTranspose(filters = 1, kernel_size = (1,14,16),strides = (1,2,2))(occs_image)


    x = Concatenate()([images,occs_image])


    for _ in range(Nr_CLSTM-1):
        x = ConvLSTM2D(filters=N_filters_CLSTM, kernel_size=kernel_size_CLSTM, 
                   padding='same', return_sequences=True)(x)

        x = BatchNormalization()(x)

    x = ConvLSTM2D(filters=N_filters_CLSTM, kernel_size=kernel_size_CLSTM,
                   padding='same', return_sequences=False)(x)
    x = BatchNormalization()(x)

    x = Conv2D(filters = 1,kernel_size=kernel_size_FinalConv,activation='sigmoid',padding='same',data_format='channels_last')(x)

    model = Model(inputs = [images,occs],outputs =x)
    model_multi = keras.utils.multi_gpu_model(model,gpus = 2,cpu_relocation = True)
    model_multi.compile(loss='binary_crossentropy', optimizer='adadelta')

    print(model.summary())
    print(model.get_config())

    cur = os.getcwd()
    train_dir = os.path.join(cur,'..','dataset_Deconv_CLSTM','train')
    eval_dir = os.path.join(cur,'..','dataset_Deconv_CLSTM','eval')

    log_dir = new_logdir('logs')
    tbCallBack = TensorBoard(log_dir =log_dir,histogram_freq = 0,write_graph = False,write_images=False)

    model.save(os.path.join(log_dir,'model.h5')) 
    model_multi.fit_generator(generator = dataset_generator(train_dir,batch_size=batch_size_training,N_samples = N_samples_training,time_steps = time_steps),
        steps_per_epoch = N_samples_training//batch_size_training,epochs = epochs,callbacks = [tbCallBack],max_queue_size = 5,
        validation_data = dataset_generator(eval_dir,batch_size = batch_size_validation,N_samples = N_samples_validation,time_steps = time_steps),validation_steps = N_samples_validation//batch_size_validation)

    print('--- Training end ---')
    print('--- Saving Model ---')

    model.save(os.path.join(log_dir,'model.h5'))
    model.save_weights(os.path.join(log_dir,'weights.h5'))

def new_logdir(log_path):
    dirs = os.listdir(log_path)
    try:
        tryValue = max([int(d) for d in dirs])+1
        path = os.path.join(log_path,str(tryValue))
        os.mkdir(path)
    except:
        path = os.path.join(log_path,str(0))
        os.mkdir(path)
    return path


if __name__ == '__main__':

    main(epochs=50,time_steps = 5,N_filters_CLSTM = 20,kernel_size_CLSTM=(3,3),Nr_CLSTM = 10)

GT和预测是这样的:

GT - Max :  1  Min : 0
Pred - Max :  0.5000003  Min : 0.49999976

预测基本上只是灰色的。那怎么可能呢?

非常感谢!

0 个答案:

没有答案