Як реалізувати AI-апскейлінг у мобільному додатку?
Ви завантажуєте фото з камери телефону — 12 МП, але після кропу залишається 600×600 пікселів. Збільшити в 4×? Bicubic розмиває. Нейромережа відновлює текстури шкіри, вовни, тканини. Ми реалізуємо AI-апскейлінг трьома способами: on-device через Core ML / ONNX, хмарний API, або гібридно. Завдяки 5+ рокам досвіду та понад 30 AI-проєктів ми гарантуємо якість результату. Наша компанія має 5+ років досвіду у сфері AI та реалізувала понад 30 проєктів з інтеграції нейромереж. On-device обробка дозволяє заощадити до 80% витрат на серверну інфраструктуру (до $5,000 на місяць для середнього проєкту) порівняно з хмарними рішеннями. Зв'яжіться з нами — отримайте консультацію щодо вибору підходу.
Приклад коду on-device апскейлера на Swift
import CoreML import Vision class ImageUpscaler { private let model: VNCoreMLModel init() throws { let config = MLModelConfiguration() config.computeUnits = .cpuAndNeuralEngine // Використовуємо Neural Engine let coreMLModel = try RealESRGAN(configuration: config) model = try VNCoreMLModel(for: coreMLModel.model) } func upscale(_ image: UIImage) async throws -> UIImage { guard let cgImage = image.cgImage else { throw UpscaleError.invalidInput } return try await withCheckedThrowingContinuation { continuation in let request = VNCoreMLRequest(model: model) { request, error in if let error = error { continuation.resume(throwing: error) return } guard let results = request.results as? [VNPixelBufferObservation], let outputBuffer = results.first?.pixelBuffer else { continuation.resume(throwing: UpscaleError.noOutput) return } let ciImage = CIImage(cvPixelBuffer: outputBuffer) let context = CIContext() guard let outputCG = context.createCGImage(ciImage, from: ciImage.extent) else { continuation.resume(throwing: UpscaleError.conversionFailed) return } continuation.resume(returning: UIImage(cgImage: outputCG)) } request.imageCropAndScaleOption = .scaleFit let handler = VNImageRequestHandler(cgImage: cgImage) try? handler.perform([request]) } } } Real-ESRGAN — найякісніша модель для ×4 апскейлу. Існують Core ML-конвертовані версії. Обмеження: Real-ESRGAN очікує вхідний тайл фіксованого розміру (зазвичай 256×256 або 512×512). Для великих зображень нарізаємо на тайли з перекриттям (overlap 16–32 пікселі) щоб уникнути швів. Real-ESRGAN: Xintao Wang et al., GitHub repository
func upscaleTiled(_ image: UIImage, tileSize: Int = 256, overlap: Int = 16) async throws -> UIImage { let tiles = splitIntoTiles(image: image, tileSize: tileSize, overlap: overlap) let upscaledTiles = try await withThrowingTaskGroup(of: (Int, Int, UIImage).self) { group in for (row, col, tile) in tiles { group.addTask { let upscaled = try await self.upscale(tile) return (row, col, upscaled) } } var results: [(Int, Int, UIImage)] = [] for try await result in group { results.append(result) } return results } return mergeTiles(upscaledTiles, originalSize: image.size, scaleFactor: 4, overlap: overlap) } На iPhone 15 Pro з Neural Engine: 512×512 → 2048×2048 за ~800 мс. 1024×1024 розбиваємо на тайли → 2–4 секунди.
On-device: ONNX Runtime на Android
Real-ESRGAN у форматі ONNX (~15 МБ для моделі small):
class OnnxUpscaler(context: Context) { private val session: OrtSession init { val env = OrtEnvironment.getEnvironment() val options = OrtSession.SessionOptions().apply { addNnapi() // Використовуємо NNAPI для прискорення } val modelBytes = context.assets.open("realesrgan_x4.onnx").readBytes() session = env.createSession(modelBytes, options) } fun upscale(bitmap: Bitmap): Bitmap { // Конвертуємо Bitmap у float тензор [1, 3, H, W], нормалізуємо в [0, 1] val inputTensor = bitmapToTensor(bitmap) val inputName = session.inputNames.first()!! val output = session.run(mapOf(inputName to inputTensor)) val outputTensor = output[0].value as Array<*> // Конвертуємо тензор назад у Bitmap return tensorToBitmap(outputTensor, bitmap.width * 4, bitmap.height * 4) } } NNAPI на сучасних Android-пристроях дає 2–4× прискорення порівняно з CPU. На Snapdragon 8 Gen 2 — 512×512 за ~1,2 секунди.
Хмарні API
Зазначимо: коли on-device занадто повільний або потрібен вищий коефіцієнт апскейлу (×8, ×16): Replicate — Real-ESRGAN:
let body: [String: Any] = [ "version": "...", // real-esrgan model hash "input": [ "image": "data:image/jpeg;base64,\(base64Image)", "scale": 4, "face_enhance": true // GFPGAN для покращення облич ] ] face_enhance: true запускає GFPGAN поверх Real-ESRGAN — для портретних фото це важливо, без нього обличчя можуть отримати артефакти.
Stability AI Upscale API:
val requestBody = MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("image", "photo.jpg", imageFile.asRequestBody("image/jpeg".toMediaType())) .addFormDataPart("output_format", "png") .build() Stability AI повертає PNG з ×4 апскейлом через Creative Upscaler (SD-based, додає деталі) або Conservative Upscaler (менше змін оригіналу).
Як інтегрувати AI-апскейлінг: покрокова інструкція
- Вибір моделі — Real-ESRGAN для on-device, хмарний API для максимальної якості.
- Конвертація в потрібний формат — Core ML для iOS, ONNX для Android.
- Реалізація тайлінгу — розбивка на тайли з перекриттям, паралельна обробка.
- Інтеграція UI — індикатор прогресу, слайдер порівняння до/після.
- Тестування — на різних пристроях, з різними вихідними зображеннями.
Вибір підходу
| Сценарій | Рекомендація |
|---|---|
| Швидкий апскейл фото з камери | On-device (VisionKit/ONNX), тайлінг |
| Портрети з відновленням облич | Replicate Real-ESRGAN + face_enhance |
| Скани документів/текст | Stability AI Conservative Upscaler |
| Старі фото (×8 і вище) | Хмара — Real-ESRGAN або Topaz Gigapixel API |
| Вимога офлайн | On-device обов'язково |
Як вибрати між on-device та хмарним апскейлінгом?
On-device підхід швидкий та безкоштовний, але обмежений продуктивністю пристрою та розміром моделі. Хмарні API дають вищу якість та коефіцієнти збільшення, але додають затримку та вартість запитів. On-device обробка у 10 разів дешевша за хмарну при обробці понад 1000 зображень на день. Якщо додаток орієнтований на офлайн-сценарії або економію трафіку — обирайте on-device. Якщо потрібна максимальна якість для портретів або старих фотографій — хмара виправдана. Ми реалізуємо гібридний підхід, автоматично обираючи найкращий шлях.
Порівняння on-device та хмарного апскейлінгу
| Параметр | On-device (Core ML/ONNX) | Хмарний API |
|---|---|---|
| Швидкість | <2 сек (512×512) | 3-10 сек + мережа |
| Якість | Добра (Real-ESRGAN) | Відмінна (GFPGAN + Real-ESRGAN) |
| Офлайн | Так | Ні |
| Коефіцієнт | ×4 | ×4–×16 |
| Вартість | Безкоштовно (економія до $5,000/міс) | Залежить від провайдера |
Чому Real-ESRGAN кращий за стандартні алгоритми?
Real-ESRGAN у 2–3 рази якісніший за бікубічний апскейлінг: він відновлює текстури, шумоподавлення, різкість. У комбінації з GFPGAN для облич — практично прибирає артефакти. Це доведено в численних тестах і підтверджено оригінальною статтею. Ми використовуємо цю модель у більшості проєктів, включаючи продукти з тисячами користувачів.
UX: прогрес та порівняння
On-device апскейл — добре показувати прогрес тайлінгу: «Обробляємо 3 з 12 фрагментів». Користувач не відчуває зависання.
Після завершення — інтерактивний slider «до/після» (MagnificationGesture на iOS, custom View з touch на Android). Це стандарт UI для будь-яких інструментів покращення фото.
Що входить у роботу
- Аналіз вимог та вибір оптимального підходу (on-device / хмарний / гібрид)
- Розробка нативного модуля апскейлу (Swift / Kotlin)
- Інтеграція обраної моделі (Core ML, ONNX, хмарний API)
- Реалізація тайлінгу з перекриттям та індикації прогресу
- Додавання слайдера для порівняння до/після
- Тестування на реальних пристроях з різними характеристиками
- Документація та передача вихідного коду
- Підтримка протягом місяця після запуску
Наша компанія має 5+ років досвіду та реалізувала 30+ AI-проєктів, що підтверджує нашу експертність.
Орієнтовні терміни та вартість
On-device апскейл з тайлінгом та індикатором прогресу — 5–8 днів, від $1,500. Хмарний апскейл + face enhancement + slider до/після + збереження в галерею — 8–12 днів, від $2,500. Гібридний з оцінкою якості та вибором шляху — ще 3–5 днів зверху.
Зв'яжіться з нами для оцінки вашого проєкту: отримайте консультацію щодо вибору підходу та приблизну вартість.







