פילוח וידאו בזמן אמת עם AI לאפליקציות מובייל
דמיינו שיחת וידאו עם רקע מטושטש, אבל במקום תמונה חלקה—גמגום וחפצים. או אפליקציית מציאות רבודה שלא מצליחה לעמוד בקצב תנועות המשתמש. אלה תוצאות אופייניות של פילוח AI באופטימיזציה גרועה. אנו מקבלים פעמים רבות בקשות לפילוח וידאו בזמן אמת—כשהאפליקציה מבינה מה נמצא בפריים: אדם, רקע, מכונית, כביש, ועושה זאת עבור כל פריים ב-15–30 FPS. לגרום לזה "לעבוד בהדגמה" זה קל. לגרום לזה "לא להתחמם, לא לפגר, לעבוד על iPhone XR" דורש אופטימיזציה רצינית. בחירת המודל הנכון וצינור עיבוד חכם הם המפתח לפרויקט מוצלח.
איך לבחור מודל פילוח?
פילוח סמנטי—כל פיקסל מקבל קטגוריה (רקע, אדם, מכונית). יישומים: החלפת רקע בשיחות וידאו, אפקטים של מציאות רבודה, ניתוח סצנות כביש. פילוח מופעים—מסכה נפרדת לכל אובייקט מאותה קטגוריה (שלוש מכוניות—שלוש מסכות). יישומים: ספירת אובייקטים, מעקב. פילוח פנופטי—שילוב. כבד יותר, בשימוש נדיר במובייל.
| מודל | רזולוציה | FPS (CoreML) | איכות |
|---|---|---|---|
| MobileNetV3-DeepLabV3 | 513×513 | 22–28 | בינונית |
| EfficientPS-lite | 640×360 | 18–24 | טובה |
| YOLOv8n-seg | 640×640 | 20–30 | טובה |
| Segment Anything (SAM-mobile) | 1024×1024 | 3–5 | מצוינת |
YOLOv8n-seg טוב פי 2 באיכות מ-MobileNetV3 במהירות דומה. SAM מיועד רק לפילוח אינטראקטיבי, לא בזמן אמת.
למה ביצועים קריטיים?
מעבדי GPU במובייל מוגבלים בפיזור חום ובצריכת חשמל. יישום נאיבי מוביל במהירות להתחממות ולירידת FPS. האופטימיזציה מתחילה בבחירת מודל: ארכיטקטורות קלות (MobileNetV3, YOLOv8n-seg) נותנות 20–30 FPS על שבבים מודרניים, אבל דורשות צינור עיבוד חכם. לפי תיעוד Core ML, הגדרת רינדור נכונה של Metal מפחיתה את עומס המעבד ב-40%.
איך אנו מייעלים את צינור העיבוד ב-iOS
class RealtimeSegmentationProcessor {
private let model: VNCoreMLModel
private let processQueue = DispatchQueue(label: "segmentation.process", qos: .userInteractive)
// Frame skipping: обрабатываем каждый N-й кадр
private var frameCounter = 0
private let processEveryNFrames = 2 // 30fps камера → 15fps обработка
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
frameCounter += 1
guard frameCounter % processEveryNFrames == 0 else { return }
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
processQueue.async { [weak self] in
self?.runSegmentation(on: pixelBuffer)
}
}
private func runSegmentation(on pixelBuffer: CVPixelBuffer) {
let request = VNCoreMLRequest(model: model) { [weak self] req, _ in
guard let observation = req.results?.first as? VNCoreMLFeatureValueObservation,
let maskArray = observation.featureValue.multiArrayValue else { return }
let mask = self?.processMask(maskArray)
DispatchQueue.main.async {
self?.delegate?.didUpdateSegmentationMask(mask)
}
}
// Важно: pixelBuffer должен быть в правильном формате
request.imageCropAndScaleOption = .scaleFill
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .right) // landscape orientation
try? handler.perform([request])
}
private func processMask(_ array: MLMultiArray) -> SegmentationMask {
// Конвертация MLMultiArray → CVPixelBuffer для рендера
// Shape: [numClasses, height, width]
let numClasses = array.shape[0].intValue
let height = array.shape[1].intValue
let width = array.shape[2].intValue
// Argmax по классам для каждого пикселя → label map
var labelMap = [UInt8](repeating: 0, count: height * width)
for y in 0..<height {
for x in 0..<width {
var maxClass = 0
var maxVal: Float = -Float.infinity
for c in 0..<numClasses {
let val = array[[c, y, x] as [NSNumber]].floatValue
if val > maxVal {
maxVal = val; maxClass = c
}
}
labelMap[y * width + x] = UInt8(maxClass)
}
}
return SegmentationMask(labels: labelMap, width: width, height: height, classColors: Self.classColorMap)
}
} מה זה רינדור מסכות ב-Metal?
גישה נאיבית—ציור המסכה בלולאת CPU—נותנת 3–5 FPS ברינדור. הדרך הנכונה היא Metal / OpenGL ES. Shader של Metal מחיל את המסכה על ה-GPU ללא מעורבות CPU, ומבטיח 30 FPS יציבים אפילו על iPhone 11.
// Metal шейдер для наложения маски на видео
// Входы: videoTexture (YCbCr), maskTexture (label map), colorLUT (класс→цвет)
fragment float4 segmentationOverlay(
VertexOut in [[stage_in]],
texture2d<float> videoTexture [[texture(0)]],
texture2d<uint> maskTexture [[texture(1)]],
texture1d<float> colorLUT [[texture(2)]],
constant OverlayParams& params [[buffer(0)]]
) {
float2 uv = in.texCoords;
float4 videoColor = videoTexture.sample(sampler, uv);
uint classLabel = maskTexture.sample(nearestSampler, uv).r;
if (classLabel == 0) {
return videoColor;
} // фон — без изменений
float4 maskColor = colorLUT.sample(sampler, float(classLabel) / float(params.numClasses));
return mix(videoColor, maskColor, params.overlayAlpha); // blending
} | פלטפורמה | מנוע רינדור | FPS (מכשירים בינוניים) |
|---|---|---|
| iOS (Metal) | GPU compute + shader | 28–30 |
| Android (MediaPipe+OpenGL) | GPU delegate + overlay | 25–30 |
החלפת רקע באנדרואיד: MediaPipe
לשיחות וידאו, פילוח בינארי (אדם/רקע) פופולרי. אנו משתמשים ב-MediaPipe Selfie Segmentation—פתרון מוכן המותאם למשימה זו:
// Android: MediaPipe Selfie Segmentation
val options = ImageSegmenterOptions.builder()
.setBaseOptions(
BaseOptions.builder()
.setModelAssetPath("selfie_segmentation.tflite")
.setDelegate(Delegate.GPU)
.build()
)
.setRunningMode(RunningMode.LIVE_STREAM)
.setResultListener { result, _ ->
val confidenceMask = result.confidenceMasks?.get(0)
updateBackground(confidenceMask)
}
.build()
val segmenter = ImageSegmenter.createFromOptions(context, options)Delegate.GPU הוא קריטי: על CPU, אותו MediaPipe מספק 8–12 FPS; על GPU, 25–30 FPS.
תהליך עבודה: מרעיון לייצור
- ניתוח משימה—הגדרת קטגוריות אובייקטים, מכשירי יעד, דרישות FPS.
- בחירת מודל—בדיקת 3–5 מודלים על מכשירים אמיתיים, מדידת מהירות ו-mIoU.
- אופטימיזציה של צינור העיבוד—הגדרת דילוג פריימים, רינדור Metal, TFLite GPU delegate.
- אינטגרציה—שילוב באפליקציה, טיפול בשגיאות (נפילה חיננית ל-CPU תחת הגבלת ביצועים).
- בקרת איכות והשקה—בדיקות עומס, פרסום ב-App Store / Google Play.
מה כלול
- בחירת מודל וכיול לנתונים שלך.
- יישום צינור לכידת ועיבוד פריימים.
- רינדור מסכות GPU (Metal ב-iOS, OpenGL/Vulkan באנדרואיד).
- תיעוד אינטגרציה ותמיכה.
- תמיכה ל-30 יום לאחר ההשקה.
לוחות זמנים ועלות
פילוח בסיסי של קטגוריה אחת (לדוגמה, אדם) עם מודל מוכן—החל משבוע. פילוח מותאם אישית עם מספר קטגוריות עם רינדור Metal/GPU ותמיכה ב-iOS + אנדרואיד—החל משבועיים עד 4 שבועות. העלות מחושבת באופן אישי לאחר הערכת הפרויקט שלך.
יש לנו 5 שנות ניסיון בפיתוח מובייל ומעל 50 פרויקטים מבוססי AI. אנו מבטיחים 30 FPS יציבים במכשירים שאינם ישנים מ-iPhone XR ו-Samsung S10. צרו קשר לייעוץ טכני והערכת עלות מדויקת. בקשו פרויקט פיילוט להערכת איכות על נתונים אמיתיים.







