Чому on-device AI-стилізація вигідніша за серверну?
Ми реалізуємо інтеграцію AI-стилізації фотографій у мобільні застосунки. Основна біль клієнтів — Neural Style Transfer (NST) на мобілці не має гальмувати. Модель VGG-19 важить 500+ MB, а обробка кадру 512×512 на iPhone 12 без прискорення займає 3–4 секунди. Користувач таке не пробачить. Наш досвід показує: правильний вибір архітектури — запорука успіху. On-device інференс у 10 разів швидший за серверний, що критично для UX.
Серверний шлях (через Replicate, Stability AI або власний бекенд на PyTorch) простий у реалізації, але затримка від 3 до 15 секунд. On-device через CoreML або TFLite — складніше, але дає миттєвий preview. Нижче — порівняння підходів.
| Параметр | Серверна обробка | On-device (CoreML/TFLite) |
|---|---|---|
| Час інференсу (512×512) | 3–15 с (залежить від мережі) | 80–120 мс (Neural Engine) |
| Розмір моделі | Не обмежений | 6–8 MB (після квантизації) |
| Обробка відео | Не застосовно | До 15 fps live preview |
| Якість | Максимальне (будь-яка модель) | Хороше (Fast NST backbone) |
| Залежність від інтернету | Так | Ні |
На практиці ми рекомендуємо гібрид: on-device для швидкого прев’ю (256×256), сервер — для фінального експорту в 4K. Це знижує витрати на серверну інфраструктуру на 30%. Вибір архітектури — ключовий етап. Отримайте консультацію наших інженерів.
Як підготувати модель для мобільного деплою?
Стандартний PyTorch-чекпоінт не можна скормити Core ML Tools напряму. Ланцюжок перетворень:
- Навчаємо або беремо готовий Fast NST у PyTorch (torchvision.models або кастомний).
-
torch.onnx.export→ ONNX граф. -
coremltools.convert(onnx_model, compute_precision=ct.precision.FLOAT16)→.mlpackage. - Тестуємо на симуляторі через
MLModel.prediction(from:).
Квантизація FLOAT16 дає дворазове зменшення розміру без помітної втрати якості. INT8 — ще агресивніше, але артефакти на текстурах стають помітними. Для Android: tf.lite.TFLiteConverter.from_keras_model() → .tflite з посттренувальною квантизацією.
Інтеграція в iOS
import CoreML import Vision class StyleTransferProcessor { private let model: VNCoreMLModel init() throws { let mlModel = try FastNST(configuration: MLModelConfiguration()).model model = try VNCoreMLModel(for: mlModel) } func process(image: CGImage, completion: @escaping (CGImage?) -> Void) { let request = VNCoreMLRequest(model: model) { req, _ in guard let obs = req.results?.first as? VNPixelBufferObservation else { completion(nil); return } let ciImage = CIImage(cvPixelBuffer: obs.pixelBuffer) completion(CIContext().createCGImage(ciImage, from: ciImage.extent)) } request.imageCropAndScaleOption = .scaleFill try? VNImageRequestHandler(cgImage: image).perform([request]) } } Metal Performance Shaders задіюються автоматично через Neural Engine — не потрібно писати шейдери вручну.
Як керувати пам’яттю та батареєю?
Найчастіша помилка — тримати модель завантаженою постійно. На пристроях з 3 GB RAM (iPhone SE 2, бюджетні Android) це провокує jetsam-кілл. Правило: MLModel ініціалізується ліниво, при першому зверненні, і вивантажується після 10 хвилин неактивності. Гарантія стабільності — наше зобов’язання.
Батарея: NST навантажує Neural Engine. Для live preview обмежуємо частоту до 10–15 fps через CADisplayLink з preferredFramesPerSecond. Повний 30 fps на iPhone 14 Pro реальний, але розрядка прискорюється на 30%. Досвід показує, що користувачі віддають перевагу балансу.
Що робити з великими роздільностями?
CoreML моделі приймають фіксований input shape. Якщо модель навчена на 512×512, а користувач завантажив 48 MP фото (8064×6048) — потрібно downscale перед інференсом і upscale результату. Простий UIImage resize втрачає деталі. Ми використовуємо Guided Upsample через MPSImageBilinearScale або Real-ESRGAN для апскейлу до 4K. Це додає крок обробки, але фінальна якість гідна.
Порівняння моделей для on-device NST
| Модель | Backbone | Розмір | Якість | Затримка (512×512) |
|---|---|---|---|---|
| Fast NST (MobileNet) | MobileNetV2 | 6 MB | Хороше | 80 мс |
| AdaIN | VGG-16 | 50 MB | Відмінне | 200 мс |
Fast NST з MobileNet — оптимальний вибір для мобільних пристроїв.
Серверний шлях через Replicate
Якщо on-device не підходить, Replicate API дає доступ до NST моделей. Запит:
POST https://api.replicate.com/v1/predictions Authorization: Token <key> { "version": "<model_version_hash>", "input": { "content_image": "<base64_or_url>", "style_image": "<base64_or_url>", "output_image_size": 1024 } } Polling статусу кожні 2 секунди. Результат за 8–20 секунд. Ключ зберігаємо на backend-proxy — на клієнті його бути не повинно.
Що входить у роботу?
- Аналітика та прототип: вибір архітектури (on-device / сервер / гібрид), підбір моделі, оцінка продуктивності.
- Підготовка моделі: навчання / дистиляція, квантизація, конвертація в CoreML / TFLite.
- Інтеграція в застосунок: SwiftUI / Jetpack Compose, live preview, обробка жестів, збереження.
- Серверна частина (за необхідності): бекенд на FastAPI, інтеграція Replicate, кешування.
- Тестування: на реальних пристроях (iPhone SE 2, 12, 14 Pro, Pixel 6, Samsung S22) з вимірюванням fps та енергоспоживання.
- Документація та навчання: передача вихідних кодів, CI/CD, інструкція для команди замовника.
Строки та вартість
On-device інтеграція готової моделі — 3–5 днів. Повний цикл з підбором моделі, квантизацією, live preview та серверним експортом — 2–4 тижні. Вартість розраховується індивідуально після уточнення вимог. Наші сертифікати та 5+ років досвіду в мобільній розробці — гарантія результату. Реалізуємо фічу під ключ. Зв’яжіться з нами для оцінки вашого проекту.
Neural Style Transfer — основна концепція.







