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







