Реализация AI-старения/омоложения лица в мобильном приложении
Эффекты старения и омоложения — одна из немногих AI-фич, где on-device обработка реально конкурирует с серверной. Специализированные модели (SAM — Style-based Age Manipulation, FRAN — Face Re-Aging Network) имеют компактные дистиллированные версии. FaceApp исторически строился именно на on-device инференсе — отсюда мгновенный отклик интерфейса.
On-device: FRAN через CoreML
FRAN (Face Re-Aging Network от Netflix Research) — опенсорсная модель, обученная на синтетических данных. Принимает изображение лица + целевой возраст, возвращает стилизованный результат. Конвертированная в CoreML версия весит ~45 MB в FLOAT16.
import CoreML
import Vision
class FaceAgingProcessor {
private let model: FRAN
func process(faceImage: CGImage, targetAge: Int) async throws -> CGImage {
// FRAN принимает нормализованное изображение 256x256
let resized = try resize(image: faceImage, to: CGSize(width: 256, height: 256))
let input = FRANInput(
face_image: try MLMultiArray(from: resized),
target_age: MLMultiArray([Float(targetAge) / 100.0]) // нормализуем 0..1
)
let output = try await model.prediction(input: input)
return try cgImage(from: output.output_face)
}
}
На iPhone 13+ с Neural Engine время инференса — 60–90 ms. Это позволяет делать live preview при перетаскивании слайдера возраста. На iPhone X (A11 Bionic) — около 200 ms, что ещё приемлемо для интерактивного слайдера при debounce 150ms.
Детекция и alignment — критически важный шаг
Качество результата FRAN сильно зависит от того, насколько точно лицо выровнено перед инференсом. Стандартный пайплайн:
-
VNDetectFaceLandmarksRequest— получаем 76 точек (iOS) или MediaPipe Face Mesh (468 точек) на Android - По 5 ключевым точкам (глаза, нос, углы рта) вычисляем аффинное преобразование
- Warp-трансформация через
vImage(iOS) или OpenCV на Android - После инференса — обратная трансформация + Poisson blending по маске лица
Без alignment модель даёт видимые артефакты при любом наклоне головы более 15°. Это самая частая причина плохих результатов в дешёвых реализациях.
Poisson Blending на iOS
Стандартный CIBlendWithMask даёт жёсткую границу маски. Для плавного перехода — Poisson Image Editing. На iOS нет встроенного метода, поэтому либо Metal шейдер, либо вызов через Accelerate Framework с решением системы линейных уравнений. Второй вариант медленнее, но не требует написания GLSL.
Серверный путь: когда нужно больше качества
Для приложений, где важен фотореализм (например, возрастной прогноз в медицинском или страховом контексте), серверные модели класса SAM2 или StyleGAN-based дают существенно лучший результат:
- Replicate:
yuval-alaluf/sam— 10–20 секунд, высокое качество - Собственный бэкенд на A100: ~2–3 секунды, полный контроль над моделью
API-вызов стандартный: multipart/form-data с изображением и параметром target_age. Результат — ссылка на обработанный файл.
Комбинация: on-device preview + серверный экспорт
Лучший UX для пользователя: мгновенный on-device preview в 256×256 при движении слайдера, и кнопка «Сохранить» запускает серверную обработку в оригинальном разрешении. Пока сервер работает — показываем анимацию. Результат сохраняется в Camera Roll через PHPhotoLibrary.
На Android: WorkManager для серверного запроса — он переживёт сворачивание приложения. Notification по завершении.
Privacy и App Store
Приложения с возрастными трансформациями проходили ревью без проблем — нет ограничений, аналогичных face swap. Но если фото загружается на сервер — обязательна Privacy Nutrition Label с Photos, usage App Functionality. Добавить NSPhotoLibraryUsageDescription и NSCameraUsageDescription с конкретным описанием.
Исходные фото с сервера удаляем сразу после обработки.
Сроки
On-device интеграция FRAN с alignment и blending — 5–8 дней. Гибридный режим (on-device preview + серверный экспорт) — 2–3 недели. Стоимость рассчитывается после уточнения требований.







