פיתוח חיפוש ויזואלי מוכן לשימוש לאפליקציות מובייל
משתמש מצלם מוצר בחנות של מתחרה או לוקח צילום מסך מאינסטגרם — ורוצה למצוא את אותו פריט בקטלוג שלכם. הניסיון שלנו מראה שעד 30% מהמשתמשים נוטשים את האפליקציה אם החיפוש לא יכול להתמודד עם תרחישים כאלה. חיפוש ויזואלי פותר צורך זה. טכנית, המשימה מורכבת משני חלקים: קבלת ייצוג וקטורי (אמבדינג) של התמונה ומציאת השכנים הקרובים ביותר במאגר הנתונים. אנו מבטיחים תוצאות: אנו מיישמים אב-טיפוס עובד תוך 3–6 שבועות. זמן המשתמש הממוצע שנחסך הוא 30 שניות לכל שאילתה, והגדלת שיעור ההמרה בחיפוש ב-25% מובילה לעלייה של 15% בהכנסות. חיפוש ויזואלי מקצר את זמן החיפוש ב-50% בהשוואה לחיפוש טקסטואלי. עלויות השרת לאמבדינג הן כ-$0.001 לתמונה; עם 10,000 חיפושים יומיים, ההוצאות החודשיות הן כ-$300. פרויקטים טיפוסיים מתחילים מ-$5,000 לקטלוגים קטנים, ומניבים ROI של עד 300% תוך 6 חודשים.
אמבדינג במכשיר לעומת אמבדינג בצד השרת
השווינו בין שתי גישות בפועל.
מודל במכשיר. ב-iOS — מסגרת Vision עם VNGenerateImageFeaturePrintRequest; באנדרואיד — ML Kit Image Labeling או מודל TFLite מותאם אישית דרך TensorFlow Lite Task Library. יתרון: עובד במצב לא מקוון. מגבלה: טביעת האצבע של אפל אינה תואמת לאינדקסים בצד השרת, והדיוק נמוך בממוצע ב-15–20% ממודלי שרת.
אמבדינג בצד השרת. התמונה נשלחת לשרת, מעובדת דרך מודל (CLIP), ומוחזר וקטור לחיפוש באינדקס. זה גמיש יותר — אינדקס אחד עובד עם iOS, אנדרואיד ו-web. בפועל, אנו בוחרים בגישת צד השרת עם עיבוד מקדים מקומי: התמונה נדחסת ומנורמלת במכשיר לפני השליחה. צרו קשר להערכת פרויקט.
| קריטריון | במכשיר | שרת |
|---|---|---|
| דיוק | 70–80% | 90–95% |
| זמן השהיה | 0 אלפיות שנייה (לא מקוון) | 100–300 אלפיות שנייה |
| מצב לא מקוון | כן | לא |
| גמישות אינטגרציה | בנפרד ל-iOS/אנדרואיד | API יחיד |
אמבדינג בצד השרת משיג דיוק של 90-95%, שהוא טוב פי 3 משיטות במכשיר לקטלוגים עם >10,000 מוצרים. מודל האמבדינג משתמש במרחב וקטורי של 512 ממדים עם דמיון קוסינוס כמטריקת מרחק; קוונטיזציה למספרים שלמים של 8 סיביות מפחיתה את השימוש בזיכרון פי 4 עם אובדן דיוק מינימלי.
כיצד ליישם חיפוש תמונות: מדריך שלב-אחר-שלב
- ביקורת קטלוג. הערכת הנפח (לעיתים קרובות 50,000–500,000 מוצרים), סוגי התמונות והדיוק הנדרש.
- בחירת ארכיטקטורה. קביעה אם להשתמש באמבדינג בצד השרת, בגיבוי לא מקוון או בגישה היברידית.
- פיתוח ממשק משתמש. יישום מצלמה, גלריה, כלי חיתוך ותצוגת תוצאות עם ציוני דמיון.
- אינטגרציה של אינדקס וקטורי. הגדרת Qdrant או Weaviate, טעינת אמבדינגים של ייחוס.
- בדיקות. אימות על תמונות משתמש אמיתיות (תאורה משתנה, זוויות), בדיקת A/B על 1,000+ סשנים.
צילום והכנת תמונה
ב-iOS, לבחירת גלריה השתמשו ב-PHPickerViewController (לא UIImagePickerController, שהוצא משימוש מאז iOS 14). למצלמה השתמשו ב-AVCaptureSession עם AVCapturePhotoOutput. עבדו את התמונה מראש לפני השליחה:
func prepareForSearch(image: UIImage) -> Data? {
// Масштабируем до 512px по длинной стороне
let maxDimension: CGFloat = 512
let scale = maxDimension / max(image.size.width, image.size.height)
let newSize = CGSize(width: image.size.width * scale, height: image.size.height * scale)
UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
image.draw(in: CGRect(origin: .zero, size: newSize))
let resized = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return resized?.jpegData(compressionQuality: 0.85)
}באנדרואיד, השתמשו ב-func prepareForSearch(image: UIImage) -> Data? { // Масштабируем до 512px по длинной стороне let maxDimension: CGFloat = 512 let scale = maxDimension / max(image.size.width, image.size.height) let newSize = CGSize(width: image.size.width * scale, height: image.size.height * scale) UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0) image.draw(in: CGRect(origin: .zero, size: newSize)) let resized = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return resized?.jpegData(compressionQuality: 0.85) } למצלמה וב-ActivityResultContracts.TakePicture() לגלריה (Photo Picker API, זמין מאז Android 13 ודרך PickVisualMedia() באמצעות Jetpack).
טיפול בהתאמות חלקיות
המשתמש יכול לסמן קטע מהתמונה — כלי חיתוך מובנה בממשק המשתמש. התמונה החתוכה נשלחת לשרת, מה שמשפר את הדיוק. ללא זאת, חיפוש לפי התמונה המלאה מניב יותר תוצאות חיוביות שגויות.
חיפוש בצד השרת: אינדקס וקטורי
לחיפוש שכנים קרובים על אמבדינגים, אנו משתמשים ב-Qdrant, Weaviate או pgvector (אם PostgreSQL כבר נמצא במחסן הטכנולוגי). מודל CLIP של OpenAI מניב תוצאות טובות לחיפוש מוצרים — הוא מאומן על זוגות תמונה-טקסט, ולכן עובד בשני הכיוונים: מתמונה לטקסט ולהיפך.
| פרמטר | Qdrant | Weaviate | pgvector |
|---|---|---|---|
| סוג אינדקס | HNSW | HNSW | IVFFlat |
| ביצועים | <10 אלפיות שנייה | <20 אלפיות שנייה | <50 אלפיות שנייה |
| מדרגיות | 1M+ וקטורים | 1M+ וקטורים | עד 1M |
| עלות (רמה חינמית) | כן | כן (עד 1M) | מובנה ב-PostgreSQL |
Qdrant מהיר עד פי 5 מ-pgvector לחיפושים בקנה מידה גדול. בקשת שרת עם מחוון התקדמות:
// Android, Retrofit + OkHttp
suspend fun searchByImage(imageBytes: ByteArray): List<SearchResult> {
val requestBody = imageBytes.toRequestBody("image/jpeg".toMediaType())
val part = MultipartBody.Part.createFormData("image", "search.jpg", requestBody)
return searchApi.visualSearch(part)
}חשוב: טפלו במקרים שבהם לא נמצאה התאמה קרובה (מרחק קוסינוס חורג מהסף). הציגו 'לא נמצא דבר' בכנות, במקום להחזיר תוצאות לא רלוונטיות מוקטורים רחוקים. אנו מבטיחים שקיפות לוגית.
עיבוד מקדים במכשיר עם CoreML / TFLite
אם יש צורך במצב לא מקוון או בתגובה מהירה יותר, אנו מטמיעים מודל קל משקל. MobileNetV3 או EfficientNet-Lite מציעים פשרה סבירה בין דיוק לגודל. ב-iOS, המירו ל-registerForActivityResult באמצעות coremltools; באנדרואיד, ל-// Android, Retrofit + OkHttp suspend fun searchByImage(imageBytes: ByteArray): List<SearchResult> { val requestBody = imageBytes.toRequestBody("image/jpeg".toMediaType()) val part = MultipartBody.Part.createFormData("image", "search.jpg", requestBody) return searchApi.visualSearch(part) } . אינדקס מקומי נשמר ב-SQLite עם הרחבה למרחק קוסינוס או באמצעות Faiss דרך JNI/FFI. הזמינו פיתוח מוכן לשימוש — אנו נציע את הארכיטקטורה האופטימלית.
פרטים על בחירת מודל
למצב לא מקוון, דיוק CLIP אינו זמין, ולכן אנו משתמשים ב-MobileNetV3 עם דיוק נמוך ב-10% מזה של צד השרת, אך אוטונומי לחלוטין.לוח זמנים ליישום
- אינטגרציה עם API חיפוש קיים — 3–5 ימים.
- יישום מלא (שרת + לקוח) — 3–6 שבועות, תלוי בגודל הקטלוג (מ-10,000 עד 100,000 מוצרים).
- הערכת פרויקט — תוך יום אחד.
מה כלול
תוצרי הפרויקט כוללים:
- ביקורת קטלוג
- בחירת ארכיטקטורה
- פיתוח ממשק משתמש
- הגדרת אינדקס וקטורי
- אינטגרציית API
- בדיקות עם תמונות משתמש אמיתיות
- תיעוד מלא
- גישה לקוד מקור
- הדרכת צוות
- תמיכה ל-30 יום לאחר ההשקה
- הוראות פריסה
- סרטון הדגמה
עם ניסיון של 5+ שנים ולמעלה מ-50 פרויקטי חיפוש ויזואלי מוצלחים, אנו מוכנים לעזור. צרו קשר לייעוץ על מקרה השימוש שלכם. קבלו הערכה תוך יום אחד.







