객체 탐지 with GroundingDINO: 소개 및 사용 가이드
GroundingDINO 개요
GroundingDINO란 컴퓨터 비전과 자연어 처리의 교차점에서 사용되는 모델로, 이미지에서 특정 객체의 위치를 탐지하는 Zero-Shot Object Detection 모델이다. DINO(Detection Transformer with IoU-aware Contrastive Learning)를 기반으로 한 모델로, 이미지와 텍스트 간의 상관관계를 학습하여 더 정확한 물체 인식과 위치 지정이 가능하다. 대규모 데이터셋에서 pre-train 된 self-supervised learning 모델로, 새로운 클래스에 대한 annotated data가 없어도 객체 탐지가 가능하다.
GroundingDINO 원리
Grounded DINO는 이중 인코더-단일 인코더 아키텍처를 사용한다.
- 이미지 backbone과 텍스트 backbone을 사용해 각각에서 feature를 추출한다. 이후, cross-modality feature 융합을 위해 feature enhancer에 공급된다.
- Deformable self-attention과 일반 self-attention을 사용해 이미지와 텍스트 각각의 feature를 향상시킨다. 그리고 둘의 상호작용을 개선하기 위해 image-to-text 및 text-to-image cross-attention을 추가한다. 이를 통해 두 modality 간의 feature를 결합하고, 보다 정교한 정보가 생성된다.
- 텍스트 기반의 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)
객체 탐지
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))