YOLO(You Only Look Once)
이미지에서 객체의 위치와 클래스를 한 번에 예측하는 고속 객체 탐지 모델
- 한 번에 예측: 이미지를 격자(Grid)로 나누고, 각 영역에서 객체 유무와 위치를 동시에 예측
- 실시간 가능: 빠른 처리 속도로 영상 스트리밍에 활용 가능
- 다중 객체 인식: 하나의 이미지에서 여러 객체를 동시에 탐지 가능
YOLOv8
Ultralytics에서 제공하는 객체 탐지(Object Detection) 분야에서 실시간 처리와 높은 정확도를 모두 갖춘 최신 딥러닝 모델
보안, 스마트 팩토리, 자율 주행 등 다양한 실시간 컴퓨터 비전 시스템에 유용
Ultralytics YOLOv8을 활용한 이미지 및 실시간 객체 탐지
환경 설정
YOLOv8 설치
pip install ultralytics
라이브러리 임포트
from ultralytics import YOLO
import cv2
from matplotlib import pyplot as plt
YOLOv8을 활용한 이미지 객체 탐지
YOLOv8 모델 로드
model = YOLO('yolov8n.pt') # 'n': nano, 가장 가벼운 모델
이미지 입력 및 탐지
image_path = 'output.jpeg' # 이미지 파일 경로
results = model(image_path) # 이미지를 모델에 입력하여 객체 탐지 수행
result = results[0] # 탐지 결과 출력
탐지 결과 시각화
img_with_boxes = result.plot() # 탐지된 객체들이 표시된 이미지를 가져옴, result.plot(): 바운딩 박스와 라벨이 포함된 이미지를 반환
# Matplotlib을 사용하여 이미지 출력
plt.imshow(cv2.cvtColor(img_with_boxes, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
YOLOv8을 활용한 실시간 객체 탐지 (웹캠)
실시간 탐지 코드 조각
cap = cv2.VideoCapture(0) # 기본 웹캠 사용
while True:
ret, frame = cap.read() # 프레임을 하나씩 읽어옴
if not ret:
break # 프레임을 못 읽었으면 반복문 종료
results = model(frame) # 객체 탐지 수행
annotated_frame = results[0].plot() # 결과 시각화
cv2.imshow("YOLOv8 Detection", annotated_frame) # 화면에 출력
if cv2.waitKey(1) & 0xFF == ord('q'):
break # 사용자가 'q' 키를 누르면 반복 종료
cap.release()
cv2.destroyAllWindows()
cv2.imshow()로 실시간 바운딩 박스 결과를 확인할 수 있고, q 키로 종료
사용자 정의 모드에 따른 실시간 객체 탐지 (Image mode/ Webcam mode)
pip install opencv-python pillow
from ultralytics import YOLO
import cv2
from matplotlib import pyplot as plt
from openai import OpenAI
from PIL import Image
import requests
from io import BytesIO
import os
import re
# YOLO 모델 로드
model = YOLO("yolov8n.pt")
# OpenAI 클라이언트
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY0"))
# 파일 이름 정리 함수 (특수문자 제거 + 공백은 _로)
def sanitize_filename(prompt: str) -> str:
filename = re.sub(r"[^\w\s-]", "", prompt)
filename = re.sub(r"\s+", "_", filename)
return filename[:50] # 너무 길지 않게 자름
# DALL·E로 이미지 생성 함수
def generate_image_with_dalle(prompt: str, save_path: str):
response = client.images.generate(
model="dall-e-3", prompt=prompt, size="1024x1024", quality="standard", n=1
)
image_url = response.data[0].url
image_data = requests.get(image_url).content
img = Image.open(BytesIO(image_data))
img.save(save_path)
# 모드 선택
mode = input("모드를 선택하세요 (image/webcam): ")
if mode == "image":
# 사용자 입력 프롬프트
prompt = input("이미지 생성 프롬프트를 입력하세요: ")
filename = sanitize_filename(prompt)
# 이미지 저장 경로
image_path = f"{filename}.jpeg"
result_path = f"{filename}_detected.jpeg"
# 이미지 생성
generate_image_with_dalle(prompt, image_path)
# YOLOv8 객체 탐지
results = model(image_path)
result = results[0]
img_with_boxes = result.plot()
# 탐지 결과 이미지 저장
cv2.imwrite(result_path, img_with_boxes)
# 시각화
plt.imshow(cv2.cvtColor(img_with_boxes, cv2.COLOR_BGR2RGB))
plt.axis("off")
plt.title("YOLOv8 Detection Result")
plt.show()
print(f"\n이미지 저장됨: {image_path}")
print(f"탐지 결과 저장됨: {result_path}")
elif mode == "webcam":
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
results = model(frame)
annotated_frame = results[0].plot()
cv2.imshow("YOLOv8 Webcam Detection", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
- yolov8n.pt, yolov8s.pt, yolov8m.pt, yolov8l.pt, yolov8x.pt: 모델 크기 및 성능 차이 존재
- 이미지 또는 영상 크기가 클수록 처리 속도에 영향이 큼
- 실시간 탐지는 CPU보다 GPU 환경에서 훨씬 더 원활하게 실행됨
웹캠버전 성능도 나쁘지 않음 고양이 잘맞춤
'⊢ AI 모델 활용' 카테고리의 다른 글
OpenCV, YOLOv8, PyQt5활용 실시간 객체 탐지 서비스 구현 (1) | 2025.03.27 |
---|---|
FastAI: 사전 학습된 모델을 활용한 이미지 분류 (4) | 2025.03.27 |
ChatGPT와 ElevenLabs실습: 텍스트에서 음성까지 (2) | 2025.03.26 |
FastAPI를 활용한 API 구축 (2) | 2025.03.25 |
Stable Diffusion을 활용한 이미지 생성 (0) | 2025.03.25 |