본문 바로가기

인공지능 AI/논문리뷰 and 재구현

(논문리뷰&재구현) YOLACT 설명 및 정리 - (1)

<Introduction>

Instance segmentation

Image segmentation은 각 object에 대해 localization을 수행해야하므로 translation variance를 만족해야한다.

(Image segmentation과 translation variance에 대한 설명은 아래 게시글에서 설명한다.)

Semantic segmentation과 Instance segmentation의 차이

 

Semantic segmentation과 Instance segmentation의 차이

컴퓨터 비전에는 크게 4가지의 과제가 있다. 1. Classification 2. Object Detection 3. Image Segmentation 4. Visual relationship 이 글에서는 이 중 3. Image Segmentation에 관해 다룰 예정..

ganghee-lee.tistory.com

 

게다가 Instance segmentation의 경우에는 동일 class instance에 대해서도 서로 경계를 구분을 해줘야한다.

 

이때 2-stage detector의 경우, localization을 "먼저" 수행한 후 classification 및 segmentation을 수행하므로

좋은 성능을 보인다. 예를들어, Mask R-CNN에서는 localization을 위해 먼저 RPN(region proposal network)에서 RoI영역(bounding box)을 추출한다.

그 후 각 bounding box에 대해서 segmentation을 수행한다.

즉, translation variance를 만족하도록 하는 localization을 먼저 수행하고 각 영역에 대해 segmentation을 수행하면

각 영역은 instance를 하나 포함하는 영역일테고 각 box에 대해 focus받는 pixel이 어떤 pixel인지만 찾아내면 instance segmentatoin을 수행할 수 있는 것이다.

 

그러나 1-stage의 경우 classification-localization을 병렬적으로 동시 수행한다.

localization을 먼저 수행함으로써 각 box내에 pixel이 어떤 class에 포함되는지 계산할 필요없이 instance인지 아닌지 binary mask만 판단하면 됐던 2-stage에서의 장점이 사라진 것이다.

때문에  localization이 되지 않은채 이미지의 전체 size에 대해서 classification 및 segmentation을 수행하려다보니 각 object를 구분해야하는 instance segmentation에서는 좋은 성능을 보이기 어렵다.

 

이때 YOLACT는 instance segmentation을 두개의 병렬 subtask로 나눠서 해결하겠다고 제안한다.

1) Prototype 마스크 생성

2) 인스턴스 별 마스크 coefficient 예측

 

위에서 설명한 문제를 YOLACT는 1) Prototype 마스크 생성 에서

"fully convolution 인데도 translation variance하게 localization을 수행하는 방식을 네트워크가 train하도록 함으로써"

해결한다고 한다.

 

RoI영역을 추출하지 않으면서 어떻게 fully convolution으로 네트워크가 localization을 수행하도록 train되는지

천천히 살펴보자.


<Backbone - ResNet>

YOLACT Architecture

Yolact의 Architecture는 위 그림과 같다.

먼저 Backbone은 ResNet-101을 기반으로 구현한다. 

이미지에서 residual neural network를 통해 C1, ... C5까지 5개의 feature map을 먼저 구성한다.

그 후 Feature Pyramid Network(FPN)를 통해 P3, ... P7까지 5개의 feature map을 새롭게 생성한다. 

 

(Feature Pyramid Network에 대해서는 아래 Mask R-CNN 글에서 확인할 수 있다.)

(논문리뷰&재구현) Mask R-CNN 설명 및 정리

 

(논문리뷰&재구현) Mask R-CNN 설명 및 정리

이전글 : (논문리뷰) Faster R-CNN 설명 및 정리 Faster R-CNN 설명 및 정리 이전글 : Fast R-CNN 설명 및 정리 Fast R-CNN 설명 및 정리 이전글 : Object Detection, R-CNN 설명 및 정리 Object Detection, R-CNN..

ganghee-lee.tistory.com

 

Feature Pyramid Network

FPN에서는 이전 feature map인 C5에 1x1 conv 연산을 해서 P5를 생성하고 같은 방식으로 C4에 1x1 conv 연산을 통해 임시로 P4'를 생성한다. 그 후 P4'에 P5를 더해서 최종적으로 P4를 생성하는데 둘의 channel size가 다르므로 P5를 upsampling한 후 P4'에 더해준다.

같은 방식으로 P3까지 생성한 다음 FPN 에서 (1x1 conv 연산, 서로다른 두 feature map을 더함)으로써 생겼을 데이터 noise를 복구하기 위해 P5부터 P3의 feature map에 3x3 conv 연산을 해준다.

마지막으로 P5를 3x3 conv(stride=2) 연산을 통해 downsampling을 해주면서 P6, P7 feature map을 생성한다.

 

위 과정들을 통해 Backbone network에서는 P3, .. P7까지 5개의 feature map을 생성하게 된다.


<Protonet>

 

위에서 설명했듯이 Yolact는 instance segmentation을 두개의 병렬 subtask로 나눈다.

위 그림에서 Prediction Head와 Protonet이 이에 해당한다. 두개의 병렬 subtask가 마지막에 연산을 통해 합쳐져서 final mask를 생성하게 됨을 그림에서 확인할 수 있다.

Protonet에서는 Backbone에서 생성한 5개의 feature map중 가장 deep한 feature map인 P3를 이용한다.


(*가장 deep한 feature map이란? - FPN전에 Resnet에 의한 feature map인 C1, .. C5 feature map을 볼때 C5로 갈수록 이전 해상도에서의 feature들의 정보를 점점 잃게된다. 따라서 FPN에서는 이전 해상도의 feature map의 정보 역시 담기 위해서 위에서 설명했듯이 두 feature map을 더해준다. 따라서 P3 feature map은 C3부터 C5까지의 feature map이 모두 반영된 가장 deep한 feature map이다.)


이렇게 가장 깊은 feature map을 이용하는데에는 두가지 이유가 있다.

1. 깊은 feature map일수록 이전 해상도들에서의 feautre 정보를 모두 포함하므로 robust한 mask를 생성할 수 있다.

2. 고해상도 feature map일수록 작은 object에 대해 좋은 성능을 보인다.

 

Protonet
Protonet

위 그림과 같이 P3를 3x3 conv 연산을 3번 한 후 upsampling을 통해 channel size를 두배로 증가시키고 다시 3x3 conv, 1x1 conv 연산을 해서 최종적으로 138x138사이즈의 mask를 k개 생성한다.

 

K=6

위 그림은 k=6일때 6개의 서로다른 original image에 대해 생성된 각각의 138x138 채널 6개를 보여준다.

생성된 채널 6개는 이미지에서 서로 다른 지역을 activate 시킨다.

1~3은 채널 이미지내에 점선으로 표시된 곡선 안쪽의 object를 activate 시키고 4는 이미지내 object의 좌하단을 activate 시킨다.

그리고 5는 이미지의 배경과 object간의 edge를, 6은 네트워크가 이미지에서 ground라 생각하는 부분을 activate 시킨다.

 

이렇게 각 채널들은

 - 공간적으로 이미지를 분할하고

 - instance를 localize하고

 - instance의 외곽을 detect하고

 - position-sensitive directional map을 생성함으로써 

 

"이미지의 partition을 activate시킬 수 있고 즉, 네트워크가 instance를 localize하는 방법을 배운다"

 

네트워크가 3x3 conv와 1x1 conv 조합으로 localize 방법을 배울 수 있는 이유는 "padding"을 이용했기 때문이다.

예를들어, 위 그림에서 a에 해당하는 빨간 사각형 이미지를 보자. 이 이미지에 padding이 없이 conv 연산을 하면 output의 모든 pixel은 동일 값을 같게 됨은 명확하다. 그러나 padding을 넣게되면 각 픽셀이 이미지의 가장자리로부터

얼마나 떨어져있는지 알 수 있다. 따라서 padding을 계속 거듭하면서 필터의 값을 조정해줌으로써 위 그림에서처럼

한 쪽 영역만 치우쳐서 actiavte 시키는것도 가능하다.

 

아래 그림을 보면 더 명확하다. 

padding을 추가하고 왼쪽만 활성화된 필터를 conv 연산하면 output은 오른쪽만 활성화된 값으로 나오게된다.


위에서 설명한 Protonet을 요약하자면 네트워크가 instance를 localize하는 방법을 학습할 수 있도록 하기위해 padding을 이용한다. padding을 이용하면 채널의 특정 지역만 activate시키는게 가능하고 이렇게

특정 부분이 activate된 mask를 총 k개 생성한다.

이때 k를 무작정 높여봤자 prediction head에서 예측하는 coefficient에 혼란을 주어 비효율적이다.

(다음 게시글에서 자세히 설명)

마지막에 k개의 마스크와 coefficient를 결합하여 final 마스크를 생성하는데 k중 1개가 큰 오류 생기면 마스크가 사라지거나 누수가 발생할수도 있다. 또한 실제로 k가 엄청 높아질수록 대응되는 마스크는 점점 외곽선 level로만 activate 한다.

(ex. k=1~3 : 특정 공간 activate, 4 : object 좌측하단, 5 : 배경 & 외곽선 , ... )

 

마지막으로 Protonet에서는 명확한 loss를 설정하지 않는데,

이는 생성되는 prototype(마스크)에서 activate되는 정도에 제한을 두지 않기 위함이다.

각 프로토타입은 특정 local을 activate하는 형태로 생성되는데 이때 확실한 background 같은 것에 대해서는 과하게 activation을 표현할 수 있도록 하기 위함이다. 따라서 활성함수로도 ReLU 같은 선형함수를 이용한다.

 

다음 글 : (논문리뷰&재구현) YOLACT 설명 및 정리 - (2)

 

(논문리뷰&재구현) YOLACT 설명 및 정리 - (2)

이전 글 : (논문리뷰&재구현) YOLACT 설명 및 정리 - (1) (논문리뷰&재구현) YOLACT 설명 및 정리 - (1) Image segmentation은 각 object에 대해 localization을 수행해야하므로 translation varia..

ganghee-lee.tistory.com