본문 바로가기
  • CobsLab upgrades your company value by AI technology
이미지 처리 논문

Dense vs Sparse - Sparse R-CNN

by divers 2022. 5. 16.

오늘 소개해 드릴 논문은 ‘Sparse R-CNN’ 입니다.

콥스랩(COBS LAB)에서는 주요 논문 및 최신 논문을 지속적으로 소개해드리고 있습니다. 

해당 내용은 유투브 ‘딥러닝 논문읽기 모임’ 중 ‘Sparse R-CNN’ 영상 스크립트를 편집한 내용으로, 영상으로도 확인 하실 수 있습니다. (영상링크: https://youtu.be/EvPMwKALqvs)

 

 

Sparse R-CNN이 어떤 모델인지 간략하게 설명드리면서 오늘 포스팅에 대해서 설명드리겠습니다. 위 그림의 왼쪽 아래에 보시면, Dense RetinaNet이라는 내용이 있습니다. 해당 내용은 굉장히 많은 수의 바운딩 박스를 사용해서 Object detection을 수행했다는 뜻입니다. 또한, 왼쪽 아래에 Dense to Sparse라는 뜻은 중간에 바운딩 박스 수가 적어지는 구간이 있어서 그렇게 표현을 했습니다. 결론적으로 Sparse R-CNN은 학습 가능한 바운딩 박스를 제안함으로써 시작단계부터 바운딩 박스 개수 사용을 굉장히 줄이고 시작할 수 있는 장점을 가진 모델을 제안하였습니다.

Sparse R-CNN의 성능이 기존 모델들인 RetinaNet, Faster R-CNN에 대비해서 더 좋은 성능을 달성했음을 보실 수 있습니다. 그리고 최근에 트랜스포머 기반으로 Object detection을 수행했던 DETR보다 훨씬 빠른 수렴 속도를 자랑하는 모델입니다.

논문의 introduction부터 차례로 설명드리겠습니다. 현재 우리가 알고 있는 유명한 object detector들은 Dense region Proposal에 기반을 하고 있다라고 보시면 될 것 같습니다. Dense region Proposal은 bounding box를 가지고 이미지를 스캔을 하는 방식입니다. 이런 알고리즘들은 직관적이고 동시에 정확도도 높고 inference 속도까지 빨라서 거의 단점이 없는 그런 방법론이 아닌가 라는 생각이 들었습니다. 그래서 해당 알고리즘은 YOLO 시리즈나 SSD, Faster R-CNN 같은 우리가 알고 있는 대부분의 Object detection 모델에서 사용되었습니다.

앞서 언급한 모델의 저자들이 Dense 한 방법론을 사용하는 모델들을을 분류 합니다. 그래서 처음부터 끝까지 Dense 한 많은 수의 바운딩 박스를 가져가는 모델들을 Dense한 모델이다 라고 분류를 합니다. 그리고 중간에 Proposal 개수가 많이 줄어드는 단계가 있는 모델들을 Dense to Sparse라는 표현을 사용합니다. 그리고 DETR은 저자들이 사용하지는 않았지만, 앞에서 사용한 바운딩 박스 개수는 굉장히 적었는데, Transformer기반한 feature interaction이 global한 feature를 전부 사용 해야 된다는 단점 때문에 Sparse to Dense라는 분류를 해봤습니다. 정리하자면, 기존의 Dense 한 패러다임에서는 이렇게 크게 세 가지 Dense한 패러다임들이 있다 라고 이해를 해주시면 좋을것 같습니다.

위 방법론들이 얼마나 Dense한 지 설명을 드리겠습니다. 다음으로 Dense method의 대표주자인 YOLO를 설명드리겠습니다. YOLO는 이미지를 특정 개수의 Grid로 분할을 합니다. 분할을 하고 어떤 Grid 안에 바운딩 박스를 할당을 하는 방식입니다. 예를 들면 Grid 하나의 다섯 개 바운딩 박스 할당한다고 하면 전체가 7 x 7이니까 총 245개 박스가 나오게 됩니다. 이런 방식을 이용해서 기존에 오리지널 페이퍼였던 YOLO 같은 경우에는 845개 박스 그리고 YOLO v3 같은 경우에는 약 만 개 박스를 쓴 걸로 알려져 있습니다.

다음으로 Dense to sparse 모델의 대표주자인 Faster R-CNN입니다. Faster R-CNN는 이미지를 image classification 모델로 받은 다음에 그 위에 어떤 region proposal를 수행하고, region proposal 결과를 다시 한번 classification 네트워크로 refine 해서, 정확도로 올리는 방식으로 구성이 되어 있습니다.

위 과정으로, 먼저 anchor generation 단계에서 grid 마다 대략 9 개 정도의 각각의 가로 세로 비율이 다른 박스를 뿌립니다.

위 과정을 visualization 해보면 이렇게 굉장히 빽빽한 그런 바운딩 박스를 확인할 수 있습니다.

여기에서 한번 필터를 하면, 적은 수의 region proposal들이 생성이 되게 되고, 조금 적은 수의 region proposal들이 있고, 상대적으로 바운딩 박스가 적다고 해서 Dense to Sparse라고 저자들은 분류합니다.

이러한 Dense 한 region proposal들의 단점이 몇 가지 있습니다. 첫 번째로는 중복되는 결과가 굉장히 많다는 문제가 있습니다. 위에 보시는 것처럼, 어떤 바운딩 박스를 굉장히 많이 던져 놓고 시작하기 때문에, 그중에서 오브젝트를 포함하는 바운딩 박스 개수도 굉장히 많게 됩니다. 그래서 위 그림에 보이는 것처럼, 자전거 주변에 여러 개의 결과가 나오게 되면, 이것을 후처리 과정인 Non-maximum suppression을 이용해서 대표 바운딩박스 1~2 개 정도만 남기게 됩니다. 이 방식의 단점은 중첩되어 있는 오브젝트들은 탐지가 잘 안 되는 문제가 있었습니다.

그리고 두 번째 문제로는 many to one label assignment problem이라는 게 있습니다. 위 그림에서 빨간색 박스를 ground truth라고 하고 파란색 박스 들을 어떤 region proposal이라고 했을 때, 이 박스랑 매칭이 될 법한 region proposal이 많습니다. 그러면 불필요한 computational cost가 올라가는 부분도 있고, 이 매칭이 불확실성으로 작용을 해서 어떤 크라우드 디텍션에서는 좀 그 정확도를 저해하는 요소가 될 수 있는 문제가 있습니다.

또한 하이퍼 파라미터에 굉장히 민감한 문제가 있습니다. 예시로 박스 사이즈, 가로세로 비율, 박스 개수 그리고 이 앵커를 얼마나 촘촘하게 뿌릴 것인가에 대한 문제들이 있습니다. 그래서 예를 들어 위 이미지 같은 경우에 그라운드 트루스가 있다고 하면 Region proposal들이 이렇게 큰 그라운드 트루스 박스랑 매칭 되기가 어렵습니다.

다른 케이스로 이렇게 세로로 너무 길거나 가로로 너무 긴 그런 Region proposal들이 생긴다면 그라운드 박스랑 매칭이 어렵다는 단점이 있습니다.

마지막 단점으로, 크라우드 디텍션 같은 경우에 Region proposal를 사용자 입장에서 나름 촘촘하게 뿌린다고 해서, 이렇게 많은 수의 사람들이 한 번에 탐지하기에는 굉장히 어렵다는 문제가 있습니다.

위에서 언급한 단점들을 제거하고, 오브젝트 디텍터를 학습을 할 때마다 파라미터 튜닝을 해야 되는 수고로움을 대체하기 위해서 적은 수의 박스만을 가지고 디텍션을 할 순 없을까?라는 것이, 본 논문이 제기한 문제라고 보시면 될 것 같습니다.

기존의 이러한 문제들에 대한 인식과 해결하고자 하는 움직임이 있었습니다. 그중 가장 대표적인 것이 DETR이었고, DETR이 바운딩 박스 개수를 굉장히 적게 가져가는 동시에 성능을 높게 달성할 수 있는 트랜스포머 구조를 제안을 하게 됩니다. 그리고 Faster R-CNN는 Sparse 한 피쳐 사용에 대해서 가장 대표적인 논문이라고 보시면 될 것 같습니다.

Sparse R-CNN는 기존 방법론들에 장점을 좀 합쳐서 Sparse in and Sparse-out, 즉 적은 수의 Region proposal를 받고 후에 사용되는 피처 사용도 필요한 부분만 사용하는 그런 식의 오브젝트 디텍터를 제안을 했다고 보시면 될 것 같습니다. 그래서 크게 컨트리뷰션은 Learnable proposal, Dynamic instance interactive head, 그리고 Set prediction loss 세 개가 있다고 보시면 되겠습니다.

Sparse R-CNN의 구조를 보겠습니다. 일단 이미지가 피처 익스트렉터인 백본 네트워크를 통과하게 되고 통과하게 된 피처 맵을 FPN을 이용해서, 해상도별로 최적화되어있는 피처 맵을 이렇게 생성을 하게 됩니다. 그리고 이 피처 맵에서 그다음 단계인 Dynamic head 단계로 넘어가게 되는데, 그때 삽입이 되는 두 가지가 proposal 박스와 proposal feature입니다. proposal 박스가 region proposal 역할을 하는 것이고, proposal 피쳐가 성능을 올린다고 보시면 될 것 같습니다. 그 후 다이내믹 헤드로 입력이 되게 되고 첫번째 나오는 그 아웃풋 클래스와 아웃풋 coordinate를 반복적으로 사용 하게 됩니다. 그래서 이렇게 겹겹이 쌓여있는 다이나믹 헤드들을 사용하게 되고 최종적으로, 마지막 사용자의 그 선택에 따라서 달라지는데, 최종층의 아웃풋을 디텍터의 아웃풋으로 사용을 하게 됩니다.

다음으로, Learnable proposal 박스와 피처에 대해서 설명을 드리겠습니다. 이 proposal 박스라는 게 가로 세로 그리고 박스의 가로 세로 길이랑 중심점 x, y 좌표를 포함하는 4개 정보로 구성이 되게 되는데 이것을 어떤 학습 가능한 파라미터로 세팅을 합니다. 여기에 최초의 랜덤 이니셜 라이즈가 되고 점점 학습을 하면서 적당한 위치를 찾아가게 된다라고 보시면 될 것 같습니다. 이제 proposal를 피처 맵상에 분포가 되게 되면, 필요한 부분에 피처만 추출을 해서 다이내믹 헤드로 넘기게 됩니다. 그런데 이 다이나믹 헤드로 넘길 때 뽑혀진 피처만 사용이 되는 게 아니라 이미지와는 직접적으로 관련이 있지 않는 어떤 피쳐맵을 넣음으로 조금 더 정확도 향상을 이루었다고 보시면 될 것 같습니다.

다음으로 다이나믹 헤드에 대해서 조금 더 구체적으로 설명을 드리겠습니다. 앞에서 보여드렸던 피처가 들어오면 박스 proposal에 좌표위치가 이제 들어와서 Roi align에 수행을 하게 됩니다. Roi align이라는 것은 어떤 피쳐 상에 있는 특징을 뽑아내는 것입니다. 그 좌표에 맞춰서 추출된 Roi 피쳐 가 먼저 생성이 됩니다. 그리고 Roi 피쳐를 다른 종류의 proposal 피쳐와 합치는 과정이 다이나믹 헤드의 전체적인 구조라고 보시면 될 것 같습니다.

첫 번째 단계에서 셀프 어텐션 단계가 오고 그래서 Self attention, drop out, layernorm, 그다음에 이 셀프어텐션을 proposal 피쳐가 합쳐집니다. 그 다음에 다이내믹 인스턴스 인터랙션이라는 모듈을 사용해서 proposal 피쳐를 보강합니다. 최종적으로는 linear 레이어의 proposal 피쳐가 들어가게 되면서 또 한 번 정제가 되는 과정이라고 보시면 될 것 같습니다. 이 과정을 통해서 나온 아웃풋이 마지막으로 classification 레이어와 박스 regression 레이어에 들어갑니다. classification 레이어에서는 classification 로스를 리턴을 하고, 박스 regression 레이어의 아웃풋으로 바운딩 박스에 좌표 정보가 됩니다. 만약에 재사용을 하고 싶으면 다음 단계에 Roi align을 인풋으로 사용하게 됩니다. 그리고 여기서 사용되었던 proposal 피쳐는 다시 한번 인풋 단계로 넘어가서, 다음 단계에 Dynamic head에 사용되게 됩니다.

Dynamic head 안에 있는 구조를 보여드리면 이 proposal 피쳐와 Roi 피쳐로 되어 있는 게 이 Proposal 피쳐는 독립적인 피쳐를 가지는 파라미터이고, ROi 피쳐는 이미지에서 직접 이렇게 가져오는 것입니다. 그래서 먼저 Proposal 피쳐를 이제 linear projection을 이용해서 연산을 하고 그다음에 두 개의 그 다른 형식의 백터로 맵핑을 하게 됩니다. 다음으로, 이 파라미터 1과 파라미터 2를, 각각 Roi 피처와 합치는 과정이 있는데, 이때 단순한 배치 매트릭스 멀티플 리케이션 그리고 노멀라이제이션 레이어 그리고 relu 펑션이 이용이 되게 됩니다. 그래서 이렇게 합쳐진 레이어를 Proposal 피처와 같은 dimension으로 만들어주는 Flatten과 linear projection 과정으로 구성된다라고 보시면 될 것 같습니다.

Sparse R-CNN학습은 기본적으로는 DETR에서 사용되었던 로스를 사용하게 됩니다. 조금 달라진 부분이 focal loss부분 정도가 있다고 보시면 될 것 같습니다. 그리고 나머지는 DETR에서 사용하는 것과 유사하게 L1 로스와 generalized IoU 로스를 사용해서 전체 로스를 구성한다고 보시면 되겠습니다.

다음으로 실험입니다. 코코 데이터셋에서 실험을 했고, 베이스 라인은 ResNet 50입니다. 실험 수준이 8개 GPU를 이용해서 저희 같은 중소 규모의 학습 장비를 이용해서도 충분히 학습 가능할 것 같습니다. 36 에포크는 DETR 같은 경우가 거의 500 됩니다. 그런 부분에 대비해서 강점을 가지는 학습 세팅이라고 볼 수 있습니다. 일반적으로 이미지 넷 사용되고 이니셜 라이제이션으로 레이어를 초기화합니다. 그리고 약 백개의 Proposal 박스를 가지고 학습을 시행을 합니다. 인퍼런스 때도 마찬가지입니다.

detector들을 비교를 해보았습니다. RetinaNet, Faster R-CNN, Cascade R-CNN, DETR, 그리고 Deformable DETR과 비교합니다. 결론적으로 Sparse R-CNN가 성능이 제일 뛰어난 것을 확인할 수 있습니다. 그리고 DETR 같은 경우는 학습시간도 굉장히 많이 걸립니다.

Ablation study에서 베이스라인이 Faster R-CNN에 Sparse는 18.5으로 굉장히 낮습니다. iterative architecture, dynamic head를 추가했을 때 성능이 향상되는 걸 확인했다라고 이해하실 수 있을 것 같습니다.

그리고 박스 Proposal에 초기화는 총 네 가지 방법으로 진행했습니다. 논문에서는 중앙에 박스를 모으는 것, 이미지 사이즈랑 똑같은 박스들만 이렇게 뿌려놓는 법, Grid에 맞춰서 이렇게 촘촘하게 뿌리는 방법, 그리고 가우시안 디스트리뷰션에 맞춰서 랜덤 하게 뿌리는 방법 총 네 가지를 실험했습니다. 전부 유사한 성능을 보이고, 박스 Proposal이라는 방법론이 파라미터 세팅에 굉장히 둔감한 제너럴 라이제이션이 잘 되어있는 방법론이다 라는 것을 어필하고 있습니다.

그리고 Proposal 개수를 올리고 성능이 얼마나 좋아지냐라고 했을 때는, 아주 드라마틱하게 올라가진 않고 오히려 학습 시간이 좀 많이 올라간다라고 리뷰를 하고 있습니다.

그리고 반복되는 그 스테이지 개수에 따라서도 학습을 했는데, 6개 까지는 많이 올라가는데, 그 이후로는 오히려 줄어드는 현상도 관측을 했습니다.

그리고 self attention이 있는데, self attention 다음에 오는 것으로 Dynamic head를 하는지, 멀티 헤드 어텐션을 하는지 비교를 했을 때, Dynamic head를 사용했을 때가 훨씬 좋았다라고 언급하고 있습니다.

마지막으로 DETR에 나오는 포지션 인코딩을 Sparse R-CNN에도 적용했다고 합니다. 오히려 DETR에서 사용했던 포지션 인코딩을 사용했을 때는 성능이 조금 떨어진다 라고 언급합니다. 그리고 이 positional encoding 이라는 방법론 때문에 DETR이 학습을 오래 할 수밖에 없는 단점이 있다라고 저자들은 언급하고 있습니다. DETR같은 경우에 positional encoding을 뺴면 정확도가 거의 -8AP 정도 내려가는 치명적인 문제가 있습니다. Sparse R-CNN에는 이렇게 positional encoding 같이 global feature와 interaction하지 않는 구조임에도 불구하고 성능이 더 좋았다 라고 서술합니다.

 

결론입니다. Sparse R-CNN을 통해서 저자들이 기존의 많은 수의 바운딩 박스를 이용하는 Dense한 방법론 대비 훨씬 적은 수의 바운딩 박스를 이용해서 더 좋은 모델을 만들었습니다. 그런데 DETR에 positional encoding 및 object query를 이용하는 것보다 훨씬 적은 연산량 그리고 bounding box와 global feature 간에 불필요한 interaction을 제거해서 빠른 학습을 수행할 수 있었다 라고 언급합니다. 그런데 이런 간단한 구조를 사용했음에도 기존 모델들 대비 좋거나 오히려 대등하거나 혹은 좋은 그런 성능을 냈다는 점이 이 논문에서 인상깊었던 점 같습니다. 추가적으로, YOLOR이 사용했던 implicit knowledge를 이렇게 이용해서 성능을 끌어올리는 테크닉을 사용했다는 점도 흥미로웠습니다. 하지만, 개인적으로, 성능이 크게 잘 나오지는 않는 부분이 아쉬웠습니다.

댓글