Разработка системы детекции лиц (Face Detection)
Детекция лиц — первый этап почти любого face-пайплайна. Задача: найти все лица на изображении и вернуть bounding boxes с confidence score. Звучит просто, но реальные условия добавляют сложности: маленькие лица на расстоянии, профильные ракурсы, частичные перекрытия, плохое освещение, маски.
Современные детекторы лиц
SCRFD (Sample and Computation Redistribution for Face Detection, InsightFace) — текущий лучший по соотношению скорость/качество. SCRFD-10GF: 95.2% AP на WiderFace Hard.
RetinaFace — классика с landmark detection (5 точек: глаза, нос, уголки рта). Используется для alignment перед face recognition.
YOLOv8 fine-tuned на WiderFace — универсальный вариант при наличии кастомных требований.
from insightface.app import FaceAnalysis
import cv2
# InsightFace: детекция + landmark detection
app = FaceAnalysis(allowed_modules=['detection'])
app.prepare(ctx_id=0, det_size=(640, 640))
def detect_faces(image_path: str) -> list[dict]:
img = cv2.imread(image_path)
faces = app.get(img)
results = []
for face in faces:
results.append({
'bbox': face.bbox.astype(int).tolist(), # [x1, y1, x2, y2]
'confidence': float(face.det_score),
'landmarks': face.kps.astype(int).tolist() # 5 keypoints
})
return results
Детекция мелких лиц
Стандартные детекторы теряют лица меньше 16×16 пикселей. Для камер видеонаблюдения с большим расстоянием до объекта:
- Image tiling: разбиваем изображение на перекрывающиеся тайлы, детектируем на каждом, мержим результаты через NMS
- SAHI (Slicing Aided Hyper Inference) — автоматический tiling с merge:
from sahi import AutoDetectionModel
from sahi.predict import get_sliced_prediction
model = AutoDetectionModel.from_pretrained(
model_type='yolov8',
model_path='face_detector.pt',
confidence_threshold=0.3
)
result = get_sliced_prediction(
image='crowd.jpg',
detection_model=model,
slice_height=512,
slice_width=512,
overlap_height_ratio=0.2,
overlap_width_ratio=0.2
)
Производительность на различном железе
| Детектор | WiderFace Hard AP | Latency CPU | Latency GPU (T4) |
|---|---|---|---|
| SCRFD-500MF | 90.5% | 8 ms | 1.5 ms |
| SCRFD-10GF | 95.2% | 45 ms | 4 ms |
| RetinaFace-R50 | 94.9% | 90 ms | 7 ms |
| YOLOv8n (WiderFace) | 93.1% | 12 ms | 2 ms |
Детекция лиц в масках
Пандемия сформировала отдельный класс задач — детекция лиц в медицинских масках. MAFA датасет содержит 35,806 размеченных лиц в масках. Дообучение стандартного детектора на MAFA+WiderFace: AP на masked faces повышается с 65% до 89%.
| Задача | Срок |
|---|---|
| Детекция, стандартные условия, готовая модель | 1 неделя |
| Кастомные условия (маски, камеры, освещение) | 2–3 недели |
| Детекция мелких лиц, оптимизация pipeline | 3–5 недель |







