지난번 리뷰에서 Grounding DINO 라는 최신 VLM 모델에 대해 다루면서, GLIP이라는 방법론을 간단하게 설명했었습니다. 단순하게 다루고 넘어가기엔, 어찌보면 CLIP 이후로 등장한 VLM의 근본이 되는 그런 얼과 혼(?)이 담겨있는 방법론이라서 추가적인 리뷰를 통해 정리해보려고 합니다.
CLIP 관련 VLM 관련 리뷰
- CLIP : [ICML 2021] (CLIP) Learning Transferable Visual Models From Natural Language Supervision
- GLIP : *현재 리뷰 중*[CVPR 2022] Grounded Language-Image Pre-training
- Grounding DINO : [ECCV 2024] Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection

- Conference: CVPR 2022 (Oral✨)
- Title: (GLIP) Grounded Language-Image Pre-training
- Code: Github
Background
Phrase Grounding

Phrase Grounding이란 이미지 내에 있는 특정 객체나 영역을 문장에서의 구문(예: 명사구)과 연결하는 작업을 의미합니다. 예를 들어, 문장 “검은 고양이가 자동차 위에 있다”에서 “검은 고양이”라는 구문을 이미지 속 해당 객체에 연결하는 것이죠. 입출력으로 정리해보자면, Phrase Grounding에서 문장과 이미지는 입력이고, 그 결과로 이미지 속에 구체적인 구문이 해당하는 객체의 위치를 bounding box로 출력됩니다. 따라서 Phrase Grounding는 이미지와 텍스트 사이의 관계를 학습하고, 해당 관계를 바탕으로 객체를 정확하게 찾는 데 중요한 역할을 합니다.
Phrase Grounding에서는 구체적인 구문과 객체 간의 관계를 학습하기 때문에, 모델은 텍스트에서의 구체적인 표현과 그 의미를 정확히 이해하고, 이를 이미지의 특정 객체와 연결할 수 있게 됩니다. 이 과정에서 모델은 객체의 시각적 특징을 더 잘 학습할 수 있으며, 이를 바탕으로 더 세밀하고 정확한 객체 검출할 수 있습니다.
Phrase grounding을 갑자기 설명드리는 이유는 바로 지금 리뷰하려는 GLIP이 바로 이 방식을 기반으로 모델을 학습시켰기 때문이죠. 특히 저자는 이 태스크를 통해 객체 수준의 언어 인식 및 시각적 표현을 학습할 수 있었고, 나아가 다양한 비전 태스크에서 공통적으로 사용할 수 있는 Pre-trained 모델을 만들 수 있었음을 제시하였기 때문입니다.
Introduction
기존의 이미지 인식 모델에서는 Closed-set에만 대응할 수 있었는데, CLIP 이 등장하며 zero-shot 에서도 굉장한 성능을 보였습니다. 특히 대규모 이미지-텍스트 쌍을 학습하여 이미지 수준의 표현을 잘 학습할 수 있고, 이를 통해 Closed-set class 말고도 다양한 정보를 다룰 수 있었습니다. 그러나 CLIP은 이미지 레벨로 텍스트와 매핑시켰기 때문에, 세밀한 영역에 대한 이해를 요구하는 태스크에서는 그닥 좋은 성능을 보이지 못했습니다. 즉, 이제는 Image-Level이 아닌 Object-Level의 모델 학습을 수행해야, 모델은 더 구체적인 정보를 얻을 수 있습니다.
다시 말해, 저자는 CLIP 처럼 Open-set에 대응 가능하면서, CLIP보다 세밀한 영역을 볼 수 있는 Pre-train 모델에 대하여 고민한 것이죠. 이를 극복하기 위해 Phrase grounding을 통해 모델을 학습하고자 하였습니다. 왜냐하면, CLIP처럼 텍스트와 이미지를 연결지어서 학습하지만, 보다 세분화된 영역으로 학습을 수행하기 때문이죠. 방법론은 비슷하지만 보는 영역이 더 세분화된다는 차이가 있죠?

그러나 Phrase grounding에서는 단순히 텍스트와 이미지를 입력받아 일부 명사구와 영역을 연결짓기 때문에, 문장에 나오는 객체만 찾아낼 수 있습니다. 만약 이미지 속 객체가 문장에 언급되지 않았다면, 해당 객체는 인식되지 않습니다. 위의 사진에 예시에서 보면, 자동차 위에 있는 “카피바라”는 입력되는 문장에 없다면, 지금처럼 카피바라가 명확하게 존재함에도 불구하고 누락한 채 검정색 자동차만 매핑하여 결과를 출력할 것입니다.
그에 반해, Object Detection은 문장 없이 객체를 찾아내기 때문에, 문장에 언급되지 않은 객체라도 인식 가능합니다. Phrase Grounding만 사용하면 문장에 나온 객체만 찾을 수 있지만, Object Detection을 동시에 수행한다면 모든 객체를 인식하고 문장과 연관된 객체도 더 정밀하게 찾을 수 있을 것입니다. 따라서 저자는 이 두 태스크를 결합하여 다양한 상황에 대응하고, 더 나은 성능을 발휘할 수 있는 모델을 만들고자 하였습니다.
뿐만 아니라, 이 둘을 결합하면 Phrase Grounding 데이터셋 뿐만 아니라 기존에 활발하게 연구되고 있어 다양하면서도 대규모인 Object Detection 데이터셋을 동시에 활용할 수 있다는 장점까지 가집니다. 따라서 저자는 두 가지 태스크를 결합한 모델인 GLIP을 제안함으로써 Object Detection의 객체 인식 및 위치 정보 능력과 Phrase Grounding의 세분화된 텍스트-이미지 매칭 능력을 함께 활용하여 더 많은 데이터를 기반으로 더 강력한 모델을 만들고자 하였습니다.
뿐만 아니라, 이렇게 만들어진 모델이 아주아주 강력한 Pre-train 모델로 활용될 수 있다는 점이 오늘날 GLIP 이 엄청난 인기를 가진다는 데에 큰 몫을 하게되지 않았나 싶습니다. 지금부터 각 방법론에 대한 자세한 리뷰 시작하겠습니다.
Method: Grounded Language Image Pre-training
저자가 제안하는 Grounded Language-Image Pre-training (GLIP)에 대해 설명드리겠습니다. GLIP은 Language Model과 Vision Model이 포함되는 모델의 구조부터, 이미지-텍스트 페어로부터 학습한다는 점에서 CLIP과 굉장히 유사합니다. 그러나, CLIP은 image-level이고, GLIP은 object-level이라는 점에서 차이가 있습니다. 또한, 입력된 문장에 없는 객체도 검출하기 위해서 저자는 Object Detection과 Phrase Grounding 을 통합했다는 점도 CLIP과 가장 대비되는 특징 중 하나입니다.
1) Object detection as phrase grounding
GLIP에서 Object Detection + Phrase Grounding 를 통합시킨 방법부터 설명하겠습니다.
일반적인 Object Detection 모델은 이미지를 입력으로 받아서 객체의 위치와 종류를 예측합니다. 그 중 저자는 객체의 종류를 예측하는 부분을 *Phrase Grounding으로 변경하였습니다.
*Object Detection을 Phrase Grounding 방식으로 전환하면, 객체 탐지를 할 때 텍스트의 구문과 이미지의 객체를 연결하는 방식으로 작업이 바뀝니다. 예를 들어, “자고있는 사람”이라는 구문을 모델이 받아들일 때, 모델은 이미지 속에서 그 구문에 맞는 사람 객체를 찾아내는 방식으로 동작합니다. 즉, 객체를 사전 정의된 카테고리에 분류하는 대신, 텍스트로 입력된 구문에 맞추어 객체를 인식하고 탐지하는 것입니다. 따라서 두 태스크는 동일한 구조를 가질 수 있습니다. Object Detection 모델이 클래스 분류 대신 텍스트 구문과의 매칭 작업을 수행하면 Phrase Grounding 작업이 되고, 반대로 Phrase Grounding 작업에서 텍스트 구문이 없이 객체를 단순히 탐지하는 방향으로 설정하면 Object Detection 작업으로 전환될 수 있다는 얘기죠.
Object Detection에서 클래스 예측 부분을 CLIP 처럼 텍스트-이미지 페어를 매칭하는 방식으로 변경한다는 얘기인데요, 문제는 Detection 데이터셋에는 텍스트 입력(프롬프트)으로 넣을 데이터가 없다는 점입니다. 단순히 이미지와 BBox의 좌표와 클래스만 존재할 뿐이죠.
그래서 저자는 프롬프트를 직접 만들었습니다. 어떻게? Detection의 모든 객체의 이름을 단순하게 나열하는 방식으로 만들었죠. 예를 들어, COCO 데이터셋이라면 “Person, Bicycle, car…“와 같은 객체 이름들을 나열해서 하나의 문장을 만드는 것입니다.

(더 나아가, 더 구체적이고 설명적인 표현을 사용하거나 – “빨간 자동차, 파란 자전거” – BERT와 같은 사전 학습된 언어 모델을 사용하여 텍스트 프롬프트가 더 자연스럽고 모델이 이해하기 쉽도록 만들 수 있다고 합니다. 이는 결국 프롬프트 엔지니어링을 어떻게 하느냐에 대한 부분이기에, 딥하게 설명하진 않겠습니다. 실험 결과를 통해 확인하시기 바랍니다)
프롬프트도 생성했으니 이제 CLIP처럼 이미지와 텍스트 임베딩 벡터 사이의 정렬(alignment)을 맞추며 학습시키는 과정만 남았습니다. CLIP과 차이는 이미지 벡터는 특정 영역으로부터, 텍스트 벡터는 특정 단어로부터 만들어져 유사도 점수를 구해 alignment score 가 계산된다는 점입니다.

이미지와 텍스트에 대한 벡터가 각각 O, P라고 합시다. 수식 (3) 처럼 각각의 인코더에 태워서 나온 최종 임베딩 벡터겠죠. 그리고 O, P 각각에 대한 유사도를 구해서 유사도 map 인 S_{ground}를 구합니다. 그 과정이 바로 아래 이미지와 같습니다. S_{ground}은 오른쪽에 있는 행렬인 Word-Region Alignment Score 입니다.

마치 CLIP과 유사하죠? 다만 차이점은 계속 강조드린 것처럼 이미지 벡터는 검출된 객체(Region) 단위고, 텍스트 벡터는 단어(Word) 단위로 만들어졌다는 점입니다. 이 S_{ground}는 N × M 크기를 가지는데, 여기서 N은 이미지에서 검출된 객체의 수, M은 텍스트에서 분리된 단어의 수입니다. 이 때 M은 Object detection 데이터의 클래스 수인 c보다 큰데, 그 이유는 하나의 class의 이름이 단어로 이루어져 있을 수 있고 – “traffic light” – 또 일부 단어들은 여러 개의 작은 부분 단어(sub-word)로 쪼개질 수 있습니다 – “toothbrush(칫솔)“가 “tooth#“와 “#brush”. 어떤 단위로 텍스트 임베딩을 시킬지에 따라 달라지는 부분이죠.

이제 객체와 단어가 매칭되는 부분은 커지도록, 그렇지 않은 부분은 작아지도록 학습시켜야합니다. 그러기 위해서는 행렬에서 어떤 부분이 매칭되는지 그 정답값을 알아야합니다. 참고로 CLIP에서는 diagonal 한 부분을 커지도록 만들었습니다. 이미지와 텍스트는 동일한 크기의 임베딩 벡터이면서, 대응되는 부분이 바로 대각선 영역이었기 때문이죠. 그러나 영역/단위 별로 대응시켜야하는 GLIP에서는 단순히 대각부분을 커지게 만들 수는 없습니다.

GLIP에서 매칭되는 부분을 찾기 위해, Detection의 레이블을 이용합니다. Detection 데이터의 정답값에는 BBox 좌표와 그에 해당하는 Class 정보가 있죠, 이를 이용해서 어떤 영역을 매칭 부분인지는 쉽게 알아낼 수 있습니다. 가령 위의 이미지처럼 O1인 헤어드라이기가 검출된 이미지 벡터와 헤어 드라이기 객체에 대한 정답값인 Hairdryer에 해당하는 P_M-1, P_M 텍스트 벡터가 대응하는 부분이 매칭되는 부분이고 그 부분을 학습 시 커지도록 계산하면 됩니다, 마찬가지로 O2인 사람과 P_1이 대응하는 영역이 정답값이 됩니다. 나머지 대응하지 않는 영역은 작아지도록 학습시키죠. 간단하죠? 특히 위에 보이는 예시처럼 멀티 레이블이 가능하다는 것도 특징입니다. 이게 가능한 이유는, Object Detection에서 클래스 예측 부분을 지금과 같이 Alignment score를 계산하는 식으로 변경했기 때문입니다.
이 때, 모델이 학습할 때 사용하는 Loss 함수는 focal binary sigmoid loss로, 각 이미지 객체와 텍스트 구문 간의 매칭 여부를 판단합니다. 추론 단계에서는 각각의 부분 단어에 대한 확률을 평균 내서, 해당 구문에 대한 최종 확률을 계산합니다. 이를 통해 모델은 구문 전체가 이미지 속 객체와 얼마나 매칭되는지 판단하게 됩니다.

마지막으로 Detection을 위한 Localization box 계산에 대한 Loss는 O라는 객체 별 feature를 사용해서 학습시키면 됩니다.
2) Language-Aware Deep Fusion

지금부터는 위에서 설명하지 않고 넘어간 Text와 Image Encoder 부분에 대해 설명드리겠습니다. CLIP에서는 이미지와 텍스트를 별도로 처리한 후, 마지막에 그 두 가지 정보를 결합하여 매칭 결과를 예측합니다. 마지막에 두 모달리티를 융합한다고 해서 이를 Late Fusion 이라고 합니다. 이 경우 Fusion이 한번만 수행되는 것인데, 저자는 더 나아가 Deep Fusion을 통해 이미지와 텍스트를 처리하는 중간 단계에서도 두 정보를 깊이 융합하고자 하였습니다.

CLIP에는 중간 단계에서의 Fusion은 없었습니다. 단순히, Text/Visual Encoder로부터 나온 feature를 Projection Layer에 태워 거쳐 동일한 차원으로 만들어주는 것이 전부였습니다. 그에 반해 GLIP에서는 CLIP의 Projection layer에 해당하는 부분에 Fusion 모듈을 통해 두 모달리티를 중간중간 맞추고 정보를 융합시키고자 하였습니다. 그 이유는 이미지와 텍스트 정보를 서로 주고받으면서, 텍스트 정보를 활용해 이미지 특징을 더 잘 이해하게 하거나, 이미지 정보를 바탕으로 텍스트를 더 잘 해석할 수 있도록 도와주기 위함이라고 합니다. 또한 이미지와 텍스트가 상호작용하는 방식을 강화하며, 이미지 속 객체를 찾는 과정에서 텍스트의 정보를 더 잘 반영할 수 있도록 해줄 수 있다고 합니다.

상단 그림이 바로 GLIP에서 텍스트와 이미지를 융합하는 Deep Fusion을 나타냅니다. 사전학습 및 Freeze한 Text/Visual Encoder(Backbone)으로부터 나온 Feature를 여러번 융합하며 정보를 향상시키는 과정이죠.


이 때, 이미지와 텍스트 간의 융합을 위해 Cross-Modality Multi-Head Attention (X-MHA) 기법을 사용합니다. 트랜스포머 디코더 부분에 있는 연산인만큼 모두들 잘 알고 계실거라 생각합니다. 따라서 수식 (4)가 이에 해당한다는 것만 언급하고 넘어가겠습니다. O는 이미지, P는 텍스트에 대한 feature 입니다.

또한 Backbone을 통한 feature 추출 이후, 이미지와 텍스트는 DyHead 모듈과 BERT 레이어를 사용하고 여러번 반복하며 정보를 융합하였습니다. DyHead 모듈은 Dynamic Head 라는 논문에서 제안한 Attention 기반의 Detection Feature Enhancement 모듈입니다. 여러번 태워도 동일한 shape의 feauture를 출력한다는 특징이 있어, DyHead 저자는 총 6번 태워서 좋은 성능을 보였다고 리포팅하였고, 이와마찬가지로 GLIP에서 여러번 태울 수 있었습니다.
Dynamic Head은 객체의 크기/형태/Task와 상관없이 잘 검출해야한다는 목적으로 설계되었습니다. 이를 반영해서 물체를 더 잘 찾아내기 위해 3가지의 Attention Layer를 통과하는데 Scale-aware Attention, Spatial-aware Attention, Task-aware Attention이 바로 그 레이어입니다. 본 리뷰에서는 이보다 더 자세히 다루진 않겠습니다. Detection 성능을 더 좋게 만드는 모듈로 알고 넘어갑시다

Fusion 된 이미지, 텍스트 Feature를 각각 O^i_{t2i}, P^i_{t2i}라고 하면 결합된 feature (빨간색)을 더해서 다음 레이어의 입력으로 들어갑니다.
제가 설명은 길게했지만, 사실 아주 간단하고 직관적인 방법론입니다. Detection 데이터셋을 활용하기 위해, 클래스를 이어붙혀 Prompt를 만들고 동시에 입력한다는 점. 그리고 feature를 개선하기 위해 최종 피처를 생성하는 중간중간 Deep fusion을 수행했다는 점. 객체-단어 단위로 Alignment score를 계산해서 학습한다는 점.

지금 표시한 부분은 Phrase Grounding 데이터를 사용해서 GLIP을 학습시키는 방식인데요, Phrase grounding 데이터에는 이미지를 표현하는 문장과, 박스 별 대응하는 레이블이 있고, 그 박스의 좌표를 제공합니다. 따라서 GLIP 학습에 필요한 모든 조건이 있어 따로 설명드리지 않고 넘어갔고 저 역시 따로 설명 없이도 어떻게 학습이 가능한지는 충분히 이해하실거라 생각하고 생략하겠습니다.
3) Pre-training with Scalable Semantic-Rich Data
Object Detection 데이터는 제한된 수의 객체 카테고리를 포함하고 있으며, 이를 확장하기 위해서는 많은 비용이 필요합니다. 가령 사람이 모두 레이블을 직접 달아야하죠. 반면, Grounding 데이터(이미지-텍스트 페어 데이터)는 더 많은 시각적 개념을 포함하고 잇습니다. 문장에서 나타나는 다양한 구문을 바탕으로, 거의 모든 개념을 학습할 수 있게 됩니다. 이게 무슨소리냐면.. COCO 데이터셋에 존재하는 클래스 개수는 80개입니다. 이를 확장한 LVIS 데이터셋은 1200여개의 클래스가 있죠. 그에 반해 Grounding 데이터셋에는 이미지를 설명하는 여러 개의 문장이 포함되어 있는데, 그 문장 속에 있는 모든 phrase를 추출해보니 VG Caption 같은 데이터셋에서는 11만 개가 존재합니다. 즉, grounding 데이터에는 더 많은 시각적 표현과 의미를 담고 있어, 모델이 더 많은 객체를 인식할 수 있습니다.
사실 CLIP이 엄청난 성능을 끌어올린 배경에는 이미지-텍스트 페어 학습이 아닌 대규모 데이터셋에 있습니다. 매우매우매우 큰 데이터셋으로 학습시키다보니 다양한 객체를 마주할 수 있었죠. 물론 grounding 데이터셋에 11만개의 명사구가 있다 한들, 이미지가 많지는 않습니다. 따라서 저자는 어떻게 해야 인터넷에 존재하는 대규모 데이터셋으로 GLIP을 학습시킬 수 있을지 고민하였고, 이를 위해 Student/Teacher 네트워크 학습 방식을 사용하였습니다.
GLIP 모델에서는 우선 teacher network가 기존에 존재하는 3백만 개의 Grounding 데이터로 먼저 학습됩니다. 다음으로 웹에서 얻은 추가 데이터에 teacher 네트워크를 사용하여 pseudo-label를 추출합니다. 다음으로 student 네트워크는 이 데이터를 기반으로 생성된 Pseudo-label와 teacher를 학습할 때 사용한 데이터를 합쳐서 다시 한번 GLIP을 학습합니다.

이렇게 대규모의 Grounding 데이터를 통해 학습된 모델은 기존 객체 탐지 데이터에 비해 더 풍부한 시각적 표현과 의미적 이해를 갖출 수 있었습니다. 그 예시가 바로 위의 결과입니다. Teacher는 학습 과정에서 모든 개념을 직접적으로 알지 못하더라도, 언어적 문맥과 일반화 능력을 활용해 추론할 수 있었습니다. 예를 들어, “백신(vaccine)“이나 “터쿼이즈(turquoise)” 같은 단어는 학습 데이터에는 없던 구문인데, “작은 병(vial)“이나 “카리브해(caribbean sea)“라는 문맥을 보고 추론할 수 있었죠. 결국 학습 때 보지 못한 단어로 잘 예측해낼 수 있었습니다.
Transfer to Established Benchmarks
이제 실험파트에 대해 설명드리겠습니다. 실험을 위해 사용된 데이터셋에 대한 정보는 아래와 같습니다.
Detection
- COCO (0.33M with 80 class and 5 captions) 33만 장 # 벤치마크
- Objects 365 (2M with 365 class, tiny ~ big object) # 학습용으로만 사용
- LVIS (0.16M with 1200+ class, rare-object) # 벤치마크 (for rare-object 에 어떤 영향을 미치는 지 확인)
Grounding data
- GoldG (0.8M Flickr30K, VG Caption, GQA): grounding 데이터셋을 합쳐서 만든 80만 개의 데이터셋 # 학습용
- Flickr 30k entities (0.03M Images): Flick30K를 확장한 데이터셋으로, 총 3만 개의 이미지/ 이미지 별 5개의 sentence + 대응되는 명사구 존재
<학습 모델 정보>

4.1. Zero-Shot and Supervised Transfer on COCO

Detection 데이터인 O365만을 사용했을 때, Zero-shot성능이 Full supervised 한 Faster RCNN보다 좋다는 것은 제법 인상적입니다. grounding 데이터셋을 추가함으로써, 단일 Task로 Object Detection을 수행하는 것보다 좀 더 높은 Visual Representation을 보이는 것을 알 수 있습니다. 또한 GLIP 모델은 Zero-Shot 설정에서 높은 성능을 보였으며, Supervised 설정에서는 fine-tuning을 통해 SOTA를 달성했습니다.
4.2. Zero-Shot Transfer on LVIS
LVIS는 COCO를 재 레이블링 한 데이터셋으로 총 1200여개의 클래스가 존재합니다. 또한 데이터 클래스의 분포는 Long-tailed 를 따른다는 특징이 있어, 빈도수에 따라 frequent / common / rare 카테고리로 나뉘며 rare한 클래스에 대해 얼마나 잘 대응하는지 보는 지표로도 많이 활용되는 데이터셋입니다.

위에 있는 세 개는 LVIS Full-supervised 성능이고, GLIP은 zero-shot 성능입니다. Zero-shot임에도 불구하고, Pre-trained된 다른 모델들보다 MiniVal에서 성능이 뛰어나며, AP_r에서 증가폭이 더 높은 것으로 볼 때, rare한 object 에서 grounding 데이터난 이미지 caption 데이터가 좋은 성능을 낸다는 것을 보입니다.
4.3. Phrase Grounding on Flickr30K Entities

MDETR에 비해 GLIP 성능이 좋고, 3, 4번째 행 결과를 토대로 Detection과 Phrase Grounding 을 합치는게 Grounding task에서도 좋은 성능을 보였습니다. (3번은 grounding / 4번은 detection + grounding)
4.4. Analysis

Object Detection 종류 및 Grounding 데이터 조합에 따른 성능차이도 보여주었는데, 단일 OD보다 gronding을 추가하는 것이 좀 더 성능이 향상된 것을 알 수 있습니다. 6, 7번을 보니 caption을 추가하면 detection은 떨어지지만, rare에서는 올라가서 rare class에는 효과적임을 다시 한 번 알 수 있었습니다.
5.2. One Model for All Tasks
GLIP 모델은 프롬프트 튜닝을 통해 하나의 모델로 다양한 작업에 적용될 수 있으며, 효율적인 Transfer가 가능하여 새로운 작업에 적은 비용과 시간으로 적응할 수 있습니다. 제가 방법론 설명 시 언급한 Manual prompt tuning과 Prompt tuning이 바로 이에 해당하는데요.

사용자는 새로운 카테고리나 상황에 맞게 프롬프트를 재설정하여, 추가 학습 없이도 다양한 객체를 인식하도록 할 수 있습니다. 예를 들어, 특정 객체에 대한 구체적인 설명(예: “넓고 둥근 가오리”)을 추가하여 모델이 객체를 더 잘 탐지하게 할 수 있습니다.
모델의 모든 파라미터를 조정하는 대신, 프롬프트 임베딩만 Fine-tuning하는 방법으로도 Transfer가 가능합니다. 이렇게 하면 새로운 태스크에 맞게 모델을 빠르고 효율적으로 조정할 수 있으며, 모든 파라미터를 다시 학습하는 방식에 비해 비용과 시간이 절약되기도 합니다.

GLIP 모델에서 프롬프트 튜닝은 전체 모델을 튜닝하는 것에 거의 가까운 성능을 보여주었습니다. 특히 모델 크기가 커질수록(예: GLIP-L) 이 성능 차이는 줄어드는 반면, Object Detection의 대표 모델인 DyHead은 프롬프트 튜닝이 불가능하며, 모든 파라미터를 조정해야 하는 단점이 있다는 차이가 있습니다.
Visualization



정성적 결과 보여드리면서 리뷰 마치도록 하겠습니다
연구 잘하네요.. 제가 다루지 못한 실험이 더 많으니 꼭 한번 찾아보시길 추천드립니다. 다음에 등장한 Grounding DINO는 사실 GLIP 과 마찬가지로 open-set에 대응 가능한 VLM 입니다.. GLIP과 다른 부분은 Fusion을 더 많이 수행한다는 점 정도인거 같습니다. 그만큼 GLIP이 그 기반이 되는 중요한 연구가 되는 것이 아닌가 싶습니다.
Contribution 요약
- Open-set Detection + Grounding 제안
- Image/Text Pair 데이터셋에서 Object-Level로 Contrastive 학습 방식 제안
- Foundation Model로 동작 가능한 CLIP 다음 가는 Vision Language Model 제안
안녕하세요, 홍주영 연구원님. 좋은 리뷰 감사합니다. 정성이 가득 담긴 리뷰라 어렵게 않게 이해하며 읽을 수 있었습니다.
유사도 행렬을 만드는 과정에서 질문이 있는데요, 프롬프트의 각 객체 단어와 박스의 수는 같아서 행렬이 계속 정방행렬로 유지되긴 하겠지만, 이미지마다 객체 수가 달라 행렬의 크기는 계속 달라질 것 같습니다. 행렬의 크기가 계속 달라지는 것에 대해서 어떻게 처리를 하는지(나머지 부분을 패딩한다던가, 행렬 크기가 달라져도 loss를 구하는데 문제가 없다던가) 논문에 언급이 있었나요? 해당 부분 알려주시면 감사하겠습니다!
말씀하신대로 이미지마다 박스 수가 다르고, 프롬프트의 길이(=토큰 수)도 다르기 때문에 행렬의 크기는 가변적일 수 있습니다. 하지만 이 가변성은 loss 계산에서 문제가 되지 않을 것 같습니다. 왜냐하면, Focal loss를 사용할 때는 binary sigmoid를 기반으로 각 유사도 score를 독립적으로 판단합니다. 즉, 고정된 크기의 전체 행렬이 아니라, 개별적으로 처리되며 batch-wise하게 dynamic하게 구성됩니다. 논문 3.1과 캡션에 따르면, 토큰 수가 class 수보다 많을 수 있으므로, label matrix도 subword 단위로 확장하여 사용한다고 합니다. 결론은 GLIP은 유사도 행렬이 정방이 아닐 수 있음을 전제로 설계되었고, loss도 이를 고ㅓ려할 수 있을 듯 하네요
안녕하세요 주영님, 좋은 리뷰 감사합니다.
독자들을 배려해주신 정갈한 리뷰에 기분 좋게 열심히 읽었던 것 같습니다.
그러다보니 질문의 양도 좀 많아졌는데 양해부탁드립니다..
1. 기존 CLIP의 late fusion과 달리, GLIP은 deep fusion으로 두 모달리티 간의 feature representation을 더 좋게 만드려 했던 것으로 이해했습니다. 하지만 생각해보니 deep fusion으로 인해 그 만큼 연산량이 많아지고 inference 속도는 느려질 것 같다는 생각이 들었습니다.
이런 관점에서 arxiv 기준 16p. Table 7을 살펴보다가 FPS나 parameter나 메모리 측면에 대한 실험이 있음을 확인했는데, GLIP-T, GLIP-L 모델 둘을 놓고 deep fusion 유무로 진행한 ablation study 였습니다. 신기한 점은 deep fusion 쪽에서 train이든 inference든, 6번이나 연속된 cross fusion 이 이루어지는 데도 FPS는 1/2정도 밖에 안 줄고, 메모리도 2배 정도로만 머무른다는 점이 신기했습니다. 논문의 D.1. 부분에서 언급을 더 찾아보니 gradient checkpointing을 사용해서 train 시에는 deep fusion 모듈 쪽에 학습 시간은 오래걸리지만 GPU 메모리 소비는 줄일 수 있었다고 말하더군요. 일단 foundation model 치고 저희 연구실의 GPU에서도 돌릴 수 있어 보일 정도로 메모리가 적게 먹는다 생각하고 있었는데, 혹시 이런 대규모 학습에 있어서 gradient checkpointing을 활용한 학습이 흔한 경우인가요?
추가로 inference 시엔 그럼 gradient checkpointing이 없을 텐데, 여기서 6번의 fusion에 비해 FPS가 1/2정도로만 감소한다는 점이 신기한데요, 애초에 fusion 부분의 반복되는 모듈이 모두 균일한 파라미터 양을 가지는 것이 아니었던 것일까요.. 이 부분에서 주영님의 견해가 궁금합니다.
2. Deep fusion 과정에서의 X-MHA는 L번(6번) 이루어지는데, 전체 아키텍쳐 중 해당 부분의 DyHead모듈과 BERT레이어만 trainable한 parameter를 가진 부분인지 궁금합니다.
3. 추가로 GLIP은 가장 앞단의 백본에 pretrained & freezed Text/Visual Encoder가 있는데, CLIP은 해당 백본 encoder 부분을 freeze 하지 않고 weight을 random initialization 하여 scratch단계에서부터 대규모 데이터의 맞춰 학습한 것으로 기억합니다.
제 생각엔 GLIP이 zero-shot detection을 지향하는 만큼 더 대규모의 grounding 데이터셋을 가지고 있기 때문에 나름의 학습 효율성(?)을 위해 백본 encoder를 freeze하여 학습한 것이라 이해해보았는데, 맞는 관점일까요?
1. 대형 모델 학습에서는 gradient checkpointing이 꽤 일반적으로 쓰이는 기법이라고 합니다. 특히 ResNet, Swin Transformer 같은 구조에서 수십~수백 레이어를 학습해야 할 때 메모리 절감을 위해 자주 사용되며, HuggingFace, PyTorch Lightning 등 주요 프레임워크에서도 기본적으로 지원되는 기법이라고 하네요?
반면, inference 시에는 gradient가 필요 없기 때문에 checkpointing은 적용되지 않습니다.
정리하면, 학습할 땐 gradient checkpointing 덕분에 메모리를 아껴서 큰 모델을 돌리는게 가능하지만, 추론 시에는 gradient 계산을 안 하니까 gradient checkpointing은 필요 없습니다.
그럼에도 FPS가 절반 수준으로만 감소한 이유는… 일부 fusion 구조가 생각보다 연산 부담이 크지 않아서 그럴 수도 있을 것 같습니다. 저자의 깃허브를 보니, 각 fusion 블록은 구조적으로 유사하지만, 파라미터를 공유하지 않고, 독립적인 연산을 수행한다고 합니다. 그게 아니라면… 전체 네트워크의 병렬 처리 구조와 배치 최적화 덕분일수도 있구요?!
2. visual/text encoer를 제외하고, (1) DyHead 내에서 cross-attended된 visual feature를 업데이트하는 부분 (2) BERT Layer를 통해 language feature를 업데이트하는 부분 (3) cross-attention layer 입니다. 즉, cross-attention은 DyHead 모듈과 BERT Layer 사이에 삽입되며, 이 두 부분만이 trainable parameter를 가지는 부분입니다.
3. 말씀하신대로, CLIP은 이미지와 텍스트 인코더 모두를 scratch에서 대규모 데이터로 사전 학습했지만, GLIP은 이와 다르게, 기존의 사전학습된 백본을 그대로 freeze하고 위에만 학습을 위한 설계를 진행하였습니다.
Encoder를 Freeze 하는 이유는 여러 가지가 있겠지만, 일단 CLIP 처럼 이미 강력한 인코더를 굳이 다시 학습시킬 필요가 없다는 학습 효율성이 가장 큰 이유는 맞는 것 같습니다. 대부분의 CLIP기반의 연구들이 그렇듯이요. 그와 동시에 Zero-shot generalization 성능을 유지하기 위함도 이유일겁니다. 이미 잘 학습된 백본을 손대는 순간 원래 가지고 있던 일반화 능력이 사라지고 Grounding 데이터셋에 fitting 될 가능성이 크죠.
안녕하세요 주영님 좋은 리뷰 감사합니다.
본문의 ‘5.2. One Model for All Tasks’ 부분에서 질문이 있습니다. 기존의 프롬프트 “stingray”를 “stingray, which is flat and round”로 변경하면 모델의 정확도가 향상하는 것을 확인할 수 있는데 ‘which is flat and round’와 같은 세부 정보는 수동으로 생성을 하는 것인지 아니면 클래스의 특성에 맞는 표현을 자동으로 생성하는 것인지 궁금합니다.
그리고 프롬프트 파인튜닝 방식은 어떻게 진행이 되는건가요? 가령 “stingray, which is flat and round”의 프롬프트가 주어졌을때 stingray는 마스킹처리하고 이미지와 ‘which is flat and round’의 정보로 마스킹부분을 예측하는 것인가요?
감사합니다.
1. 말씀하신대로, GLIP에서는 기본적으로 각 클래스에 대해 “Detect: stingray.”와 같은 프롬프트를 사용하지만, 논문 5.2절에서 소개된 방식처럼 “stingray, which is flat and round”처럼 수동으로 더 정교한 설명을 추가하면 성능이 개선됩니다. 이 프롬프트는 자동 생성이 아닌, 사람이 작성한 수동 프롬프트라고 합니다.
2. Prompt Tuning은 다음과 같이 진행됩니다. (1) 프롬프트 전체가 아니라, 프롬프트를 임베딩으로 바꾼 후 그 임베딩만 학습 대상으로 삼습니다. (2) BERT 같은 모델을 통해 생성한 초기 임베딩(P₀)을 고정된 인코더에 넣고, 그 임베딩만 task-specific하게 Fine-tuning 합니다 (3) 이 때, 마스킹 기반 학습은 사용되지 않습니다. 즉, “stingray” 부분을 마스킹하고 예측하게 하지는 않으며, 단지 더 나은 임베딩이 되도록 전체 alignment loss를 통해 학습됩니다.
안녕하세요 좋은 리뷰 감사합니다.
결국 영상 내 일부 영역에 대한 표현력을 학습하기 위해 대규모 데이터셋으로 사전학습을 수행한 모델이라고 이해하였습니다.
학습 과정을 보았을 때, 주어진 bbox 라벨을 활용해 영상 내 해당 영역을 크롭하고 contrastive learning을 하는 것으로 이해하였는데, 추론 단계에서는 일단 영상 내 물체의 위치를 찾아내는 작업이 우선되어야하기에 글로벌한 영상 속 로컬한 부분을 잡아내는 능력이 필요하다고 생각합니다.
glip모델의 어느 부분이 이러한 능력을 위한 학습인지 궁금합니다. 즉 학습할 때 하나의 이미지에서 영역을 잘라내는 부분은 그냥 gt라벨을 쓰고있는데, 디텍션에 대해서도 학습하는 부분이 있는지 여쭈어봅니다.
잘못 이해하신 것 같아서, 다시 설명을 드리자면..
해당 논문에서는 Detection과 그에 대한 결과를 text의 word와 매핑하는 논문입니다.
즉, Detection은 기존 방식처럼 이미지로부터 object 가 있는 영역을 찾습니다.
고전적인 Detection 방법이 그렇듯, 댓글에서 말씀하신 것처럼 “GT 레이블을 사용하여 Crop” 하진 않습니다
기존 Detection 태스크와 동일하게 입력 이미지로부터 object가 있을법한 영역을 찾고,
예측한 영역과 Text feature 사이에 Contrastive learning을 수행하는 것이죠