Vision はAppleのコンピュータビジョンフレームワークで、2017年にiOS 11で初めて導入されました。Visionは顔検出、テキスト認識(OCR)、バーコード検出、オブジェクトトラッキング、画像分類、輪郭分析のための既製のアルゴリズムを提供します — すべてNeural Engineを使用してデバイス上で実行されます。Apple WWDC 2023によると、Visionは標準の写真アプリでの顔認識やカメラアプリでのiPhoneとiPadでのリアルタイムテキスト検出に使用されています。
重要ポイント
Vision は、複雑な機械学習アルゴリズムをシンプルなリクエストAPI(VNRequest)の背後に抽象化する高レベルコンピュータビジョンフレームワークです。開発者は畳み込みニューラルネットワークを理解する必要はありません — 適切なリクエストタイプを作成し、画像を渡して結果を得るだけです。
Visionのアーキテクチャは Request → Handler → Result の原則に基づいています:VNImageRequestHandlerが画像を受け入れ、VNRequestを実行し、結果とともにVNObservationの配列を返します。これにより、1つの画像に複数のリクエストを組み合わせることができます — 例えば、写真内の顔とテキストを同時に検出するなど。
Visionは iOS 11+ とmacOS 10.13+をサポートしています。Neural EngineによるハードウェアアクセラレーションにはA12 Bionicチップ以上が必要です。A17 ProおよびMシリーズデバイスでは、Visionはストリーミングビデオに対して毎秒60フレームまで処理します。
主な利点 は完全なプライバシーです:すべての計算はデバイス上で実行され、画像がサーバーに送信されることはありません。これにより、医療アプリや銀行アプリなどの機密データを扱うアプリケーションでフレームワークを使用できます。
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)と、リクエストがVNDetectFaceLandmarksRequestだった場合の顔のランドマーク(点の配列)も含まれます。0.5未満のconfidenceは通常、誤検出を示します — そのような結果は破棄することをお勧めします。
Visionは VNDetectFaceCaptureQualityRequest もサポートしており、顔画像の品質(照明、シャープネス、回転角度)を評価します。これはユーザー登録時に最適なフレームを選択したり、アバターを作成したりするのに役立ちます。
VNRecognizeTextRequest はAppleの内蔵OCRエンジンで、iOS 13で導入されました。13の言語(英語、ロシア語、中国語、日本語、韓国語、イタリア語、ドイツ語、スペイン語、ポルトガル語、フランス語、アラビア語、ベトナム語、タイ語)をサポートして、画像内の印刷テキストを認識します。
VNRecognizeTextRequest は2つの精度レベルをサポートしています:.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 によると、.accurateレベルのVNRecognizeTextRequestの精度は、英語の鮮明な書類写真で96%、ロシア語で約88%です。パッケージ、看板、画面のテキストでは、精度は75〜85%に低下します。
| 認識レベル | 速度 | 精度(英語) | ロシア語対応 |
|---|---|---|---|
| .fast | 0.1〜0.3秒 | 〜85% | はい |
| .accurate | 0.3〜1.0秒 | 〜96% | はい |
VNDetectBarcodesRequest は、画像内のバーコードとQRコードを検出およびデコードするためのVisionリクエストです。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コードの場合、ペイロードはURL、テキスト、またはJSONになります。EAN/UPCの場合は、データベースで商品を検索するために使用できる数値の製品コードが返されます。
Visionは1つの画像で 複数のバーコード を処理できます — observations配列には、検出されたコードごとに1つのオブジェクトが含まれます。これは、製品のバッチや複数のバーコードを持つドキュメントのスキャンに便利です。
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はトラッキング補正のために10〜15フレームごとに検出(VNDetectObjectAtPointRequest)を再起動することを推奨しています。
VNClassifyImageRequest は、Visionの組み込み画像分類モデルで、1000カテゴリ(ImageNetでトレーニングされたResNet-50モデル)をカバーしています。リクエストは、カテゴリ名とconfidenceを含む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を使用すると、Visionパイプライン内でCore MLモデルを実行でき、両方の利点(Visionの既製検出器 + Core MLのカスタム分類)を得られます。
はい、Vision はVNSequenceRequestHandlerによるトラッキングとAVCaptureVideoDataOutputによるフレームごとの処理を通じて、リアルタイムのビデオストリーム処理をサポートしています。A12+とNeural Engineを搭載したデバイスでは、Visionは顔検出で最大60 fpsを処理します。負荷の高いタスク(OCR、分類)では、5〜10フレームごとに処理することをお勧めします。
VNRecognizeTextRequest は13の言語(英語、ロシア語、中国語(簡体字および繁体字)、日本語、韓国語、イタリア語、ドイツ語、スペイン語、ポルトガル語、フランス語、アラビア語、ベトナム語、タイ語)をサポートしています。1つの画像で複数の言語を認識するには、recognitionLanguagesプロパティに配列を指定します。
はい、VNCoreMLRequest を介して使用できます。VNCoreMLModelでラップされたCore MLモデルを作成し、VNCoreMLRequestに渡します。Visionは自動的に画像の前処理(スケーリング、クロッピング)を処理し、Core MLモデルに供給します。結果はモデルの出力データとともにVNCoreMLFeatureValueObservationとして返されます。
いいえ、Vision はすべての分析を完全にデバイス上で実行します。画像がユーザーのデバイスから出ることはありません。これはAppleの基本アーキテクチャです:すべてのMLフレームワーク(Vision、NaturalLanguage、Core ML、Speech)はプライバシーを確保するためにオンデバイスで動作します。Appleのサーバーにデータが送信されることはありません。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。