구글 리서치에서 나온 논문.
저번 포스팅에서 서베이하며 언급한 논문이다.
Abstract
이 논문에서는 Panoptic-DeepLab이라는 모델을 제시한다.
이 논문의 특징은 bottom-up 구조라는 것.
먼저 Semantic Segmentation branch. 여기서는 dual ASPP 사용하는데, 이전의 DeepLab스러운 방법이라고 한다.
그리고 Instance Segmentation branch. 여기서는 dual decoder. class agnostic이고, 가볍게 instance center regression도 한다.
Dataset은 Cityscapes, evaluation metric은 mIoU, AO, PQ. (testset에서.) 좋은 성능을 냈다.
그리고 COCO에서도 다른 top down 방식의 모델과 비슷한 성능을 낸다고 한다.
게다가 real time으로도 된다고 한다. 1025*2049에 15.8 fps면 이미지 꽤 큰거 아닌가? 잘 되는듯.
Introduction.
Panoptic segmentation은 semantic label과 instance id를 모든 픽셀에 대해 둘다 할당해야하는 태스크이다.
- stuff/thing 클래스 이렇게 두가지로 나뉜다.
- stuff : instance id가 필요하지 않은 object. (별로 안 중요해서 그런가?)
- thing : instance id가 할당되어야하는 Object.
- 그러면 대충 머릿속에 그려볼 수 있다. 자율주행 데이터라면 나무는 그냥 대충 '나무 (stuff)'라고 표기하며,
만약에 자동차의 경우 '자동차 (thing)', instance 1번 뭐 이런식이지 않을까.
일반적으로 Top down, bottm up 방식으로 나뉜다.
Top down의 경우, Mask RCNN에다가 semantic segmentation branch를 붙이는 형태이다. Instance segmentation이 보통 detection쪽에서 출발하여 많이 관련이 있기 때문에 Mask RCNN같은데다가 시맨틱 seg를 얹는 형태인 것 같다.
그런데 그러면 instance seg와 semantic seg 둘의 결과를 봤을 때, boundary가 다르다거나 하는 문제가 있을 것이다. Discrepancy 문제. 이를 해결하기 위해 그냥 휴리스틱하게 처리하는 접근법이 있다. instance mask에다가 confidence score를 이용한다거나, 각 레이블간의 pairwise관계를 이용한다거나 그런 식이다. (무조건 '넥타이'는 사람 class 위에 있다든가.) 그런 휴리스틱같은경우에는 속도면에서도 역시 안좋겠다.
그러면 역시 뭘 쓰려고 시도할까. 당연히 시맨틱 세그와 인스턴스 세그의 결과를 어떻게 잘 fuse하는 모듈을 만들지? 일것이다. 하지만 이런 방법의 문제들은, 다들 각각의 파이프라인을 가지고 있어서 아무래도 속도가 오래 걸릴 수 밖에 없다는 점. 그래도 따로 해서 합치니까 성능은 좋을 것 같다.
이와 다르게 Bottom up 방법이 있다. 바텀업의 경우, 딱히 이런 discrepancy 문제가 없다. 왜냐면 parallel하게 처리하는 것이 아니라 sequential하게 하기 때문. 시맨틱 세그를 먼저 하고, 이어서 인스턴스 세그를 하는 형식. 당연히 더 빠르고 간편할거다. 그런데 왜 이런 접근법이 별로 없을까? 당연히 성능이 충분하지 않으니까. 원래 시맨틱 세그랑 인스턴스 세그가 따로 발전해왔는데, 이걸 이제와서 합치려면 원래 잘 되던 것들을 적절히 섞는 게 성능이 가장 좋지 않았을까? 음. 묘하게 detection의 two stage와 one stage가 떠오르는걸.
=>
이 논문에서는 바텀업 구조를 사용하는데, 성능이 괜찮으면서 거의 real time이라고 한다.
저번 포스트에서 스르륵 봤던 Cityscapes, Mapillary Vistas, COCO 데이터셋에서 결과를 냈다.
Related Works
Top-Down.
Mask RCNN을 주로 쓴다. overlapping instance들을 구분하기 위해서이다.
- TASCNet : binary mask를 사용하여 consistency 보장. stuff / thing을 나눈다.
- AUNet : thing/stuff 구분을 위해서 attention module 도입.
- Panoptic FPN : Mask RCNN에 시맨틱 세그 브랜치를 붙였다.
- UPSNet : thing/stuff간의 conflict를 없애려고 추가적으로 unknown class를 맞추는걸 추가했다. 이 역할을 하는 게 panoptic head인데, 이 모듈은 parameter가 없다고.
- 가벼운 DeepLab에 multiscale feature를 사용한 모델도 있다.
- 그리고 AdaptIS는 instance mask와 point proposal을 만든다. point proposal이 뭐람?
Bottom Up.
별로없다.
주로 시맨틱 세그를 먼저 하고, 그 다음에 인스턴스 세그를 한다고. 왜냐면 그래야 인스턴스때 각각의 'thing'을 그룹핑할수 있으니까.
1. DeeperLab 논문이 이 분야에서 첫 논문.
class agnostic instance segmentation을 위해서 bbox corner, object center 정보를 도입했다.
2. SSAP
pixel-pair affinity pyramid와 graph partition method를 쓴다고. (역시 이렇게만 보면 뭔소린지는 모른다)
하지만 성능이 걍 그랬다고 한다.
이 논문의 경우 계속 class agnostic instance segmentation했고, instance center점을 regression한다고 하는데, 그게 predicted center 근처에 있는 픽셀들을 그룹화하기 위함이라고 한다. 그래서 이 논문의 경우 특별한 clustering 기법이라든가, clustering을 위한 loss도 쓸 필요가 없었다고.
Keypoint Representation.
이 개념이 object detection, instance segmentation에서 최근에 사용되기 시작했다고 한다.
예를들면 이런 기법들이 있다.
- 임베딩 벡터들을 통해 픽셀들을 그룹핑
- 사람에 대한 세그 마스크를 구하고, 인스턴스로 그룹핑.
- CornerNet : corner 정보를 예측하고, 이 정보를 통해 그룹핑
- ExtremeNet : center point를 가지고 extreme point라는걸 그룹한다고 한다.
등등... 요즘 center point와 corner 정보를 가지고 인스턴스들을 잘 나누려는 시도가 있는 것 같다.
그러니까 요약하면, object를 나타낼때 원래 우리는 항상 4d vector로 bbox를 표기했었다. 그런데 그러지 말고, cornet만 표기한다거나 extreme point같은걸 사용할 수 있지 않는가?해서 최근에 여러 논문이 나왔다는 얘기다.
대략 아래와 같은 느낌으로다가.
Method.
아래 그림을 보면 대략 이렇게 생겼다는 것을 알 수 있다.
1. Shared Encoder.
아마 모바일넷같은걸 써서 멀티스케일 피쳐를 뽑았겠지 뭐.
자그마한 피쳐맵이 만들어질 것이다.
2. Instance, Semantic Multiscale Context.
각각 두개.
뭔가 context를 뽑기 위해서 1*1 conv, 3*3 conv, pooling같은게 multiscale로 진행되어 하나로 합쳐진다.
3. 디코더.
각각 두개. 아까 인코더의 앞에 lower layer 두개에서 피쳐맵 가져와 넣어주는 과정이 있다.
upsampling해서 세그멘테이션 맵처럼 생긴걸 만들어줄것이다!
4. 시맨틱, 인스턴스 prediction.
시맨틱 세그의 경우, 디코더 아웃풋가지고 바로 클래스 정보를 픽셀단위로 알 수 있을 것이다. 각각 클래시피케이션 해주면.
그리고 instance의 경우, 특이하게 instance segmentation map을 만드는 게 아니라 center만 구한다.
두가지 브랜치로 나뉜다. center prediction과 center regression.
center prediction은 시맨틱세그와 같은 연산이 들어간다. 다만 output이 class 개수가 아니라 '1'이라고 적혀있다. center인지 아닌지를 표시하는건가?
그리고 center regression의 경우도 마찬가지인데, '2'라고 적혀있다.
아무튼 이것들을 다 fuse하여 post processing을 해주면 결과가 나온다.
이렇게 보면 인스턴스 센터에 관한 처리를 자세히 어떻게 하는지, 포스트 프로세싱은 어떻게 하는건지에 대해서만 들여다보면 될 것 같다.
결국 핵심은 decoder 이후에 각 브랜치에서 뭘 어떻게 하느냐.
Details.
Architecture : 4단계로 구성.
1. Encoder Backbone : ImageNet pretrained를 사용.
2. Decoupled ASPP module
3. Decoupled Decoder modules (specitic to each task)
4. Task specific prediction Head.
2, 3은 DeepLabV3+를 기반으로 하되, 두가지 변형이 있다고 한다. 세세한 변화인 것 같다.
ASPP에서 하나의 5*5 depthwise seperavle conv를 사용한점, 그리고 백본에 피쳐맵 하나 추가한 것.
그러면 4를 살펴보자.
Semantic Segmentation Head.
이건 그냥 얻을 수 있지 않는가. 그림에서도 보면 바로 num_class개의 레이블에 할당한다.
학습은 weighted bootstrapped CE loss를 사용했다고 한다.
각 픽셀마다 다르게 weighting을 하는 로스라고 한다.
Class-Agnostic Instance Segmentation Head.
Hough voting에서 영감을 받았다고 한다.
일단 이 논문에서는 무게중심 (center mass) 으로 물체를 나타낸다.
1. center에 대한 GT가 있으면 거기에 2D Gaussian을 씌워서 heatmap 형태로 만들어준다. 시그마값은 8을 사용했다고 한다.
predicted heatmap이 있으면, 이걸 GT와 비교하여 loss를 가지고 학습할 것이다.
따라서 loss로는 MSE를 사용했다.
2. 또한 offset prediction을 위해서는 L1 로스를 사용하였다.
이건 해당 object의 instance인 경우에만 사용하는 로스.
이걸 이해하려면 다음 과정을 봐야하는데, 대략 설명하자면 이렇다.
center point를 중심으로 object를 나타낼건데, heatmap이 제대로 나왔다면 이걸가지고 NMS같은걸 적절히 돌린다면 정말 오브젝트라고 할 수 있는 것들의 center point만 남을 것임. 그러면 clustering같은 느낌으로다가 그룹핑을 한다고 생각하면, 각각의 center point 중에서 가장 가까운 것에 모든 픽셀을 각기 할당해주면? object각각을 instance segmentation 할 수 있을것임!
여기서 왜 class agnostic을 강조하냐면, 여기선 instance segmentation인거라 그냥 Instance id를 할당하는 게 목적이니까. 시맨틱 세그멘테이션은 여기가 아니라 아까 앞에서 말한 다른 브랜치에서 하기 때문.
나름대로의 요약
- Input image를 shared encoder에 넣어 피쳐를 뽑는다.
- semantic, instance 각각의 context를 뽑기 위해 ASPP 모듈을 거친다.
- 디코더에 넣어 (upsampling같은 느낌) semantic map, instance map를 각각 뽑아준다.
- 각각 map을 구한다.
- semantic segmentation은 그림에 보이는대로 클래스 각각에 대한 score가 (픽셀단위로) 나올거다.
(out dim = NUM_CLASS) - Instance의 경우, 두가지 output.
첫번째 : center score.
나중에 이걸 NMS같은 처리를 해서 (max pooling으로 간단한 구현) 상위 몇개의 object center만 남길거다.
(out dim = 1)
두번째 : offset. (center regression)
지금 이 픽셀은 센터에서 얼마나 떨어져있는가? x, y축.
그렇기때문에, 나중에 모든 후보 object center 좌표값과 비교해서 가장 가까운걸로 할당할 수 있을 것.
그러면 해당 오브젝트라고 말할 수 있으니까! 이게 그룹핑 과정.
(out dim = 2)
- semantic segmentation은 그림에 보이는대로 클래스 각각에 대한 score가 (픽셀단위로) 나올거다.
Experiments
시작에 앞서 잠깐 감상해주고 가자.
Dataset.
thing/stuff로 나누는 게 국룰인 것 같다.
- Cityscapes : 교통 관련. 8 things, 11 stuff.
- Mapillary Vistas : 교통 관련. 37 things, 28 stuff.
- COCO : 일상 배경들. 80 things, 53 stuff.
Evaluation Metrics
- mean IoU
- average precision (AP)
- Panoptic quality (PQ)
Experimental Setup
tensorflow 구현, 32 TPUs.
하지만 비공식 코드중에서 내가 돌려봤던걸 (torch 기반)쓰면 GPU 몇대로도 충분하다. single GPU로 해봤는데, COCO 9만 iteration 돌리는데 하루도 안 걸렸다.
이것저것 자세하게 셋팅이 써있는데, 나는 COCO를 돌릴거라서 이것만 봤다.
- batch norm parameter를 finetuning* 했다고 한다. 음?
- 가로 세로중에서 긴 곳이 1025가 되도록 resize했고, 그리고 1025*1025 crop 적용하였다.
- batch 64
- 200K iterations
- poly learning rate policy
- Adam, init lr 0.001
- PQ의 sensitivity 때문에 thresholding (4096) 을 해서 stuff segment들을 VOID로 보냈다고 한다.
- "Encoder-decoder with atrous separable convolution for semantic image segmentation."과 거의 비슷한 셋팅이다.
- 인퍼런스때 multiscale {0.5, 0.75, 1, 1.25, 1.5} 및 left-right flipped input 사용.
- 특별히 표기하지 않으면 Xception-71을 기본 백본으로 사용.
* "Batch normalization: accelerating deep network training by reducing internal covariate shift" ICML 15.
아래는 Cityscapes에서의 ablation 결과.
중간에 cityscapes와 vistas 데이터셋 결과도 있는데 생략하겠다.
additional data로 COCO를 쓴 실험들이 있었다. COCO가 큰 데이터셋인건가? 이쪽은 안해봐서 잘 모르기.
아래는 COCO.
그냥 같은 셋팅에서 val, test 성능 같이 적지 뭔 기준으로 뽑아서 이렇게 비교해놓은건지 모르겠다.
그리고 아래 그래프를 보면 시간에 대한 측정도 있는데, 논문 말대로 꽤 빠른 것 같다.
Bottom-up approach에 있어서 필요한 고려사항 (by 논문)
- 아까 실험파트 맨 위에 넣은 그림을 보면, 횡단보도를 여러 인스턴스로 쪼개서 구분한 것을 볼 수 있었다.
하지만 top-down의 경우에는 ROIPooling, ROIAlign 덕에 이런것들을 하나의 인스턴스로 정상적으로 볼 수 있었다.
bottom-up도 이러한 고려를 통해서 성능을 올릴 수 있지 않나 싶다. feature pyramid라든가.
이 논문 읽으면서 이런 고려를 했던 흔적은 보였는데도 아직은 저런 문제가 남아있는 것 같다. - PQ thing의 경우는 잘 못맞춘다. PO stuff는 잘 맞추지만.
- 대부분 bottom-up panoptic segmentation은 panoptic annotation만 사용하며, instance annotation은 안 쓴다고 한다.
그런데 COCO에는 instance 정보 또한 있다. 이 점을 고려하자. - end-to-end training이 안된다고 한다. 몇가지 post processing 때문.
아래는 COCO의 annotation 얘기.
instance의 경우, overlapping이 가능하니까 저런게 되는데 panoptic의 경우에는 각각 나눠져있기때문에 함유하는 의미가 조금 다르지 않나 싶다.
top down 기법들은 모두 인스턴스 어노테이션을 썼고, 바텀업 기법들은 (이 논문을 포함해서) 팬옵틱 어노테이션을 사용했다고 한다.
그 인스턴스가 쪼개지는 현상이 바텀업에서 안되는 이유도 이와 연관있지 않을까 싶다.
실제 문제를 풀때 어떤 접근법으로 할지, 데이터는 어떻게 만들지, 어떤 방향을 채택해야하는지 결정하기 위해 이점은 꼭 고려해야할 것 같다.
'AIML 분야 > Segmentation' 카테고리의 다른 글
[연구노트] Semantic Segmentation 살펴보기 (0) | 2021.02.15 |
---|---|
panoptic-deeplab 코드 리뷰 (0) | 2021.02.04 |
Panoptic Segmentation COCO dataset 살펴보기 (0) | 2021.02.03 |
[연구노트] Panoptic Segmentation 서베이 (0) | 2021.02.02 |
Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers 읽어보기 (0) | 2021.01.05 |
댓글