인프런 커뮤니티 질문&답변

양시몬님의 프로필 이미지

작성한 질문수

[개정판] 딥러닝 컴퓨터 비전 완벽 가이드

Faster RCNN의 이해 02 - Anchor Box를 활용한 RPN 구성

fully convolutional layer에 대해서 질문이있습니다.

작성

·

329

0

우선 강의 너무 잘듣고 있습니다.

이번 강의에서 RPN 부분 1x1 fully convonlutional layer 에대해서 이해가 안가서 질문 올립니다.

우선 제가 이해하고 있는 1x1 conv layer는 이미지 사이즈는 고정하고 채널수를 조정할려고 할때 사용한다고 알고 있습니다.

하지만 어떻게 fully connect 부분을 1x1로 대채할수 있는지? 의문입니다.

1. 먼저 VGG가 끝나고 3x3 covolution 과정이 강의에서 

50x40 이미지 전체를 도는게 아니고 

anchor마다 그러니까 한 포인트에서 9개의 anchor를 3x3 filter로 convolution 512channel로 한다는 말씀인거죠?? 아니면 전체 50x40 이미지 즉 VGG 에서 결과로나온 것을 그냥 3x3 filter로 컨볼루션 한다는건가요??

2. 저는 처음에 50x40 에 3x3 filter를 적용하는거다 이해했는데.

50x40x 3x3filter maxpooling(x) padding(x) = 48 x 38 out 이미지

 그러면 1x1filter 적용하면 

48x38x512 -> 48x38x(2*9) = 48x38x18 채널 

즉 1x1은 채널수만 조정하니까 사이즈가 다른 이미지

1000x600 -> 60x40 이미지 일때

58x38x512 -> 58x38x(2*9) = 58x38x18 채널

이런식으로 이미지 사이즈에 다르게 파라미터가 나오는데 어떻게 

결과값 서로 다른데 softmax를 적용할수 있는지 이해가 가지가 않아서 질문 올립니다.. 제가 너무 어렵게 생각하는것 같은데. 설명 해주시면 감사하겠습니다.

faster rcnn 찾다가 찾은 이미지인데요.

이걸보면 조금은 이해가 갔습니다.

vgg 결과값이 7x7x512 나온다면 filter를 7x7x(원하는 채널수)

이렇게 하면 1x1이 되겠구나 했는데. 

문제는 저희 강의 처럼 결과값이 7x7이 아니고 50x40, 60x40 이면 적용 필터 이미지를 50x40 60x40 수정해야하고 즉 고정 filter 3x3을 적용할수 없는데.. 어떻게 해야하는거지?? 라는 의문이 듭니다.

답변 2

2

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

보통은  classification, Regression을 할때 Fully connected layer 연결후에 activation함수(multi classification일 경우 softmax, binary classification 일때 sigmoid,  regression일 경우 linear)를 이용하여 결과를 얻습니다.

예를 들어  Keras를 사용한다면 binary classification(오브젝트인가 아닌가?)라면 Dense 를 사용하여  아래와 같이 최종 Fully connected 단을 만들 수 있습니다.

X = Conv2D(...)(input)

X= Conv2D(...)(X)

X = Flatten()(X)

...

### 이진 Classification 최종 fully connected 단

Dense(1, activation='sigmoid')(X)

그런데 이렇게 Dense를 사용하지 않고 1x1 Conv2D 연산 후 activation을 바로 적용해서 이진 classification 예측 확률을 구할 수도 있습니다.

x_class = Conv2D(num_anchors * 2, (1, 1), activation='sigmoid', kernel_initializer='uniform', name='rpn_out_class')(x)

따라서 전반적으로 RPN Network은 아래와 같이 만들어 질 수 있습니다.

base_layers를 input layer라고 할때

def rpn_layer(base_layers, num_anchors):
    # 3x3 conv 후에 feature map output
    x = Conv2D(512, (3, 3), padding='same', activation='relu', kernel_initializer='normal', name='rpn_conv1')(base_layers)
    # 1x1 conv 후에 sigmoid activation 으로 이진 binary classification,  filter 갯수는 anchor 갯수 * 2
    x_class = Conv2D(num_anchors * 2, (1, 1), activation='sigmoid', kernel_initializer='uniform', name='rpn_out_class')(x)

    # 1x1 conv 후에 linear로 regression수행,  filter 갯수는 anchor 갯수 * 4
    x_regr = Conv2D(num_anchors * 4, (1, 1), activation='linear', kernel_initializer='zero', name='rpn_out_regress')(x)

    return [x_class, x_regr, base_layers]

감사합니다.

0

양시몬님의 프로필 이미지
양시몬
질문자

코드까지 붙여주셔서 이해하는데 도움이 되었습니다. 감사합니다!!

직접 tensorflow 로 해봤는데. 

shape=(1, 37, 50, 18), dtype=float32)

40, 50 으로 512 채널 결과가 있을때 

앵커마다 9 * 2(물체인지 아닌지) 이렇게 각픽셀별로 sigmoid 값을 한방에 계산할수 있구나 라고 이해했습니다. ㅎ 맞는지 틀린지는 잘모르곘지만 앵커 개념이 들어가다보니까. 뭔가 복잡해보여 어렵긴 한것같습니다. ㅠㅜ 그래도 선생님 코드 보면 대략적으로 이해가 가네요~감사합니다.