Реалізація сегментації зображень у мобільних додатках
Сегментація — найбільш обчислювально дороговартісне завдання комп'ютерного зору на мобілі. Якщо детекція повертає прямокутник, сегментація повертає маску на кожний піксель. На зображенні 512×512 це 262 144 пікселів, кожен з класом—все обраховується та відображається за 33 ms для 30 FPS.
Семантична проти інстанс-сегментації: що вибрати
Семантична сегментація присвоює кожному пікселю один клас (небо, людина, дорога). Всі люди в кадрі = один клас "person". Моделі: DeepLabV3+, MobileNetV3 Segmentation. TFLite DeepLabV3+ зі входом 257×257 працює за 22–35 ms на сучасному Android.
Інстанс-сегментація дає кожному екземпляру об'єкта окрему маску. Три люди = три маски. Моделі: Mask R-CNN, YOLOv8-seg. Значно важче: YOLOv8n-seg на TFLite: 80–120 ms на мобілі. Справжнє real-time тільки на флагманах з GPU делегатом.
Для більшості consumer випадків (видалення фону, розмиття фону на фото), семантичної сегментації класів "person" або "background" достатньо. Це охоплюється ML Kit Selfie Segmentation—on-device, 30 FPS, спеціальна нейронка навчена для цього точного випадку.
Real-time накладання маски
Маска сегментації — це ByteArray або FloatArray індексів класів. Накладання її на відеопотік за 33 ms — завдання для GPU.
На iOS використовуйте Metal для блендингу: конвертуйте маску в CIImage через CIFilter.pixellate або кастомний Metal kernel, накладіть на оригінальний кадр через CIBlendWithMask. Весь Metal рендеринг уникає копіювання даних через 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 ms тільки для виділення + копіювання—вбиває бюджет 33 ms. Правильно: використовуйте Bitmap.copyPixelsFromBuffer з попередньо виділеним ByteBuffer або передавайте маску напрямку в shader.
ML Kit Selfie Segmentation на практиці
Найшвидший шлях для "розмиття фону" у відеозвонках або фото-редакторах:
val segmenter = Segmentation.getClient(
SelfieSegmenterOptions.Builder()
.setDetectorMode(SelfieSegmenterOptions.STREAM_MODE)
.enableRawSizeMask()
.build()
)
STREAM_MODE оптимізований для відео—кешує стан між кадрами. enableRawSizeMask() повертає маску у повному розширенні, не downsampled—потрібно для якісного згладжування країв.
Кейс: корпоративна програма відеопрезентацій, віртуальний фон на iOS. Core Image CIBlendWithMask + ML Kit Selfie Segmentation (iOS SDK): 28 ms на iPhone 13 mini при 720p. На iPhone SE 2nd gen: 41 ms, спричинюючи втрачені кадри кожні 2–3 секунди при 30 FPS. Рішення: знизили розширення обробки до 540p, upscale маски через білінійну інтерполяцію—24 ms, втрачені кадри зникли.
Часові рамки
Інтеграція ML Kit Selfie Segmentation з накладанням ефекту: 5–7 днів. Кастомна модель сегментації з Metal/OpenGL рендерингом на реальному відеопотоці: 2–3 тижні. Вартість розраховується індивідуально.







