오늘은 Grounding-DINO라는 논문에 대해서 리뷰하겠습니다.
본 논문은 Conditional-DETR, DAB-DETR, DN-DETR, Deformable-DETR 등등에 대한 기초 지식을 알고 있다는 전제하에 작성한 글입니다. 따로 해당 논문들에 대해에 대해 정리하겠지만 미리 공부하고 보면 더 도움이 될 것입니다.
세부적인 내용들은 찾아보시는 걸 권장하고 틀린 부분이 있으면 언제든 댓글로 말씀해주시면 수정하겠습니다.
(위의 언급된 기초지식들은 해당 블로그 다른 글에 작성되어있습니다.)
Github : https://github.com/IDEA-Research/GroundingDINO
Paper : https://arxiv.org/abs/2303.05499
Abstract
본 논문에서는 Transformer 기반 객체 검출기인 DINO와 언어 기반 pre-training을 결합하여 Grounding DINO라는 open-set object detector를 개발하였습니다.
기존에는 Closed-Set Object Detection 부분을 보시면 데이터셋에 labeling이 되어있는 부분만 분류 및 탐지를 할 수 있었습니다. 하지만 기술이 진화하면서 점점 labeling되어있지 않은, 즉 더 많은 분야와 범위를 감지를 할 수 있게 되었습니다. (위의 그림처럼 Bench만이 아닌, The left Lion처럼) 이러한 객체 감지 기술을 본 논문에서는 Open-Set Object Detection이라 설명합니다.
Introduction
본 논문에서는 Transformer 기반 detector의 발전에 동기를 부여하여 DINO 기반의 강력한 open-set detector인 Grounding DINO를 제안하였습니다.
DINO는 SOTA object detection 성능을 가졌을 뿐만 아니라 여러 수준의 텍스트 정보를 grounded pre-training을 통해 알고리즘에 통합이 가능합니다.
위의 그림(Figure 2)을 통한 설명을 하자면,
- Closed-Set Detector (흔히 아는 일반적인 Detection Model)
Feature 추출은 backbone 부분이고 Feature 향상은 neck 부분(즉, Encoder), 영역 세분화 또는 Bounding box 예측은 Head 부분(즉, Decoder)에서 이루어집니다.
- Open-Set Detector
Closed-Set Detector를 확장하여 개발한 모델로써, 이 Detector는 언어 인식 영역 임베딩을 학습하여 새로운 객체를 탐지하여 언어 인식 의미 공간에서 각 영역을 새로운 범주로 분류할 수 있도록 일반화할 수 있습니다. 핵심적인 내용은, Contrastive Loss(CLIP에도 나왔던 내용과 비슷함)를 이용하는 것입니다.
- 왜 DINO를 사용할까?
개념적으로는 위의 방법이 간단하지만 실제로 Fast-RCNN과 같은 모델은 block 단계에서 언어 정보와 상호 작용하기 어려습니다. 근데 DINO는 위의 모델과 다르게 일관된 구조를 가지고 있다고 설명합니다.
Grounding-DINO의 핵심 기술을 설명하자면 아래와 같습니다.
- Neck(Encoder)
- a feature enhancer by stacking self-attention, text-to image cross-attention, and image-to-text cross-attention
- Head(Decoder)
- develop a language-guided query selection method to initialize queries
- query representation(표현)을 향상시키기 위해 a cross-modality decoder for the head phase with image and text cross-attention layers
- 추가적인 내용
- multi-modal learning에서는 그림 1(b)의 왼쪽 열과 같이 새로운 범주의 객체에 대한 모델을 평가해야 함. 이러한 task를 본 논문에서는 Referring Expression Comprehension (REC)이라 함
Grounding-DINO
아키텍처의 전체적인 형태에 대해서 설명드리겠습니다.
Grounding-DINO는 이미지와 텍스트를 입력으로 하여 multiple pairs of object boxes and noun phrases(명사구)를 출력합니다. 위의 그림에서 예를 들면 입력 이미지에서 고양이와 테이블을 위치시키고 입력 텍스트에서 단어 고양이와 테이블을 해당 레이블로 추출하는 형태가 되겠습니다.
그림에서 보이는 것처럼 모델은 dual-encoder-single-decoder 구조를 가지게 됩니다. (오른쪽 하단)
Input 단계에서 보면 텍스트와 이미지를 입력하여 vanilla image features와 vanilla text features를 추출하고, cross-modality text와 image features를 얻은 후에 language-guided query selection module에서 이미지 feature로부터 cross-madality query를 선택합니다. 마지막 decoder 출력 쿼리는 object boxes를 예측하고 해당 구문을 추출하는 형태가 되겠습니다.
한번에 이해가 어려우실 수 있으니 논문과 같은 방식으로 아래 단계에서 차근차근 설명드리겠습니다.
1. Feature Extraction and Enhancer
Image 입력을 위한 backbone는 Swin Transformer와 같은 backbone을 사용하게 됩니다. 이 과정에서 이전(ex. Deformable-DETR)과 같이 multi-scale features가 추출된다고 저자는 설명합니다. Text 입력을 위한 backbone은 BERT와 같은 텍스트 backbone 모델을 사용합니다.
Backbone을 거쳐 vanilla image와 text features 추출하게 되는데요, feature enhancer는 multiple feature enhancer layers로 구성되어 있고 위의 그림 block2처럼 되어있습니다. Image features를 강화하기 위해 Deformable self-attention을 사용하고, text feature를 강화하기 위해 vanilla self-attention을 사용합니다.
(Vanilla란, 컴퓨터 공학 분야에서 흔히 사용되는 단어인데 전처리를 거치지 않은 raw한 형태의 데이터라고 아시면 될 것 같습니다.)
결국에 이 과정의 목적은 어떻게 feature를 더 강화하여 사용할 지 전처리하는 부분이라고 아시면 될 것 같습니다.
2. Language-Guided Query Selection
이 부분의 목적은 텍스트를 효과적으로 활용하여 객체 감지를 하기 위해 language-guided query selection module를 사용하여 입력 텍스트와 더 관련이 높은 특징을 decoder query로 선택하는 것입니다.
알고리즘의 Pseudo Code는 아래와 같습니다. 간단하게 설명하자면, 변수 image features 와 text features는 각각 image features와 text features이며, num_query는 디코더 쿼리 수(실제로는 900으로 설정했다고 함)이고 bs : batch-size, ndim : 그냥 차원, 마지막으로 이미지 토큰 및 텍스트 토큰은 말 그대로 토큰입니다.
language-guided query selection module은 num query index를 출력하게 됩니다. 선택한 index를 기반으로 feature 추출하여 query 초기화를 할 수 있고 DINO처럼 mixed query selection을 사용합니다. 해당 방법은 positional query만 초기화하고 content query(디코더 임베딩)는 학습할 수 있도록 유지하는 효과를 가지고 있습니다. (제가 작성한 DINO 글을 참고하시면 좋을 것 같습니다.)
3. Cross-Modality Decoder
위의 그림과 같이 저자들은 이미지와 텍스트 modality 기능을 결합하기 위해 cross modality 디코더를 개발하였습니다. 각 디코더 계층에는 DINO 디코더 계층에다가 텍스트 cross attention 계층을 추가하였는데, 이렇게 한 이유는 더 나은 modality 정렬을 위해 쿼리에 텍스트 정보를 주입해야 하기 때문이라고 설명합니다.
4. Sub-Sentence Level Text Feature
이전 연구에서는 Sentence level, Word level 두 단계의 텍스트 프롬프트로 나뉘어 진다고 설명합니다.
Sentence level은 전체 문장을 하나의 특징으로 인코딩합니다. (= encodes a whole sentence to one feature.)
구문 접지 데이터(phrase grounding data)에 Some sentence가 여러 개의 구문을 가지고 있다면, 특정 구문을 제외하고는 다른 단어들은 discard(폐기)합니다. 이러한 방식으로 문장에서 세분화된 정보를 상실하면서 단어 간의 영향력이 제거하는데 쉽게 말해 세밀한 정보가 소실된다고 생각할 수 있습니다.
간단하게 phrase grounding이 무엇인 지 설명하자면, image와 그에 해당하는 caption (이미지를 설명하는 text)가 두개 다 주어진다면(즉, phrase grounding data를 의미), Pharse Grounding는 caption에 있는 명사구에 해당하는 각 entity를 이미지 영역에 매칭(접지)하는 Task를 의미합니다.
Word level은 하나의 순방향으로 여러 범주 이름을 인코딩할 수 있지만(encoding multiple category names with one forward), 특히 입력 텍스트가 여러 범주 이름을 임의의 순서로 연결한 경우 범주 간에 불필요한 종속성을 발생시킵니다. 그래서 위의 그림 4-b처럼, 서로 연관 없는 단어(unrelated word)가 attention동안 상호작용합니다.(interact)
그래서 본 논문에서는 “subsentence” level을 설명합니다.
목적은 원치 않는 단어 상호작용을 피하기 위해서 라고 설명을 하는데요. (To avoid unwanted word interactions)
unrelated category names간의 attention을 차단하기 위해(block하기 위해), attention mask를 도입하였습니다. (위의 그림 4-c) 해당 과정은 Feature Enhance layer에 적용되는 것으로 보입니다.
Masked Attention: 기존 Attention과 같이 모든 값(픽셀, 단어 등)에 대해 연산하는 것이 아니라, 특정 의미 있는 영역에만 부분적으로 연산하여 수렴의 가속
5. Loss Functions
Loss는 DINO의 논문을 정확하게 파악하고 있다면 생각보다 간단합니다.
1. Bounding box regression에 L1 loss와 GIOU loss를 사용을 합니다.
2. GLIP을 follow하며 contrastive loss를 사용합니다. (between predicted objects과 language tokens). 좀 더 구체적으로 설명하면 각 쿼리에 텍스트 feature를 내적하여 각 텍스트 토큰에 대한 logits을 예측한 다음 각 logits에 대한 focal loss를 계산합니다.
Box regression과 classification costs은 prediction과 GT간의 이분 매칭(bipartite matching)에 사용됩니다.
그런 다음 최종적인 loss는 동일한 loss components를 사용하여 GT와 일치하는 예측 간의 최종 loss를 계산합니다.
이전 DETR 모델과 동일하게 각 디코더 레이어와 인코더 출력 뒤에 auxiliary loss를 추가합니다.
6. 학습 시 특이사항
학습 시 특이사항에는 자세하게 볼만한 부분은 없는 것 같습니다.
다만, Grounding-DINO를 바로 학습하는 건 리소스 비용이 너무 크기 때문에 DINO 모델을 transfer learning을 한다고 설명합니다. (Pre-trained Model을 사용)
Experiments와 Conclusion은 실험 결과 및 토의 부분이기 때문에 따로 적지는 않았습니다.