본문 바로가기
DL|ML

CNN(Convolutional Neural Networks)에 가변적인 input을 줄 수 있을까

by 이든Eden 2019. 9. 13.

 

💡
예전부터 궁금했는데, 대충 찾고 넘어간거라서 정리해볼겸 다시 검색해보았고 Is it possible to give variable sized images as input to convolutioal neural network라는 질문으로 stack exchange에 올라와 있어서 번역 및 설명을 추가해보았다. 원문은 Q. 을 클릭하면 나온다.

Q. CNN에 가변적인 input을 줄 수 있을까(Is it possible to give variable sized images as input to convolutioal neural network)

Object Detection을 위한 input 사이즈가 가변적인 CNN을 만들 수 있을까요? 가능하다면 어떻게 해야하나요?

 

 

부가질문)

하지만 우리가 이미지를 크롭(crop)한다면, 우리는 이미지의 일부분을 잃게되고 리사이즈(resize)하게 되면 이미지의 선명도(clarity)가 떨어집니다. 이미지 선명도(clarity)가 주요 고려 사항인 경우 inherent network를 사용하는 것이 최선인가요?

 

A1. 👍 x 5

네트워크에 가변적인 input을 줄 방법에는 여러가지가 있습니다. 그것의 대부분은 StackOverflow, Quora를 비롯한 여러 웹사이트의 포스트들에서 볼 수 있습니다. 요약을 하자면, 대부분의 기술은 두 가지 솔루션 그룹으로 이야기할 수 있습니다.

  1. Transformation
  1. Inherent Network Property

Transformation은 다음과 같은 기술입니다.

  • Resize, 가장 심플한 기술
  • Crop, 정보 손실이 따르는 슬라이딩 윈도우(Sliding window) 또는 one-time crop

또한 네트워크를 구성하는 계층 행동의 덕택에 입력의 크기에 영향을 받지 않는 고유한 속성(Inherent Network Property)을 가진 네트워크를 생각해볼 수도 있습니다. 그에 대한 예는 다음과 같은 측면에서 확인할 수 있습니다.

  • Fully convolutional networks (FCN), 일단 커널과 스텝 크기가 설명되면, 각 레이어의 convolution은 해당 입력에 따라 적절한 출력을 생성할 수 있기 때문에 입력 크기에 제한이 전혀 없음.
  • Spatial Pyramid Pooling (SPP), FCN은 dense layer를 가지고 있지 않아서 이미지 크기에 구애받지 않지만, input size를 고려하지 않으면서 dense layer를 사용하고자 한다면 그러한 딥러닝 네트워크의 레이어를 설명하는 흥미로운 논문이 있음.

References:

  1. https://www.quora.com/How-are-variably-shaped-and-sized-images-given-inputs-to-convoluted-neural-networks
  1. https://ai.stackexchange.com/questions/2008/how-can-neural-networks-deal-with-varying-input-sizes
  1. https://discuss.pytorch.org/t/how-to-create-convnet-for-variable-size-input-dimension-images/1906

⚠️ 몇 가지 기술을 citing하는 것을 놓쳤을 수도 있습니다. 이 리스트가 완전하다고 생각하지 않습니다.

 

A2. 👍 x 3

Convolutional 레이어와 pooling 레이어는 input dimension과 독립적입니다. 그러나, convolutional 레이어의 output은 각각 다른 사이즈의 이미지에 대해서 다른 사이즈의 공간 정보를 가지고 있습니다. 그리고 이것은 이후에 나올 fully connected 레이어가 이슈를 만드는 원인이 됩니다. Fully connected layer는 고정된 input 사이즈를 요구하기 때문입니다. 이것에 대한 몇 가지 솔루션이 있습니다:

1. Global Pooling:

당신의 feature map 사이즈를 (N,H,W,C) (global pool 전) (N,1,1,C)(global pool 후)로 줄이기 위해서, Convolutional 레이어의 마지막에 fully connected 레이어를 피하고 Global Average Pooling 등을 사용하세요.

N = 미니배치 개수 H = feature map 높이 W = feature map 너비 C = feature maps 개수 (channels)

결과에서 볼 수 있듯이 출력 차원(N*C)은 이제 feature map의 크기(H,W)와 독립적입니다. Classification의 경우, 당신은 이제 fully connected layer를 계속 사용할 수 있다.

2. Variable sized pooling:

다양한 크기의 풀링을 사용하여 서로 다른 입력 사이즈에 대해 동일한 feature map 사이즈를 얻을 수 있습니다.

3. Crop/Resize/Pad input images:

당신은 input 이미지를 모두 같은 사이즈(shape)로 crop/resize/pad 할 수 있습니다.

 

부가질문답변)

당신은 아마도 모델이 학습될 때 사용하던 이미지 사이즈와 다른 사이즈의 이미지를 input으로 사용하고 싶은 것 같습니다. 그것을 위한 몇 가지 솔루션이 있습니다.

4. Create new fully connected layers:

이전의 fully connected 레이어를 버리고 완전히 새로운 당신이 원하는 사이즈를 갖는 fully connected 레이어로 바꾸세요. 그리고 처음부터 다시 모델을 학습하세요.

5. Treat the fully connected layer as a convolution:

일반적으로, 우리는 feature map을 fully connected layer로 보내기 전에 (N,H,W,C)에서 (N,H*W*C)로 다시 reshape합니다. 그러나 fully connected layer를 (H,W)의 receptive field를 이용해 convolution으로 처리할 수도 있습니다. 그런 다음 크기에 상관없이 feature map으로 이 커널을 전달할 수 있습니다(필요한 경우 zero padding 사용)[http://cs231n.github.io/transfer-learning/].

 


정리

기본적으로 서로 다른 이미지의 크기를 input size와 동일하게 만들어주는 Crop/Resize/Pad 방법이 있고, 고정된 크기의 입력만을 받는 문제(fully connected layer 때문에)를 해결하는데 제안된 FCN(Fully Convolutional Layer)을 사용하는 방법 등이 있다. 추가로 Segmentation과 같은 spatial information이 중요한 문제에서는 fully connected 레이어를 거치고 나면 spatial한 정보가 사라지기 이슈가 생긴다. 이를 해결한 방법이 fully connected 레이어 대신 1 x 1 convolution을 쓰는 것이다.

 

참고)

 

receptive field : 출력 레이어에 영향을 미치는 입력 spatial한 영역

 

 

 

 

'DL|ML' 카테고리의 다른 글

KoNLPy, mecab 설치하기 (ubuntu 16.04)  (8) 2019.12.11
mAP(mean Average Precision)  (2) 2019.09.22
ckpt, pb, h5 차이점?  (2) 2019.09.18
TensorFlow Object Detection API 써보기  (6) 2019.09.09
Keras backends?  (0) 2019.09.09