본문 바로가기
코딩 독학/CS231n

[cs231n] 11강. Detection and Segmentation

by 효니루 2020. 12. 19.

✔ 본 포스팅은 20/10/10 ~ 20/12/26 동안 진행하는 가짜연구소 딥러닝기초이론스터디를 통해 학습한 내용입니다.

 

✔ 본 포스팅은 스탠포드 대학의 cs231n 강의를 정리한 내용입니다.


1. Semantic Segmentation

Semantic segmentation은 하나의 이미지 안에서 일부 픽셀들이 어떤 클래스에 속하는지 알아내는 과정이다.

 

단, 동일한 객체에 대해서는 분리하지 않는다는 단점이 있다.

 

Semantic segmentation의 첫번째 방법은, 모든 픽셀이 어떤 카테고리에 속하는지 찾아내는 방법인데,

계산량이 너무 많아서 그다지 좋은 방법은 아니다.

 

두번째로는 fully convolutional layer이다. 여러층의 convolutional layer라고 생각하면, spatial size를 유지하고, 최종 C x H x W 같은 하나의 tensor가 나올 것이다. 그리고 모든 픽셀에 대해 카테고리에 대한 score를 계산하게 된다.

역시 계산량이 엄청나게 크다.

 

이에 대하여 다음과 같은 방법이 제시되었다.

피쳐맵을 downsampling 후 (max pooling이나 stride를 이용) 다시 Upsampling이란 것을 하게 된다.

 

Upsampling 

Upsampling은 convolution을 거치면서 줄어든 피처맵의 크기를 다시 기존 input의 사이즈로 늘려주는 과정인데, 이때 빈공간을 채워야 하는 문제가 발생한다.

이를 해결하기 위한 방법을 보자.

(1) Unpooling

(2) Maxpooling

(3) Transpose Convolution

 

(1) Unpooling

- 같은 값으로 채우거나, 0으로 채우는 방법

 

(2) Max Unpooling

- Downsampling 할 때 Max Pooling을 거쳤다면, Max Unpooling을 할 때 input 이미지의 원래 위치에 픽셀을 넣고 나머지는 0으로 채운다.

 

(3) Transpose Convolution

피처맵에서 하나의 값(스칼라)을 선택하고, 3x3 필터와 가중치연산을 하여 output으로 나오게 되는데, 위 그림에서는 픽셀 2개식 움직이게 되고, 겹치는 부분은 더해준다.

이해하기 쉽게 1D 이미지로 보면, 같은 필터를 Input의 각 픽셀에 적용하게 되면, 필터크기만큼 output이 확장되고, stride크기에 따라 겹친 부분은 값을 더하게 된다. 

 왼쪽은 일반적인 stride 1 convolution이고 오른쪽은 transpose convolution이다. 

 

stride가 2일때는 또 다르다. 

 

 

이렇게 Down/Upsampling을 하는 convolution network가 있고, 마지막에 모든 픽셀의 cross entropy를 계산하여 네트워크 전체를 학습시킨다.

 

2. Classification + Localization

이미지의 카테고리 뿐만이 아니라 객체의 위치까지 detection해준다. 하지만 사진당 1개만 가능하다. 이와 다른게 여러 객체를 detection하는 것은 object detection이고 아래에서 다룬다.

 

구조를 살펴보면 기존의 CNN 아키텍처와 비슷한데, 끝쪽에 box coordination을 하는 FC layer가 추가된다.

그림에서 위쪽으로는 Classification score를, 아래쪽으로는 Box Coordination 에 대한 값을 반환하는 것을 볼 수 있다.

그렇게 Loss가 2가지 나온다. 그리고 학습 이미지는 카테고리 레이블과 해당 객체의 위치를 나타내는 bounding box ground truth 라는 것도 함께 제시해주어야 하고, 이를 이용해 예측한 값과의 오차를 측정하게 된다.

 

3. Object Detection

Object Detection은 한 이미지 내에서 모든 객체들의 Bbox와 카테고리를 예측한다. 하지만 역시 카테고리 레이블은 제공해야 한다.

 

하지만 모든 이미지마다 객체의 수는 다르고, 이에 따라 output도 달라진다.

이를 위해 Sliding Window라는 방법을 적용했다.

 

위의 파란박스가 쫙 슬라이딩 해가면서 초반에 입력한 카테고리에 해당하는지 확인하면서 간다. 중요한 것은 Background 카테고리가 추가되어 아무것도 아닌 곳은 그냥 Background로 속하게 된다.

근데 이것도 객체의 크기도 제각각이고 여러문제가 있어서 다음의 방법이 개발되었다.

 

4. R-CNN

 

Region Proposals은 말 자체로 객체가 있을만한 곳의 후보를 찾는다는 것이다. 뭔가 뭉쳐있는 곳들은 후보로 뽑는다.

그리고 이 후보를 대상으로 CNN을 하는 거다. 이를 R(egional)-CNN이라고 한다.

 

예시를 보자.

처음에 이미지를 주면 RoI (Regions of Interest) , 즉 객체가 있을 법한 곳들을 2000개 찾는다.

이 2000개의 사이즈는 당연히 서로 다를 것이다. 나중에 CNN classification을 해주려면 이들의 크기를 맞춰주어야 하기 때문에, 크기를 변형시켜준다.

그리고 CNN을 통과하여 최종분류에 이경우에는 SVM을 사용했다.

그리고 Bbox reg(ularization)는 정확하지 못한 region proposal를 보정해주는 것이다.

 

R-CNN의 몇 가지 문제는 역시 계산비용도 많고, region proposal이 학습되지 않는다는 단점도 있다.

 

이러한 R-CNN의 단점들을 보완한 것이 Fast R-CNN이다. 

 

일단 가장 큰 차이점은 RoI를 뽑아내기 전에 CNN을 전체 이미지에 대하여 수행해 고해상도 피쳐맵을 얻는다.

그 피쳐맵에 대하여 RoI를 얻는다. 그리고 RoI의 크기를 조정하고 FC layer에 넣어 classification score와 linear regression 에 대한 값을 구하게 된다. 그리고 이에 대한 loss를 합친 것이 최종 loss가 된다.

 

여기서 더 개선된 몇 모델들이 있다.

faster R-CNN, mask R-CNN

 

 


출처

www.youtube.com/watch?v=nDPWywWRIRo&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv&index=11

댓글