이전 포스트에서는 YOLO v3 로 Face Detection을 진행하였다. 그렇다면 이후버전인 YOLO v5의 성능은 어떨까? 문득 궁금해서 구글링한 결과 v5의 경우 Darknet이 아닌 pytorch에서 불러올 수 있으며 정식 yolo버전으로 인정하지 않는다는 의견도 존재했다.
v5는 이전버전에 비해 용량도 낮고 성능도 개선되었다고 한다. 그렇다면 직접 YOLO v5 모델을 가져와서 실습해보도록 하자.
실제 프로젝트에서는 threshold를 쉽게 조절할 수 있는 yolo v3를 쓰도록 한다.
YOLO v5는 4가지의 모델로 소개되었다.
YOLOv5s, YOLOv5m, YOLOv5l, YOLOv5x로 간단하게 small, medium, large, xlarge로 이름지어졌다.
backbone이나 head는 모두 동일하지만, depth_multiple(model depth multiple)과 width_multiple(layer channel multiple)이 다릅니다. large가 1.0으로 기준이 되는 크기로 생각하시면 좋다.
이후에서는 YOLOv5s 모델을 가지고 실습해보도록 하자. 이전과 마찬가지로 pre-trained 모델을 불러와서 얼굴인식에 바로 사용할 것이다.
import torch
import cv2
# Image
img_path = 'static/img/driver4.jpg'
img = cv2.imread(img_path)
# Model
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
본격적으로 object detection을 위해 model의 해당 이미지를 넣어주었다. 이를 분석용이하게 판다스 라이브러리를 통해 out이라는 클래스로 받았다.
# Inference
results = model(img)
out = results.pandas().xyxy[0]
print(out)
위와 같이 roi의 좌표값, confidnce level, class라벨을 리턴하는 것을 볼 수 있다.
out에 담겨있는 결과 중 roi 좌표값을 사용하여 open cv를 통해 해당 이미지에 정보를 표시하였다.
out_list=[]
for i in range(len(out)):
outs = out.iloc[i,:].tolist()
out_list.append(outs)
# 좌표
left= int(out_list[i][0])
top= int(out_list[i][1])
right=int(out_list[i][2])
bottom=int(out_list[i][3])
label = out_list[i][6]
# 정보표시
cv2.rectangle(img, (left,top),(right,bottom),(0,255,0),3)
cv2.putText(img,label,(left,top),cv2.FONT_HERSHEY_COMPLEX, fontScale=2, color=(0,0,255), thickness=1)
cv2.imshow(img)
[참고자료]