Vision — это фреймворк компьютерного зрения от Apple, впервые представленный в iOS 11 в 2017 году. Vision предоставляет готовые алгоритмы для детекции лиц, распознавания текста (OCR), обнаружения штрихкодов, отслеживания объектов, классификации изображений и анализа контуров — всё выполняется на устройстве с использованием Neural Engine. По данным Apple WWDC 2023, Vision используется в стандартном приложении «Фото» для распознавания лиц и в «Камере» для детекции текста в реальном времени на iPhone и iPad.
Главное
Vision — это высокоуровневый фреймворк компьютерного зрения, который абстрагирует сложные алгоритмы машинного обучения за простым API запросов (VNRequest). Разработчику не нужно разбираться в свёрточных нейросетях — достаточно создать запрос нужного типа, передать изображение и получить результат.
Архитектура Vision построена по принципу Request → Handler → Result: VNImageRequestHandler принимает изображение, выполняет VNRequest и возвращает массив VNObservation с результатами. Это позволяет комбинировать несколько запросов к одному изображению — например, одновременно определить лица и текст на фотографии.
Vision поддерживает iOS 11+ и macOS 10.13+. Для аппаратного ускорения через Neural Engine требуется чип A12 Bionic или новее. На устройствах с A17 Pro и M-серией Vision обрабатывает до 60 кадров в секунду для потокового видео.
Ключевое преимущество Vision — полная конфиденциальность: все вычисления выполняются на устройстве, изображения не отправляются на сервер. Это позволяет использовать фреймворк в приложениях, работающих с чувствительными данными, например в медицинских или банковских.
VNDetectFaceRectanglesRequest — базовый запрос Vision для обнаружения лиц на изображении. Он возвращает координаты прямоугольников, ограничивающих каждое лицо, без идентификации конкретного человека.
Для более детального анализа используйте VNDetectFaceLandmarksRequest, который определяет ключевые точки лица: глаза, брови, нос, рот, контур челюсти. Эти данные используются для наложения масок, анимации эмодзи и фильтров в реальном времени (как в FaceTime и Snapchat).
import Vision
import UIKit
guard let image = UIImage(named: "photo") else { return }
let request = VNDetectFaceRectanglesRequest()
let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
try handler.perform([request])
for observation in request.results ?? [] {
let bbox = observation.boundingBox
print("Face at x=\\(bbox.origin.x), y=\\(bbox.origin.y)")
}
VNFaceObservation содержит не только boundingBox, но и confidence (уверенность от 0 до 1), а также landmarks — массив точек лица, если запрос был VNDetectFaceLandmarksRequest. Confidence ниже 0.5 обычно означает ложное срабатывание — такие результаты рекомендуется отбрасывать.
Vision также поддерживает VNDetectFaceCaptureQualityRequest, который оценивает качество изображения лица: освещённость, резкость, угол поворота. Это полезно для выбора лучшего кадра при регистрации пользователя или создания аватарки.
VNRecognizeTextRequest — это встроенный OCR-движок Apple, представленный в iOS 13. Он распознаёт печатный текст на изображениях с поддержкой 13 языков: английского, русского, китайского, японского, корейского, итальянского, немецкого, испанского, португальского, французского, арабского, вьетнамского и тайского.
VNRecognizeTextRequest поддерживает два уровня точности: .fast (быстрый, для простого текста на контрастном фоне) и .accurate (точный, для сложных сцен с разными шрифтами и углами). .fast работает в 3–5 раз быстрее, но хуже справляется с рукописным текстом и нестандартными шрифтами.
import Vision
let textRequest = VNRecognizeTextRequest { request, _ in
guard let observations = request.results as? [VNRecognizedTextObservation]
else { return }
for observation in observations {
let topCandidate = observation.topCandidates(1).first
print(topCandidate?.string ?? "")
}
}
textRequest.recognitionLevel = .accurate
textRequest.usesLanguageCorrection = true
Свойство usesLanguageCorrection включает коррекцию распознанного текста с использованием языковой модели. Это повышает точность для английского на 10–15%, но увеличивает время обработки. Для русского языка коррекция также доступна, если указана соответствующая рекогниция.
По данным Apple ML Research 2022, точность VNRecognizeTextRequest на уровне .accurate составляет 96% для чётких фотографий документов на английском и около 88% для русского. Для текста на упаковках, вывесках и экранах точность снижается до 75–85%.
| Recognition Level | Скорость | Точность (английский) | Поддержка русского |
|---|---|---|---|
| .fast | 0.1–0.3 сек | ~85% | Да |
| .accurate | 0.3–1.0 сек | ~96% | Да |
VNDetectBarcodesRequest — запрос Vision для обнаружения и декодирования штрихкодов и QR-кодов на изображении. Поддерживаются все основные форматы: EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, PDF417, Aztec и QR.
В отличие от AVFoundation (AVCaptureMetadataOutput), Vision работает не только с видеопотоком, но и со статическими изображениями — это позволяет сканировать коды из уже сделанных фотографий или скриншотов. Vision также определяет boundingBox кода с точностью до пикселя, что удобно для анимации рамки вокруг найденного кода.
import Vision
let barcodeRequest = VNDetectBarcodesRequest { request, _ in
guard let observations = request.results as? [VNBarcodeObservation]
else { return }
for observation in observations {
let payload = observation.payloadStringValue ?? ""
print("Barcode: \\(payload), Symbology: \\(observation.symbology.rawValue)"
}
}
VNBarcodeObservation содержит payloadStringValue (декодированное содержимое), symbology (тип кода) и confidence. Для QR-кодов payload может быть URL, текстом или JSON. Для EAN/UPC возвращается числовой код продукта, который можно использовать для поиска товара в базе данных.
Vision может обрабатывать несколько штрихкодов на одном изображении — массив observations содержит по одному объекту на каждый найденный код. Это полезно для сканирования пачек товаров или документов с несколькими штрихкодами.
VNDetectObjectAtPointRequest и VNSequenceRequestHandler — инструменты Vision для отслеживания объектов в видеопотоке. Первый определяет объект по точке касания пользователя, второй отслеживает объект между кадрами видео.
VNSequenceRequestHandler принимает последовательность изображений (кадры видео) и для каждого кадра возвращает обновлённую позицию отслеживаемого объекта. Это используется в приложениях дополненной реальности, видеоредакторах и системах видеонаблюдения.
import Vision
let trackingRequest = VNTrackObjectRequest(detectedObjectObservation: initialObservation)
let sequenceHandler = VNSequenceRequestHandler()
for frame in videoFrames {
try sequenceHandler.perform([trackingRequest],
on: frame.cgImage!)
let newBBox = trackingRequest.results?.first?.boundingBox
// Update object position on screen
}
VNTrackObjectRequest использует алгоритм трекинга на основе оптического потока — он не переобучает детектор на каждом кадре, а вычисляет смещение объекта относительно предыдущего положения. Это позволяет работать в реальном времени даже на устройствах без Neural Engine.
Ограничение: трекинг может потерять объект при быстром движении, перекрытии или резком изменении освещения. Apple рекомендует перезапускать детекцию (VNDetectObjectAtPointRequest) каждые 10–15 кадров для коррекции трекинга.
VNClassifyImageRequest — это встроенная модель Vision для классификации изображений по 1000 категориям (модель ResNet-50, обученная на ImageNet). Запрос возвращает массив VNClassificationObservation с названием категории и уверенностью.
VNDetectContoursRequest выполняет анализ контуров изображения — выделяет границы объектов, что полезно для сегментации, обводки и предобработки перед распознаванием. Запрос возвращает массив точек, описывающих каждый контур на изображении.
import Vision
// Image classification
let classificationRequest = VNClassifyImageRequest { request, _ in
guard let results = request.results as? [VNClassificationObservation]
else { return }
let topMatch = results.prefix(3).filter { $0.confidence > 0.3 }
for match in topMatch {
print("\\(match.identifier): \\(match.confidence)"
}
}
VNClassifyImageRequest хорошо работает для общих категорий (кошка, собака, машина, еда), но не подходит для специфических объектов — для них нужно обучить кастомную модель Core ML и использовать VNCoreMLRequest. Модель от Apple оптимизирована для мобильных устройств и занимает всего 5 MB.
VNDetectContoursRequest возвращает контуры в виде массива точек с указанием типа контура (внешний, внутренний, дыра). Этот запрос используется для предобработки изображений перед OCR (улучшение контраста текста), для рисования эффектов (обводка объектов) и для анализа форм.
| Запрос Vision | Назначение | iOS версия |
|---|---|---|
| VNDetectFaceRectanglesRequest | Поиск лиц на изображении | iOS 11 |
| VNRecognizeTextRequest | Распознавание текста (OCR) | iOS 13 |
| VNDetectBarcodesRequest | Детекция штрихкодов и QR | iOS 11 |
| VNClassifyImageRequest | Классификация изображений | iOS 13 |
| VNDetectContoursRequest | Анализ контуров | iOS 14 |
| VNTrackObjectRequest | Отслеживание объектов | iOS 11 |
Часто задаваемые вопросы
Vision предоставляет готовые алгоритмы (детекция лиц, OCR, штрихкоды) без обучения модели. Core ML — это движок для выполнения кастомных моделей. Vision + VNCoreMLRequest позволяют запускать Core ML модели в пайплайне Vision, получая лучшее из двух миров: готовые детекторы Vision + кастомная классификация Core ML.
Да, Vision поддерживает обработку видеопотока в реальном времени через VNSequenceRequestHandler для трекинга и через AVCaptureVideoDataOutput для покадровой обработки. На устройствах с A12+ и Neural Engine Vision обрабатывает до 60 кадров в секунду для детекции лиц. Для тяжёлых задач (OCR, классификация) рекомендуется обрабатывать каждый 5–10 кадр.
VNRecognizeTextRequest поддерживает 13 языков: английский, русский, китайский (упрощённый и традиционный), японский, корейский, итальянский, немецкий, испанский, португальский, французский, арабский, вьетнамский и тайский. Для распознавания нескольких языков на одном изображении укажите массив в свойстве recognitionLanguages.
Да, через VNCoreMLRequest. Вы создаёте Core ML модель, обёрнутую в VNCoreMLModel, и передаёте её в VNCoreMLRequest. Vision автоматически обрабатывает предобработку изображения (масштабирование, crop) и передаёт его в Core ML модель. Результат возвращается в виде VNCoreMLFeatureValueObservation с выходными данными модели.
Нет, Vision выполняет весь анализ полностью на устройстве. Изображения не покидают девайс пользователя. Это принципиальная архитектура Apple: все ML-фреймворки (Vision, NaturalLanguage, Core ML, Speech) работают on-device для обеспечения приватности. Никакие данные не отправляются на сервера Apple.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также