Розробка системи визначення віку та статі за обличчям
Визначення віку та статі за зображенням обличчя — завдання комп'ютерного зору зі застосуванням у retail аналітиці (демографічний профіль відвідувачів), системах адаптивного контенту, медичних дослідженнях, перевірці віку (age gate). Обидва завдання часто реалізуються єдиною мультизадачною моделлю.
Мультизадачна архітектура
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
# Спільна репрезентація
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 класифікація: регресія дає неперервний результат (32.4 року), класифікація по діапазонах (30–35 років) менш точна але зручніша для деяких застосувань. Розподілена регресія (DLDL — Distribution Learning) — найкращий підхід: вік моделюється як розподіл ймовірностей, а не точкове значення.
Датасети
| Датасет | Кількість фото | Діапазон віку | Мітки |
|---|---|---|---|
| IMDB-Wiki | 524k | 0–100 | Вік, стать |
| UTKFace | 23k | 0–116 | Вік, стать, етнічність |
| APPA-REAL | 7.6k | 7–77 | Реальний та сприйманий вік |
| FairFace | 108k | 0–70+ | Стать, раса, 9 діапазонів віку |
| AgeDB | 16k | 0–101 | Вік, стать |
Попередня обробка та аугментація
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()
])
Функції втрат для мультизадачного навчання
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
Метрики продуктивності
| Модель | MAE (вік) | Точність (стать) | Швидкість |
|---|---|---|---|
| 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 4–6 років — типовий результат для «дикої природи» (селфі, фото різної якості). В контрольованих умовах (фронтальний портрет, гарне освітлення) — 3–4 років.
Етика та bias
Моделі, навчені на IMDB-Wiki, мають недопредставлення людей похилого віку та деяких етнічних груп. Датасет FairFace спеціально збалансований для зменшення bias. При використанні для прийняття рішень (age gate) — обов'язкове тестування на fairness у межах демографічних груп.
| Завдання | Строк реалізації |
|---|---|
| Інтеграція готової моделі (InsightFace) | 1 тиждень |
| Користувацька модель на корпоративних даних | 3–5 тижнів |
| Система з аналітикою та звітами | 4–7 тижнів |







