0
0 Комментариев

Здравствуйте, стоит задача поиска объекта с помощью полносверточной нейронной сети, используя Keras, theano, на языке python. На данный момент используется вот такая конфигурация сети:

def create_encoding_layers():
    kernel = 3
    filter_size = 64
    pad = 1
    pool_size = 2
    return [
        ZeroPadding2D(padding=(pad,pad)),
        Convolution2D(filter_size, kernel, kernel, border_mode='valid'),
        BatchNormalization(),
        Activation('relu'),
        MaxPooling2D(pool_size=(pool_size, pool_size)),
 
        ZeroPadding2D(padding=(pad,pad)),
        Convolution2D(32, kernel, kernel, border_mode='valid'),
        BatchNormalization(),
        Activation('relu'),
        MaxPooling2D(pool_size=(pool_size, pool_size)),
 
        ZeroPadding2D(padding=(pad,pad)),
        Convolution2D(32, kernel, kernel, border_mode='valid'),
        BatchNormalization(),
        Activation('relu'),
        MaxPooling2D(pool_size=(pool_size, pool_size)),
 
        ZeroPadding2D(padding=(pad,pad)),
        Convolution2D(64, kernel, kernel, border_mode='valid'),
        BatchNormalization(),
        Activation('relu'),
    ]
    def create_decoding_layers():
    kernel = 3
    filter_size = 64
    pad = 1
    pool_size = 2
    return[
        ZeroPadding2D(padding=(pad,pad)),
        Convolution2D(64, kernel, kernel, border_mode='valid'),
        BatchNormalization(),
 
        UpSampling2D(size=(pool_size,pool_size)),
        ZeroPadding2D(padding=(pad,pad)),
        Convolution2D(32, kernel, kernel, border_mode='valid'),
        BatchNormalization(),
 
        UpSampling2D(size=(pool_size,pool_size)),
        ZeroPadding2D(padding=(pad,pad)),
        Convolution2D(32, kernel, kernel, border_mode='valid'),
        BatchNormalization(),
 
        UpSampling2D(size=(pool_size,pool_size)),
        ZeroPadding2D(padding=(pad,pad)),
        Convolution2D(filter_size, kernel, kernel,     border_mode='valid'),
        BatchNormalization(),
        ZeroPadding2D(padding=(0,pad+1)),
    ]
 
    segnet_basic = models.Sequential()
    segnet_basic.add(Layer(input_shape=(120, 420, 1)))
    segnet_basic.encoding_layers = create_encoding_layers()
    for l in segnet_basic.encoding_layers:
        segnet_basic.add(l)
    segnet_basic.decoding_layers = create_decoding_layers()
    for l in segnet_basic.decoding_layers:
        segnet_basic.add(l)
    segnet_basic.add(Convolution2D(1, 1, 1, border_mode='valid',))
    segnet_basic.summary()
    segnet_basic.add(Reshape((120,420,1)))

На вход подается фотография и маска(область, где находится объект заполнена единицами, а остальная область нулями). Как я понимаю, на выходе мы должны получить такую же маску. Пробовал разные функции потерь. На выходе получается ерунда. Собственно вопрос: что нужно исправить, чтобы получить на выходе аналогичную маску ? Какую функцию потерь и optimizer использовать?
На картинке пример работы уже обученной сети. image — изображение, которое подается сети, label — ожидаемый результат, который я для вывода умножил на 255, result — то, что выдает сеть.Так же умножил на 255 для вывода
введите сюда описание изображения


Добавить комментарий