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
// Оновити позицію об'єкта на екрані
}
VNTrackObjectRequest використовує алгоритм трекінгу на основі оптичного потоку — він не перенавчає детектор на кожному кадрі, а обчислює зміщення об'єкта відносно попереднього положення. Це дозволяє працювати в реальному часі навіть на пристроях без Neural Engine.
Обмеження: трекінг може втратити об'єкт при швидкому русі, перекритті або різкій зміні освітлення. Apple рекомендує перезапускати виявлення (VNDetectObjectAtPointRequest) кожні 10–15 кадрів для корекції трекінгу.
VNClassifyImageRequest — це вбудована модель Vision для класифікації зображень за 1000 категоріями (модель ResNet-50, навчена на ImageNet). Запит повертає масив VNClassificationObservation з назвою категорії та впевненістю.
VNDetectContoursRequest виконує аналіз контурів зображення — виділяє границі об'єктів, що корисно для сегментації, обводки та попередньої обробки перед розпізнаванням. Запит повертає масив точок, що описують кожен контур на зображенні.
import Vision
// Класифікація зображень
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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також