זיהוי רכב באמצעות AI (יצרן ודגם) לאפליקציות מובייל
זיהוי יצרן ודגם של רכב מתמונה הוא בעיה שנחקרה היטב. מודלים שאומנו על מערך הנתונים של Stanford Cars (196 מחלקות) או CompCars משיגים דיוק של 90%+ בתמונות צד נקיות. האתגרים העיקריים בייצור הם זוויות, ראות חלקית (חזית בלבד או אחור בלבד), תנאי לילה, ורכבים בשוק נישתי.
לצוות שלנו יש ניסיון של 5+ שנים בפתרונות AI למובייל, וסיפקנו מעל 50 פרויקטים של ראייה ממוחשבת לתחום הרכב. טיפלנו באתגרים אלה בפרויקטים אמיתיים לאפליקציות ביטוח וסוכנויות רכב. במאמר זה נסקור כיצד לבנות מערכת זיהוי רכב חזקה שעובדת בתנאים מאתגרים, ונשווה אפשרויות יישום—מ-APIs מוכנים ועד מודלים מותאמים אישית של CoreML/TFLite. נתאר פתרונות טכניים ספציפיים כולל לכידת זוויות מרובות וגישה היברידית של VIN+ויזואלי. אם אתם צריכים הערכה לפרויקט דומה, צרו קשר לקבלת ייעוץ.
APIs מוכנים והמגבלות שלהם
| שירות | מספר דגמים | הערות |
|---|---|---|
| CarAPI / CarQuery | 10,000+ | טוב לסיווג, חלש יותר על רכבים ישנים/נדירים |
| AutoVIN API | מסד נתונים רחב | פענוח VIN בשילוב עם תמונה |
| Imagga | תגיות מותאמות | דורש כוונון עדין לתחום הרכב |
| Google Cloud AutoML Vision | מותאם אישית | דורש תיוג עצמי |
לרוב הפרויקטים: מודל CoreML/TFLite מותאם אישית המבוסס על EfficientNetV2, מכוונן על מערך נתונים משולב (Stanford Cars + VMMRdb). גודל המודל — 25–40 MB, דיוק Top-1 על דגמים פופולריים — 88–93%. מודל מותאם אישית משיג דיוק גבוה ב-10-15% מאשר APIs מוכנים, במיוחד על רכבים נדירים. זמן עיבוד באייפון 13 — מתחת ל-50 אלפיות השנייה.
איך לבחור את הגישה לזיהוי רכב?
הבחירה בין API מוכן למודל מותאם אישית תלויה בדרישות שלכם. אם אתם צריכים לזהות רק דגמים פופולריים (100-200 המובילים) ודיוק אינו קריטי, CarAPI יספיק. לאפליקציות ביטוח או סוכנויות שבהן כל פרט חשוב, מודל מותאם אישית עם לכידת זוויות מרובות הוא האפשרות האמינה היחידה. אנו ממליצים להתחיל עם אב טיפוס מבוסס API כדי להעריך דיוק על נתונים אמיתיים, ואז לעבור לפתרון מותאם אישית.
יישום iOS עם CoreML
class CarRecognitionService {
private lazy var model: VNCoreMLModel = {
let config = MLModelConfiguration()
config.computeUnits = .cpuAndNeuralEngine
let mlModel = try! CarClassifierV3(configuration: config).model
return try! VNCoreMLModel(for: mlModel)
}()
func recognize(image: UIImage) async throws -> [CarPrediction] {
guard let cgImage = image.cgImage else {
throw CarError.invalidImage
}
return try await withCheckedThrowingContinuation { continuation in
let request = VNCoreMLRequest(model: model) { request, error in
if let error = error {
continuation.resume(throwing: error)
return
}
let results = (request.results as? [VNClassificationObservation]) ?? []
let predictions = results
.filter { $0.confidence > 0.05 }
.prefix(5)
.map { CarPrediction(
makeModel: $0.identifier, // "Toyota Camry"
confidence: $0.confidence
)}
continuation.resume(returning: Array(predictions))
}
// Нормализация ориентации изображения критична — иначе точность падает
request.imageCropAndScaleOption = .centerCrop
let handler = VNImageRequestHandler(cgImage: cgImage, orientation: image.cgImageOrientation)
try? handler.perform([request])
}
}
}הפרמטר class CarRecognitionService { private lazy var model: VNCoreMLModel = { let config = MLModelConfiguration() config.computeUnits = .cpuAndNeuralEngine let mlModel = try! CarClassifierV3(configuration: config).model return try! VNCoreMLModel(for: mlModel) }() func recognize(image: UIImage) async throws -> [CarPrediction] { guard let cgImage = image.cgImage else { throw CarError.invalidImage } return try await withCheckedThrowingContinuation { continuation in let request = VNCoreMLRequest(model: model) { request, error in if let error = error { continuation.resume(throwing: error) return } let results = (request.results as? [VNClassificationObservation]) ?? [] let predictions = results .filter { $0.confidence > 0.05 } .prefix(5) .map { CarPrediction( makeModel: $0.identifier, // "Toyota Camry" confidence: $0.confidence )} continuation.resume(returning: Array(predictions)) } // Нормализация ориентации изображения критична — иначе точность падает request.imageCropAndScaleOption = .centerCrop let handler = VNImageRequestHandler(cgImage: cgImage, orientation: image.cgImageOrientation) try? handler.perform([request]) } } } הוא פרט לא מובן מאליו. כברירת מחדל, CoreML משנה את קנה המידה של תמונות בצורה שונה ממה שהמודל ציפה במהלך האימון, מה שגורם לאובדן דיוק של 5–8%.
למה לכידת זוויות מרובות משפרת דיוק?
למשימות עם דיוק גבוה (אפליקציות ביטוח, סוכנויות רכב), צילום אחד אינו מספיק. אנו מבקשים שלוש זוויות:
enum CarPhotoAngle: CaseIterable {
case frontThreeQuarter // 3/4 спереди — оптимален для марки/модели
case rear // для задней части (доп. верификация)
case side // боковой — для кузова и поколения
var instruction: String {
switch self {
case .frontThreeQuarter:
return "Сфотографируйте автомобиль спереди-сбоку (45°)"
case .rear:
return "Сфотографируйте сзади"
case .side:
return "Сфотографируйте строго сбоку"
}
}
}
// Агрегация результатов по трём снимкам — weighted voting
func aggregatePredictions(_ predictions: [[CarPrediction]]) -> CarPrediction {
let weights: [Double] = [0.5, 0.3, 0.2] // frontThreeQuarter важнее
// ... weighted voting по makeModel
} זיהוי שנה ודור
קביעת השנה חזותית קשה יותר מאשר יצרן/דגם: מתיחות פנים משנות את המראה באופן מינימלי. שתי גישות:
- מסווג דורות (ראש נפרד במודל משימות מרובות)
- היברידי: VIN באמצעות OCR (אם גלוי) + סיווג דורות חזותי
גישת ה-VIN מדויקת יותר: אם OCR קורא את ה-VIN מלוחית הרישוי או מהשמשה, כל הנתונים (יצרן, דגם, שנה, רמת גימור) מפוענחים ללא AI באמצעות NHTSA API או מפענחי VIN בתשלום. זמן זיהוי VIN באמצעות OCR הוא כ-200 אלפיות השנייה.
שלבי עבודה (מפתח ביד)
- ניתוח דרישות ואיסוף מערך נתונים (אם נדרשים דגמים נדירים)
- אימון ואימות מודל (EfficientNetV2, CoreML/TFLite)
- שילוב מודול הזיהוי עם ממשק המשתמש של האפליקציה
- בדיקות על תמונות אמיתיות בתנאים שונים
- תמיכה לאחר השקה (כוונון עדין, עדכוני API)
מה כלול בתוצר הסופי
| תוצר | תיאור |
|---|---|
| מודל מאומן | CoreML/TFLite, 25–40 MB |
| קוד מקור | Swift/Kotlin עם הערות |
| תיעוד | API, ארכיטקטורה, הוראות אימון מחדש |
| תמיכה | חודש לאחר מסירה, תיקוני באגים |
| הבטחת דיוק | 90%+ על דגמים פופולריים |
הניסיון שלנו מפחית עלויות תיוג ב-30% באמצעות למידת העברה ודגימת תמונות מפתח סלקטיבית.
הערכות לוחות זמנים
שילוב מודל CoreML מוכן עם ממשק תצוגת תוצאות — 3–5 ימים. מערכת מלאה עם לכידת זוויות מרובות, גישה היברידית של VIN+ויזואלי, מסד נתונים של מאפייני רכב, ו-iOS + Android — 1–2 שבועות.
כדי לקבל הערכה לפרויקט שלכם, מלאו את הטופס או כתבו לנו — נשיב תוך יום. פנו אלינו לייעוץ.







