Ultralytics의 YOLOv8은 23년 1월에 출시된 YOLO detector 시리즈 모델이다.
https://github.com/ultralytics/ultralytics
https://docs.ultralytics.com/modes/predict/#plotting-results
모델은 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은 도큐먼트화 및 모듈화가 친화적으로 잘 되어 있어 사용에 크게 어려울 것이 없다. 바로 사용해보도록 하자!
시작에 앞서, 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을 훈련해서 사용해 보는 것도 좋겠다.