CVPR 2022에 나온 WSSS 관련 논문인 Weakly Supervised Semantic Segmentation using Out-of-Distribution Data입니다. 저자가 한국 사람들이기도 하고, 최근에 OOD 개념에 대해 들어보기도 해서 관심이 생겨 읽어보았습니다.
추가로 지금까지는 논문 내용을 그저 '정리'만 했는데, 이제는 내용을 모두 담지 않더라도 조금 더 분석적, 비판적으로 읽고 생각한 내용을 적어보려고 합니다.
Introduction
- 본 논문에서는 '간단한 이미지 추가'만으로 WSSS 성능을 올릴 수 있었다고 합니다. 그 이미지는 바로 Out-Of-Distribution(이상치) 데이터입니다. 논문 첫 장부터 간단한 그림을 통해 어떤 novelty를 가지고 있는지 확인시켜줍니다.
- WSSS 분야에서는 Foreground(분할할 오브젝트)와 background(배경)의 구분이 주요 관건입니다. 그래서 그 경계(Boundary)를 잡아내는 것이 중요합니다. image-level labeled data은 그 특성상 더더욱 그 경계를 혼동합니다. 이 논문에서는 오리-물, 딱따구리-나무, 눈썰매-눈, 기차-기찻길로 그 예를 들었습니다. 주로 두 object가 동시에 등장하기 때문이죠.
- 여기서는 '기차'를 좀 더 잘 segmentation 하기 위해 '기차가 없는 기찻길'도 학습을 시키는 기법을 도입했습니다. 타 방법들에 비해서 레이블링 하는 과정도 단순합니다. 심지어는 class별로 '한 장'의 OOD 데이터가 있어도 2% 정도 성능을 높였다는 부분에서 흥미를 이끌어냈습니다.
- 이 연구진들은 OOD 셋 중에서도 학습에 도움이 되는 hard-OOD data를 모으는 방법에 집중했습니다. 기존의 image-label 단계에서 시행할 수 있는 정도라 시간과 비용이 거의 안 들어간다는 점을 강조했습니다.
Method
Collecting the Hard OoD Data
Hard Ood data를 모으는 과정은 다음과 같습니다.
- 원하는 클래스들( C list )을 정한다.
- 다양한 출처에서 레이블링 되지 않은 데이터를 수집한다. (인터넷, Open dataset 등)
- C list에 속해있는 이미지들을 결정하고, 태그를 단다. (foreground images)
- (3)에서 수집되지 않은 data를 모은다.
- --- 여기까지는 Candidate OoD Data ---
6. (3)에서 얻은 데이터를 학습한 classifier로 Candidate Data를 추론하고, score에 따라 정렬한다.
7. score가 0.5 이상인 이미지들만 남긴다.
8. 그중에서 foreground class가 있는 이미지들을 수동으로 거른다. (miss, false positive annotations)
9. --- Hard OoD Data 완성 ---
1개의 클래스라면 쉬워 보이지만, 원하는 클래스가 여러 개라면 어느 정도 cost가 필요해 보입니다.
Leaning with Hard OoD Dataset
이 부분에서 classifier의 Loss 함수를 정의합니다. 수식이 좀 복잡해 제대로 이해했는진 모르지만, 크게 두 부분으로 나뉩니다.
Classification loss에서는 in-distribution 입력값은 y 클래스 벡터 ( [0,1,0,...,0] )과의 binary cross entropy(BCE)를 계산하고, out-of-distribtion 입력값은 0 벡터 ( [0,0,0,...,0] )와의 BCE를 계산합니다.
Distance loss에서는 in-data와 OoD 데이터를 K-means 알고리즘을 이용해 clustering 한 뒤, 해당 cluster와의 거리를 구합니다.
Training Segmentation Networks
CAM은 low-resolution 정도의 예측 (seed area)만 할 수 있기 때문에, 최근 연구들에는 CAM의 결과를 pseudo-mask로 복원하는 데에 집중을 하고 있습니다. 이 연구에서는 IRN 프레임워크를 (attention 맵을 사용한 기법) 사용했다고 합니다.
Experiments
- In-Distribution: Pascal VOC 2012 데이터, Out-of-Distribution: OpenImages 데이터 사용
- Classifier: ResNet-50 사용
- Segmetation: DeepLab-v2 사용 (backbone은 ResNet-101, WideResNet-38)
- 모든 Backbone은 ImageNet에 pre-trained
Results
Conclusion
결과적으로 OoD data를 얻어내기 위한 data collection pipeline을 잘 설계함으로써 WSSS 성능을 많이 높일 수 있었습니다. Future Work로는 OoD 이미지를 Classifier가 아닌 Segmentation 네트워크에 적용하는 것을 언급했습니다.
보통은 새롭게 설계한 Neural Network 구조를 공개하며 성능을 높이는 추세 같은데, 간단한 데이터 레이블링 및 전처리, loss 함수 정의를 통해 WSSS 성능을 끌어올린 것이 인상적이었습니다. Localization 해야 하는 클래스가 그리 많지 않다면, 시도해볼 만한 방법인 것 같습니다.
혹시나 잘못된 부분이 있다면, 얼마든지 태클해주시기 바랍니다!
Ref.
https://github.com/naver-ai/w-ood