My Blog

다양한 정보 – 스타크래프트, 그림AI, 동물, 파이썬 등

파이썬

GroundingDino 를 이용해 객체탐지하고 세그멘테이션에 이용하기

GroundingDino 는 Zero-Shot Object Detection를 수행하는 모델로 정해진 레이블만 탐지하는 것이 아니라 입력으로 주어진 텍스트를 기반으로 객체탐지를 수행합니다. GroundingDino에 탐지대상에 대한 텍스트를 전달하면 탐지대상에 대한 박스를 예측해서 결과로 줍니다. GroundinigDino의 결과로 나온 박스들을 SAM(Segment Anything Model)에 전달하면 프롬프트를 통한 세그멘테이션을 수행할 수 있습니다. 결과적으로 텍스트를 전달해 세그멘테이션을 하는 것과 같습니다.

이 글에서는 GroundingDino를 이용해 객체탐지를 하고 추가로 세그멘테이션까지 해보겠습니다.

목차

라이브러리 설치

transformers, torch, matplotlib, numpy, PIL, opencv를 설치해줍니다. 모델 사용과 이미지를 다루기 위한 라이브러리들입니다.

torch는 https://pytorch.kr/get-started/locally/ 이 링크에서 환경에 맞는 명령어로 설치해줍니다.

코랩은 위의 라이브러리들이 설치되어 있습니다.

GroundingDino 객체탐지 하기

필요한 라이브러리를 불러오고 cuda 사용 여부에 따라 device를 설정합니다.

GroundingDino는 base모델과 tiny모델이 있는데 base 모델을 이용해서 객체탐지를 하겠습니다. 허깅페이스에서 모델을 불러옵니다.

객체탐지 할 이미지를 PIL.Image와 opencv를 이용해 불러오겠습니다. AI로 만든 이미지를 이용하겠습니다. 투명도가 있는 RGBA 이미지의 경우 RGB 타입으로 바꿔줍니다. opencv로 불러온 이미지는 시각화에 쓰이게 됩니다.

객체탐지 대상 이미지
객체탐지 대상 이미지

고양이와 강아지를 탐지하기 위한 텍스트를 만들겠습니다. 텍스트의 작은 변화가 결과에 영향을 주는데 ‘cat. dog.’로 입력한 경우는 아래의 프롬프트와 결과가 다르게 나옵니다.

다음으로 모델에 이미지와 텍스트를 전달합니다.

여기서 box_threshold와 text_threshold를 크게 하면 점수가 높은 대상만 탐지를 하기 때문에 탐지가 잘 안되면 값을 내리면 됩니다. 너무 낮게 하면 원하지 않는 대상이 탐지 될 수 있습니다.

결과로 나온 results는 다음과 같은 형태입니다. 리스트 안에 딕셔너리가 있고 키 값으로 scores, labels, boxes가 있으며 scores와 boxes는 텐서 타입입니다.

다음 함수를 이용해 results를 이미지 위에 시각화해보겠습니다. opencv를 이용해 도형을 그리는 것은 이 글에 나와있습니다.

결과 이미지를 저장하고 주피터노트북에 출력하겠습니다.

GroundDino 결과 시각화
GroundDino 결과 시각화

SAM에 박스전달해 세그멘테이션 하기

결과로 나온 박스를 전달하는 것 외에는 저번 글과 다를게 없습니다. 저번에는 리스트로 박스를 만들었지만 이번에는 결과로 나온 텐서형태의 박스를 입력 형태에 맞게 약간 변형해 SAM에 전달합니다.

라이브러리와 모델을 불러옵니다.

그리고 boxes를 모델에 전달합니다.

이제 결과로 나온 masks를 시각화해보겠습니다. 코드에 대한 자세한 내용은 이 글에 나와 있습니다.

GroundingDino+SAM
GroundingDino+SAM

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

error: Content is protected !!