AI-Розпізнавання марки й моделі автомобіля у мобільних застосунках
Розпізнавання марки й моделі автомобіля за фотографією—задача з добре вивченим рішенням. Моделі, обучені на Stanford Cars Dataset (196 класів) або CompCars, дають точність 90%+ на чистих боконих знімках. Основна складність у продакшні—ракурси, часткова видимість (тільки спереду або тільки ззаду), нічні умови й автомобілі з нішевих ринків.
Готові 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%.
Реалізація на 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 2022"
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—не очевидна деталь. За замовчуванням Vision framework масштабує зображення інакше, ніж очікувала модель при навчанні, що дає 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 моделі)
- Гібридний: VIN через OCR (якщо номер видно) + візуальна класифікація покоління
VIN-підхід точніший: якщо OCR прочитав VIN з номерного знака або рамки, усі дані (марка, модель, рік, комплектація) декодуються без AI через NHTSA API або платні VIN-декодери.
Орієнтири за часом
Інтеграція готової CoreML моделі з UI відображення результатів—3–5 днів. Повна система з багаторакурсним захопленням, гібридним VIN+Visual підходом, базою характеристик автомобілів і iOS + Android—1–2 тижні.







