iBetter Books
수정

YOLO(You Only Look Once)는 객체 검출 분야에서 가장 유명한 모델 계열입니다. 한 번의 신경망 통과로 화면의 모든 객체를 동시에 찾아내 빠르면서도 정확합니다. Ultralytics가 관리하는 YOLO는 얼굴뿐 아니라 사람·자동차 등 온갖 객체를 검출하는데, 이 장에서는 이를 얼굴 검출에 활용하는 두 갈래 길을 정직하게 짚고, 코드로 돌려 봅니다.

먼저 짚을 점 — 공식 "얼굴 전용" 모델은 없다

오해를 먼저 풀어야 합니다. Ultralytics가 기본 제공하는 모델(예: yolo11n.pt)은 COCO라는 데이터셋으로 학습되어 "사람(person)"은 검출하지만 "얼굴"이라는 별도 클래스는 없습니다. 즉 기본 모델로는 사람의 몸 전체를 박스로 잡지, 얼굴만 따로 잡지는 못합니다.

그래서 YOLO로 얼굴을 검출하는 길은 둘입니다.

방법 모델 특징
사람 검출 후 활용 공식 yolo11n.pt 안정적이지만 얼굴이 아닌 몸 전체 박스
얼굴 가중치 사용 커뮤니티 yolov11n-face.pt 얼굴 박스 + 5점 키포인트, 비공식

이 책에서 말하는 "YOLO 얼굴 검출"은 두 번째, 커뮤니티가 WIDERFACE라는 얼굴 데이터셋으로 학습해 공개한 얼굴 전용 가중치를 쓰는 방식입니다. 이 가중치들은 공식 배포가 아니므로, 출처와 라이선스를 확인하고 내려받아야 합니다.

얼굴 가중치로 검출하기

커뮤니티 얼굴 가중치 파일(yolov11n-face.pt 등)을 작업 폴더에 두고 다음 내용을 yolo_detect.py로 저장합니다. Ultralytics의 사용법은 가중치만 얼굴용으로 바꾸면 일반 검출과 똑같습니다.

# 파일: yolo_detect.py"""Ultralytics YOLO 얼굴 가중치로 얼굴을 검출한다."""import cv2from ultralytics import YOLO# 커뮤니티 얼굴 검출 가중치 (WIDERFACE 학습)model = YOLO("yolov11n-face.pt")img = cv2.imread("sample.jpg")result = model(img)[0]   # 결과 목록의 첫 번째# 박스: r.boxes.xyxy = [[x1, y1, x2, y2], ...], 신뢰도: r.boxes.conffor box, conf in zip(result.boxes.xyxy, result.boxes.conf):    x1, y1, x2, y2 = map(int, box)    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)    cv2.putText(img, f"{float(conf):.2f}", (x1, y1 - 6),                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1, cv2.LINE_AA)cv2.imwrite("yolo_result.jpg", img)

YOLO 얼굴 검출 결과

Ultralytics의 결과 객체에서 result.boxes.xyxy는 박스 좌표를 (x1, y1, x2, y2) 형태로, result.boxes.conf는 신뢰도를 담습니다. 이 값들은 PyTorch 텐서라서, 화면에 그릴 때는 위처럼 정수나 실수로 변환해 씁니다.

검출과 키포인트를 한 번에

얼굴 가중치 중에는 박스와 함께 5개 키포인트(양눈·코·양 입꼬리)를 돌려주는 것도 있습니다. 이 경우 result.keypoints로 좌표에 접근합니다.

# 파일: yolo_keypoints.py (얼굴 키포인트 지원 가중치인 경우)import cv2from ultralytics import YOLOmodel = YOLO("yolov11n-face.pt")img = cv2.imread("sample.jpg")result = model(img)[0]# 키포인트가 있으면 점으로 표시if result.keypoints is not None:    for person_kpts in result.keypoints.xy:   # 얼굴별 [[x, y], ...]        for (px, py) in person_kpts:            cv2.circle(img, (int(px), int(py)), 2, (0, 0, 255), 2)cv2.imwrite("yolo_kpts_result.jpg", img)

이렇게 검출과 랜드마크를 한 번의 추론으로 동시에 얻을 수 있어, 정렬이 필요한 인식 파이프라인의 앞단으로 효율적입니다.

실무 팁. 모델 이름 끝의 n은 크기 등급입니다. n(nano)은 가장 작고 빠르며, s·m·l·x로 갈수록 커지고 정확해지지만 느립니다. 라즈베리파이나 노트북 CPU라면 n이나 s, 정확도가 중요하고 GPU가 있다면 m 이상을 고르세요. 같은 가중치 안에서 등급만 바꿔도 속도·정확도 균형을 손쉽게 조절할 수 있습니다.

이 장에서 기억할 것

YOLO는 한 번의 통과로 객체를 검출하는 빠르고 정확한 모델이지만, 공식 모델에는 얼굴 전용 클래스가 없어 얼굴 검출에는 커뮤니티가 WIDERFACE로 학습한 비공식 얼굴 가중치를 씁니다. Ultralytics의 YOLO("...-face.pt")로 불러 result.boxes.xyxy·result.boxes.conf로 박스와 신뢰도를, 지원 가중치라면 result.keypoints로 랜드마크까지 한 번에 얻습니다. 모델 등급(n·s·m·l·x)으로 속도와 정확도를 조절합니다. 이제 검출기를 모두 만나 봤으니, 다음 장에서 같은 사진으로 이들을 나란히 비교해 봅니다.