El marco Vision fue presentado por Apple en 2017 en la WWDC como parte de iOS 11. Su lanzamiento marcó un punto de inflexión en la evolución de la visión artificial y el análisis de imágenes, proporcionando a los desarrolladores herramientas nativas para analizar contenido visual y realizar el procesamiento posterior según sea necesario.
En 2017, Vision presentó:
Desde su debut, Apple ha mejorado continuamente el marco Vision, asegurándose de que evoluciona para cumplir con los requisitos modernos. Para fines de 2024, con el lanzamiento de iOS 18, Vision ahora ofrece:
Con la llegada del marco Vision, los desarrolladores obtuvieron la capacidad de realizar tareas avanzadas de análisis de imágenes y videos de forma nativa, sin depender de soluciones de terceros. Estas capacidades incluyen escanear documentos, reconocer texto, identificar rostros y poses, detectar imágenes duplicadas y automatizar varios procesos que agilizan las operaciones comerciales.
En este artículo, veremos los principales escenarios de uso de Vision con ejemplos de código que te ayudarán a comprender cómo trabajar con él, comprender que no es difícil y comenzar a aplicarlo en la práctica en tus aplicaciones.
Vision tiene una clase abstracta VNRequest que define estructuras de solicitud de datos en Vision, y las clases descendientes implementan solicitudes específicas para realizar tareas específicas con una imagen.
Todas las subclases heredan el inicializador de la clase VNRequest .
public init(completionHandler: VNRequestCompletionHandler? = nil)
Que retorna el resultado del procesamiento de la solicitud. Es importante aclarar que el resultado de la solicitud será retornado en la misma cola en la que se envió la solicitud.
Donde VNRequestCompletionHandler es un alias de tipo.
public typealias VNRequestCompletionHandler = (VNRequest, (any Error)?) -> Void
Que devuelve un VNRequest con los resultados de la solicitud o un Error si la solicitud no se ejecutó debido a algún error del sistema, imagen incorrecta, etc.
La clase VNRecognizeTextRequest de la clase abstracta VNRequest está diseñada para manejar solicitudes de reconocimiento de texto en imágenes.
Ejemplo de implementación de una solicitud de reconocimiento de texto:
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 }
Cree una VNRecognizeTextRequest para el reconocimiento de texto.
Reciba los resultados de la solicitud de reconocimiento de texto como matrices de objetos VNRecognizedTextObservation.
El objeto VNRecognizedTextObservation contiene:
Cree una solicitud de procesamiento de imágenes y envíe una solicitud de reconocimiento de texto.
Ejemplo: Reconocimiento del número de identificación fiscal y del número de pasaporte al desarrollar su propio SDK para el reconocimiento de documentos
Esta clase encuentra caras en una imagen y devuelve sus coordenadas.
Ejemplo de implementación de una solicitud de reconocimiento facial:
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 }
Cree una VNDetectFaceRectanglesRequest para el reconocimiento facial en una imagen.
Reciba los resultados de la solicitud de reconocimiento de texto como matrices de objetos VNFaceObservation .
El objeto VNFaceObservation contiene:
Coordenadas de la cara reconocida VNFaceObservation().boundingBox.
Cree una solicitud de procesamiento de imágenes y envíe una solicitud de reconocimiento facial.
Ejemplo: En los bancos existe un onboarding KYC donde debes tomarte una foto con tu pasaporte; de esta manera, puedes confirmar que ese es el rostro de una persona real.
Esta clase reconoce y lee códigos de barras y códigos QR de una imagen.
Ejemplo de implementación de una solicitud de reconocimiento y lectura de un código de barras y un código 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 }
Cree una VNDetectBarcodesRequest para reconocimiento.
Obtenga los resultados de la solicitud de matriz de objetos VNBarcodeObservation .
El objeto VNBarcodeObservation contiene muchas propiedades, entre ellas:
VNFaceObservation().payloadStringValue : el valor de la cadena del código de barras o código QR.
Cree una solicitud de procesamiento de imágenes y envíe una solicitud de reconocimiento facial.
Ejemplo: escáner QR para leer códigos QR para pago.
Hemos cubierto los tres tipos principales de consultas en Vision para ayudarlo a comenzar a utilizar esta poderosa herramienta.