1. 소개
이전 포스팅에서 SOLOv1에 대한 논문을 리뷰해보았다.
https://do-my-best.tistory.com/75
semantic segmentation을 위해 기존에 사용하던 방식은 a) 계산량이 많던 픽셀 단위의 segmenting 이나 b) 독립적으로 anchor를 찾고, segenting하는 two stage 방식이 있었는데, SOLOv1에서는 instance를 나누는 기준을 중심간의 거리나 instance의 크기로 보고 grid cell을 나누어 grid cell을 한번에 분류하고 segmenting하는 box free 방식을 제시하였다.
하지만 SOLOv1에는 다음과 같은 퍼포먼스의 제한 요소가 있었는데, a) 효과적이지 않은 학습과 mask representing과 b) 좋은 mask prediction을 하기엔 부족한 high resolution c) 느린 mask NMS 이 때문에 속도를 올리는데 한계가 있었다. SOLOv2는 다음과 같은 방식을 제안함으로써 위의 제한 요소를 없애 더 좋은 모델을 제시하고자 한다.
1. dynamic scheme
위치에 따라 다이나믹하게 객체를 segmenting하도록 한다. 엄밀하게 말하면 mask learning 과정은 convolution kernel learning과 feature learning 2가지 파트로 나눌 수 있다. 픽셀들을 다른 객체의 카테고리로 분류할 때 mask kernel은 네트워크와 주어진 input에 의해 동적으로 예측된다. 더 나아가 instance-aware segmentation을 위해 통일되고, high-resolution인 mask feature representation을 구성할 것이다.
이를 통해 우리는 mask kernels와 mask features를 독립적으로, 그리고 효과적으로 학습할 뿐만 아니라 high-resolution의 object mask를 손쉽게 얻을 수 있을것이다.
2. effective matrix NMS algorithm.
연속적이고 반복적인 연산은 무시할 수 없는 latency를 유발한다. bounding box와 다르게, 각 mask pair의 IoU를 계산하는데 더 많은 시간을 소요하고 이는 큰 overhead로 이어진다.
본 모델은 효과적인 matrix NMS algorithm을 제안하여 이를 해결하고자 한다. 실험 결론 부터 말하자면 간단히 Matrix NMS를 적용시킨 파이썬 코드는 500 masks를 1ms도 안되는 시간에 해결하였고 퍼포먼스(정확도)도 Fast NMS보다 0.4% 증가했다고 한다. 흥미롭게도 SOLOv2에서 bounding box 개념은 사용하지 않았지만, 부산물로써 생성되었다고 한다. predicted mask를 bounding box로 직접 변환하기만 해도 object detecion에서 44.9%의 AP를 보였다고 한다. (이는 많은 object detection method를 뛰어 넘는 결과라고 한다)
이를 바탕으로, SOLOv1의 퍼포먼스의 제안 문제를 해결하고 개선된 모델인 SOLOv2를 제안하고자 한다.
2. SOLOv2
instance segmentation system은 픽셀 레벨에서 다른 instance들을 분리해야 한다. instance를 분리하기 위해서 SOLOv1의 컨셉을 따르고자 한다. 입력 이미지를 S X S grid로 나누고, 객체의 중심이 grid cell에 떨어진다면 grid cell에 대응하는 binary mask를 내보낸다. 그러한 방법으로 총 S^2개의 마스크를 system의 output으로 하였다. 이 방식은 좋았으나, 성능의 발목을 잡는 3가지의 문제점이 있다.
a) 효과적이지 않은 mask representation : 최종 출력 tensor인 M(즉, S^2)개의 channels를 예측하기에 메모리와 연산이 너무 많다. 게다가 S는 서로 다른 FPN의 레벨에 따라서 서로 다른 크기를 갖고 각 레이어의 마지막 레벨은 독립적으로 학습되고 공유 되으므로 학습이 효과적이지 않다.
b) 부정확한 mask prediction : 좋은 mask 예측은 객체 boundary의 디테일을 높이기 위하여 high-resolution mask를 필요로 하는데, 이는 상당한 computational cost를 야기한다.
c) slow mask NMS : box NMS나 mask NMS는 많은 시간을 잡아먹으므로 큰 overhead를 야기한다.
이러한 문제를 dynamic mask representation과 Mastrix NMS로 풀었고, 이를 지금부터 소개하고자 한다.
1. Dynamic Instance Segmentation
SOLOv1를 다시 상기해보자. SOLOv1 에서 S X S 그리드 크기에 맞게 S^2개의 instance mask를 생성했었다. 그 과정에서 마지막 레이어는 H X W X E의 크기의 입력을 받고, 중간 과정을 거쳐 최종적으로 convolution layer를 적용시켜 S^2크기의 output chennels을 만들었다. 이를 새로운 식으로 나타내보고자 한다. instance의 중심이 (i,j) 그리드 위치에 있다고 할 때 1 X 1 X E 크기의 conv kernel을 G_i,j라고 하고, 단 하나의 객체를 mask를 포함한 final mask 를 M_i,j라고 하자. 이를 식으로 나타내면 다음과 같다.
즉, 이 식을 통해 우리는 mask를 직접 만들지 않고도 input F와 G를 통해 mask를 만들 수 있다는 것이다. 이전 모델에서는 전체 마스크인 M을 직접 학습하고 추론했었는데, M이 매우 크고 직접 예측하기에는 메모리나 연산적으로 효과적이지 않았다. 그렇기 때문에 대부분의 케이스에서 object는 드문드문하게 위치해 있으므로, 실제 하나의 실제 추론을 위해서 S^2개의 중 하나의 커널인 M(Mast)을 따로 학습하는 것은 너무 낭비라는 것이다.
다른 관점에서 보았을 때 F와 G를 따로 학습하면 M을 F와 G로 만들 수 있을것이다. 이러한 방식으로 본 모델은 간단하게 S^2 커널 중 valid한 instnace들만 선택해서 다이나믹하게 convolution을 진행하였다. M을 F와 G로 나누고 학습함에 따라 parameter의 수도 줄었고, 예측 kernel은 입력에 대해 동적으로 생성되게 되었다. 이는 모델이 flexibility와 adaptive를 갖게 한다.(아마 학습에 따라 유연하고, 학습에 적응하는 모델을 만든다는 의미인듯). 추가로 각 S^2개의 커널은 location에 의해 생성되므로 location으로 object를 segmenting한다는 의 중심 아이디어와 일치하므로 위치에 따라 예측하고 segment 할 수 있다.
이제 이 두가지 Mask(1. Mask Kernel[G], 2. Mask Feature[F])에 대해서 알아보자.
1. Mask Kernel G
Backbone인 FPN으로 주어졌을 때, 모델은 각 피라미드 레벨에서 mask kernel인 G를 예측할 수 있다. 우선 입력 feature인 F_I를 H_I X W_I X C 에서 S X S X C로 resize 해준다. 그리고 4x conv와 3 X 3 X D크끼의 conv를 적용하여 kernel G를 생성한다. 이때 SOLOv1과 동일하게 normalize된 위치 정보를 붙이는 CoordConv를 진행한다. head의 weight는 모든 feature map의 levels간에 공유된다.
각 grid에 대해 kernel branch는 예측된 convolution kernel의 weight를 나타내기 위해 D-Dimensional 출력을 예측한다 (여기서 D는 파라미터의 수이다). 예를 들어 1 X 1크기의 convolution의 weight를 만들고자 한다면 E 크기의 입력 체널은 E와 같다. 만약 3 X 3 크기의 convolution의 weight를 만들고자 한다면 D는 9 * E와 같다. 만약 입력을 S X S크기의 grid로 나눈다면 output의 차원은 S X S X D일것이다. (output엔 activation function을 적용시키지 않는다.)
2. Mask Feature F
mask feature과 mask kernel이 decouple 되고 각각 예측되기 때문에 2가지 방법으로 mask feature을 구성할 수 있다. 첫번째로 kernel branch와 함께 head에 넣는 방법이 있다. 이는 FPN에서 각 레벨에 대해 mask feature를 예측하는 방식을 의미한다. 두번째 방법으론 FPN의 모든 레벨에 대해 통합된 mask feature repesentation을 예측하는 것이다. 본 논문은 두 방식을 실험하여 비교하였고, 효율성과 효과적인 후자를 적용하였다.
통합되고, high-resolution인 feature mask를 학습하기 위해서 Panoptic feature pyramid networks의 semantic segmentation으로 부터 영감을 받은 pyramid fusion을 적용하였다. 이는 3 X 3 conv 이후 Group normalization와 RELU와 2번의 bilinear upsampling을 진행한 이후 FPN의 P2부터 P5까지의 features는 하나의 1/4크기의 output으로 통일된다. 마지막 레이어에서 1 X 1 convolution을 통한 element wise summation을 한 이후 group normalize와 ReLU를 적용한다. (더 자세한 건 보충자료를 참고하란다). 이 때 convolution과 bilinear upsampling과정 이전에 normalize된 pixel 좌표를 가장 깊은 FPN의 레벨(1/32 크기)에 feed해주었음을 유의해야한다. 정확한 위치 정보를 제공하는것은 position sensitivity와 predicting instance-aware features를 위해 중요하다.
3. Forming Instance Mask
(i,j)에 위치하는 grid cell에 대해 G_i,j를 먼저 계산하고 G_i,j는 instance mask를 얻기 위해 F로 convolved된다. (M = G * F)전체적으로 각 prediction level에서 최대 S^2개의 mask가 나올것이다. 마지막으로 이를 이용하여 Matrix NMS를 적용하여 최종 instance segmentation결과를 얻을 수 있다.
4. Learning and Inference
training loss function은 SOLOv1과 동일하게 정의한다.
추론을 하면서 input image를 backbone model과 FPN을 진행하고, grid cell의 category score인 p_i,j를 얻는다. confidence threshold를 0.1로 설정하여 낮은 confidence를 갖는 결과를 거르고, 예측된 mask kernel은 mask feature로 convolution을 수행하게 된다. sigmoid 이후 threshold를 0.5로 설정하여 예측된 soft mask를 binary mask로 나타낸다. 이후 Matrix NMS를 통해 최종 instance segmentation결과를 도출한다.
2. Matrix NMS
Soft-NMS에서 부터 영감을 받은 방식이다. Soft-NMS는 monotonic decreasing function인 f(iou)가 겹침에 따라 detection score를 줄였다. IoU의 반복성에 따라 점수를 줄였는데, 더 높은 IoU detection은 최소 score threshold로 제거된다. 하지만 이런 연속적인 프로세스는 기존 Greedy NMS와 같고, 병렬적으로 적용될 수 없을것이다.
Matrix NMS는 이러한 절차를 예측된 mask인 m_j가 어떻게 압축되었는지를 고려하며 다른 관점으로 보았다. m_j의 decay factor는 다음 두가지에 영향을 받는다. a) s_i > s_j이라고 할 때 s_i와 s_j예측 mask인 m_j에 대한 m_i의 패널티. b)m_i가 suppressed(억제??)되었을 확률
a)의 경우 m_j에 대한 m_i의 패널티는 쉽게 f(iou_i,j)로 계산할 수 있다. b)의 경우 m_i가 suppressed될 확률은 손쉽게 계산할 순 없다. 하지만 확률은 IoU와 positive correlation이므로, IoU를 통해 그 확률을 유추할 수 있다. 다음은 대부분의 m_i의 overlap된 확률을 통해 본 논문이 제안하는 유추한 확률이다.
위에 서술한 바를 바탕으로 최종 decay factor를 나타내면 다음과 같다.
decay factor을 구한 이후, s_j = s_j * decay_i로 score를 업데이트 한다. 본 논문에서 가장 심플한 decremented function을 이용한다. 다음은 어떻게 적용을 하였는지에 대한 내용이다.
Matrix NMS의 모든 연산은 반복 없이 one shot으로 적용할 수 있다. 우선 score에 대해 내림차순으로 정렬된 예측에서 top N개의 예측을 선택하고, N X N의 pairwise IoU matrix를 계산한다. binary mask의 경우, IoU matrix는 matrix operation으로 효과적으로 사용될 수 있다. 그리고 IoU matrix에서 column-wise max를 통해 대부분의 overlapping IoU를 찾아낼 수 있다. 그 이후 모든 높은 score를 갖는 예측의 decay factors를 계산하고, 각 예측에 대해 column-wise min연산을 통해 decay factor가 선택된다. 최종적으로 decay factor을 통해 score가 update된다. Matrix NMS를 사용한다면 주어주어야 할 것은 threshold와 마지막 예측에 대해 선택할 scoring mask의 갯수이다. 결과로는 일반 NMS보다 9배 빨랐으며 더 정확했다더라~
3. 개인적으로 흥미로운 결과 요약
1. kernel shape
1 x 1 conv의 커널 vs 3 x 3 conv의 커널의 차이는 없다고 한다. 대신 128개의 input channel을 256으로 바꿨더니 0.4%의 추가 AP를 얻을 수 있었다더라. 하지만 그 이상은 변화가 거의 없다더라. 그래서 256으로 했다더라
2. effectiveness of coordinate
만약에 위치 데이터를 추가하지 않았다면, 같은 외형을 갖는 객체에 대해서 같은 커널을 예측할 것이고, 이는 같은 output mask를 나타낼 것이다(위치, 각도와 상관없이). 또한 feature branch가 position 정보가 없으므로, 픽셀을 mask kernel에 해당하는 feature channels에 배정하지 못할것이다. 그래서 위치 정보가 없을 때 36.3%의 AP를 갖는데, 이 정보가 없는것 치고는 꽤 괜찮았다고 한다. 그 이유를 CNN이 zero-padding operation으로 내부적으로 암묵적으로 위치 정보를 학습하기 때문이라고 한다. (How much position information do convolutional neural networks encode? 논문에 의거하여) 하지만 이렇게 암묵적으로 위치를 배우는건 조잡하고, 부정확하므로 Coord operation을 적용시키면 1.5% AP를 추가로 얻을 수 있었다고 한다
// 나중에 한번 저 논문 보면 재밌겠다
3. Unified Mask Feature Representation
mask feature learning에서 2가지의 옵션이 있었다고 한다. feature learning을 head에서 각 FPN의 레벨 별로 따로따로 할것인가, 아니면 통일할것인가?로 나뉘었다고 하는데, 전자는 7개의 3 X 3크기의 Conv를 이용하여 mask feature를 예측했고, 후자는 FPN의 특징을 융합해서 통일된 mask representation을 얻었다고 한다.
후자가 일반적으로 더 좋은 결과를 냈고 특히 중간, 큰 크기의 object에 효과적이었다고 한다. 이 부분은 큰 크기의 object는 FPN의 low spatial resolution의 High level feature map배정되어 있기 때문에 조잡한 boundary prediction을 야기했기 때문이다.
4. Matrix NMS
기존의 방식들은 IOU를 계산해야하는데 Matrix NMS는 미리 계산하므로 속도가 빠르다더라. 속도는 바르꼬 추가 AP도 0.4%정도 얻을 수 있었다더라.
5. light weight models
목적에 따라 다르게 설정했다. 첫째로는 속도를 우선으로 한 모델은 prediction head의 conv layer의 수를 2개로 줄이고, input을 448로 줄였다더라. 정확도를 우선으로 한 모델은 conv layer의 수를 3으로, input을 512로 했다더라
'ML' 카테고리의 다른 글
HOG (Histogram of Oriented Gradient for human detecting) (0) | 2021.07.21 |
---|---|
SIFT (Scale-Invariant-Feature TRansform)를 활용한 이미지 특징 추출 및 매칭 알고리즘 (1) | 2021.07.20 |
SOLOv1 논문 리뷰 (0) | 2021.07.16 |
CS231n lecture 12 : Visualizing and Understanding (0) | 2021.07.12 |
CS231n Lecture 11 : Detection and Segmentation (0) | 2021.07.12 |