Реалізація 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 тижні.
Для оцінки вашого проєкту заповніть форму або напишіть нам — ми відповімо протягом дня. Отримайте консультацію, це безкоштовно.







