AI/강아지 객체 분류 알고리즘

종 분류 알고리즘: DenseNet, GAP에 대하여

모딩 2021. 2. 9. 11:49
반응형

왜 다른거 안쓰고 Densenet121을 썼나요?

피쳐 맵이 그대로 보존되고, 적은 수의 파라미터를 요구한다는 장점이 있다고 생각하여 DenseNet을 사용했다. 

 

어떻게 레이어를 수정했나요? 

pretrain된 densenet121 model에 추가로 6개의 레이어를 넣었다. 

# keras pretrain densenet121 model

def create_model(weights): 
    inp = Input((224, 224, 3))
    backbone = DenseNet121(input_tensor=inp,
                          weights= weights,
                          include_top=False)
    x = backbone.output # fc layer 
    x = GlobalAveragePooling2D()(x)
    x = Dense(1024, activation="relu")(x)
    x = Dropout(0.5)(x)
    x = Dense(512, activation="relu")(x)
    x = Dropout(0.5)(x)
    outp = Dense(num_classes, activation="softmax")(x)
    model = Model(inp, outp)
    return model  

 

Global Average Pooling을 적용한 이유 

일반적으로 한개의 이미지에 대한 classification의 경우에 FC layer를 적용하는데 문제가 되지 않는다.

하지만, 프레임에 있는 여러 개의 이미지들을 classification하고 localization을 수행하는데 문제가 된다. 

왜냐하면 FC layer에서 위치 정보를 담고있던 conv feature map이 dense하게 쫙 펴지기 때문에 위치 정보를 모두 손실하기 때문이다.

 

FCN vs. GAP

FCN는 위치 정보를 그대로 유지하면서 dimension 즉,  filter의 개수에 해당하는 차원을 줄여준다.

(height, width는 유지한 상태로 classification을 하기위해 다시 1x1x10, 즉 10개의 node로 resize해줘야 함)

반면에 GAP는 conv feature map에서 하나의 filter내에 있는 모든 pixel값을 average pooling하여 1개의 value로 수렴시킨다. 따라서 GAP는 HxW의 픽셀을 1개의 value로 수렴시키기 때문에 filter의 개수만 고정시키고 input size는 유동적이게 할 수 있다.

 

 

 

컴파일

model.compile(optimizer="adam",
              loss="categorical_crossentropy",
              metrics=["acc"])

 

 

결과값은 어떻게 출력했나요? 

믹스종을 판별하기 위해 5개의 퍼센트로 나오게 만들었고, 50퍼센트 이상 분포한 강아지 종을 선택하여 value값으로 지정했다. 

 

 

반응형