Реализация AI-оценки стоимости повреждений по фото в мобильном приложении
Детекция повреждений (предыдущий этап) — техническая задача. Оценка стоимости ремонта — задача на стыке computer vision, баз данных нормативов и бизнес-логики конкретной страны. Одна и та же вмятина на крыле обойдётся по-разному в Москве и Варшаве, у официального дилера и в независимом сервисе. Система должна это понимать.
Архитектура оценочного пайплайна
Оценка стоимости — не прямой вывод нейросети. Это многошаговый расчёт:
Фото → Детекция повреждений → [тип, серьёзность, площадь, локализация]
↓
Нормативная база ремонта
(нормо-часы по типу работ)
↓
Региональные расценки
(стоимость нормо-часа)
↓
Стоимость запчастей
(OEM vs aftermarket)
↓
Итоговая оценка [min, expected, max]
Нейросеть используется только на первом шаге — всё остальное детерминированный расчёт по базам данных.
Нормативные базы ремонта
В России стандарт де-факто — AUDATEX (теперь Solera) и GT Motive. Они содержат нормо-часы по каждой операции для каждого автомобиля: замена переднего крыла Toyota Camry XV70 — 2.4 нормо-часа, рихтовка — 1.8 нормо-часа, покраска — 3.2 нормо-часа. Доступ к API — через партнёрское соглашение.
Для MVP без дорогих лицензий: открытые базы Mitchell1, AllData (США) или собственная база по публичным прайс-листам СТО — через scraping + нормализацию.
// iOS: запрос расчёта стоимости
struct DamageCostRequest: Codable {
let vehicleInfo: VehicleInfo // марка, модель, год
let damageDetections: [DamageDetection]
let repairLocation: RepairLocation // city, country
let repairType: RepairType // dealer, certified, independent
}
struct VehicleInfo: Codable {
let make: String
let model: String
let year: Int
let bodyType: BodyType
let vin: String?
}
// Ответ содержит разбивку по позициям
struct DamageCostEstimate: Codable {
let lineItems: [CostLineItem]
let laborCost: MoneyAmount
let partsCost: MoneyAmount
let paintCost: MoneyAmount
let totalMin: MoneyAmount
let totalExpected: MoneyAmount
let totalMax: MoneyAmount
let currency: String
let validUntilDate: Date // расценки меняются
let disclaimer: String
}
struct CostLineItem: Codable {
let description: String // "Замена переднего бампера"
let damageType: DamageType
let panelLocation: PanelLocation // front_bumper, hood, etc.
let laborHours: Double
let laborCostPerHour: MoneyAmount
let partsCost: MoneyAmount?
let repairVsReplaceRecommendation: RepairOption
}
Логика repair vs replace
Для каждого повреждения система рекомендует: ремонт (рихтовка + покраска) или замена детали. Правило упрощённо:
func recommendRepairOption(
damage: DamageDetection,
panel: PanelInfo
) -> RepairOption {
let damageAreaRatio = damage.maskAreaPx / panel.totalAreaPx
// Если повреждение > 40% площади детали → замена, не ремонт
if damageAreaRatio > 0.4 { return .replace }
// Структурные повреждения → только замена
if damage.severity == .structural { return .replace }
// Если ремонт дороже 70% стоимости новой детали → замена
let repairEstimate = calculateRepairCost(damage, panel)
let partPrice = panel.partPrice.aftermarket
if repairEstimate > partPrice * 0.7 { return .replace }
return .repair
}
UI: понятный вывод для нетехнической аудитории
Страховой агент или владелец автомобиля не читает «ммASDA-норматив 2.4 н/ч». Интерфейс должен показывать понятный breakdown:
@Composable
fun CostEstimateScreen(estimate: DamageCostEstimate) {
Column(modifier = Modifier.padding(16.dp)) {
// Итоговая сумма — крупно и первой
TotalCostBanner(
min = estimate.totalMin,
expected = estimate.totalExpected,
max = estimate.totalMax
)
Spacer(Modifier.height(24.dp))
// Разбивка по статьям
SectionHeader("Разбивка расходов")
CostBreakdownBar(
labor = estimate.laborCost,
parts = estimate.partsCost,
paint = estimate.paintCost
)
Spacer(Modifier.height(16.dp))
// Позиции по повреждениям
SectionHeader("Повреждения и работы")
estimate.lineItems.forEach { item ->
DamageLineItemCard(item = item)
}
// Disclaimer — обязателен
DisclaimerText(text = estimate.disclaimer)
}
}
Диапазон min–expected–max честнее точной цифры. Точная цифра создаёт ложные ожидания и приводит к конфликтам при выставлении счёта от СТО.
Ориентиры по срокам
Backend с детекцией повреждений (YOLOv8) + расчётом стоимости по фиксированной региональной базе + мобильный клиент iOS/Android — 2–3 недели. Полная система с интеграцией Audatex/GT Motive, региональными расценками, актуальными ценами на запчасти, экспортом отчёта в PDF и подписью — 1–3 месяца.







