OpenCV와 YOLOv8을 활용한 실시간 객체 탐지 서비스 구현
OpenCV와 최신 YOLOv8 모델, 그리고 PyQt5를 활용하여 실시간 객체 탐지 GUI 프로그램을 만듦
사용 기술 스택
객체 탐지 YOLOv8 (ultralytics 라이브러리)
영상 처리 OpenCV (cv2)
GUI 구성 PyQt5 (QWidget, QLabel, QPushButton, QVBoxLayout)
*PyQt5
Python에서 데스크탑 애플리케이션(GUI 앱)을 만들 수 있게 해주는 라이브러리
QWidget | 모든 GUI 요소의 기본 (창, 버튼 등) |
QLabel | 텍스트나 이미지 보여주는 위젯 |
QPushButton | 클릭 가능한 버튼 |
QVBoxLayout | 위에서 아래로 위젯 정렬하는 레이아웃 |
QTimer | 일정 시간마다 반복적으로 이벤트 실행 (ex: 20ms마다 프레임 갱신) |
QImage, QPixmap) | 이미지를 GUI로 보여줄 때 사용하는 포맷들 |
- TKinter보다 복잡한 UI 구현 가능
- C++ 기반 GUI 프레임워크인 Qt를 Python에서 쓸 수 있도록 한 라이브러리
- 버튼, 드롭다운, 탭, 이미지뷰터, 입력창 등 모두 가능
사전 준비
pip install ultralytics opencv-python pyqt5
코드 구성 개요
- YOLOv8 모델 로드
ultralytics.YOLO이용 yolov8x.pt 가중치 로드
실시간 프레임마다 객체 탐지 수행 - PyQt5 기반 UI 구상
QWidget을 상속한 VideoCaptureWidget 클래스 정의
Start Webcam, Stop, Webcam 버튼으로 웹캠 제어
QLabel로 탐지 결과 화면 표시 - OpenCV로 웹캠 프레임 처리
cv2.VideoCapture(0)을 통해 웹캠 캡처
QTimer로 20ms마다 프레임 갱신
YOLO 추론 → 바운딩 박스 그리기 → PyQt5 이미지 변환 → 화면 표시
from ultralytics import YOLO
import cv2
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QImage, QPixmap
class VideoCaptureWidget(QWidget):
def __init__(self):
super().__init__()
self.model = YOLO('yolov8x.pt') # YOLOv8 모델 로드
# UI 구성
self.setWindowTitle("실시간 객체 탐지")
self.image_label = QLabel(self)
self.layout = QVBoxLayout()
self.layout.addWidget(self.image_label)
self.start_button = QPushButton("Start Webcam", self)
self.start_button.clicked.connect(self.start_webcam)
self.layout.addWidget(self.start_button)
self.stop_button = QPushButton("Stop Webcam", self)
self.stop_button.clicked.connect(self.stop_webcam)
self.layout.addWidget(self.stop_button)
self.setLayout(self.layout)
# 웹캠 초기화
self.capture = None
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_frame)
def start_webcam(self):
self.capture = cv2.VideoCapture(0)
self.timer.start(20) # 50fps
def stop_webcam(self):
self.timer.stop()
if self.capture:
self.capture.release()
def update_frame(self):
ret, frame = self.capture.read()
if ret:
results = self.model(frame)
result = results[0]
img_with_boxes = result.plot()
rgb_image = cv2.cvtColor(img_with_boxes, cv2.COLOR_BGR2RGB)
h, w, ch = rgb_image.shape
bytes_per_line = ch * w
qt_image = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888)
self.image_label.setPixmap(QPixmap.fromImage(qt_image))
def closeEvent(self, event):
if self.capture:
self.capture.release()
if __name__ == "__main__":
app = QApplication([])
window = VideoCaptureWidget()
window.show()
app.exec_()
구현 흐름
모델 준비 → 웹캠에서 프레임 획득 → 객체 탐지 → 바운딩 박스 시각화 → PyQt5로 표시
PyQt5 버튼으로 웹캠을 직접 제어 가능
YOLOv8의 탐지 성능을 실시간 GUI 앱으로 체험
'⊢ AI 모델 활용' 카테고리의 다른 글
음성 생성과 번역을 활용한 데스크톱 번역기 (0) | 2025.03.28 |
---|---|
ChatGPT, FastAPI 활용 챗 서비스 구현 (0) | 2025.03.27 |
FastAI: 사전 학습된 모델을 활용한 이미지 분류 (4) | 2025.03.27 |
Ultralytics YOLOv8를 활용한 이미지 및 실시간 객체 탐지 (1) | 2025.03.26 |
ChatGPT와 ElevenLabs실습: 텍스트에서 음성까지 (2) | 2025.03.26 |