이번 포스팅에서는 ICCV 2019에 나온 YOLACT 논문을 리뷰할 예정이다.
해당 논문은 '실시간'으로 이미지를 instance segmentation 문제를 해결하는 방법을 제시한다.
Paper:
https://arxiv.org/abs/1904.02689
Bolya, Daniel, et al. "Yolact: Real-time instance segmentation."
Proceedings of the IEEE/CVF international conference on computer vision. 2019.
Abstract
이 논문에서는 'real-time instance segmentation'을 위한 fully-convolution model을 제시한다.
이를 가능하게 하기 위해서 instance segmentation task를 두 개의 하위 작업으로 나눠 병렬로 수행한다.
- Prototype mask set 생성
- 각 instance mask의 coefficients 예측
이에 대한 내용은 추후에 설명하도록 하겠다.
여기서는 두 가지의 병렬 task로 instance segmentation을 한다는 정도만 알면 될 것 같다.
Instroduction
2-stage detection 모델인 Mask RCNN, FCIS와 같은 접근 방식은 Faster R-CNN 및 R-FCN을 기반으로 발전해 왔다.
하지만 2-stage 방식 detection은 '속도'(speed)보다 '성능'(performance)에 중점을 두고 있다.
속도의 측면에서 보완하고자 1-stage 방식의 detection 모델인 SSD, YOLO와 같은 모델이 실시간으로 detection 할 수 있게 했다.
그러나 object detection보다 intance segmentation가 더 어려운 task이기 때문에 정말 똑같은 방식으로 '실시간'의 성능을 고도화할 순 없다.
그 이유는 다음과 같다.
2-stage 기반의 instance segmentation은 feature localization에 의존하여 mask를 생성해 낸다.
feature의 일부를 바운딩 박스 영역으로 pooling(=re-pooling)하고 이를 mask predictor에 입력으로 통과시킨다.
이 방법은 sequential하기 때문에 가속화하여 속도를 높이기 어렵다.
물론 FCIS와 같이 이러한 단계를 병렬로 수행하는 단계별 방법도 있지만, localization 이후에 많은 후처리 과정이 필요하기 때문에 속도를 높이는 것은 어렵다고 한다.
본 연구에서는 이러한 점을 고려하면서 2-stage의 한계를 극복하는 방식으로 빠르고 단계적인 인스턴스 세그멘테이션 모델을 제공한다.
실제로 본 논문에서 제시한 YOLACT 모델의 성능은 figure 1과 같다.
COCO dataset 기준으로 Mask mAP가 30을 상회하면서 동시에 30 FPS를 넘는 추론 능력을 보여준다.
이는 인간이 느끼기에 실시간이라고 판단되는 기준인 30 FPS를 넘기 때문에 목표를 달성했다고 볼 수 있다.
YOLACT(The proposed method)
앞서 언급한 것처럼 YOLACT 저자들은 Faster R-CNN에서 Mask R-CNN로 발전시킨 것(object detect측면에서)과 같이
mask branch를 추가하여 실시간의 성능을 고도화하고자 한다.
다만 위의 발전 방식과 다른 점은 explicit feature localization step이 따로 없다는 것이다.
다음 Figure 2를 보고 YOLACT의 구조를 파악하고 어떻게 문제를 해결하고 자하는 지 그 흐름을 이해해 보자.
Input image로부터 특징을 추출하기 위해 Feature Backbone을 거치면, 어떠한 형태의 특징을 가지는 Feature map이 만들어진다.
그중 C5에 해당하는 feature map을 활용하여 P5로 대응시키고 이를 up / down - sampling 한다.
Upsampling 과정에서 P4와 C4, P3와 C3을 선형 결합한다. 이때 만들어진 P3 ~ P7이 Protonet과 Prediction Head에 사용되는 것이다.
왜 Feature pyramid를 사용할까?
다양한 크기와 해상도를 가지는 Feature map을 만들고 이를 결합하면 다양한 receptive field를 고려할 수 있기 때문에
다양한 크기의 객체 특히 작은 객체의 특징을 잡아내는 데 유용하게 사용된다.
즉, robust 한 segmentation 성능을 내기 위해서이다.
드디어 Abstract에서 언급한 두 가지 병렬 작업(parallel task)에 대해 알아볼 시간이다.
하나는 1) FCN(fully convolutional network)를 사용한 Prototype masks set 생성하기이고,
다른 하나는 2) 'mask coeffiecients'의 벡터를 예측하기이다.
위의 figure 2에서 prediction head와 protonet의 파트로 나눠지는 부분이 이에 해당한다.
이 두 가지를 병렬적으로 수행될 수 있는 경우는 mask의 spatially coherent 성질을 이용할 수 있어야 하는 경우이다.
spatially coherent의 성질은 쉽게 말해서 서로 가까운 픽셀은 같은 instance일 가능성이 높다는 것을 의미한다.
그러나 spatially coherent의 성질을 활용하는 데 기존의 task에 문제가 있다.
원래 one-stage detector는 각 anchor에 대해 class와 box coefficients를 fc-layer의 출력으로 생성한다.
하지만 fc-layer는 mask에 대하여 spatially coherent한 것을 활용하지 못한다.(localization의 정보 없이 class와 box coefficient를 계산하기 때문에)
그렇다고 two-stage의 localization(ex. RoI-Align)을 사용하면 속도 페널티가 크다.
따라서 본 논문은 fc-layer의 출력으로 semantic vector를, conv-layer의 출력으로 mask coefficients와 prototype mask를 생성하여 활용하고자 한다.
결과적으로 이 둘이 독립적으로 계산되기 때문에, computation overhead는 이 둘을 합치는 과정에서 생긴다.
이것을 matrix multiplication으로 해결하기 때문에 속도 문제를 해결할 수 있다고 한다.
각 파트에 대해 좀 더 자세히 알아보자.
1. Prototype Generation
Figure 2에서 Protonet에 해당하는 부분이다.
Protonet은 전체 이미지에 대한 K개의 prototype mask set을 예측한다.
k개의 channel이 각각의 k개의 mask로 대응되는 꼴이다.
아래의 figure 3을 보면 138 * 138 * k(개)의 mask set이 생성된 것이다.
이를 backbone feature layer에 연결하는데, figure 2의 P3에 해당한다.
FPN(Feature Pyramid Network)를 사용하고 그 후 입력 이미지에 대하여 1/4 크기로 up-sampling 한다.
(550 * 550 input size -> 138 * 138 feature map size )
FPN의 깊은 layer를 활용한 고해상도의 feature map을 통해 작은 객체에 대해 고품질의 mask를 생성할 수 있다.
또한 Protonet의 출력을 unbound 하게 만드는 게 중요하다고 강조한다.
큰 confident를 가지는 값에 대하여 large, overpowering activation(명확할 수록 더 커지는 활성화 값)하게 하기 위해
Protonet출력에 Relu나 비선형이 아닌(nonlinearity)의 함수를 사용하는 것으로 이를 해결했다고 한다.
2. Mask Coefficients
일반적으로 anchor-based detector는 prediction head에 2개의 branch를 사용한다.
- c개의 class confidence를 예측
- bounding box 좌표계(4개)를 위한 regressor 예측
본 논문은 Mask coefficients를 예측하기 위해 위의 1,2 branch와 병렬적으로 다른 하나의 branch를 추가하여 k개의 prototype의 mask coefficients를 예측한다.
따라서 일반적인 anchor-based detector에서 anchor당 4+c(4a + ca)개의 계수를 생성하는 것 대신에 4 + c + k(ca + 4a + ka)개의 계수를 생성하게 된다.
Figure 4를 보면 왼쪽(기존 anchor-based)은 Pᵢ 로부터 class(1번에 해당)와 box(2번에 해당) branch를 가지지만 오른쪽(본 논문 제시)은 class와 box에 병렬적으로 더하여 mask의 branch를 생성하는 것을 볼 수 있다.
3. Mask Assembly
최종적으로 instance mask를 생성하기 위해서 prototype branch와 mask coefficients branch를 결합해야 한다.
mask coefficient를 계수로 한 선형 결합을 통해 이를 가능하게 한다.
final mask 생성을 위해 비선형 함수인 sigmoid를 사용한다고 한다.
즉, 아래의 식(1)과 같이 두 branch의 단일 행렬 곱과 simoid를 통한 instance mask를 생성한다.
P는 prototype mask의 H * W * K 크기의 행렬이고, C는 인스턴스에 대한 mask coefficients의 N * K (N은 NMS 결과 남아있는 class들의 수) 크기의 행렬이다.
3.1 Losses
본 논문은 모델 훈련에 사용할 손실 함수로 Classification Loss, Box regression Loss, Mask Loss 3가지를 사용한다.
각각 weight을 1 / 1.5 / 6.125로 두기 때문에 Mask loss에 대해 더 민감하게 적용되도록 구성했다.
Classification과 Box regression Loss에 대해서는 'SSD: Single shot multibox detector'의 논문에서 사용한 것을 차용했다고 한다.
(SSD 논문 리뷰에서 다뤄보자!)
Mask Loss는 pixel-wise binary cross entropy를 사용했다고 한다.
3.2 Cropping Masks
본 논문은 evaluation 단계에서 최종 마스크를 예측된 bounding box로 자른다.
반면 Training 단계에서는 예측된 bounding box 대신에 Ground truth bounding box로 자른다.
Mask Loss를 Ground truth bounding box 영역으로 나누어 Prototype mask에서 작은 객체를 보존한다고 한다.
(이게 어떻게 가능한 건지는 아직 이해를 못 해서 더 공부해야 할 것 같다..)
4. Emergent Behavior
instance segmentation에서 FCNs를 사용하여 translation invariance의 성질을 가진 것과 달리 본 논문의 task에서는 translation variance가 필요하기 때문에 조금 다른 접근법을 사용했다. (mask별 나타나는 activation이 달라야 할 것이다.)
Translation invariance란?
쉽게 말해, Conv layer의 연산 과정에서 input의 위치가 달라져도 output이 동일한 값을 갖는 것을 의미한다.
가령 고양이 구분 task에서 고양이가 이미지의 어떤 곳에 위치하더라도 Convnet은 Translation invariance의 성질로 고양이로 구분할 수 있어야 한다.
참고: https://ganghee-lee.tistory.com/43
FCIS나 Mask R-CNN에서 적용한 방법은 translation variance를 explicitly 하게 추가한다.
(re-pooling, second stage에 mask branch 적용 -> localizing instance X )
반면 본 논문에서는 final mask를 predicted bounding box로 자르는 과정을 제외하면 explicitly하게 추가하여 translation variance를 추가하지 않았다.
대신 서로 다른 Prototypes의 activation을 통해 localizing instance 하는 방법에 대해 학습했다고 보는 것 같다.
Figure 5에서 이를 확인해 볼 수 있다.
우선 이미지 A(빨간 픽셀로만 이뤄진 이미지)가 padding 없이 FCN을 통과하면 모두 같은 값을 가질 것이다.
padding을 각 layer마다 추가해 준다면 각 layer를 지날 때마다 픽셀이 이미지의 가장자리로부터 얼마나 떨어졌는지 알 수 있다.
이것이 본질적으로 Translation variant를 가지고 있다고 볼 수 있으며, 이를 활용하는 게 본 논문이다.
Figure 5를 보면 6개(k = 6)의 Prototype mask가 각 이미지(a~f)에 대하여 생긴 것을 볼 수 있다.
각각의 prototype은 이미지의 특정 partitions를 활성화하는 것으로 보인다.
이러한 partition map(1~3)을 결합하여 같은 semantic class에 대해서 instance를 구분할 수 있다고 한다.
(심지어 겹치는 부분도 구별한다고 합니다.)
예를 들어 이미지 d에서 prototype 2에서 3을 빼준다면 녹색 우산을 activation 한 것과 같게 된다.
또한 Prototype은 compressible(압축가능)하다.
Protonet이 prototype을 하나로 결합하는 경우, mask coefficient branch가 어떤 prototype이 어떤 상황에서 필요한 지를 학습할 수 있게 한다.
따라서 무작정 K를 증가시키는 것은 mask coefficient가 network에서 학습면서 올바르게 생성되어 그 균형을 이루는 것에 방해가 될 것이다. (실제로는 K를 무작정 증가시키는 것은 별 효과가 없다고 한다.)
Results
Table 1을 보면 MS COCO 셋 기준으로 YOLACT모델을 다른 모델의 성능 지표와 비교하였다.
속도 측면(FPS, Time)에서 큰 경쟁 우위가 있다는 점에서 의미가 있다.
더욱이 다른 모델들끼리의 성능 지표는 AP기준(AP50, 75의 차이를 보면) 비슷한 간격을 두고 성능이 측정된다.
반면 YOLACT-550(550은 이미지 사이즈)와 Mask R-CNN을 비교해 보면 AP50은 약 9.5 정도 차이가 나지만 AP75는 약 6.6 정도 차이 난다는 점에서 IOU threshhold를 높일수록 성능 차이가 줄어든다는 것을 시사하고 있는 것 같다.
Figure 7을 보면 mask의 quality 부분에서도 YOLACT의 좋은 성능을 볼 수 있다.
이를 가능하게 한 것은 138 * 138 크기의 비교적 큰 final mask size와 원본 feature로부터 생성한 mask를 꼽는다.
큰 객체에 대하여 FCIS와 Mask R-CNN와 비교하여 더 좋은 quality를 내고 있다.
가령 사람의 팔 부분을 보면 그 경계를 더욱 세밀하게 따르는 mask를 생성하는 것을 볼 수 있다.
(FCIS, Mask R-CNN은 주위에 noise가 있는 모습이 관찰된다.)
References
[1] YOLACT 논문: Bolya, Daniel, et al. "Yolact: Real-time instance segmentation."
Proceedings of the IEEE/CVF international conference on computer vision. 2019.
[2] translation invariance: https://ganghee-lee.tistory.com/43
'인공지능 > Paper Review' 카테고리의 다른 글
[Paper Review] Image style transfer using CNN (2) | 2023.12.23 |
---|