Object Detection with YOLOv8

정예슬·2023년 6월 20일
0

vision

목록 보기
9/21

about YOLOv8

Ultralytics의 YOLOv8은 23년 1월에 출시된 YOLO detector 시리즈 모델이다.

모델은 nano부터 xlarge 모델까지 있으며, 모델 크기에 따른 mAP와 파라미터 수, 처리속도는 아래 표를 참고하길 바란다.

YOLOv8의 구조는 modified CSPDarknet32 backbone을 사용한다. YOLOv5에서 사용되었던 CSPLayer는 C2f module로 대체되었다. spatial pyramid pooling fast(SPPF) layer가 이미지 특징들을 고정된 크기의 map에 pooling함으로써, 연산 속도를 가속화한다. 각 컨볼루션은 BN(batch normalization)과 SiLU activation을 적용한다. head 부분은 process objectness, classification, regression task로 나누어져, 각 태스크를 개별적으로 수행한다.

모델에 대한 자세한 설명은 이후 따로 포스팅하기로 하고, YOLOv8 모델을 코드로 직접 활용해보도록 하자.


YOLOv8 활용(pretrained model)

사실 YOLOv8은 도큐먼트화 및 모듈화가 친화적으로 잘 되어 있어 사용에 크게 어려울 것이 없다. 바로 사용해보도록 하자!

시작에 앞서, ultralytics 라이브러리를 설치한다.

$ !pip install ultralytics
from ultralytics import YOLO
import cv2
model = YOLO("yolov8s.pt") # 원하는 크기 모델 입력(n ~ x)

result = model.predict("./test.png", save=True, conf=0.5)
plots = result[0].plot()
cv2.imshow("plot", plots)
cv2.waitKey(0)
cv2.destroyAllWindows()

코드가 매우 직관적이라 크게 설명이 필요 없다. 원하는 크기 모델을 YOLO()객체 내에 입력하면 다운로드도 알아서 해준다. source file은 YOLO-NAS와 마찬가지로 영상,링크,다수의 이미지, 디렉토리 등등등이 될 수 있다.

predict의 모든 옵션(파라미터)은 아래를 참조하자.


친절 설명..1 따봉

또는 다음과 같은 입력도 유효하다.

from ultralytics import YOLO
import cv2
model = YOLO("yolov8s.pt")
results = model("./test.png")
plots = results[0].plot()
cv2.imshow("plot", plots)
cv2.waitKey(0)
cv2.destroyAllWindows()

박스 정보를 얻고 싶다면, 다음과 같이 할 수 있다.

from ultralytics import YOLO
import cv2
model = YOLO("yolov8s.pt")

results = model("./test.png")
plots = results[0].plot()

boxes = results[0].boxes

for box in boxes :
    print(box.xyxy.cpu().detach().numpy().tolist())
    print(box.conf.cpu().detach().numpy().tolist())
    print(box.cls.cpu().detach().numpy().tolist())

box.xyxy, box.xonf, box.cls만 입력해도 무방하나, 변환 과정을 거치지 않으면 다음 출력값과 같이 tensor 값으로 나온다. 사용하고자 하면 detach/변환 과정을 거쳐주자.

  • 변환 전

  • 변환 후

영상(mp4, avi..) 스트리밍 형식으로 실행하고 싶은 경우, 다음의 코드를 따르면 된다.

from ultralytics import YOLO
import cv2


model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("./sample.mp4")

while cap.isOpened() :
    ret, frame = cap.read()

    if ret :
        results = model(frame)
        cv2.imshow("Results", results[0].plot())

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()
cap.release()

이 포스팅에서는 간단히 pretrained model만 사용해봤지만, 직접 custom dataset에 YOLOv8 model을 훈련해서 사용해 보는 것도 좋겠다.

profile
춘식이랑 함께하는 개발일지

0개의 댓글