VNRequest — a Vision keretrendszer absztrakt alaposztálya, amely egy kép vagy videóstream elemzési egységét reprezentálja. Minden elemzési típus — arcok észlelése, szövegfelismerés, vonalkódok keresése, osztályozás — a VNRequest egy konkrét alosztályaként van implementálva. Az Apple Developer Documentation (2024) szerint a fejlesztő létrehoz egy kéréspéldányt, konfigurálja a paramétereit, átadja a képet a VNImageRequestHandler-en keresztül, és megkapja az eredményeket egy VNObservation tömb formájában.
Lényeg
VNRequest — a Vision architektúra alapvető eleme, amely a Request-Response mintát valósítja meg képek és videók elemzéséhez. A VNRequest minden alosztálya egy adott számítógépes látási feladatért felelős: arcok keresése, szöveg felismerése, tartalom osztályozása.
A VNRequest architektúra elválasztja a „mit elemezzünk” (kérés) a „hogyan dolgozzuk fel” (handler) résztől. A fejlesztő konfigurálja a kérést (elemzés típusa, további paraméterek), és átadja a handler-nek a képpel együtt. A handler végrehajtja a kérést és visszaadja az eredményeket anélkül, hogy a fejlesztőnek meg kellene értenie a belső ML algoritmusokat.
A VNRequest összes alosztálya egységes szerkezetet követ: inicializálás opcionális completion handler-rel, tulajdonságok konfigurálása (elemzési régió, pontossági szint) és átadás a handler-nek. Ez az API-t kiszámíthatóvá és könnyen bővíthetővé teszi — új elemzési típus hozzáadása a VNRequest új alosztályának létrehozását jelenti.
import Vision
// 1. Kérés létrehozása
let request = VNDetectFaceRectanglesRequest { req, _ in
// 3. Eredmények feldolgozása
guard let faces = req.results as? [VNFaceObservation]
else { return }
print("Found \\(faces.count) faces")
}
// 2. Végrehajtás handler-en keresztül
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])
A VNRequest legfontosabb tulajdonságai: regionOfInterest (érdeklődési terület a képen az elemzés gyorsításához), preferBackgroundProcessing (háttér mód), revision (algoritmus verzió) és cancellationSupport. Ezen tulajdonságok helyes konfigurálása lehetővé teszi a teljesítmény optimalizálását egy adott feladathoz.
Az Apple WWDC 2024 szerint a Vision 7 éves fennállása alatt a VNRequest elérhető alosztályainak száma 8-ról (iOS 11) több mint 25-re (iOS 18) nőtt, lefedve az összes főbb számítógépes látási feladatot mobil eszközökön.
Vision több mint 25 VNRequest alosztályt tartalmaz, kategóriákra bontva: észlelés, felismerés, követés és osztályozás. Minden alosztály örökli a VNRequest-et és hozzáadja a feladatspecifikus tulajdonságokat.
VNDetectFaceRectanglesRequest — arcok keresése a képen. Visszaadja a VNFaceObservation-t bounding box koordinátákkal és confidence-szel. VNDetectHumanRectanglesRequest — hasonlóan emberekre. VNDetectHumanBodyPoseRequest — emberi testtartás meghatározása (csontváz pontok).
VNRecognizeTextRequest — szövegfelismerés 13 nyelv támogatásával és két pontossági szinttel. VNReadCodeRequest — speciális kódokhoz. VNDetectTextRectanglesRequest — szöveges területek keresése felismerés nélkül (gyorsabb, de csak téglalapok).
VNClassifyImageRequest — kép osztályozása 1000 ImageNet kategória szerint. VNGenerateImageFeaturePrintRequest — feature vector kinyerése képek összehasonlításához. VNDetectContoursRequest — objektum kontúrok észlelése.
VNImageRequestHandler — handler statikus képekhez. CGImage, CIImage vagy Data (JPEG/PNG) elfogadásával egy vagy több VNRequest végrehajtására képes. Ez a fő módja a Vision használatának fényképekhez, képernyőképekhez és feltöltött képekhez.
VNSequenceRequestHandler — handler képszekvenciákhoz (videó képkockák). Ugyanazt a képtípus készletet fogadja el, de képkockánkénti feldolgozásra szolgál az állapot megőrzésével a képkockák között (objektumkövetéshez szükséges).
// VNImageRequestHandler egyetlen képhez
let imageHandler = VNImageRequestHandler(
cgImage: cgImage,
orientation: orientation,
options: [:])
// VNSequenceRequestHandler videóhoz
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
on: cgImage)
Fontos különbség: A VNSequenceRequestHandler nem támogatja több kérés párhuzamos végrehajtását — minden perform() hívás egy kéréskészletet dolgoz fel egyetlen képkockához. Többszálú videófeldolgozáshoz külön handler példányokat hozzon létre a különböző szálakhoz.
VNImageRequestHandler végrehajtható háttér sorban. Az Apple a DispatchQueue.global(qos: .userInitiated) ajánlja interaktív forgatókönyvekhez (a felhasználó várja az eredményt) és a .background-ot kötegelt feldolgozáshoz (pl. a teljes fotókönyvtár elemzése).
VNObservation — a Vision kérések összes eredményének alaposztálya. Minden VNObservation alosztály az elemzési típushoz tartozó adatokat tartalmaz: bounding box koordináták, felismert szöveg, megbízhatóság (confidence), egyedi azonosító (uuid) és időbélyeg (timeRange).
A VNObservation legfontosabb alosztályai: VNFaceObservation (arcészlelés eredménye bounding box-szal és landmarks-szel), VNRecognizedTextObservation (felismert szöveg candidates-szel), VNBarcodeObservation (dekódolt vonalkód payload-dal és symbology-val), VNClassificationObservation (osztályozási kategória confidence-szel).
func handleTextResults(request: VNRequest) {
guard let observations = request.results
as? [VNRecognizedTextObservation]
else { return }
for observation in observations {
let bbox = observation.boundingBox
let text = observation.topCandidates(1).first ?? ""
print("\\(text) at \\(bbox)")
}
}
A confidence tulajdonság (0.0-tól 1.0-ig) minden VNObservation-ban jelen van, és mutatja a modell bizonyosságát az eredményben. Az Apple azt ajánlja, hogy a confidence < 0.5 értékű megfigyeléseket el kell vetni a legtöbb feladatnál. Kritikus alkalmazásoknál (orvosi, biztonsági) a küszöböt 0.8–0.9-re kell emelni.
VNObservation tartalmazza továbbá a timeRange-t (videó kérésekhez) és uuid-t (egyedi azonosító a képkockák közötti egyeztetéshez). Ez lehetővé teszi ugyanazon objektum (pl. arc) követését videó képkockák sorozatán keresztül.
A VNRequest egyik legfontosabb előnye — a lehetőség több különböző kérés egyetlen handler.perform() hívásban történő végrehajtására. A Vision belsőleg optimalizálja a végrehajtási sorrendet és újrahasznosítja a közös számításokat (pl. a kép előfeldolgozását).
Ez lehetővé teszi a képről származó teljes adatkészlet egyetlen átmenetben történő megszerzését: egyidejűleg arcok észlelése, szöveg felismerése, vonalkódok megtalálása és tartalom osztályozása. Ez a megközelítés jelentősen hatékonyabb, mint az egyes kérések egymás utáni meghívása.
import Vision
// Több kérés egy tömbben
let faceRequest = VNDetectFaceRectanglesRequest()
let textRequest = VNRecognizeTextRequest()
let barcodeRequest = VNDetectBarcodesRequest()
let classifyRequest = VNClassifyImageRequest()
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([
faceRequest,
textRequest,
barcodeRequest,
classifyRequest
])
// Eredmények elérése minden kérésből
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")
Korlátozások: nem minden kérés kombinálható másokkal. Például a VNGenerateImageFeaturePrintRequest külön kell végrehajtani. Az Apple a kérések típus szerinti csoportosítását ajánja (észlelés, felismerés, osztályozás) és a kombinációk tesztelését a cél eszközökön.
Teljesítmény: 3–4 kérés egyesítése egy perform()-ban 30–40%-kal gyorsabb, mint a szekvenciális végrehajtás, mivel a Vision újrahasznosítja a közös ML számításokat és a kép előfeldolgozását (skálázás, színkorrekció).
VNCoreMLRequest — híd a Core ML és a Vision között, amely lehetővé teszi bármely Core ML modell futtatását Vision kérésként. A modell VNCoreMLModel-be van csomagolva, átadva a VNCoreMLRequest-nek, és a Vision automatikusan elvégzi a kép előfeldolgozását (skálázás, vágás a modell bemeneti méretéhez).
VNCoreMLRequest örökli a VNRequest-et, így támogatja az összes szabványos funkciót: regionOfInterest, completion handler, több kérés. Ez lehetővé teszi az egyedi ML modell és a Vision beépített érzékelőinek kombinálását egy pipeline-ban.
import Vision
import CoreML
// Core ML modell becsomagolása
guard let mlModel = try VNCoreMLModel(
for: MyCustomClassifier().model)
else { return }
// VNCoreMLRequest létrehozása
let coreMLRequest = VNCoreMLRequest(model: mlModel) { request, _ in
guard let results = request.results
as? [VNClassificationObservation]
else { return }
for result in results.prefix(5) {
print("\\(result.identifier): \\(result.confidence)"
}
}
coreMLRequest.imageCropAndScaleOption = .centerCrop
coreMLRequest.regionOfInterest = faceBoundingBox
imageCropAndScaleOption határozza meg, hogy a Vision hogyan skálázza a képet a modell bemenetére: .centerCrop (vágás középről), .scaleFill (nyújtás) vagy .scaleFit (skálázás arányok megtartásával). A választás a modell típusától és az objektum képen elfoglalt helyzetétől függ.
Gyakorlati példa: arcok észlelése a VNDetectFaceRectanglesRequest segítségével, majd az egyes arcok osztályozása a VNCoreMLRequest segítségével egyedi modellel (pl. nem vagy életkor meghatározása). Két kérés egy perform()-ban történő kombinálásával teljes arcelemzési pipeline-t kap egyetlen átmenetben.
Gyakran Ismételt Kérdések
Igen, minden VNRequest rendelkezik egy cancel() tulajdonsággal, amely megszakítja a kérés végrehajtását. A megszakítás azonban csak a feldolgozás megkezdése előtt működik — ha az ML modell már elindult, a megszakítás nem állítja meg a számítást. Megbízható megszakításhoz használja a DispatchWorkItem.cancel()-t a VNRequest.cancel()-lel együtt a completion handler-ben.
VNDetectFaceRectanglesRequest csak arc téglalapokat talál. VNDetectFaceLandmarksRequest emellett meghatározza az arc 68 kulcspontját (szemek, szemöldök, orr, száj, kontúr). A VNDetectFaceLandmarksRequest lassabb, de több adatot szolgáltat animációhoz, maszkokhoz és AR effektekhez. Egyszerű arcszámláláshoz elegendő a VNDetectFaceRectanglesRequest.
Igen, a VNDetectBarcodesRequest — a megfelelő kérés minden típusú vonalkódhoz és QR kódhoz. Támogatja az EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR és egyéb formátumokat. Az eredmény VNBarcodeObservation-ban kerül visszaadásra payload-dal és symbology-val. Videó streamhez használja az AVCaptureMetadataOutput-t — gyorsabb élő szkenneléshez.
Igen, VNImageRequestHandler elfogadja a CIImage-t az init(ciImage:options:) inicializáló segítségével. Támogatott még a Data (JPEG/PNG) és NSURL (fájl elérési út) is. A CIImage akkor kényelmes, ha a kép már betöltődött a Core Image pipeline-on keresztül — ez elkerüli a szükségtelen adatmásolást a memóriában.
Nincs számbeli korlátozás, de a gyakorlatban 3–5 kérés az optimális mennyiség. Több mint 5 kérés memóriahasználat-növekedést okozhat, mivel minden kérés betölti a saját ML modelljét. Ha 10+ különböző elemzést kell végrehajtania, ossza fel őket 2–3 csoportra és hajtsa végre szekvenciálisan.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is