למה עיבוד מקומי במכשיר מנצח לתצוגה מקדימה של הזדקנות פנים בזמן אמת
עיבוד אפקטים של הזדקנות או התחדשות פנים עם זמן השהיה של פחות מ-100 אלפיות השנייה במכשיר נייד הוא אתגר טכני קשה. מודלים בצד השרת כמו SAM2 ו-StyleGAN מספקים תוצאות פוטוריאליסטיות אך לוקחים 2–20 שניות לתמונה — בלתי מקובל עבור מחוונים אינטראקטיביים. הפרויקטים שלנו מנצלים מודלים מקומיים ייעודיים כמו FRAN (רשת הזדקנות פנים), אשר מזוקקים לגרסאות קומפקטיות שרצות ישירות על הסמארטפון. FaceApp היה חלוץ היסטורי בגישה המקומית הזו. אנו משלבים את FRAN עם CoreML ב-iOS ו-TensorFlow Lite באנדרואיד, ומבטיחים משוב מיידי בממשק המשתמש. לצוות שלנו יש ניסיון של 10+ שנים בפיתוח AI למובייל והוא סיפק 40+ פרויקטים עם רשתות עצביות מקומיות.
בעיות שאנו פותרים
הפשרה בין זמן השהיה לאיכות
נקודת הכאב הנפוצה ביותר היא בחירה בין תצוגה מקדימה מיידית לבין נאמנות גבוהה. עיבוד מקומי במכשיר על מנוע Neural של iPhone 13+ לוקח 60–90 אלפיות השנייה עבור קלט של 256×256. זה מאפשר תצוגה מקדימה חיה בזמן שהמשתמש גורר את מחוון הגיל. במכשירים ישנים יותר כמו iPhone X (A11 Bionic), אנו עדיין משיגים ~200 אלפיות השנייה, מקובל עם דיבונס של 150 אלפיות השנייה. החלופה — עיבוד שרת בלבד — מאלצת המתנה של 2–20 שניות, ושוברת את חוויית האינטראקטיביות.
פגמי יישור
ללא יישור פנים מדויק, FRAN מייצר פגמים בסיבובי ראש מעבר ל-15°. צינורות עיבוד סטנדרטיים המשתמשים ב-import CoreML import Vision class FaceAgingProcessor { private let model: FRAN func process(faceImage: CGImage, targetAge: Int) async throws -> CGImage { // FRAN принимает нормализованное изображение 256x256 let resized = try resize(image: faceImage, to: CGSize(width: 256, height: 256)) let input = FRANInput( face_image: try MLMultiArray(from: resized), target_age: MLMultiArray([Float(targetAge) / 100.0]) // нормализуем 0..1 ) let output = try await model.prediction(input: input) return try cgImage(from: output.output_face) } } (76 נקודות ב-iOS) או MediaPipe Face Mesh (468 נקודות באנדרואיד) מחשבים טרנספורמציה אפינית מחמישה נקודות מפתח (עיניים, אף, זוויות פה). עיוות באמצעות VNDetectFaceLandmarksRequest ב-iOS או OpenCV באנדרואיד, ולאחר מכן אחרי העיבוד, טרנספורמציה הפוכה ומיזוג עם Poisson blending.
חששות פרטיות
משתמשים מהססים להעלות תמונות אישיות לענן. עיבוד מקומי מבטיח פרטיות של 100% — אין נתונים שעוזבים את המכשיר. כאשר נדרש עיבוד שרת (לייצוא ברזולוציה מלאה), אנו מוחקים את התמונות המקוריות מיד לאחר העיבוד ומצהירים על כך בבירור בתווית התזונה לפרטיות.
איך אנחנו עושים את זה: FRAN על CoreML
FRAN הוא מודל קוד פתוח של Netflix Research שאומן על נתונים סינתטיים. הוא מקבל תמונת פנים וגיל יעד (מנורמל 0–1) ומחזיר פנים מסוגננות. גרסת CoreML שוקלת ~45 MB ב-FLOAT16.
import CoreML
import Vision
class FaceAgingProcessor {
private let model: FRAN
func process(faceImage: CGImage, targetAge: Int) async throws -> CGImage {
// FRAN принимает нормализованное изображение 256x256
let resized = try resize(image: faceImage, to: CGSize(width: 256, height: 256))
let input = FRANInput(
face_image: try MLMultiArray(from: resized),
target_age: MLMultiArray([Float(targetAge) / 100.0]) // нормализуем 0..1
)
let output = try await model.prediction(input: input)
return try cgImage(from: output.output_face)
}
}בפרויקטים אחרונים, השגנו בעקביות זמני עיבוד בין 60–90 אלפיות השנייה ב-iPhone 13 וחדשים יותר. צינור היישור מוסיף ~10 אלפיות השנייה, ו-Poisson blending (באמצעות Accelerate Framework ב-iOS או Metal shader) מוסיף עוד 20 אלפיות השנייה. זמן השהיה הכולל של הצינור נשאר מתחת ל-120 אלפיות השנייה — אידיאלי למחוונים בזמן אמת.
Poisson blending למעברים חלקים
vImage סטנדרטי משאיר קצה מסכה קשה. אנו מיישמים Poisson Image Editing כדי למזג את אזור הפנים שעבר טרנספורמציה בצורה חלקה. ב-iOS, זה נעשה באמצעות Accelerate Framework על ידי פתרון מערכת משוואות ליניאריות, או באמצעות Metal compute shader מותאם לביצועים טובים יותר.
תהליך: מבדיקה ועד השקה
- איסוף נתונים — אנו מנתחים את מכשירי היעד שלך ואת דרישות הביצועים.
- בדיקה — הערכת מועמדים למודלים (FRAN, SAM, או מותאם אישית) מול רף האיכות שלך.
- עיצוב — בחירת ארכיטקטורה מקומית, היברידית או שרת בלבד.
- הערכה — מתן פירוט מפורט של מאמץ ועלות.
- פיתוח — המרת מודל, יישום צינור עיבוד (זיהוי, יישור, עיבוד, מיזוג), רכיבי ממשק משתמש (מחוון, אנימציה), נקודות קצה בשרת (אם היברידי).
- בדיקות — מדדי ביצועים בחוות מכשירים, אימות איכות חזותית.
- השקה — סיוע בהגשה ל-App Store ול-Google Play, כולל תוויות פרטיות.
מה כלול באינטגרציה
- בחירת מודל ואופטימיזציה (FRAN, SAM, או מותאם אישית)
- המרה ל-CoreML / TensorFlow Lite עם קוונטיזציה
- צינור עיבוד מלא: זיהוי → יישור → עיבוד → מיזוג
- רכיב ממשק משתמש: מחוון גיל עם מעבר מונפש
- חלק שרת: נקודת קצה להעלאה/הורדה (אם היברידי)
- אינטגרציה עם ספריית התמונות ומערכת השיתוף
- תיעוד API ותצורה
- תמיכה בהגשה לחנות (App Store Review, Google Play)
ציר זמן ועלות
אינטגרציה מקומית עם FRAN לוקחת 5–8 ימים. המצב ההיברידי (תצוגה מקדימה מקומית + ייצוא שרת) דורש 2–3 שבועות. העלות נקבעת לאחר הבהרת דרישות. צור קשר להערכת פרויקט — אנו נציע את הפתרון האופטימלי.
טעויות נפוצות שיש להימנע מהן
- דילוג על יישור — תמיד יש להחיל עיוות אפיני לתוצאות חזקות.
- שימוש בשרת בלבד לתצוגה מקדימה — משתמשים מצפים למשוב מיידי; עיבוד מקומי הוא חובה למחוונים.
- התעלמות מתוויות פרטיות — אם תמונות עוזבות את המכשיר, עליך לחשוף את טיפול הנתונים ב-App Store.
- חוסר בגיבוי — במכשירים ישנים יותר, גיבוי לרזולוציה נמוכה יותר או לשרת כאשר מנוע Neural אינו זמין.
השילוב המנצח: תצוגה מקדימה מקומית + ייצוא שרת
חוויית המשתמש הטובה ביותר היא תצוגה מקדימה מקומית מיידית ב-256×256 בזמן גרירת המחוון, וכפתור "שמור" שמפעיל עיבוד בצד השרת ברזולוציה המקורית. במהלך עיבוד השרת, הצג אנימציה. בסיום, שמור את התוצאה ל-Camera Roll באמצעות Photos. באנדרואיד, השתמש ב-App Functionality כך שהבקשה תימשך גם אם האפליקציה ברקע, והודע למשתמש כשזה מסתיים.
צור קשר כדי להעריך את הפרויקט שלך ולבחור את הנתיב האופטימלי.







