1

Я пытаюсь создать сверлочную сеть, чтобы оценить глубину изображений с помощью Keras.Оценка глубины с использованием Keras

У меня есть входные изображения RGB с формой 3x120x160 и имеют глубинные карты глубины серого с формой 1x120x160.

Я попытался использовать архитектуру, похожую на VGG, где глубина каждого слоя растет, но в конце, когда я хочу конструировать последние слои, я застреваю. использование плотного слоя слишком дорого, и я попытался использовать Upsampling, который оказался неэффективным.

Я хочу использовать DeConvolution2D, но я не могу заставить его работать. единственная архитектура я в конечном итоге что-то вроде этого:

model = Sequential() 
    model.add(Convolution2D(64, 5, 5, activation='relu', input_shape=(3, 120, 160))) 
    model.add(Convolution2D(64, 5, 5, activation='relu')) 
    model.add(MaxPooling2D()) 
    model.add(Dropout(0.5)) 

    model.add(Convolution2D(128, 3, 3, activation='relu')) 
    model.add(Convolution2D(128, 3, 3, activation='relu')) 
    model.add(MaxPooling2D()) 
    model.add(Dropout(0.5)) 

    model.add(Convolution2D(256, 3, 3, activation='relu')) 
    model.add(Convolution2D(256, 3, 3, activation='relu')) 
    model.add(Dropout(0.5)) 

    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(Dropout(0.5)) 

    model.add(ZeroPadding2D()) 
    model.add(Deconvolution2D(512, 3, 3, (None, 512, 41, 61), subsample=(2, 2), activation='relu')) 
    model.add(Deconvolution2D(512, 3, 3, (None, 512, 123, 183), subsample=(3, 3), activation='relu')) 
    model.add(cropping.Cropping2D(cropping=((1, 2), (11, 12)))) 
    model.add(Convolution2D(1, 1, 1, activation='sigmoid', border_mode='same')) 

Резюме Модель выглядит так:

Layer (type)      Output Shape   Param #  Connected to      
==================================================================================================== 
convolution2d_1 (Convolution2D) (None, 64, 116, 156) 4864  convolution2d_input_1[0][0]  
____________________________________________________________________________________________________ 
convolution2d_2 (Convolution2D) (None, 64, 112, 152) 102464  convolution2d_1[0][0]    
____________________________________________________________________________________________________ 
maxpooling2d_1 (MaxPooling2D) (None, 64, 56, 76) 0   convolution2d_2[0][0]    
____________________________________________________________________________________________________ 
dropout_1 (Dropout)    (None, 64, 56, 76) 0   maxpooling2d_1[0][0]    
____________________________________________________________________________________________________ 
convolution2d_3 (Convolution2D) (None, 128, 54, 74) 73856  dropout_1[0][0]     
____________________________________________________________________________________________________ 
convolution2d_4 (Convolution2D) (None, 128, 52, 72) 147584  convolution2d_3[0][0]    
____________________________________________________________________________________________________ 
maxpooling2d_2 (MaxPooling2D) (None, 128, 26, 36) 0   convolution2d_4[0][0]    
____________________________________________________________________________________________________ 
dropout_2 (Dropout)    (None, 128, 26, 36) 0   maxpooling2d_2[0][0]    
____________________________________________________________________________________________________ 
convolution2d_5 (Convolution2D) (None, 256, 24, 34) 295168  dropout_2[0][0]     
____________________________________________________________________________________________________ 
convolution2d_6 (Convolution2D) (None, 256, 22, 32) 590080  convolution2d_5[0][0]    
____________________________________________________________________________________________________ 
dropout_3 (Dropout)    (None, 256, 22, 32) 0   convolution2d_6[0][0]    
____________________________________________________________________________________________________ 
convolution2d_7 (Convolution2D) (None, 512, 20, 30) 1180160  dropout_3[0][0]     
____________________________________________________________________________________________________ 
convolution2d_8 (Convolution2D) (None, 512, 18, 28) 2359808  convolution2d_7[0][0]    
____________________________________________________________________________________________________ 
dropout_4 (Dropout)    (None, 512, 18, 28) 0   convolution2d_8[0][0]    
____________________________________________________________________________________________________ 
zeropadding2d_1 (ZeroPadding2D) (None, 512, 20, 30) 0   dropout_4[0][0]     
____________________________________________________________________________________________________ 
deconvolution2d_1 (Deconvolution2(None, 512, 41, 61) 2359808  zeropadding2d_1[0][0]    
____________________________________________________________________________________________________ 
deconvolution2d_2 (Deconvolution2(None, 512, 123, 183) 2359808  deconvolution2d_1[0][0]   
____________________________________________________________________________________________________ 
cropping2d_1 (Cropping2D)  (None, 512, 120, 160) 0   deconvolution2d_2[0][0]   
____________________________________________________________________________________________________ 
convolution2d_9 (Convolution2D) (None, 1, 120, 160) 513   cropping2d_1[0][0]    
==================================================================================================== 
Total params: 9474113 

Я не мог уменьшить размер Deconvolution2D слоев от 512 так как это приводит к форме и кажется, что я должен добавить столько слоев Deconvolution2D, сколько количество фильтров в предыдущем слое. Мне также пришлось добавить последний уровень Convolution2D, чтобы иметь возможность запускать сеть.

Вышеупомянутая архитектура учится, но очень медленная и (я думаю) неэффективно. Я уверен, что я делаю что-то неправильно, и дизайн не должен быть таким. Можете ли вы помочь мне создать лучшую сеть?

Я также попытался создать сеть как указанную в this repository, но кажется, что Keras не работает, как это делает этот пример лазанья. Я бы очень признателен, если бы кто-нибудь мог показать мне, как создать что-то вроде этой сети в Keras. Это архитектура, как это:

enter image description here

Благодаря

ответ

1

Я бы предложил U-Net (смотри рисунок 1). В первой половине U-Net пространственное разрешение уменьшается по мере увеличения количества каналов (например, VGG, как вы упомянули). Во второй половине происходит противоположное (количество каналов уменьшается, увеличивается разрешение). Соединения «Пропустить» между различными уровнями позволяют сети эффективно производить вывод с высоким разрешением.

Вы должны найти подходящую реализацию Keras (возможно, this one).

Смежные вопросы