2 minute read

Yolo V8 Basic


Install (Dependency)

Windows


Mac / Linux

pip install ultralytics
pip install opencv-python


Real-time Detection


Pure Codes

import ultralytics
from ultralytics import YOLO
import cv2

ultralytics.checks()

model = YOLO('yolov8n.pt')

video = cv2.VideoCapture(0)
# video = cv2.VideoCapture('path_to_your_video.mp4')

if not video.isOpened():
    print("Cant open cam")
    exit()
    
while True:
    ret, frame = video.read()
    if not ret:
        print("Cant bring frame")
        break
        
    result = model(frame)
    
    for result in result:
        for box in result.boxes:
            x1, y1, x2, y2 = map(int, box.xyxy[0])
            conf = box.conf[0]
            cls = box.cls[0]
            
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0,255,0), 2)
            label = f"{model.names[int(cls)]} {conf:.2f}"
            cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    
    cv2.imshow("Temp", frame)
    
    if cv2.waitKey(1) & 0xff == ord('q'):
        break

video.release()
cv2.destroyAllWindows()


Codes Explain

# pre-train 된 yolov8 nano 모델을 사용
model = YOLO('yolov8n.pt') 
# 비디오 객체 선언
video = cv2.VideoCapture(0) 

# 로컬 저장된 영상을 사용
# video = cv2.VideoCapture('path_to_your_video.mp4')

# Error 처리
if not video.isOpened(): 
    print("Cant open cam")
    exit()
while True:
    
    # 비디오 객체 생성
    ret, frame = video.read() 
    if not ret: # 에러 처리
        print("Cant bring frame")
        break
    
    
    # 각 프레임 별 이미지    
    result = model(frame) 
    
    
    # 감지된 객체 처리
    for result in result: 
    # 매 프레임 별 동작. 하나의 프레임에 여러개의 감지된 객체가 생성될 수 있으므로 반복
    
        for box in result.boxes: # 객 객체의 경계 상자
            x1, y1, x2, y2 = map(int, box.xyxy[0]) # 좌표 추출
            conf = box.conf[0] # confidence
            cls = box.cls[0] # class
            
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0,255,0), 2) # 객체 경계 박스 그리기
            label = f"{model.names[int(cls)]} {conf:.2f}" # 라벨 지정
            cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 텍스트 표시
    
    cv2.imshow("Temp", frame)
    
    if cv2.waitKey(1) & 0xff == ord('q'):
        break

video.release()
cv2.destroyAllWindows()


Core Fn

cv2.read

ret, frame = video(object).read()

ret: return True or False.
프레임을 성공적으로 읽을 경우 True 반환.

frame: numpy.ndarray
프레임을 나타내는 이미지 데이터.
numpy 배열로 표현되며 픽셀 정보가 BGR 색상 채널 순서로 저장되어 있다.


box.xyxy[0]

x1, y1, x2, y2 = map(int, box.xyxy[0])

x1, y1: 바운딩 박스의 좌측 상단 모서리 좌표
x2, y2: 바운딩 박스의 우측 하단 모서리 좌표

map: box.xyxy[0] 값을 int로 변환하여 각각 반환


cv2.rectangle

cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)

img: 이미지
pt1: 바운딩 박스 좌측 상단 모서리 좌표 
pt2: 바운딩 박스 우측 하단 모서리 좌표
color: 바운딩 박스 색상 (B, G, R)
thickness: 두께
linetype:  유형. cv2.LINE_8 (실선, 기본값), cv2.LINE_AA(안티 앨러이싱) ...
shift: 좌표를 소수점으로 처리 가능. 기본값은 0


cv2.putText

cv2.putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)

img: 이미지
text: 표시할 텍스트 문자열. 문자열 형식으로 텍스트를 전달
org: 텍스트가 시작될 좌표 (x, y)
fontFace: 텍스트에 사용할 글꼴 유형. (cv2.FONT_HERSHEY_[SIMPLEX] or [PLAIN, DUPLEX...])
fontScale: 글꼴 크기 비율. 실수 
color: 텍스트의 색상. BGR 형식의 튜플로 지정
thickness: 텍스트의 두께
lineType: 선의 유형
bottomLeftOrigin: True일 경우, 텍스트의 좌표 시스템이 아래쪽에서 시작


Results

untitle

untitle

untitle

Leave a comment