실사 인물 모자이크 파이프라인
개요
이미지 및 영상에서 실사 인물을 탐지하여 신체 윤곽 기준으로 전신 모자이크를 적용하는 파이프라인.
처리 대상
| 입력 타입 |
설명 |
| 실사 사진 |
인물이 포함된 정지 이미지 |
| 실사 영상 |
인물이 포함된 동영상 |
| 애니메이션/일러스트 |
추후 확장 고려 (현재 범위外) |
모델 선정: YOLO11
선정 이유
- Ultralytics YOLO11 (2024년 9월 출시)
- COCO 데이터셋에 person 클래스(class ID 0)가 포함되어 있어 별도 학습 불필요
- YOLOv8 대비 정확도 +2.1%, 속도 +22%, 파라미터 -16% 향상
- 동일 패키지(
ultralytics) 내에서 트래킹(BoT-SORT/ByteTrack) 기본 지원
- ONNX / TensorRT / CoreML export 가능
모델별 성능 (RTX 3090, 640px 입력)
| 모델 |
mAP50-95 |
FPS |
용도 |
| yolo11n |
39.5 |
~1100 |
초경량, 실시간 |
| yolo11s |
47.0 |
~730 |
추천 (밸런스 최적) |
| yolo11m |
51.5 |
~370 |
정밀도 우선 |
| yolo11x |
54.7 |
~150 |
최고 정밀도 |
M1 Max (맥북 로컬) 성능
| 모델 |
FPS (GPU/MPS) |
| yolo11n |
~47 |
| yolo11s |
~43 |
| yolo11m |
~29 |
| yolo11x |
~18 |
MPS(Metal Performance Shaders) 백엔드는 FP16 미지원, CUDA 대비 최적화 덜 됨.
1080p 기준 풀파이프라인 약 30 FPS로 실시간 처리 가능.
파이프라인 구조
입력 (영상/이미지)
│
├─ 프레임 추출 (OpenCV VideoCapture)
│
├─ 사람 탐지 (YOLO11, class=[0])
│ └─ model.track(frame, persist=True, classes=[0], conf=0.5)
│ └─ 반환: 바운딩 박스 (xyxy) + 트래킹 ID
│
├─ 모자이크 적용 (OpenCV)
│ └─ ROI 추출 → downscale (1/10) → upscale (INTER_NEAREST)
│ └─ 필요시 GaussianBlur 대체 가능
│
└─ 출력 (처리된 영상/이미지)
핵심 코드
from ultralytics import YOLO
import cv2
model = YOLO('yolo11s.pt')
cap = cv2.VideoCapture('input.mp4')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 사람 탐지 + 트래킹
results = model.track(frame, persist=True, classes=[0], conf=0.5)
# 모자이크 적용
if results[0].boxes.id is not None:
for box in results[0].boxes.xyxy:
x1, y1, x2, y2 = map(int, box)
roi = frame[y1:y2, x1:x2]
h, w = roi.shape[:2]
small = cv2.resize(roi, (w // 10, h // 10))
mosaic = cv2.resize(small, (w, h), interpolation=cv2.INTER_NEAREST)
frame[y1:y2, x1:x2] = mosaic
out.write(frame)
기술 스택
| 항목 |
선택 |
| 탐지 모델 |
YOLO11 (yolo11s.pt) |
| 라이브러리 |
ultralytics, opencv-python |
| 트래커 |
BoT-SORT (기본) 또는 ByteTrack |
| 추론 백엔드 |
PyTorch (dev1), MPS (M1 Max) |
| 최적화 |
TensorRT FP16 (dev1 선택사항) |
| 설치 |
pip install ultralytics opencv-python |
처리 속도 예상
dev1 (RTX 3090)
| 영상 길이 |
처리 시간 |
비고 |
| 10초 |
< 1초 |
|
| 1분 |
~0.3초 |
|
| 10분 |
~3초 |
|
| 1시간 |
~18초 |
|
로컬 (M1 Max)
| 영상 길이 |
처리 시간 |
비고 |
| 10초 |
~1초 |
|
| 1분 |
~2초 |
|
| 10분 |
~20초 |
|
| 1시간 |
~2분 |
|
참고 자료
- Ultralytics YOLO11 공식 문서: https://docs.ultralytics.com/models/yolo11/
- Multi-Object Tracking: https://docs.ultralytics.com/modes/track/
- Person Tracking 튜토리얼: https://aaron.de/en/posts/personentracking-mit-ultralytics-yolo11/
- YOLO11 vs YOLOv8 비교 리뷰: https://www.labellerr.com/blog/yolo11-vs-yolov8-model-comparison/