Реалізація AI-розпізнавання автомобілів (марка, модель) у мобільному додатку
Розпізнавання марки та моделі автомобіля за фотографією — задача з добре вивченим рішенням. Моделі, навчені на Stanford Cars Dataset (196 класів) або CompCars, дають точність 90%+ на чистих бічних знімках. Основна складність у продакшн — ракурси, часткова видимість (тільки перед або тільки задня частина), нічні умови та автомобілі з нішевих ринків.
Наша команда має 5+ років досвіду в розробці мобільних AI-рішень і реалізувала понад 50 проєктів з Computer Vision для automotive. Ми стикалися з цими проблемами на реальних проєктах для страхових і дилерських додатків. У цій статті розберемо, як побудувати надійну систему розпізнавання авто, яка працює в складних умовах, і порівняємо варіанти реалізації — від готових API до кастомних CoreML/TFLite моделей. Опишемо конкретні технічні рішення, включаючи багаторакурсну зйомку та гібридний VIN+Visual підхід. Якщо вам потрібно оцінити подібний проєкт — зв'яжіться з нами для безкоштовної консультації.
Готові API та їх обмеження
| Сервіс | Кількість моделей | Особливості |
|---|---|---|
| CarAPI / CarQuery | 10 000+ | Гарний для класифікації, слабше на старих/рідкісних авто |
| AutoVIN API | Широка база | VIN-декодування в зв'язці з фото |
| Imagga | Кастомні теги | Вимагає донавчання під automotive |
| Google Cloud AutoML Vision | Кастомне | Потрібна своя розмітка |
Для більшості проєктів: кастомна CoreML/TFLite модель на базі EfficientNetV2, донавчена на об'єднаному датасеті (Stanford Cars + VMMRdb). Розмір моделі — 25–40 МБ, точність Top-1 на популярних моделях — 88–93%. Кастомна модель дає точність на 10-15% вищу, ніж готові API, особливо на рідкісних автомобілях. Час інференсу на iPhone 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]) } } } Параметр imageCropAndScaleOption = .centerCrop — не очевидна деталь. За замовчуванням 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 } Визначення року випуску та покоління
Рік випуску візуально — складніше марки/моделі: рестайлінги змінюють зовнішність незначно. Два підходи:
- Класифікатор поколінь (окрема голова в multi-task моделі)
- Hybrid: VIN через OCR (якщо номер видно) + візуальна класифікація покоління
VIN-підхід точніше: якщо OCR зчитав VIN з номерного знаку або рамки, всі дані (марка, модель, рік, комплектація) декодуються без AI через NHTSA API або платні VIN-декодери. Час розпізнавання VIN з OCR — близько 200 мс.
Етапи робіт під ключ
- Аналіз вимог і збір датасету (якщо потрібні рідкісні моделі)
- Навчання та валідація моделі (EfficientNetV2, CoreML/TFLite)
- Інтеграція модуля розпізнавання з UI додатку
- Тестування на реальних знімках в різних умовах
- Підтримка після релізу (донавчання, оновлення API)
Що входить в результат
| Deliverable | Опис |
|---|---|
| Навчена модель | CoreML/TFLite, розмір 25–40 МБ |
| Вихідний код | Swift/Kotlin з коментарями |
| Документація | API, архітектура, інструкція з донавчання |
| Підтримка | 1 місяць після здачі, виправлення багів |
| Гарантія точності | 90%+ на популярних моделях |
Наш досвід дозволяє знизити витрати на розмітку на 30% за рахунок transfer learning і відбору ключових знімків.
Орієнтири за термінами
Інтеграція готової CoreML моделі з UI відображення результатів — 3–5 днів. Повна система з багаторакурсним захопленням, гібридним VIN+Visual підходом, базою характеристик автомобілів та iOS + Android — 1–2 тижні.
Для оцінки вашого проєкту заповніть форму або напишіть нам — ми відповімо протягом дня. Отримайте консультацію, це безкоштовно.







