
안녕하세요! 딥러닝과 컴퓨터 비전에 관심 많으신 분들을 위해 오늘은 YOLO (You Only Look Once) 모델인 YOLO12와 함께, Ultralytics YOLO 라이브러리를 활용하여 다양한 컴퓨터 비전 태스크를 수행하는 방법을 익히게요!
YOLO12는 단순히 객체 탐지를 넘어, 여러 핵심 컴퓨터 비전 작업을 지원하는 다목적 모델이에요.
다양한 작업 지원:
압도적인 정확도 향상:
YOLO12는 모든 모델 스케일에서 YOLOv10 및 YOLO11과 같은 이전 YOLO 모델에 비해 상당한 정확도 향상
물론, 가장 빠른 이전 모델 대비 속도에서 약간의 트레이드오프가 있지만, 정확도와 효율성 사이의 최적의 균형을 제공하며 YOLO12의 강력한 성능을 입증했어요.
일반적인 객체 감지가 직사각형 바운딩 박스(Axis-Aligned Bounding Box)를 사용하는 반면, OBB는 객체의 회전 각도까지 고려하여 바운딩 박스를 그려요.
이는 위성 이미지의 차량, 비스듬히 놓인 건물 등 방향성이 있는 객체를 더욱 정확하게 탐지하는 데 매우 유용해요.
이제 코드를 통해 Ultralytics YOLO 라이브러리로 다양한 YOLO 모델을 로드하고, 객체 감지, 영역 분할, 포즈 추정, OBB 감지까지 어떻게 수행하는지 살펴보게요.
먼저, 필요한 라이브러리를 임포트해야 해요.
from ultralytics import YOLO
import matplotlib.pyplot as plt
import cv2
import numpy as np
yolo12n.pt 모델을 사용하여 이미지에서 객체를 탐지해요
# YOLO12n 모델 로드
model = YOLO('./model/yolo12n.pt') # 모델 경로 확인 (yolo12n.pt로 가정)
# 이미지에 대한 예측 수행
result = model('./images/109_bus.jpg')
# 결과 시각화
plt.figure(figsize=(8, 8)) # 이미지 크기 조정
plt.imshow(cv2.cvtColor(result[0].plot(), cv2.COLOR_BGR2RGB))
plt.title("Object Detection with YOLO12n")
plt.axis('off')
plt.show()
YOLO11의 인스턴스 분할 모델을 사용하여 객체를 픽셀 단위로 분할해요
# YOLO11n-seg 모델 로드
model = YOLO('./model/yolo11n-seg.pt')
# 이미지에 대한 예측 수행
result = model('./images/109_bus.jpg')
# 결과 시각화
plt.figure(figsize=(8, 8))
plt.imshow(cv2.cvtColor(result[0].plot(), cv2.COLOR_BGR2RGB))
plt.title("Instance Segmentation with YOLO11n-seg")
plt.axis('off')
plt.show()
YOLO11의 포즈 추정 모델을 통해 이미지 속 객체의 주요 관절 포인트를 예측해요
# YOLO11n-pose 모델 로드
model = YOLO('./model/yolo11n-pose.pt')
# 이미지에 대한 예측 수행
result = model('./images/109_bus.jpg')
# 결과 시각화
plt.figure(figsize=(8, 8))
plt.imshow(cv2.cvtColor(result[0].plot(), cv2.COLOR_BGR2RGB))
plt.title("Pose Estimation with YOLO11n-pose")
plt.axis('off')
plt.show()
이제 OBB 모델을 사용하여 회전된 객체들을 감지하고, 그 결과를 자세히 분석하게요!
# YOLO11n-obb 모델 로드
model = YOLO('./model/yolo11n-obb.pt')
# 이미지에 대한 예측 수행 (회전된 차량이 있는 이미지 사용)
result = model('./images/cars.jpg')
# 결과 시각화
plt.figure(figsize=(8, 8))
plt.imshow(cv2.cvtColor(result[0].plot(), cv2.COLOR_BGR2RGB))
plt.title("Oriented Object Detection with YOLO11n-obb")
plt.axis('off')
plt.show()
# 예측 결과 객체 접근
result_temp = result[0]
# 예측 결과 출력 (객체 정보 요약)
print("--- Prediction Result Summary ---")
print(result_temp)
print("\n")
# 첫 번째 감지된 OBB의 바운딩 박스 좌표 (xyxy)
print(f"First OBB Bounding Box (xyxy): {result_temp.obb.xyxy[0].cpu().numpy()}")
# 첫 번째 감지된 OBB의 클래스 인덱스
print(f"Class Index of First OBB: {result_temp.obb.cls[0].cpu().item()}")
# 모든 클래스 이름 매핑
print(f"All Class Names: {result_temp.names}")
# 이미지 데이터와 OBB 정보 추출
image = result_temp.orig_img.copy()
obb_boxes = result_temp.obb.xyxy.cpu().numpy() # xyxy는 일반적으로 AABB를 나타냄
classes = result_temp.obb.cls.cpu().numpy().astype(int)
names = result_temp.names
# 수동으로 바운딩 박스와 클래스 이름 시각화 (OBB 모델로 감지했으나, xyxy 사용 시 AABB로 표시)
# 실제 OBB (회전된 박스)를 그리려면 cv2.boxPoints와 cv2.polylines를 사용해야 합니다.
# 여기서는 간단한 시각화를 위해 xyxy 좌표 기반의 직사각형을 그립니다.
for i, box in enumerate(obb_boxes):
x1, y1, x2, y2 = map(int, box[:4])
# AABB (Axis-Aligned Bounding Box) 그리기
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2) # 초록색 박스
# 클래스 이름 표시
class_name = names[classes[i]]
cv2.putText(image, class_name, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2) # 파란색 텍스트
plt.figure(figsize=(8, 8))
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Manual Bounding Box Visualization (AABB from OBB Model)")
plt.axis('off')
plt.show()
자신만의 데이터셋으로 모델을 학습시키고 싶다면, model.train() 메서드를 사용하면 되어요.
data 인수에 YAML 형식의 데이터셋 설정 파일 경로를 넘겨주고, epochs와 imgsz 등 학습 파라미터를 설정하면 되어요. 하지만 이 부분은 나중에 모델 학습 방법에 대해서 게시글을 쓸 때에 적을게요!
오늘 Velog 게시글에서는 YOLO12의 발전된 특징과 함께, Ultralytics YOLO 라이브러리를 활용하여 객체 감지, 인스턴스 분할, 포즈 추정, 그리고 방향성 객체 감지 (OBB)와 같은 다양한 컴퓨터 비전 태스크를 수행하는 방법을 살펴보았어요.
YOLO12는 강력한 성능과 유연성을 바탕으로 다양한 AI 애플리케이션 개발에 큰 기여를 할 것으로 기대하고 있어요.
그리고 이 글이 YOLO 모델을 이해하고 활용하는 데 도움이 되셨기를 바래요!
작성일 : 2025.07.07
작성자 : 발라