1

저는 Keras를 사용하여 이미지의 깊이를 추정하기 위해 Convolutional Net을 설계하려고합니다.Keras를 사용하는 깊이 추정

나는 RGB 입력 이미지의 모양이 3x120x160이고 그레이 스케일 출력 깊이 맵의 모양이 1x120x160입니다.

각 레이어의 깊이가 커지는 아키텍처와 같은 VGG를 사용했지만 최종 레이어를 디자인 할 때 막혔습니다. Dense 레이어를 사용하는 것은 너무 비싸고 비효율적 인 것으로 판명 된 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 

나는 모양 때문에 결과를하기로 512에서 Deconvolution2D 층의 크기를 줄일 수 없었다 관련 오류가 있으며 이전 레이어의 필터 수만큼 Deconvolution2D 레이어를 추가해야하는 것 같습니다. 또한 네트워크를 실행할 수 있도록 최종 Convolution2D 레이어를 추가해야했습니다.

위의 아키텍처는 배우기는하지만 실제로는 느리고 (비관적으로) 비효율적입니다. 나는 틀린 일을하고 있고 디자인이 이렇게해서는 안된다고 확신한다. 더 나은 네트워크를 설계하도록 도와 줄 수 있습니까?

나는 또한 this repository에 언급 된 것과 같은 네트워크를 만들려고했으나 Keras는이 Lasagne 예제처럼 작동하지 않는 것으로 보입니다. Keras에서이 네트워크와 같은 것을 디자인하는 법을 누군가가 보여 주면 정말 고맙습니다. 그것의 구조는 다음과 같이이다 :

enter image description here

감사

답변

1

내가 제안 거라고 U-Net (그림 1 참조). U-Net의 전반부에서는 채널 수가 증가함에 따라 공간 해상도가 감소합니다 (앞에서 언급 한 것처럼 VGG처럼). 하반기에는 반대의 현상이 발생합니다 (채널 수가 줄어들고 해상도가 높아짐). 서로 다른 레이어 사이의 "건너 뛰기"연결을 통해 네트워크에서 고해상도 출력을 효율적으로 생성 할 수 있습니다.

적절한 Keras 구현 (어쩌면 this one)을 찾을 수 있어야합니다.