Реалізація сегментації зображень у мобільному додатку
Ми не раз стикалися із завданням: клієнт хоче реалізувати сегментацію зображень у мобільному додатку, але не знає, з чого почати. Сегментація — найбільш обчислювально затратна з задач комп'ютерного зору на мобільному пристрої. Якщо детекція повертає прямокутник, сегментація повертає маску попіксельно. На зображенні 512×512 це 262 144 пікселі, кожен з класом, і все це потрібно обробити та відобразити за 33 мс для 30 FPS. Без правильного вибору моделі та рендерингу real-time недосяжний. Ми накопичили досвід на 10+ проєктах з комп'ютерним зором і гарантуємо стабільну роботу рішення.
Яку сегментацію вибрати: семантичну чи інстанс?
Семантична сегментація — кожен піксель отримує один клас (небо, людина, дорога). Всі люди в кадрі — один клас «person». Моделі: DeepLabV3+, MobileNetV3 Segmentation. TFLite-версія DeepLabV3+ з входом 257×257 працює за 22–35 мс на сучасних Android.
Інстанс-сегментація — кожен екземпляр об'єкта має окрему маску. Три людини = три маски. Моделі: Mask R-CNN, YOLOv8-seg. Значно важчі: YOLOv8n-seg на TFLite — 80–120 мс на мобільному пристрої. Реальний real-time з такою моделлю — тільки на флагманах з GPU-делегатом.
Для більшості споживчих кейсів (видалення фону, розмиття фону на фото) достатньо семантичної сегментації класу «person» або «background». Це закривається ML Kit Selfie Segmentation — on-device, 30 FPS, окрема нейромережа, навчена саме під цей кейс. Наш досвід показує: ML Kit у 2–3 рази швидше універсальних моделей при порівнянній якості.
Порівняємо основні підходи:
| Модель | Тип | FPS (iPhone 13) | FPS (Pixel 6) | Застосування |
|---|---|---|---|---|
| DeepLabV3+ (TFLite) | Семантична | 28 | 22 | Універсальна сегментація |
| YOLOv8n-seg (TFLite) | Інстанс | 8 | 10 | Детальне виділення |
| ML Kit Selfie Segm. | Семантична | 30 | 28 | Портрет / фон |
How-to: як інтегрувати ML Kit Selfie Segmentation за 5 днів?
Інтеграція займає 5–7 днів, якщо працювати за нашим чеклистом:
- Підключіть SDK через Gradle (Android) або CocoaPods (iOS).
- Створіть екземпляр
SelfieSegmenterOptionsзSTREAM_MODE. - Передавайте кадри в
segmenter.process()(кожен кадр з камери). - Отримайте маску, накладіть через GPU (Metal/OpenGL).
- Оптимізуйте: використовуйте
enableRawSizeMask()для якості.
Приклад коду для Android
val segmenter = Segmentation.getClient( SelfieSegmenterOptions.Builder() .setDetectorMode(SelfieSegmenterOptions.STREAM_MODE) .enableRawSizeMask() .build() ) Як досягти real-time накладання маски?
Маска сегментації — це ByteArray або FloatArray з індексами класів. Накласти її на відеопотік за 33 мс — задача для GPU.
На iOS використовуємо Metal для блендингу: маска конвертується в CIImage через CIFilter.pixellate або кастомний Metal kernel, потім накладається на оригінальний кадр через CIBlendWithMask. Весь рендеринг в Metal уникає копіювання даних між CPU і GPU через MTLBuffer з shared storage mode.
На Android — RenderScript (deprecated API 31+) або Vulkan/OpenGL ES через SurfaceView. Для нових проєктів: AGSL (Android Graphics Shading Language) починаючи з Android 13, або Canvas.drawBitmap з Paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_IN) для простих випадків.
Часта помилка: генерувати Bitmap з маски на CPU в циклі для кожного кадру. На Pixel 6 це ~18 мс тільки для алокації + copy — вбиває всі 33 мс бюджету. Правильно: використовувати Bitmap.copyPixelsFromBuffer з попередньо алокованим ByteBuffer або передавати маску безпосередньо в шейдер.
ML Kit Selfie Segmentation на практиці
Найшвидший шлях для «розмиття фону» у відеодзвінках або фоторедакторах — використання ML Kit. Кейс: корпоративний додаток для відеопрезентацій, віртуальний фон на iOS. Core Image CIBlendWithMask + ML Kit Selfie Segmentation (iOS SDK): 28 мс на iPhone 13 mini при 720p. На iPhone SE 2nd gen — 41 мс, що при 30 FPS призводило до dropped frames кожні 2–3 секунди. Рішення: знизили роздільну здатність обробки до 540p, маску upscale через білінійну інтерполяцію — 24 мс, dropped frames зникли.
Що входить в нашу роботу по сегментації
- Аналіз вимог та вибір оптимальної моделі (ML Kit / кастомна / OpenCV).
- Проектування пайплайну (захоплення кадру → сегментація → накладання → рендеринг) з урахуванням цільового FPS.
- Реалізація: кодування на Swift/Kotlin, інтеграція TFLite/Metal/OpenGL.
- Тестування на реальних пристроях (від iPhone SE до флагманів Android).
- Оптимізація під конкретну задачу: профілювання, зменшення latency.
- Документація з інтеграції та навчання команди замовника.
Терміни та вартість
Інтеграція ML Kit Selfie Segmentation з накладанням ефекту — 5–7 днів. Кастомна сегментаційна модель з рендерингом через Metal/OpenGL на реальному відеопотоці — 2–3 тижні. Вартість розраховується індивідуально. Ми працюємо на ринку більше 5 років, виконали 15+ проєктів з комп'ютерним зором. Замовте розробку сегментації під ключ — отримайте готове рішення. Отримайте консультацію щодо вашого проєкту.







