Реалізація AI-збільшення роздільної здатності зображення (Upscale) у мобільному додатку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація AI-збільшення роздільної здатності зображення (Upscale) у мобільному додатку
Середній
~2-3 дні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Впровадження збільшення дозволу зображення з штучним інтелектом в мобільному додатку

AI-апскейл відрізняється принципово від звичайного «розтягування через bicubic» — нейромережа відновлює деталі, яких немає в оригіналі. Фото 512×512 → 2048×2048 з реальними текстурами шкіри, шерсті, матеріалу. На мобільному реалізується трьома способами: на пристрої через Core ML / ONNX, через хмарний API, або гібридно.

На пристрої: Real-ESRGAN через Core ML (iOS)

Real-ESRGAN — найякісніша модель для ×4 апскейла. Існують конвертовані версії Core ML:

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 очікує вхідної плитки фіксованого розміру (зазвичай 256×256 або 512×512). Для більших зображень — розбивай на плитки, апскейлюй кожну, склеюй з перекриттям (16–32 пікселі) щоб уникнути видимих швів.

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 секунди.

На пристрої: ONNX Runtime на Android

Real-ESRGAN у форматі ONNX (~15 МБ для малої моделі):

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

Коли на пристрої надто повільно або потрібен вищий коефіцієнт апскейла (×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 (менше змін оригіналу).

Вибір підходу

Сценарій Рекомендація
Швидкий апскейл фото з камери На пристрої (VisionKit/ONNX), розбиття на плитки
Портрети з відновленням облич Replicate Real-ESRGAN + face_enhance
Скани документів/текст Stability AI Conservative Upscaler
Старі фото (×8 та вище) Хмара — Real-ESRGAN або Topaz Gigapixel API
Вимога офлайну На пристрої обов'язково

UX: прогрес та порівняння

На пристрої апскейл — добре показувати прогрес розбиття на плитки: «Обробляємо 3 з 12 фрагментів». Користувач не відчуває зависання.

Після завершення — інтерактивний slider «до/після» (MagnificationGesture на iOS, custom View з touch на Android). Це стандарт UI для будь-яких інструментів покращення фото.

Терміни

На пристрої апскейл з розбиттям на плитки та прогрес-індикатором — 5–8 днів. Хмарний апскейл + покращення облич + slider до/після + збереження в галерею — 8–12 днів. Гібридний з оцінкою якості та вибором шляху — ще 3–5 днів зверху.