1

J'essaye de concevoir un réseau convolutif pour estimer la profondeur des images en utilisant Keras.Estimation de profondeur en utilisant Keras

J'ai des images d'entrée RVB de la forme 3x120x160 et j'ai des cartes de profondeur de sortie en niveaux de gris avec la forme 1x120x160.

J'ai essayé d'utiliser une architecture de type VGG où la profondeur de chaque couche augmente mais à la fin quand je veux concevoir les couches finales, je suis coincé. utiliser une couche Dense est trop cher et j'ai essayé d'utiliser l'Upsampling qui s'est révélé inefficace.

Je souhaite utiliser DeConvolution2D mais je n'arrive pas à le faire fonctionner. la seule architecture je finis est quelque chose comme ceci:

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')) 

Le résumé du modèle est comme ceci:

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 

Je ne pouvais pas réduire la taille des couches Deconvolution2D de 512 car cela entraîne forme erreurs liées et il me semble que je dois ajouter autant de couches Deconvolution2D que le nombre de filtres dans la couche précédente. J'ai également dû ajouter une couche finale Convolution2D pour pouvoir exécuter le réseau.

L'architecture ci-dessus apprend mais est très lente et (je pense) inefficace. Je suis sûr que je fais quelque chose de mal et le design ne devrait pas être comme ça. Pouvez-vous m'aider à concevoir un meilleur réseau?

J'ai également essayé de faire un réseau comme celui mentionné dans this repository mais il semble que Keras ne fonctionne pas comme le fait cet exemple Lasagne. J'apprécierais vraiment que quelqu'un puisse me montrer comment concevoir quelque chose comme ce réseau dans Keras. Son architecture est comme ceci:

enter image description here

Merci

Répondre

1

Je suggérerais un U-Net (voir figure 1). Dans la première moitié d'un U-Net, la résolution spatiale se réduit à mesure que le nombre de canaux augmente (comme VGG, comme vous l'avez mentionné). Dans la seconde moitié, le contraire se produit, (le nombre de canaux diminue, la résolution augmente). Les connexions "Skip" entre différentes couches permettent au réseau de produire efficacement une sortie à haute résolution.

Vous devriez être en mesure de trouver une implémentation Keras appropriée (peut-être this one).