오늘은 Open-vocabulary Scene Graph Generation 에 대한 논문을 리뷰해보겠습니다. 해당 논문은 Grounding DINO를 Open-vocabulary SGG를 위해 개선한 논문입니다. 앞으로 진행할 연구의 베이스라인이 되는 논문으로, 아마 당분간은 해당 분야에 대해 계속 리뷰하지 않을까 생각됩니다.
이번 리뷰에는 DETR과 Grounding DINO에 대해 컨셉적으로 다루기 때문에, 조금 간단하게 해당 방법론을 구조적으로 이해하고 싶으신 분들이라면 1번째 파트인 Background를 추천합니다.
- Conference: ECCV 2024
- Authors: Zuyao Chen, Jinlin Wu, Zhen Lei, Zhaoxiang Zhang, and Changwen Chen
- Affiliation: The Hong Kong Polytechnic University,
- Title: Expanding Scene Graph Boundaries: Fully Open-vocabulary Scene Graph Generation via Visual-Concept Alignment and Retention
- Code: Github
Background
해당 논문을 보다 잘 이해하기 위해서는 DETR, 그리고 Grounding DINO 에 대해 알고있으면 좋습니다. 왜냐? 저자가 제안하는 OvSGTR(Open-vocabulary Scene Graph Transformer) 방법론에는 “Transformer” 이라는 말이 포함되는데, 이는 OvSGTR은 Grounding DINO를 기반으로 설계되었기 때문입니다. 그리고 Grounding DINO는 DETR을 기반으로 설계되었죠. 그리고 다시 DETR은 Transformer를 기반으로 설계되었기에 Ov-SGTR 인 것이죠!
이미 DETR과 Groundind DINO를 잘 아시는 분들은 바로 다음 파트로 넘어가셔도 좋습니다. 또한 지금부터 각각의 방법론을 컨셉적으로만 다룰 것이기 때문에, 더 자세한 내용이 궁금하신 분들은 DETR과 Grounding DINO 리뷰를 읽어보시기 바랍니다.
DETR (paper link)
DETR은 DEtection TRansformer 의 줄임말로, Detection 태스크에 Transformer를 접목시킨 모델입니다. DETR은 크게 아래 4가지 구조로 구성됩니다.
- CNN Backbone: To Extract Visual Feature
- Encoder (Transformer): Feature Enhancer
- Decoder (Transformer) with Object Query
- Prediction Head: For BBox and Class
1️⃣ CNN Backbone
우선, 이미지로부터 ResNet50 혹은 Swin-Transformer를 사용하여 Feature를 추출합니다. 여기서 추출한 Feature를 Vanilla Feature라고 하겠습니다.
- input: raw image (H_0, W_0, 3)
- output: vanilla feature (H, W, C)
2️⃣ Encoder
앞서 추출한 Feature를 Transformer의 입력으로 사용합니다. (Transformer는 텍스트를 입력으로 받는 모델인만큼, 3차원 입력을 2차원으로 변경해주는 과정이 필요합니다.) 또한 이 Feature에 위치정보를 나타내는 Positional Encoding를 더해서 인코더에 입력됩니다. 이제 Self-Attention / FFN로 구성된 인코더 레이어를 여러번 통과하여, 더 향상된 Feature가 만들어집니다. 이를 enhanced feature라고 부르겠습니다. (encoder output이라고도 할 수 있겠죠)
- input: vanilla feature w/ positional encoding (H*W, d_model)
- output: enhanced feature (H*W, d_model)
3️⃣ Decoder
DETR의 핵심은 object query라고 할 수 있을 것 같습니다. 이 object query는 이미지에서 다양한 객체를 찾기 위해 모델이 묻는 ‘질문’과 같은 역할을 합니다. 즉, query를 입력으로 디코더를 태워나온 출력으로 객체가 어디에 무엇이 있는지 예측하게 되죠. 이 때 object query로는 상단 그림에서 빨간색 박스로 표시된 것처럼 랜덤 파라미터를 넣어주게 됩니다. n_queries
가 100이라는 건 100개의 예측을 생성하라는 뜻이죠.
이 object query가 디코더의 쿼리로 사용되고, cross-attention 연산을 수행하기 위한 key, value는 인코더의 출력입니다. 즉 인코더를 통해 만들어진 feature를 섞어서 최종 출력을 만들어냅니다.
- input: object query (n_queries, d_model), encoder output (H*W, d_model)
- output: decoder output (n_queries, d_model)
4️⃣ Prediction Head
이제 디코더의 출력을 바탕으로 classification head와 bbox head 각각에 태워 최종 출력을 만듭니다.
- input: decoder output (n_queries, d_model)
- output: class (n_queries, n_categories), bbox (n_queries, 4)
Grounding DINO
Grounding DINO는 최근에 가장 많이 활용되고 있는 Vision Language Model 중 하나로, Phrase Grounding를 수행하는 모델입니다. Phrase grounding 은 상단 이미지와 같이, 주어진 텍스트에서 명사구가 이미지에서 어디에 존재하는 지를 매칭까지 해야하는 태스크입니다. CLIP처럼 텍스트와 이미지를 동시에 학습하면서, word-region 같이 보다 세분화된 단위로 학습을 수행하는 탓에 다양한 태스크에서 zero-shot으로 충분히 좋은 성능을 내며 foundation model로 각광받고 있기도 하죠.
Grounding DINO에서 DINO는 Deformable DETR, DAB DETR, DN DETR을 섞은 DETR을 기반의 Detection모델 입니다. 결국 DETR을 grounding task로 수정하여 제안한 것이죠. Grounding DINO는 DETR과 비슷하게 아래 4가지 구조를 가집니다. Grounding DINO의 경우, DETR과 매칭되는 관점을 중심으로 설명하겠습니다.
- Image, Text Backbone: To Extract Feature
- Encoder (Transformer): Feature Enhancer
- Decoder (Transformer) with Object Query
- Prediction Head: For BBox and Class
1️⃣ Image, Text Backbone
이미지와 텍스트에 대하여 Feature를 추출합니다. 이 때, Backbone으로 이미지는 Swin-Transformer를, 텍스트는 BERT를 사용하며, 이미 학습된 웨이트를 불러오고 Freeze 한 상태로 사용합니다.
DETR과의 차이점으로는 Text Backbone이 생겼다는 점입니다.
2️⃣ Encoder
왼쪽은 DETR의 Encoder, 오른쪽은 Grounding DINO의 Encoder입니다. Grounding DINO도 마찬가지로 Transformer의 인코더를 사용합니다.
다만 DETR과 차이점은 image 와 text를 서로 cross-attention을 통해 섞는다는 점입니다. 상단 그림이 Grounding DINO에서의 Encoder 구조입니다. Image-to-text 그리고 Text-to-Image Cross-Attention을 통해 image, text feature를 key, value로 사용했다는 점이 차이점이죠.
3️⃣ Decoder
왼쪽 DETR의 Query가 있는 것처럼, 오른쪽 Grounding DINO에서도 Query가 존재합니다.
차이점은 DETR에서는 query에 random한 값을 넣지만, Grounding DINO에서는 encoder를 통해 만들어진 image feature를 통해 query를 만든다는 점입니다. image feature와 text feature의 유사도를 구해서 더 좋은 쿼리를 만들어 디코더에 입력으로 사용하는 것이 목적이죠.
이제 앞 단계에서 생성한 쿼리를 디코더에 입력으로 넣고, 인코더의 출력과 Cross-attention을 통해 최종 출력을 만들어내는 과정입니다. 상단그림에서 표시한 왼쪽 DETR의 디코더와 오른쪽 Grounding DINO의 디코더가 서로 매핑되는 부분이죠.
다만 DETR과의 차이점은, Encoder와 동일하게, Text Feature를 사용하여 Cross-attention을 수행한다는 점입니다. 상단 그림에서 Grounding DINO의 디코더 구조를 나타냅니다.
4️⃣ Prediction Head
classification과 regression을 수행하는 부분입니다. 왼쪽은 DETR, 오른쪽은 Grounding DINO에 매핑되는 부분이죠.
차이점은 Grounding DINO에서는 DETR의 Classification Loss가 Text, Image Feature 사이의 유사도를 높이는 Contrastive Loss로 변경되었다는 점입니다. 이 덕분에 Zero-shot classification이 가능해졌습니다.
(사전에 말씀드렸듯, 더 디테일한 부분이 궁금하신 분들은 지난 리뷰를 읽어보시는 것을 강력하게 권장합니다)
Summary
결국, DETR과 Grounding DINO를 간소화시키면 위의 그림처럼 나타낼 수 있습니다. 가장 큰 차이는 Text Feature를 사용했다는 점, 그리고 Transformer 의 attention 수행 시 text도 동시에 고려했다는 점이 있습니다.
Introduction
Scene Graph Generation(이하 SSG) 태스크는 이미지 속 객체들과 그 객체들 간의 관계를 그래프로 표현하는 방법입니다. 예를 들어, 사진 속에서 ‘사람’, ‘책상’, ‘컵’이 있다면, 이들 간의 관계를 “사람이 책상 앞에 있다”, “책상 위에 컵이 있다”와 같은 형태로 나타내는 것이죠. 이런 그래프는 이미지 캡셔닝, Visual Question Answering, 이미지 생성 등 다양한 컴퓨터 비전 기술에 있어, 이미지를 이해하는 중추 역할로 사용되어 많은 연구가 수행되고 있습니다.
“사람이 책상 앞에 있다” 라는 예문에서 주어(Subject)는 “사람”, 객체(Object)는 “책상”, 그리고 서술어(Relation)는 “앞에 있다” 에 해당합니다. SSG에서 레이블은 이렇게 (Subject, Object, Relation) Triplet을 한 쌍으로 구축되어 있습니다. SSG에 대해 더 자세한 설명은 임근택 연구원의 리뷰 중 Preliminaries 파트를 읽어보시는 것을 강력 권장드립니다. 그래야 저의 리뷰를 잘 이해할 수 있을 거라 생각합니다.
기존의 SSG 방법들은 미리 정해진 Object나 Relation만을 인식할 수 있었기 때문에 실세계의 다양한 상황을 처리하는 데 한계가 있었습니다. Unseen object를 검출하기 어렵다는 점, 뿐만아니라 Unseen Relation 을 검출하기 어렵다는 점이 그 한계이죠.
상단 그림은 SGG에 발생할 수 있는 4가지 세팅에 대해 설명한 것입니다. 즉, 모델이 새로운 객체나 서술어를 처리하는 방식 으로 총 4가지로 구분할 수 있습니다.
- Closed-set SGG: 미리 정해진 객체와 관계만 인식 가능
- OvD-SGG: unseen 객체는 인식할 수 있지만, 학습에서 본 관계만 인식 가능
- OvR-SGG: unseen 관계는 인식할 수 있지만, 학습에서 본 객체만 인식 가능
- OvD+R-SGG: unseen 객체와 unseen 관계를 모두 인식 가능
대부분의 SGG 연구는 (1)에서 수행되고 있었고, 그나마 Open-vocabulary 상황을 고려하는 연구는 2번인 OvD-SGG이 그나마 수행되던 상황이었습니다. (3) OvR-SGG 연구가 없지는 않지만, 상대적으로 연구가 많이 부족했죠, 그렇다면 더욱 어려운 상황인 (4) OvD+R-SGG 연구는 훨씬 없겠죠? 저자에 따르면 “최초”라고 합니다. 즉, 학습 중에는 등장하지 않은 관계와 객체를 동시에 검출할 수 있는 SGG 연구는 거의 없다고 봐야하죠. 그렇지만 실제 환경에서 잘 워킹하기 위해서는 (4)의 상황을 고려하지 아니할 수 없습니다.
따라서 본 논문은 (4)에 상황에서도 SGG를 가능하도록, OvSGTR(Open-vocabulary Scene Graph Transformer)이라는 방법론을 제안하였습니다. 즉, 학습 중에 보지 못한 새로운 객체나 관계도 인식할 수 있도록 설계되었습니다.
Method: Ov-SGTR
사실 Ov-SGTR은 Grounding DINO을 개선시킨 모델입니다. 즉, SGG 를 수행하기 위해 Grounding DINO에 몇 가지 요소를 추가하였습니다.
상단 그림에서 빨간 박스는 Ov-SGTR에서 Grounding DINO와 차이나는 부분을 표시한 것입니다. 다시 말해, 빨간색을 제외한 나머지 부분은 Grounding DINO와 동일하단 얘기죠. Grounding DINO가 어떻게 구성되는지는 Background 에서 다뤘으니, 여기서는 그와 차이나는 부분을 위주로 작성하겠습니다.
✅ Relation Feature Extraction
relation을 위한 text feature를 추가로 추출합니다. Grounding DINO 처럼, 기존 Relation으로 발생하는 값을 이어붙혀서 prompt를 만들어냅니다. “on. in. wears. … riding. with” 같이 말이죠. 그리고 object를 위한 prompt “man. table. helmet. … “과 concat해서 feature를 추출합니다.
✅ Decoder
SGG에서는 detection과 다르게 relation에 대한 예측이 필요합니다. 따라서 저자는 relation에 대해 출력을 만들기 위해, relation query 추가하였습니다. grounding DINO에서 object query는 image feature로부터 생성했으나, relation query는 DETR처럼 랜덤한 값으로 초기화됩니다. 그리고 상단 그림과 같이, object query와 relation query을 concat 해서 디코더의 입력으로 사용합니다.
- decoder query: (n_queries+1, d_model)
- object query: (n_queries, d_model)
- relation query: (1, d_model)
왼쪽은 Grounding DINO의 디코더 구조고, 오른쪽은 Ov-SGTR의 디코더 구조입니다. self-attention -> text-cross attention -> image attention -> FFN을 거친다는 구조는 동일합니다. (아 참고로 왼쪽 Grounding DINO 그림은 image -> text 지만 코드 상에서는 text-> image 였습니다)
차이점이라면 오른쪽에 보이는 것처럼 Relation 을 위한 query (1, d_model) 가 추가되었고, 기존 object query에 concat 된다는 점입니다.
✅ Learning Visual-Concept Alignment
relation에 대한 image-text alignment을 학습하기 위한 부분입니다. text feature는 encoder를 통해 출력된 값을 사용하지만, relation visual feature는 subject와 object 사이의 관계를 고려해야하기 때문에 추가적인 처리가 필요합니다. 저자는 이를 위해 상단 출력 중 object 로 검출된 서로 다른 두 개의 객체에 대한 feature와 hidden relation feature를 concat한 다음, MLP에 태워서 relation (edge)를 위한 feature를 생성하였습니다.
그렇게 생성된 edge feature와 text feature 사이의 alignment를 맞출 수 있도록, 매칭되는 피처 사이의 유사도는 커지도록, 그 반대는 작아지도록 focal loss를 사용하여 학습합니다.
✅ Visual-Concept Retention with Knowledge Distillation
지금까지 설명드린 relation에 대해서도 alignment를 고려하여 새로운 데이터에 대해 학습할 경우, 기존에 학습한 정보를 잊는 Forgetting 문제가 발생한다고 합니다. 따라서 저자는 이를 해결하기 위해 Knowledge distillation을 사용하였습니다. GLIP ([CVPR 2022] Grounded Language-Image Pre-training) 처럼 Teacher/Student 모델을 활용하는 것이죠.
Teacher는 이미지-캡션 데이터를 사용해 language 파서를 통해 triplet을 추출하고 이를 가지고 사전학습을 진행한 모델입니다. 학습 방식은 위에 설명한 것과 동일합니다. 이 모델은 대규모 데이터셋을 통해 다양한 관계를 이미 학습해서 이미 풍부한 relation을 알고 있습니다. Student는 새로운 SGG 데이터(이미 사람이 레이블링한 SGG를 위해 제안된 데이터)를 학습합니다. Distillation 과정에서 teacher가 제공하는 relation 정보를 student에 전달함으로써, student가 새로운 데이터를 학습하면서도 기존에 teacher가 학습한 정보를 유지할 수 있도록 하는 것이죠.
이를 위해, student가 새로운 relation 정보 학습 시, teacher의 relation에 대한 feature 정보를 지속적으로 받습니다. 이때 student가 학습한 relation feature와 teacher가 제공하는 relation feature가 유사해지도록, 수식 (3)과 같이 L1 Loss를 사용하여 두 feature 간 거리를 최소화하였습니다.
총 정리하면, Grounding DINO에 relation을 위한 query가 추가되었다는 점이 Ov-SGTR입니다. 그 덕분에 open-vocab relation 예측을 수행할 수 있게 되었죠.
Experiments
SGG 데이터셋으로는 VG150을 사용하였습니다. OvR, OvR+D에서 teacher 학습을 위해 사용한 대규모 데이터셋은 COCO caption, Flickr30k, 그리고 SBU caption을 결합하여 사용하였습니다.
Compared with SOTA
저자는 초기에 정의한 4가지 세팅에 대한 성능을 각각 리포팅하였습니다.
Closed-set
제안한 모델이 모든 방법론에 비해, 성능과 복잡도 모두 뛰어난 것을 확인할 수 있었습니다. 또한 mR@20/50/100은 SGG에서 가장 심각한 long-tailed 상황에 대해 얼마나 견고한 지를 확인할 수 있는 지표인데, VS3에 비해 MLP라는 간단한 네트워크를 사용하면서, edge를 잘 처리한다는 것을 확인할 수 있었다고 합니다. 게다가 파라미터 수도 적고 추론 속도도 더 빠르다는 장점이 있습니다.
OvD-SGG (unseen detection)
VG150 데이터셋의 70%를 학습 중에, 나머지 30%는 새로운 객체로 나뉘었을 때의 성능입니다. 기존에 비해 (특히, VS3랑 비교했ㅇ르 때,) 엄청나게 상승된 성능을 보인다는 것을 알 수 있습니다.
OvR-SGG (unseen relation)
VG150 데이터셋의 50개 관계 중 15개를 새로운 관계로 설정해 학습에서 제외하였다고 합니다. 일단 knowledge distillation 없이도 기존 방법들보다 높은 성능을 보이는데, 여기서 특이한건 novel relation에 대해서는 엄청난 성능 하락이 발생했다는 것입니다. OvSGTR 첫번째, 세번째의 오른쪽 결과를 보면 됩니다. 이는 새로운 relation을 인식하는 데 어려움이 있다는 얘기인데, 이를 visual-concept retention 즉 distillation을 통해 엄청나게 많이 개선된 것을 확인할 수 있었습니다.
OvD+R-SGG (unseen detection, relation)
마지막으로 OvD+R-SGG는 새로운 객체와 관계를 모두 학습에서 제외한 설정입니다. 실험은 모든 객체와 관계를 포함한 성능(Joint Base+Novel), 새로운 객체에 대한 성능(Novel Object) 으로 나누어 수행하였습니다, 앞선 실험과 동일하게 distillation을 수행햇을 때 성능이 엄청나게 오른 것을 알 수 있었습니다. 물론 distillation 없이도 SOTA이긴 합니다.
Ablation study
relation query를 (1, d_model)로 선언하였는데, 1이 아닌 다른 수로 성능 차이를 실험한 결과, 동일 환경에서 1이 평균적으로 좋은 성능을 내면서 복잡도를 줄일 수 있음을 그림 3을 통해 알 수 있었습니다.
Visualization
마지막으로 정성적 결과입니다. 왼쪽은 Closed-set이고, 오른쪽은 OvD+R-SGG 세팅인데, 확실히 Closed-set은 알고있는 객체 내에서는 확실하게 많이 예측해내는 경향이 있습니다. 그래프를 오른쪽에 비해 빡빡하게 잘 검출해내죠. 그러나 오른쪽인 OvD+R은 아무래도 해당 관계가 정말 학습에 없던 새로운 관계인지, 아님 아무것도 아닌 배경인지 까지 구분해야해서 보다 어려워지는 탓에 그래프가 듬성듬성한 것이라고 합니다.
지금까지 처음으로 RElation 까지 고려한 Ov-SGG 방법론에 대해 알아보았습니다. 다만 teahcer 학습에 language parsar에 의존적이라는 것과 open-vocab 상황에서 그래프가 충분히 많은 정보를 뽑아내지 못한다는 것이 좀 아쉬운 부분이지 않나 싶습니다