GroundingDINO 개요

GroundingDINO란 컴퓨터 비전과 자연어 처리의 교차점에서 사용되는 모델로, 이미지에서 특정 객체의 위치를 탐지하는 Zero-Shot Object Detection 모델이다. DINO(Detection Transformer with IoU-aware Contrastive Learning)를 기반으로 한 모델로, 이미지와 텍스트 간의 상관관계를 학습하여 더 정확한 물체 인식과 위치 지정이 가능하다. 대규모 데이터셋에서 pre-train 된 self-supervised learning 모델로, 새로운 클래스에 대한 annotated data가 없어도 객체 탐지가 가능하다.

GroundingDINO 원리

Grounded DINO는 이중 인코더-단일 인코더 아키텍처를 사용한다.

  1. 이미지 backbone과 텍스트 backbone을 사용해 각각에서 feature를 추출한다. 이후, cross-modality feature 융합을 위해 feature enhancer에 공급된다.
  2. Deformable self-attention과 일반 self-attention을 사용해 이미지와 텍스트 각각의 feature를 향상시킨다. 그리고 둘의 상호작용을 개선하기 위해 image-to-text 및 text-to-image cross-attention을 추가한다. 이를 통해 두 modality 간의 feature를 결합하고, 보다 정교한 정보가 생성된다.
  3. 텍스트 기반의 query selection, cross-modality attention 및 subsentence text representation을 통해 텍스트와 이미지 간의 세밀한 연관을 찾아내고, 이를 바탕으로 객체를 탐지한다.

GroundingDINO 특징

  • 텍스트와 이미지: 이미지에서 텍스트로 정의된 물체를 탐지한다.
  • 범용성: 대규모 데이터셋으로 학습되어 다양한 이미지에 대해 일반화된 성능을 보인다.

GroundingDINO 사용 가이드

모델 불러오기

github에서 GroundingDINO를 clone한다.

!git clone https://github.com/IDEA-Research/GroundingDINO.git
!pip install -e .

weight를 다운로드 받는다.

!mkdir weights
%cd weights
!wget -q https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth

모델을 불러온다.

from groundingdino.util.inference import load_model, load_image, predict, annotate

model = load_model("groundingdino/config/GroundingDINO_SwinT_OGC.py", "weights/groundingdino_swint_ogc.pth")

이미지 불러오기

url = 'https://p.turbosquid.com/ts-thumb/OC/ifQmXg/Sd/001/png/1617679051/600x600/fit_q87/492768164adc687ef4e17b2b7b4dfc490c93b46f/001.jpg'

img = Image.open(requests.get(url, stream=True).raw)

plt.imshow(img)

raw

객체 탐지

def annotate_on_frame(image_url, text_prompt, box_treshold = 0.35, text_treshold = 0.25):
    """
    Annotates an input image with detected objects and associated phrases based on a given text prompt with GroundingDINO.
    
    Parameters:
    - image_url (str): 주석을 달 이미지 url 또는 경로
    - text_prompt (str): 탐지할 객체에 대한 텍스트 프롬프트
    - box_threshold (float, optional): 예측된 바운딩 박스 신뢰도 임계값(기본값: 0.35)
    - text_threshold (float, optional): 예측된 클래스의 신뢰도 임계값(기본값: 0.25)
    
    Returns:
    - annotated_frame (numpy.ndarray): 바운딩 박스와 주석이 달린 이미지
    """   
    
    image_source, image = load_image(requests.get(image_url, stream=True).raw)

    boxes, logits, phrases = predict(
        model=model,
        image=image,
        caption=text_prompt,
        box_threshold=box_treshold,
        text_threshold=text_treshold
    )

    annotated_frame = annotate(image_source=image_source, boxes=boxes, logits=logits, phrases=phrases)
    return annotated_frame
TEXT_PROMPT = "safety-vest. hardhat."
BOX_TRESHOLD = 0.35
TEXT_TRESHOLD = 0.25

annotated_frame = annotate_on_frame(url,TEXT_PROMPT,BOX_TRESHOLD, TEXT_TRESHOLD)

plt.imshow(cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB))

result