Розробка системи визначення віку та статі за обличчям
Зберіть сотні тисяч селфі — і що? Як витягти вік і стать з помилкою менше 5 років? Ми стикалися з проєктами, де стандартні моделі InsightFace давали MAE 8 років на неякісних знімках. Пересклали пайплайн: мультизадачний підхід з розподіленою регресією та аугментацією під специфіку замовника. Результат — 4.2 року MAE на реальних даних. Наша команда має понад 7 років досвіду, реалізувала 15+ проєктів і працює на ринку з 2018 року. Використання нашої системи знижує витрати на ручну обробку до 70% завдяки автоматизації демографічного аналізу.
Оцінка віку й статі за зображенням обличчя — задача computer vision із застосуванням у retail аналітиці (демографічний профіль відвідувачів), системах адаптивного контенту, медичних дослідженнях, перевірці віку (age gate). Обидві задачі часто реалізуються єдиною спільною моделлю.
Чому спільна модель краща за дві окремі?
Одна backbone, що навчається на двох пов'язаних задачах, витягує більш загальні ознаки обличчя. Об'єднане навчання покращує узагальнення: градієнти від задачі статі допомагають регресії віку, і навпаки. На практиці це дає виграш MAE в 1.1–1.2 рази порівняно з двома незалежними мережами.
Архітектура та навчання моделі
import torch import torch.nn as nn import timm class AgeGenderModel(nn.Module): """Єдина модель для одночасного передбачення віку та статі""" def __init__(self, pretrained_backbone: str = 'efficientnet_b2'): super().__init__() backbone = timm.create_model(pretrained_backbone, pretrained=True, num_classes=0) self.backbone = backbone feat_dim = backbone.num_features # 1408 для B2 # Shared representation self.shared = nn.Sequential( nn.Linear(feat_dim, 512), nn.GELU(), nn.Dropout(0.3) ) # Окремі голови для кожної задачі self.age_head = nn.Linear(512, 1) # регресія (MAE) self.gender_head = nn.Linear(512, 2) # класифікація (CE) def forward(self, x): features = self.backbone(x) shared = self.shared(features) age = self.age_head(shared).squeeze() gender_logits = self.gender_head(shared) return age, gender_logits Вік як регресія vs класифікація: regression дає неперервний результат (32.4 року), classification за діапазонами (30–35 років) менш точна, але зручніша для деяких застосувань. Розподілена регресія (DLDL) — найкращий підхід: вік моделюється як імовірнісний розподіл, а не точкове значення. DLDL забезпечує точність в 1.3 рази вищу за звичайну регресію за рахунок зниження впливу викидів.
Функції втрат для спільного навчання
def multitask_loss(age_pred, age_true, gender_logits, gender_true, age_weight=1.0, gender_weight=0.5): # MAE для віку + CE для статі age_loss = nn.L1Loss()(age_pred, age_true.float()) gender_loss = nn.CrossEntropyLoss()(gender_logits, gender_true) # Uncertainty weighting (Kendall et al.) return age_weight * age_loss + gender_weight * gender_loss Датасети та аугментація
| Датасет | Кількість фото | Діапазон віку | Мітки |
|---|---|---|---|
| IMDB-Wiki | 524k | 0–100 | Вік, стать |
| UTKFace | 23k | 0–116 | Вік, стать, етнічність |
| APPA-REAL | 7.6k | 7–77 | Реальний і сприйнятий вік |
| FairFace | 108k | 0–70+ | Стать, раса, 9 діапазонів віку |
| AgeDB | 16k | 0–101 | Вік, стать |
Що дає аугментація для точності?
Без аугментації модель перенавчається на домені датасету — падає на «диких» фотографіях. Ми застосовуємо random brightness/contrast, blur, coarse dropout, щоб імітувати реальні умови (погане світло, перекриття). Це знижує MAE на 1–1.5 року на валідації.
import albumentations as A from albumentations.pytorch import ToTensorV2 train_transform = A.Compose([ A.Resize(224, 224), A.HorizontalFlip(p=0.5), A.RandomBrightnessContrast(brightness_limit=0.3, contrast_limit=0.3, p=0.5), A.GaussianBlur(blur_limit=(3, 7), p=0.2), A.CoarseDropout(max_holes=4, max_height=30, max_width=30, p=0.3), A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ToTensorV2() ]) Метрики продуктивності
| Модель | MAE (вік) | Accuracy (стать) | Швидкість |
|---|---|---|---|
| EfficientNet-B2 (IMDB-Wiki FT) | 4.8 років | 96.3% | 8 ms |
| MobileNetV3 (UTKFace FT) | 5.2 років | 95.8% | 3 ms |
| ViT-B/16 (IMDB-Wiki FT) | 4.3 років | 97.1% | 12 ms |
Наш спільний підхід зменшує MAE на 0.5–1 рік порівняно з двома окремими моделями. EfficientNet-B2 на 15% точніший за MobileNetV3, але в 2.5 рази повільніший.
Етика та bias
Моделі, навчені на IMDB-Wiki, мають недопредставлення літніх людей і деяких етнічних груп. FairFace датасет спеціально збалансований для зниження bias. При використанні для прийняття рішень (age gate) — обов'язкове тестування на fairness across demographic groups. Також застосовуємо байєсівську оптимізацію гіперпараметрів для покращення стійкості.
Детальніше про DLDL
Distribution Learning (DLDL) замінює регресію на задачу передбачення розподілу ймовірностей. Модель виводить softmax за віками, а потім очікуване значення використовується як передбачення. Це знижує вплив викидів і покращує калібрування.
Процес роботи
- Аналітика та збір вимог — визначаємо цільові метрики, джерела даних, обмеження по latency.
- Збір і розмітка даних — якщо потрібна кастомна розмітка, залучаємо краудсорсинг з контролем якості.
- Прототипування — швидкий тест декількох архітектур (EfficientNet, MobileNet, ViT) на невеликій вибірці.
- Тренування та валідація — повний цикл: аугментація, спільне навчання, оптимізація гіперпараметрів.
- Тестування на перехресних вибірках — оцінка bias, перевірка на реальних даних замовника.
- Деплой — упаковка в Triton Inference Server або SageMaker, API (REST/gRPC), документація.
- Моніторинг дрейфу — відстежуємо зміщення розподілу віку/статі, автоматичні алерти.
Що входить в роботу
- Документація пайплайну (препроцесинг, архітектура, навчання).
- Навчена модель з вагами та конфігами.
- API для інтеграції (приклади на Python, cURL).
- Звіт з bias-метрик та очікуваної точності на ваших даних.
- Навчання ваших інженерів (2 години воркшопу).
- Гарантія на модель: фіксація метрик в контракті.
Терміни орієнтовно
| Задача | Термін |
|---|---|
| Інтеграція готової моделі (InsightFace) | 1 тиждень |
| Кастомна модель на корпоративних даних | 3–5 тижнів |
| Система з аналітикою та звітами | 4–7 тижнів |
Вартість проєкту орієнтовно від $5,000 до $20,000 залежно від обсягу даних та складності. Оцінимо проєкт безкоштовно — зв'яжіться з нами.
Гарантуємо прозорість пайплайну та API, який вбудовується у вашу інфраструктуру за день. Отримайте консультацію — зв'яжіться з нами.







