안녕하세요, 박천성 연구원입니다. 요즘 weakly and semi-supervised learning에 대한 연구를 진행중인데, classification 혹은 detection 에 대한 연구는 많은 반면 semantic segmentation에 대해선 많지 않았던것 같습니다. 그러던 와중 최근 서울대학교 연구실에서 CVPR 2019에 publish한 연구결과를 발견하여 이번 포스트를 작성하게 되었습니다.  소개해드릴 논문은 “FickleNet:Weakly and Semi-supervised Semantic Image Segmentation using Stochastic Inference, Lee et al” 입니다.

먼저 이 논문의 main contribution을 말씀드리고 싶습니다.

  1. Weakly-supervised learning의 경우 class level label 만을 가지고, Semantic segmentation model을 학습했습니다. Grad-CAM, DSRG를 응용하여 weak label에 대한 segmentation mask를 pseudo label처럼 사용했고, 결과가 상당히 인상적입니다.
  2. 논문 제목에 써 있듯이 semi-supervised learning 에 대해서도 해당 모델을 적용하여 segmentation 결과를 보여주었습니다. 다만 일반적인 Semi-supervised learninig setting 과는 달리, unlabeled data대신 weakly labeled data를 사용했습니다. 본 모델은 Semi-supervised learning 에 최적화되어 있다기 보단, weakly-supervised learning 에 최적화되어 있다고 생각됩니다.
  3. 실험적 측면 : 모델의 성능, 걸리는 시간, 중요한 parameter들에 대해 자세히 결과를 분석해 놓았고, 각 부분별로 원인과 결과를 정확히 이해할 수 있었습니다. 다만 뒤에서 설명하겠지만, general dropout과 비교분석하는 실험 부분이 궁금증으로 남았습니다.

Intro

스크린샷 2019-04-22 오후 1.18.42.png
그림(1) Fully & Weakly-supervised Semantic Image Segmentation [1]

그림(1)은 weakly-supervised semantic segmentation의 예시를 보여주고 있습니다. 그림에서 위의 label과 image 는 fully-supervised semantic segmentation 을 의미하고, 그림에서 아래 label과 image는 weakly-supervised semantic segmentation setting 을 보여주고 있습니다. 그림을 보면 바로 이해가 되시겠지만, weakly-supervised setting은 상대적으로 적은 정보만을 가지고, fully-supervised setting 에서 하려는 fine한 segmentation mask를 predict 해야합니다. fully setting 처럼 디테일한 정보를 주지 않더라도, 여러 데이터를 관찰하면, 물체를 구분하는 방법을 스스로 파악하고, fully-supervised setting 만큼의 성능은 아니지만 준수한 성능을 얻어내는것이 weakly-supervised setting 의 목표라고 할 수  있습니다. 특히 그림(1) 경우에는 다른 weakly-supervised setting 과 비교해서 상대적으로 많은 정보를 제공하고 있습니다. fine한 segmentation mask는 아니지만, coarse한 segmentation mask를 제공하기 때문에, weak label 중에서도 양반(?)인 편입니다. 그럼 정보가 훨씬 없는 weakly-supervised setting 을 가정하면 다음과 같이 문제를 풀어야 합니다.

스크린샷 2019-04-22 오후 1.38.11
그림(2) Class Level Label Weakly-supervised Setting [0]

그림(2)는 Class level label만이 주어진 weakly-supervised semantic segmentation의 예시를 보여주고 있습니다. 그림(1)에서 보았던 weak label 중에서도 양반(?)인 label과 달리, 그림(2)는 “Airplane”이라는 class level label만 주어져 있습니다. 정보가 훨씬 없는 weakly-supervised setting입니다. 어떻게 이 정보만 가지고, segmentation까지 해낼 수 있을까요?

스크린샷 2019-04-22 오후 3.11.46
그림(3) Class Activation Map [3]

Class level label을 가지고, segmentation map을 근사하여 얻어낼 수 있는 방법에는 여러가지가 있겠지만, 그 중에서도 CAM(Class Activation Map)을 사용하면 쉽게 얻어낼 수 있습니다. Class level label을 가지고 classifier를 training 한 후 CAM을 뽑아내면 됩니다. 하지만 그림(3)에서 볼 수 있듯이, “Airplane”이라는 class에대한 CAM은 분별하기 쉬운 특성을 지니고 있는 곳에 집중되어 있습니다. 우리가 원하는것은 비행기의 테두리를 따라 segmentation mask를 추출해내는 것 입니다. 하지만 classifier는 비행기의 엔진이나, 날개 시작점, 비행기 중앙부분만을 보고도 비행기라고 판별할 수 있기 때문에, CAM이 그림(3)의 오른쪽 그림처럼 나오게 되는 것입니다. 그렇다면 CAM을 어떻게 활용해야 segmentation mask로 근사하여 사용할 수 있을지 알아봅시다!

Related work

이전에 나왔던 논문을 보면 앞서 던진 “CAM을 어떻게 활용해야 segmentation mask로 근사하여 사용할 수 있을까요?” 질문에 대한 답을 찾을 수 있습니다.

  • Seed Region Growing
  • Weakly-Supervised Semantic Segmentation Network with Deep Seeded Region Growing

Seed Region Growing (SRG)

스크린샷 2019-04-22 오후 4.06.41
그림(4) Region Growing Process [4]

그림(4)는 region growing process 를 보여줍니다. 이 process는 단순한 segmentation 기법 중 하나입니다. 주어진 출발점에서 시작하여 주변 영역들이 같은 분류군인지를 점차 판단해 나갑니다. 모든 영역을 다 탐색한 후에는 같은 분류군들끼리 묶어낼 수 있고, 그렇게 되면 image를 segmentation 할 수 있게 됩니다. 과정을 상세히 살펴보면, 왼쪽 그림에 검은 점들이  seed 포인트들입니다. 이 점들에서부터 주변 영역들을 탐색해 나갑니다. 가운데 그림을 보면, 주변영역을 점차 탐색해나감을 볼 수 있습니다. 주변 영역을 탐색하면서 image의 pixel 값을 기준으로 seed 포인트와 특정 한계값 이하로 차이가 나면 같은 분류군으로 묶습니다. 빨간색 작은 박스로 표시되어있는 포인트들이 같은 분류군으로 묶인 포인트들입니다. 오른쪽 그림을 보면 명확히 이해할 수 있습니다. 탐색한 영역중에 크게 차이가 나지 않는 점들만 같은 분류군으로 묶였습니다.

Deep Seed Region Growing (DSRG)

스크린샷 2019-04-22 오후 5.24.41
그림(5) Deep Seed Region Growing(DSRG) [2]

Region growing 은 단순한 segmentation 기법 중 하나입니다. 그렇지만 이를 활용하면 그림(5)와 같은 결과를 얻어낼 수 있습니다. Training data는 승마하는 사람에 대한 image 그리고  “Person”, “Horse”라는 class level label만을 가지고 training 한 것입니다. 그럼에도 불구하고, GT처럼 디테일한 segmentation 결과는 아니지만, 상당히 좋은 결과를 보여주고 있습니다. Deep Seed Region Growing은 seed region growing과 CAM을 활용하여, 위와 같은 결과를 얻어냈습니다. 그림(5)에서 하단의 이미지들을 보면 짐작할 수 있지만, region growing 과정을 거쳐 segmentation map에 도움을 주게 됩니다.

스크린샷 2019-04-23 오후 3.57.37.png
그림(6) DSRG 구조 [2]

DSRG는 크게 classifier training, seed cues generation, segmentation model training, 그리고 region growing prosess로 나뉘어 있다고 볼 수 있습니다. Training data가 image와 그에 해당하는 class label들이 있기 때문에, 그를 활용해서 먼저 classifier를 training합니다.

Training된 classifier를 통해 image에 대해 CAM을 추출합니다. 각 class 별 CAM을 특정 한계값 이하의 값들은 버리고, 이상의 값들을 하나의 map 으로 합쳐 그림(6)의 S 와 같이 만들어줍니다. (class 별로 겹치는 영역이 있으면 더 높은 값을 같는 class로 선택합니다). S를 seed cues로 사용하게 됩니다.

Segmentation model의 prediction 값을 H라고 합니다. S와 H를 가지고 region growing 을 합니다. 기존 region growing과의 차이점은 region growing은 RGB 값을 기준으로 같은 분류군에 속하는지 안하는지 판별하는 반면, 여기서는 H의 값을 기준으로 판별하게 됩니다. 즉 segmentation prediction의 probability를 활용해서 region growing을 하기 때문에, seed cues 주변으로 probability가 큰 경우 같은 분류군으로 묶여 확장되고, 그렇지 않은 경우 같은 분류군으로 묶이지 않고 버려집니다. 이렇게 region growing을 하면 그림(6)에서 G처럼 됩니다.

스크린샷 2019-04-23 오후 4.06.53
수식(1) Loss Term & Seed Loss [2]

이 과정이 제대로 동작하기 위해선 segmentation model의 H 값이 학습이 되어야지만, region growing도 의미가 있고, 최종적으로 segmentation 결과도 얻어낼 수 있을겁니다. 그래서 DSRG에서는 수식(1)과 수식(2)를 사용하여 segmentation network를 학습시키게 됩니다. 수식(1)을 보면, G의 모든 점들에 대해 foreground class, background class 각각 probability가 maximize 되게끔 loss를 주게 됩니다. 결국 G에 해당하는 부분들은 segmentation prediction이 활성화가 된다는 것입니다.  그렇지만 이것만 가지고서는 segmentation prediction 이 seed cues 이상의 정보를 반영할 수 없게 됩니다. Seed cues랑 비슷하게 prediction하면, G가 seed cues와 비슷해지고, 그렇게 되면 seed loss도 minimize할 수 있기 때문입니다.

스크린샷 2019-04-23 오후 4.07.54
수식(2) Boundary Loss [2,5]

DSRG에서는 boundary loss를 통해 이를 보완합니다. 표기가 조금 달라 죄송합니다. f(X)를 H라고 하고, X를 image라고 하고 Q(X, f(X)) 를 fully-connected CRF라고 하면, H와 fully-connected CRF와의 KL-divergence가 boundary loss라고 할 수 있습니다.

스크린샷 2019-04-23 오후 4.08.43
그림(7) Grid CRF VS Fully connected(Dense) CRF [5]

Fully-connected CRF를 하는 이유는 그림(7)에서 볼 수 있습니다. Grid CRF에 비해 훨씬 더 boundary 영역이 분명하기 때문에, fully-connected CRF를 이용해 KL-divergence loss를 주게되면 boundary까지 정확히 맞추어야 loss가 낮아질 수 있습니다. seed cues는 CAM에서 나온 결과이기 때문에 boundary가 불분명했던 반면, fully-connected CRF를 이용하면 boundary정보까지도 반영할 수 있게되어, segmentation map H가 더 발전할 수  있습니다. boundary loss까지 포함하여 학습하고, 이를 이용해서 region growing을 하고, 또 다시 segmentation model을 학습하고, region growing을 하고, 이 과정을 반복하면 최종 결과를 얻어낼 수 있습니다. 그림(5)의 하단을 참조하면 그 과정을 쉽게 볼 수 있습니다. 이렇게 학습된 DSRG의 결과물은 생각보다 놀랍습니다.

스크린샷 2019-04-23 오후 4.10.46
그림(8) DSRG Segmenration Result [4]

GT와 디테일한 부분들이 많이 다르고, 부정확한 부분도 많지만, class level label만을 가지고 training 했다는 것을 감안하면 놀라운 결과입니다.

FickleNet Idea

스크린샷 2019-04-23 오후 4.11.56
그림(9) FickleNet Idea [0]

DSRG까지 자세히 살펴보았으니, 본격적으로 FickleNet에 대해 살펴보면 쉽게 이해할 수 있습니다. FickleNet의 주요 과정은 DSRG와 큰 차이는 없습니다. 하지만 CAM을 사용한 seed cues generation을 좀 더 잘할 수 없을까?라는 의문을 가졌고 이를 풀어냈습니다.  그림(9)에 모든 아이디어가 녹아있습니다. 비행기 사진을 보았을때 CAM은 비행기의 작은 일부분인 앞부분, 날개, 혹은 엔진에 activation이 활성화가 크게 될 것입니다. Class를 구분할때 그것만으로도 충분하기 때문입니다. 근데 이걸 만약 random하게 selection 된 feature map에서 뽑게되면 selection 된 feature 중에서 가장 핵심요소들을 잡아낼 것 입니다. 이걸 여러번 하면 그림(9)처럼 서로다른 activation들이 나오게 될겁니다. 이렇게 나온 여러 map들을 합치면 오른쪽 map처럼 비행기에 전체적으로 activation된 map을 얻어 낼 수 있습니다. 이것이 FickleNet의 seed cues generation의 핵심입니다. Feature를 random하게 selection하면서 학습하고, CAM을 뽑을 때에도 random하게 selection 된 feature들에 대해 여러번 CAM을 구한 뒤 합치면, 일반적인 CAM을 뽑았을 때보다 더 확장된 map을 얻을 수 있다는 것 입니다.

FickleNet framework

스크린샷 2019-04-23 오후 4.35.10
그림(10) Naive Approach [0]

그럼 random selection을 어떻게 할까요?  FickleNet은 conv5 layer에 대해 (이전까지는 변경하지 않음) random하게 feature selection을 하게 됩니다. Feature map을 통째로 random selection하지 않고, 9 size 의 filter를 적용하고, stride를 1로 두고 각 sliding window마다 random하게 feature selection을 합니다. 그림(10)에서 초록색 영역과 빨간색 영역이 각 sliding window이고, 이에 대해 각각 random selection 된 point들이 x 표시가 되어있는 점들이라고 보면 됩니다. 정리하자면, filter로 feature map을 sliding하는데, 이때 각 slide window마다 다르게 random selection을 해줍니다. 근데 이렇게 하게되면, 단점이 있습니다. 일반적인 Deep learning framework(pytorch, tensorflow)에서 이 과정을 쉽게 구현할 수 없습니다. sliding window하면서 각각 random 하게 뽑아내야하기 때문에, 별도로 구현을 해야하고, 연산이 복잡해 집니다.

스크린샷 2019-04-23 오후 4.35.25
그림(11) Proposed Approach [0]

하지만 그림(10) 처럼 하게 된다면, 메모리는 조금 더 사용하지만 훨씬 더 빠르고, 일반적인 연산만을 사용해서 구현할 수 있습니다. 방법을 자세히 보면, 그림(10)에서는 sliding 을 하면서 random selection을 하는 반면 그림(11)에서는 그렇게 하지 않고, 미리 feature 를 확장하여 크게 만들어 놓습니다. Sliding window가 겹치는 영역들이 있는데, 이를 펼치고 random selection을 한꺼번에 하게되면, 겹치는 부분도 서로 다르게 random selection을 할 수 있습니다. 그림(11)에서 x 표시된 점들을 보면 쉽게 이해할 수 있습니다. 이 방법으로 하게되면 그림(10)과 결과물은 같지만, 한번에 random selection을 하면 되기 때문에 훨씬 빠르다고 합니다. Random selection은 아주 쉽게 할 수 있습니다. 확장된 feature에 대해 dropout을 한번 적용하면 됩니다.

스크린샷 2019-04-23 오후 4.40.40
그림(12) Center-preserving Spatial Dropout [0]

논문에서는 dropout을 할때 Center-preserving Spatial Dropout 기법을 사용했습니다. 앞서 sliding window를 하는 대신 feature map을 확장했는데, 각 sliding window 정중앙에 해당하는 feature는 dropout으로 날아가지 않도록, 보전해줍니다. 일반적인 dropout을 사용하면, 정중앙이 보전되지 않아 각 sliding window끼리의 상관관계를 파악하는데 어려움을 겪을 수 있기 때문에 정중앙을 보전했다고 합니다. 극단적인 예를 들면 overlap 된 영역만 보전되는 경우 거의 같은 값을 여러 sliding window에서 추출해낼 것이고, 위치가 서로 다른데 거의 같은 값을 추출하기 때문에 이를 통해 학습을 진행하면 spatial 정보가 이상하게 꼬일 수 있습니다. 중앙을 항상 보전하면, 이 문제가 없어질 것이고 정상적으로 spatial 정보를 학습할 수 있게 됩니다.

Training

 

스크린샷 2019-04-23 오후 4.49.23
알고리즘(1) 동작 알고리즘 [0]

각 과정을 하나씩 살펴보았는데, Map을 뽑아내는 과정을 정리하면 알고리즘(1)과 같습니다. 먼저  1. conv5 layer까지 feed-forward를 통해 feature를 추출했고, 3. feature를 그림(11)처럼 확장합니다. 그리고 그림(12)처럼 center-fixed spatial dropout을 적용합니다. 7. 매번 random selection 된 feature를 classifier에 넣어 학습을 진행합니다. 이렇게 학습된 classifier를 가지고 CAM을 추출해내야 하는데, 이때 일반적인 CAM추출과 다르게(그림(9) 참조),  CAM을 추출할 때마다 random selection을 하게 되므로 그때 그때 CAM이 다르게 나옵니다. 따라서 CAM추출을 N번 반복하여, 합치게 됩니다. Map을 합칠때는, 특정 한계값 이상의 값을 갖는 영역들을 합치고, 여러 class가 동시에 한계 값 이상인 경우에는 최대값을 갖는 class로 선택하여 map을 구성합니다.

스크린샷 2019-04-23 오후 5.47.57
그림(13) DSRG Process [2]

Map을 뽑은 이후에는 앞서 살펴 보았던 DSRG랑 process가 비슷하게 진행됩니다. Map을 seed cues로 사용하고, DSRG처럼 segmentation network을 학습시키기 위해 그림(13)처럼 region growing, segmentation network학습, region growing 그리고 segmentation network학습 이런식으로 계속 반복하게 됩니다. DSRG와의 차이는 seed cues가 더 sharp한 정보를 담고 있다는 것이라고 볼 수 있습니다.

스크린샷 2019-04-23 오후 4.51.07
수식(3) Weakly & Semi Loss Term [0]

Loss term도 똑같다고 볼 수 있습니다. 다만, weakly-supervised뿐만 아니라 Semi-supervised setting까지 확장했기 때문에 그 setting에서만 full loss(fully labeled)를 추가하게 됩니다.

스크린샷 2019-04-23 오후 4.59.34
수식(4) Semi Loss Term [0]
Full loss는 seed loss와 똑같은 형태이지만, 다른점은 growing 된 포인트 대신 GT segmentation mask의 포인트들로 넣어주고 loss를 주는 방식입니다. 한가지 아셔야할 점은, loss term에서도 드러나 있듯이 논문에서의 Semi-supervised setting 은 fully labeled data와 unlabeled data의 setting이 아니라 fully labeled data와 weakly labeled data setting이라는 점입니다.

Results

스크린샷 2019-04-23 오후 5.00.40
표 (1) Weakly & Semi Results [0]
성능을 비교한 표(1)을 보면, Image level label 을 준 다른 weakly-supervised 방법론들에 비해 성능이 매우 좋습니다. 상단에 위치한 AISI 같은 경우는 class level label 뿐만 아니라 추가적인 정보를 더 주었다고 하는데, 그것과 성능이 크게 차이가 나지 않는 것을 볼 수 있습니다. Backone 을 Resnet-base로 바꾸면 성능은 더 올라감을 볼 수 있습니다.

스크린샷 2019-04-23 오후 5.00.54
표 (2) Performance & Dropout Comparision Results [0]

표(2)는 앞서 설명했던 그림(10), 그림(11) 의 성능차이를 직접적으로 보여주고 있습니다. 또한 중요한 parameter인 dropout rate(random selection의 정도)에 따른 성능차이도 보여주고 있습니다. 저는 여기서 제일 중요한 부분은 General dropout과의 비교라고 생각합니다. 사실 FickleNet이 제안하는 Sliding window 마다 random selection을 달리해야 더 좋은 결과(Map)를 얻을 수 있다는 가설을 이 부분이 증명해줄 수 있기 때문입니다. 그 가설이 맞아야 FickleNet이 제안한 그림(11)의 방법론도 의미가 있고, Map을 여러게 inference해서 합치는 과정도 의미가 있기 때문입니다. General dropout을 적용해서 random selection한 경우 성능이 확 떨어짐을 보여주었고, 그 가설을 잘 증명했습니다. 하지만 한가지 더 궁금한것은 general dropout을 학습때 뿐만 아니라 inference때도 적용하여 합치는 과정을 동일하게 하면 과연 그때는 성능차이가 얼마나 날지는 궁금점으로 남았습니다.

스크린샷 2019-04-23 오후 5.01.20
그림(14) FickleNet Results [0]

결과는 다른 방법론들에 비해 확실히 좋음을 알 수 있습니다.

 

스크린샷 2019-04-23 오후 5.01.34
그림(15) FickleNet Grad-CAM and mIoU Comparision [0]

그림(15)은 아주 중요한 결과인것 같습니다. Dropout rate에 따라 CAM이 어떻게 변하는지 보여주고, Inference할 때 N을 몇번 반복해서 합치는지에 따라 mIoU가 어떻게 변하는지를 보여주고 있습니다. 아쉬웠던 점은 CAM이 생각만큼 다양한 영역에 분포하지는 않았고, 최고성능을 보여주는 N이 너무커서 실사용 하기에 조금 부담이 될수 있지 않나 싶었습니다. 하지만 dropout rate이 커짐에 따라 CAM이 많이 퍼지는 모습을 볼 수 있었습니다.

Conclusion

Feature를 random하게 뽑아서 학습을 진행하고, inference 때도 CAM을 다양한 random selection 된 feature에서 가져와 합치면 더 좋은 seed cues를 만들 수 있다는 내용으로 좋은 성능까지 보여준 논문입니다. DSRG의 단점을 잘 보완했고, 성능 향상이 매우 컸기 때문에 좋은 연구결과라고 보여집니다. 다만 N이 매우 커야해서 실제 적용하시려는 분들은 이 점을 꼭 고려를 해보셔야 할 것 같습니다. 또한 semi-superivsed에서도 weak label이 있어야 사용할 수 있다는 점 때문에 weak label이 없는 semi-supervised에 적용해보시려는 분들은 직접적으로 이용하기 어려울 것 같습니다. Weakly-supervised setting에서는 DSRG를 먼저 적용해보고, 성능을 더 끌어올리기 위해 이 방법론을 적용해보면 가장 좋을 것 같습니다!

[0] FickleNet:Weakly and Semi-supervised Semantic Image Segmentation using Stochastic Inference, Lee et al.

[1] Weakly Supervised Semantic Image Segmentation with Self-correcting Networks, Ibrahim et al.

[2] Weakly-Supervised Semantic Segmentation Network with Deep Seeded Region Growing, Huang et al.

[3] Learning Deep Features for Discriminative Localization, Zhou et al.

[4] https://www.youtube.com/watch?v=VaR21S8ewCQ

[5] Seed, expand and constrain: Three principles for weakly-supervised image segmentation, Kolesnikov et al.

Posted by:Cesc Chunseong Park

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s