Реализация 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-увеличения разрешения изображения (Upscale) в мобильном приложении

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

On-device: 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). Для больших изображений — нарезай на тайлы, апскейль каждый, склеивай с перекрытием (overlap 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 секунды.

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 (меньше изменений оригинала).

Выбор подхода

Сценарий Рекомендация
Быстрый апскейл фото с камеры On-device (VisionKit/ONNX), тайлинг
Портреты с восстановлением лиц Replicate Real-ESRGAN + face_enhance
Сканы документов/текст Stability AI Conservative Upscaler
Старые фото (×8 и выше) Облако — Real-ESRGAN или Topaz Gigapixel API
Офлайн требование On-device обязательно

UX: прогресс и сравнение

On-device апскейл — хорошо показывать прогресс тайлинга: «Обрабатываем 3 из 12 фрагментов». Пользователь не чувствует зависания.

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

Сроки

On-device апскейл с тайлингом и прогресс-индикатором — 5–8 дней. Облачный апскейл + face enhancement + slider до/после + сохранение в галерею — 8–12 дней. Гибридный с оценкой качества и выбором пути — ещё 3–5 дней сверху.