일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- AI 기술
- tts
- 뉴럴링크
- 딥마인드
- TRANSFORMER
- ubuntu
- PYTHON
- 일론 머스크
- 티스토리챌린지
- 가상환경
- 시간적 일관성
- ControlNet
- 생성형 AI
- LORA
- 아두이노
- 딥러닝
- 휴머노이드 로봇
- AI
- 트랜스포머
- 서보모터
- 확산 모델
- LLM
- 멀티모달
- 우분투
- ChatGPT
- OpenAI
- 오픈AI
- 메타
- 인공지능
- 오블완
- Today
- Total
AI 탐구노트
SAHI 의 적용 : 작은 물체 감지 테스트 본문
영상에서 감지해야 할 객체의 크기가 아주 작다면 어떻게 할까요? 어차피 영상이 감지 모델의 입력으로 들어가면 모델 내부의 입력 데이터의 크기에 따라 다시 resize 될텐데 대부분 이 값이 영상의 크기보다는 작죠. 그러니, 영상 속에 작은 객체가 있다면 이는 더더욱 감지하기 어려워질 겁니다. 그래서, 입력 영상 이미지를 타일링해서 각각에 대해 감지를 진행하고 결과를 취합하는 방식을 이용하기도 합니다. 이런 접근법을 제시한 것이 SAHI라는 기술인데요... 이에 대해서는 예전 글에서 공유 드린 바가 있습니다.
이번 글에서는 SAHI 기법이 적용된 Python 패키지 (Roboflow에서 개발한 supervision)를 이용해 작은 물체의 객체를 감지하는 예시를 보여 드리겠습니다.
환경 구성
대략 다음과 같은 패키지가 필요합니다.
$ pip install supervision ultralytics opencv-python torch torchvision torchaudio
테스트 영상
테스트에 사용할 영상은 실제 밭에서 비둘기가 창궐(?)한 영상의 일부입니다. 영상 내용을 보면, 이런 장면은 농촌에서 흔히 볼 수 있죠. 콩을 심고 나서 싹이 나올라 치면 비둘기나 까치 같은 녀석들이 와서 휘젓고 가는건데, 이 때를 잘못 넘기면 그 농사 짓고 계시는 분들이 하시는 말씀을 들은 적이 있습니다. 그렇다고 매번 밭에 나가서 새만 쫓을 수도 없는 노릇이고... 그래서 정말 다양한 방편을 도입하고 계시다고 합니다.
원래는 cap_from_youtube 패키지를 이용해 직접 Youtube URL로부터 작업하려고 했는데 아쉽게도 제가 사용하는 우분투에서는 AV1 코덱을 하드웨어 가속으로 지원 하지 않아 영상 일부를 다운받은 다음에 shotcut으로 불러서 다시 내보내기를 하는 등의 시행착오를 거쳐야 했습니다.
테스트 코드
테스트 코드는 Ultralytics의 Yolo v8모델을 사용합니다. '새'라는 객체에 대해 별도로 추가학습을 하거나 미세 조정을 한 것은 아니고 Ultralytics에서 공개한 사전 학습 모델 가중치를 그대로 이용했습니다. 이런 이유로 감지 결과 자체는 기대만큼 아주 훌륭하지는 않다는 것을 감안하셔야 합니다.
import cv2
import numpy as np
import supervision as sv
import torch
from ultralytics import YOLO
from datetime import timedelta
cap = cv2.VideoCapture('birds3_out.mp4')
cap.set(cv2.CAP_PROP_POS_MSEC, 20000)
# YOLO 모델 로드
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = YOLO("yolov8x.pt")
model.to(device)
# 비디오 출력 설정 (해당 기능 사용 시 필요)
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# Callback 함수 정의
def callback(image_slice: np.ndarray) -> sv.Detections:
result = model(image_slice)[0]
detections = sv.Detections.from_ultralytics(result)
# 'bird' 클래스만 필터링
bird_class_id = 14 # COCO 데이터셋에서 bird 클래스 ID
mask = detections.class_id == bird_class_id
return detections[mask]
# Inference Slicer 초기화
slicer = sv.InferenceSlicer(callback=callback)
# Box 및 Label Annotator 초기화
box_annotator = sv.BoxAnnotator()
label_annotator = sv.LabelAnnotator()
# namedWindow 생성
cv2.namedWindow("Birds detection", cv2.WINDOW_NORMAL)
#cv2.resizeWindow(winname='Birds detection', width=960, height=640)
# 비디오 프레임 처리 루프
while cap.isOpened():
ret, frame = cap.read()
if not ret: break
# 객체 검출
detections = slicer(frame)
# 검출 결과 주석 추가
annotated_frame = box_annotator.annotate(scene=frame, detections=detections)
annotated_frame = label_annotator.annotate(scene=annotated_frame, detections=detections)
# 결과 표시 및 저장
cv2.imshow("Birds detection", annotated_frame)
# 'q'를 누르면 종료
key = cv2.waitKey(1)
if key == ord('q'): break
# 리소스 해제
cap.release()
cv2.destroyAllWindows()
테스트 결과
SAHI 기법을 적용한 결과입니다. slicer는 기본 설정값을 이용합니다.(기본 타일 사이즈 : 320x320) 결과는 slicer를 사용하지 않은 경우보다는 훨씬 감지 성능이 높게 나옵니다. 물론 slicer가 작동했음에도 감지를 못하는 경우가 여전히 많이 있긴 합니다. 아래 사진도 감지를 잘 한 축에 속하는 경우를 캡처한 것인데 감지 못한 비둘기들이 많이 보이죠. 하지만 앞서 언급처럼 추가학습과 미세조정 없이 이 정도면 상당히 좋은 축에 속한다고 할 수 있겠습니다.
정리하며
처음에는 입력 이미지를 그냥 타일로 잘라서 모델을 호출하는 작업을 별도로 하려고 했는데, 마침 Roboflow에서는 이 작업을 이미 구현해서 Supervision 내에 포함시켜 두었고, 덕분에 손쉽게 적용 테스트를 해 볼 수 있었습니다. 비록 원하는 클래스(예:'새')의 데이터로 추가적인 학습을 하거나 미세 조정을 하지는 못했기에 결과가 아주 만족스럽지는 않았지만, 그래도 가능성은 충분히 확인한 것 같습니다.
작은 물체 감지(Small Object Detection)은 드론/위성 영상 분석이나 의료 분야 등 다양한 산업 현장이나 자율주행의 안전성 등을 위해 반드시 필요한 기술입니다. 작은 물체를 놓치면 위험도가 증가하거나 중요한 정보를 잃어버릴 수 있는 그런 분야 말이죠.
간단히 타일링을 통해 성능을 높일 수 있다는 측면에서보면 SAHI는 콜롬부스의 달걀 같은 느낌을 줍니다. 비전 기술과 모델의 고도화도 꼭 필요 하지만 그와 함께 SAHI와 같이 기존과는 다른 과감한 아이디어가 더 많이 나오길 바래 봅니다.
'DIY 테스트' 카테고리의 다른 글
직소퍼즐, 집중과 휴식이 함께 할 수 있는 게임 (0) | 2025.01.08 |
---|---|
AI를 이용한 간단한 안면 식별 서비스 개발 테스트 (1) | 2025.01.07 |
흡연 감지 : 다같이 사는 세상, AI로 유도하는 작은 배려 (1) | 2025.01.04 |
인공지능 영상 분석으로 화재를 감지하는 기술 (9) | 2025.01.02 |
마법같은 숫자의 조합 - 마방진(魔方陣) (2) | 2024.12.31 |