Vision フレームワークは、2017 年の WWDC で iOS 11 の一部として Apple によって導入されました。そのリリースは、マシン ビジョンと画像分析の進化における転換点となり、開発者に視覚コンテンツを分析し、必要に応じて後続の処理を実行するためのネイティブ ツールを提供しました。 2017 年に Vision は以下を導入しました。 テキスト認識 顔認識 長方形の検出 バーコードとQRコードの認識 Apple は、デビュー以来、Vision フレームワークを継続的に強化し、現代の要件を満たすように進化させてきました。2024 年末の iOS 18 のリリースにより、Vision は次の機能を提供します。 多数の言語をサポートし、テキスト認識精度が向上 顔とその特徴の検出 動きを分析する能力 手の位置や人体の要点など、ポーズを認識する能力 ビデオ内のオブジェクト追跡のサポート カスタム機械学習モデルを操作するための CoreML との統合の改善 AVKit、ARKitなどの関連フレームワークとの緊密な統合 Vision フレームワークの登場により、開発者はサードパーティのソリューションに頼ることなく、高度な画像およびビデオ分析タスクをネイティブに実行できるようになりました。これらの機能には、ドキュメントのスキャン、テキストの認識、顔やポーズの識別、重複画像の検出、ビジネス オペレーションを効率化するさまざまなプロセスの自動化などが含まれます。 この記事では、Vision を使用する主なシナリオをコード例とともに見ていきます。これにより、Vision の使い方を理解し、それが難しくないことを理解し、実際にアプリケーションに適用し始めることができます。 VNリクエスト Vision には、Vision のデータ要求構造を定義する抽象クラス があり、子孫クラスは、イメージを使用して特定のタスクを実行するための特定の要求を実装します。 VNRequest すべてのサブクラスは、 クラスから初期化子を継承します。 VNRequest public init(completionHandler: VNRequestCompletionHandler? = nil) リクエストの処理結果を返します。リクエストの結果は、リクエストが送信されたのと同じキューに返されることを明確にすることが重要です。 ここで、 は typealias です。 VNRequestCompletionHandler public typealias VNRequestCompletionHandler = (VNRequest, (any Error)?) -> Void リクエストの結果を含む を返します。システム エラー、不正な画像などによりリクエストが実行されなかった場合は、エラーを返します。 VNRequest 抽象 クラスの クラスは、画像内のテキスト認識要求を処理するように設計されています。 VNRequest VNRecognizeTextRequest テキスト認識のリクエストを実装する例: import Vision import UIKit func recognizeText(from image: UIImage) { guard let cgImage = image.cgImage else { return } let request = VNRecognizeTextRequest { request, error in // 1 guard let observations = request.results as? [VNRecognizedTextObservation] else { return } // 2 for observation in observations { if let topCandidate = observation.topCandidates(1).first { print("Recognized text: \(topCandidate.string)") print("Text boundingBox: \(observation.boundingBox)") print("Accuracy: \(topCandidate.confidence)") } } } request.recognitionLevel = .accurate request.usesLanguageCorrection = true let handler = VNImageRequestHandler(cgImage: cgImage, options: [:]) // 3 try? handler.perform([request]) // 3 } テキスト認識用の を作成します。 VNRecognizeTextRequest テキスト認識要求の結果を VNRecognizedTextObservation オブジェクトの配列として受信します。 オブジェクトには以下が含まれます。 VNRecognizedTextObservation 認識されたテキストの配列 (V ) NRecognizedText().string 認識精度 ( ) VNRecognizedText().confidence 画像上で認識されたテキストの座標 ( ) VNRecognizedText().boundingBox 画像処理のリクエストを作成し、テキスト認識のリクエストを送信します。 文書認識用の独自のSDKを開発する場合の納税者番号とパスポート番号の認識 例: VNDetectFaceRectanglesリクエスト このクラスは画像内の顔を見つけて、その座標を返します。 顔認識リクエストの実装例: import Vision import UIKit func detectFaces(from image: UIImage) { guard let cgImage = image.cgImage else { return } let request = VNDetectFaceRectanglesRequest { request, error in // 1 guard let results = request.results as? [VNFaceObservation] else { return } // 2 for face in results { print("Face detected: \(face.boundingBox)") } } let handler = VNImageRequestHandler(cgImage: cgImage, options: [:]) // 3 try? handler.perform([request]) // 3 } 画像内の顔認識用の を作成します。 VNDetectFaceRectanglesRequest テキスト認識要求の結果を オブジェクトの配列として受信します。 VNFaceObservation オブジェクトには以下が含まれます。 VNFaceObservation 認識された顔の座標 VNFaceObservation().boundingBox。 画像処理のリクエストを作成し、顔認識のリクエストを送信します。 銀行では、パスポートと一緒に写真を撮る KYC オンボーディングがあり、これにより、これが実際の人物の顔であることを確認できます。 例: VNバーコード検出リクエスト このクラスは、画像からバーコードと QR コードを認識して読み取ります。 バーコードと QR コードを認識して読み取るリクエストを実装する例: import Vision import UIKit func detectBarcodes(from image: UIImage) { guard let cgImage = image.cgImage else { return } let request = VNDetectBarcodesRequest { request, error in // 1 guard let results = request.results as? [VNBarcodeObservation] else { return } // 2 for qrcode in results { print("qr code was found: \(qrcode.payloadStringValue ?? "not data")") } } let handler = VNImageRequestHandler(cgImage: cgImage, options: [:]) // 3 try? handler.perform([request]) // 3 } 認識用の を作成します。 VNDetectBarcodesRequest オブジェクト配列要求の結果を取得します。 VNBarcodeObservation オブジェクトには、次のような多くのプロパティが含まれています。 VNBarcodeObservation - バーコードまたは QR コードの文字列値。 VNFaceObservation().payloadStringValue 画像処理のリクエストを作成し、顔認識のリクエストを送信します。 支払い用の QR コードを読み取る QR スキャナー。 例: この強力なツールを使い始めるのに役立つように、Vision の 3 つの主要なクエリの種類について説明しました。