AI-Розпізнавання пошкоджень автомобіля за фотографією у мобільних застосунках
Страховий інспектор фотографує пошкоджений автомобіль—AI за секунди локалізує царапини, вмятини й тріщини. Це не просто «знайшли й обвели»: щоб результат був прийнятий страховою компанією, система повинна давати відтворювані, аргументовані результати, стійкі до спроб шахрайства.
Завдання: детекція, сегментація, класифікація
Три рівні аналізу:
Детекція—bounding box навколо пошкодження. YOLOv8 або RT-DETR справляються добре, якщо обучені на відповідному датасеті (CarDD, COCO-format розмітка з 6–8 класів: scratch, dent, crack, broken_glass, paint_damage, deformation, missing_part).
Сегментація—попіксельна маска пошкодження. Instance segmentation дає площу в пікселях → при відомому масштабі → площу в см². YOLOv8-seg, Mask R-CNN.
Класифікація серйозності—поверхневої царапини, глибокої царапини, вмятини, структурного пошкодження. Від неї залежить ремонтний сценарій (полірування, кузовний ремонт, заміна).
// iOS: запит до backend для аналізу пошкоджень
struct DamageAnalysisRequest: Codable {
let imageBase64: String
let vehicleInfo: VehicleInfo? // марка, модель, рік—для контексту
let captureMetadata: CaptureMetadata
}
struct CaptureMetadata: Codable {
let angle: CaptureAngle // front, rear, side_left, side_right, roof
let lightingCondition: String // auto-detected
let gpsCoordinates: CLLocationCoordinate2D?
let timestamp: Date
let deviceModel: String
}
Метаданні съємки—не опціональна деталь для страхового контексту. Геолокація й тимчасова метка створюють цифровий слід, що утруднює подачу старих пошкоджень як нових.
Протокол багаторакурсної съємки
Одного фото недостатньо для повної оцінки ущербу. Правильна реалізація—guided photo flow:
enum DamageInspectionStep: CaseIterable {
case overview_front // загальний вид спереду
case overview_rear // загальний вид ззаду
case overview_side_left // ліва сторона
case overview_side_right // права сторона
case damage_closeup_1 // крупний план #1 (користувач указує зону)
case damage_closeup_2 // крупний план #2
case odometer // пробіг
case vin // VIN-номер
var instruction: String { /* ... */ }
var requiredDistance: DistanceRange { /* approx 2m, 0.3m, etc */ }
}
AR-оверлей показує, де стояти й яку зону снімати—через ARKit/ARCore позиціонування. Це зменшує процент повторних съємок через невдалий ракурс.
Детекція спроб манипуляції
Страхове шахрайство—реальна проблема. Кілька перевірок на рівні застосунку:
struct AntifraudChecks {
// 1. Метаданні EXIF: фото зроблено сьогодні, не з галереї
func isLiveCapture(_ image: UIImage) -> Bool {
guard let exifData = image.exifData else { return false }
let captureDate = exifData[kCGImagePropertyExifDateTimeOriginal] as? String
return isWithinLastMinutes(captureDate, minutes: 5)
}
// 2. Перевірка GPS: координати совпадают з заявленим місцем ДТП
func isLocationConsistent(_ metadata: CaptureMetadata, claimedLocation: CLLocation) -> Bool {
guard let gps = metadata.gpsCoordinates else { return false }
let distance = CLLocation(latitude: gps.latitude, longitude: gps.longitude)
.distance(from: claimedLocation)
return distance < 500 // допуск 500м
}
// 3. Детекція фото фото (фото екрану з чужим пошкодженням)
func isScreenPhoto(_ image: UIImage) -> Bool {
// Аналіз моаре-паттернів й піксельної сітки екрану
return moareDetector.detect(image) > 0.7
}
}
Backend: детекція пошкоджень
Модель працює на GPU. Для продакшн-навантаження—TorchServe або Triton Inference Server.
# YOLOv8-seg inference для пошкоджень
from ultralytics import YOLO
model = YOLO("car_damage_seg_v8x.pt") # x-варіант для максимальної точності
def analyze_damage(image_path: str) -> DamageReport:
results = model.predict(
image_path,
conf=0.25, # нижчий поріг confidence
iou=0.45, # NMS threshold
imgsz=1280, # високе розрізнення важливе для дрібних царапин
retina_masks=True # високоточні маски
)
detections = []
for result in results[0].boxes:
mask = results[0].masks[i] if results[0].masks else None
detections.append(DamageDetection(
class_name=model.names[int(result.cls)],
confidence=float(result.conf),
bbox=result.xyxy[0].tolist(),
mask_area_px=mask.area if mask else None,
severity=classify_severity(result.cls, result.conf)
))
return DamageReport(
detections=detections,
overall_severity=aggregate_severity(detections),
processing_time_ms=results[0].speed["inference"]
)
imgsz=1280 замість стандартного 640—принципово для дрібних царапин (2–5 мм на фото). На стандартному розрізненні поверхневі царапини детектуються приблизно у 40% випадків, на 1280—у 75%+.
Візуалізація результатів
// Android: overlay пошкоджень на фото
@Composable
fun DamageAnnotationView(
image: ImageBitmap,
detections: List<DamageDetection>
) {
Box {
Image(bitmap = image, contentDescription = null)
Canvas(modifier = Modifier.matchParentSize()) {
detections.forEach { detection ->
// Bounding box з кольором за серйозністю
val color = when (detection.severity) {
Severity.MINOR -> Color(0xFF4CAF50)
Severity.MODERATE -> Color(0xFFFFC107)
Severity.MAJOR -> Color(0xFFFF5722)
Severity.STRUCTURAL -> Color(0xFFD32F2F)
}
drawRect(
color = color,
topLeft = detection.bbox.topLeft(size),
size = detection.bbox.size(size),
style = Stroke(width = 3f)
)
// Лейбл із класом й confidence
drawDamageLabel(detection, color)
}
}
}
}
Орієнтири за часом
Backend з YOLOv8 детекцією й базовим мобільним клієнтом—2–3 тижні. Повна система з guided photo flow, AR-позиціонуванням, антифрод перевірками, сегментацією, оцінкою площі пошкоджень, інтеграцією з CRM страховщика й підтримкою iOS + Android—1–3 місяці в залежності від вимог до інтеграції.







