Реализация AI-верификации документов (паспорт, права) через камеру
Верификация документов через камеру — это не просто OCR. Это пайплайн из нескольких шагов: обнаружение документа в кадре, оценка качества изображения, извлечение данных через OCR, структурирование полей, проверка валидности и обнаружение признаков подделки. Каждый шаг может провалиться — и именно здесь сосредоточена вся сложность.
Почему сырой OCR не работает
Попытка прочитать паспорт через Vision framework (iOS) или ML Kit (Android) и распарсить результат регулярными выражениями — самый распространённый первый подход. Он даёт 70–80% точности в лабораторных условиях и 40–60% на реальных пользователях: засвет, угол съёмки, мятые страницы, износ документа, нестандартные шрифты — всё это ломает простой OCR.
Правильный пайплайн добавляет три слоя поверх OCR:
Предобработка изображения. Коррекция перспективы (документ снят под углом), повышение контрастности, удаление бликов. На iOS — CIFilter + CIPerspectiveCorrection. На Android — OpenCV через JNI или CameraX с кастомным ImageAnalysis.
Специализированный document OCR. Не общий OCR, а модели, обученные на документах: Microsoft Azure Document Intelligence, Google Document AI, Amazon Textract. Они возвращают не просто текст, а структурированные поля — surname, given_names, date_of_birth, document_number — уже правильно привязанные к зонам документа.
Machine Readable Zone (MRZ) parsing. Паспорта содержат MRZ — две строки стандарта ICAO 9303 в нижней части страницы. Это самый надёжный источник данных: стандартизированный шрифт, чёткая структура, встроенная контрольная сумма. Библиотеки: mrz-java, passport-reader для iOS, или собственная реализация парсера.
Интеграция Azure Document Intelligence
// iOS — Swift
import AzureAIDocumentIntelligence
class DocumentVerificationService {
private let client: DocumentIntelligenceClient
func analyzePassport(imageData: Data) async throws -> PassportData {
let request = AnalyzeDocumentRequest(
urlSource: nil,
base64Source: imageData.base64EncodedString()
)
let operation = try await client.beginAnalyzeDocument(
"prebuilt-idDocument",
analyzeRequest: request
)
let result = try await operation.waitForResult()
guard let document = result.documents?.first else {
throw DocumentError.noDocumentDetected
}
return PassportData(
firstName: document.fields?["FirstName"]?.valueString,
lastName: document.fields?["LastName"]?.valueString,
documentNumber: document.fields?["DocumentNumber"]?.valueString,
dateOfBirth: document.fields?["DateOfBirth"]?.valueDate,
expiryDate: document.fields?["ExpirationDate"]?.valueDate,
nationality: document.fields?["CountryRegion"]?.valueCountryRegion,
mrz: document.fields?["MachineReadableZone"]?.valueString,
confidence: document.confidence ?? 0
)
}
}
Confidence score — критичный параметр. При confidence < 0.8 запрашиваем повторную съёмку с подсказкой пользователю (лучше освещение, держать ровнее, не закрывать края).
Realtime guidance через камеру
Пользователь не должен делать несколько попыток вслепую. Realtime feedback при съёмке через Vision framework на iOS:
// Detects document bounds in realtime while camera is active
func detectDocumentInFrame(_ pixelBuffer: CVPixelBuffer) {
let request = VNDetectRectanglesRequest { [weak self] request, error in
guard let observation = request.results?.first as? VNRectangleObservation else {
self?.cameraGuidance = .noDocumentFound // "Наведите камеру на документ"
return
}
let area = observation.boundingBox.width * observation.boundingBox.height
if area < 0.4 {
self?.cameraGuidance = .tooFar // "Поднесите ближе"
} else if area > 0.9 {
self?.cameraGuidance = .tooClose // "Отдалите камеру"
} else {
self?.cameraGuidance = .ready // Автоматическая съёмка
}
}
request.minimumAspectRatio = 0.5
request.maximumAspectRatio = 1.0
request.minimumConfidence = 0.7
try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer).perform([request])
}
Автоматический capture при идеальном позиционировании убирает необходимость нажимать кнопку — снижает количество плохих снимков.
Обнаружение подделок
Базовый anti-spoofing для мобильной верификации включает:
Проверка физического документа vs фото документа. Если пользователь фотографирует распечатанный или экранный документ — модели обнаруживают паттерн пикселей экрана (moire effect) или неравномерную текстуру бумаги. Microsoft Azure и Onfido имеют встроенные детекторы.
Liveness check. Для связки «документ + selfie» обязательна проверка живости: случайные движения головы, мигание. AWS Rekognition и FaceTec предоставляют SDK.
Кросс-проверка MRZ с визуальными полями. Дата рождения в MRZ и визуальной зоне должны совпадать — это простая, но эффективная проверка.
Процесс работы
Анализ документов, которые нужно поддержать → выбор OCR-провайдера (Azure / Google Document AI / Регула) → реализация realtime camera guidance → интеграция document analysis API → MRZ parsing и кросс-валидация полей → anti-spoofing → compliance-проверка (ФЗ-152 для хранения данных паспортов).
Ориентиры по срокам
MVP с Azure Document Intelligence и базовым guidance — 2–3 недели. Полная система с liveness check, anti-spoofing и поддержкой нескольких типов документов — 4–6 недель.







