VNRequest — คืออะไร โครงสร้างของคำขอ Vision ใน iOS

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-07-20 เวลาอ่าน: 8 นาที

VNRequest เป็นคลาสพื้นฐานนามธรรมของเฟรมเวิร์ก Vision ที่ทำหน้าที่เป็นหน่วยวิเคราะห์ภาพหรือวิดีโอสตรีม การวิเคราะห์แต่ละประเภท — การตรวจจับใบหน้า การรู้จำข้อความ การค้นหาบาร์โค้ด การจำแนกประเภท — ถูกนำไปใช้เป็นคลาสย่อยเฉพาะของ VNRequest ตามข้อมูลจาก Apple Developer Documentation (2024) นักพัฒนาสร้างอินสแตนซ์ของคำขอ กำหนดค่าพารามิเตอร์ ส่งภาพผ่าน VNImageRequestHandler และรับผลลัพธ์ในรูปแบบอาร์เรย์ของ VNObservation

สิ่งสำคัญ

  • VNRequest เป็นคลาสพื้นฐานสำหรับคำขอ Vision ทั้งหมด: การวิเคราะห์ภาพ วิดีโอ และโมเดล ML
  • คำขอจะถูกดำเนินการผ่าน VNImageRequestHandler (ภาพ) หรือ VNSequenceRequestHandler (วิดีโอ)
  • ผลลัพธ์จะถูกส่งกลับในรูปแบบอาร์เรย์ของ VNObservation — คลาสย่อยแต่ละตัวมีข้อมูลเฉพาะ
  • Completion handler ช่วยให้ประมวลผลผลลัพธ์แบบอะซิงโครนัสหลังจากวิเคราะห์เสร็จ
  • สามารถดำเนินการคำขอหลายรายการ ด้วยการเรียกครั้งเดียว handler.perform() สำหรับภาพเดียว

VNRequest ใน Vision คืออะไร?

VNRequest เป็นองค์ประกอบพื้นฐานของสถาปัตยกรรม Vision ที่ใช้รูปแบบ Request-Response สำหรับการวิเคราะห์ภาพและวิดีโอ คลาสย่อยแต่ละตัวของ VNRequest รับผิดชอบงานคอมพิวเตอร์วิทัศน์เฉพาะ: การค้นหาใบหน้า การรู้จำข้อความ การจำแนกเนื้อหา

สถาปัตยกรรมของ VNRequest แยกสิ่งที่ต้องการวิเคราะห์ (คำขอ) ออกจากวิธีการประมวลผล (ตัวจัดการ) นักพัฒนากำหนดค่าคำขอ (ประเภทการวิเคราะห์ พารามิเตอร์เพิ่มเติม) และส่งให้ตัวจัดการพร้อมกับภาพ ตัวจัดการดำเนินการตามคำขอและส่งคืนผลลัพธ์ โดยไม่ต้องการให้นักพัฒนาเข้าใจอัลกอริทึมภายในของ ML

คลาสย่อยทั้งหมดของ VNRequest เป็นไปตามโครงสร้างเดียวกัน: การเริ่มต้นด้วย completion handler แบบเลือกได้ การตั้งค่าคุณสมบัติ (พื้นที่วิเคราะห์ ระดับความแม่นยำ) และการส่งให้ตัวจัดการ ทำให้ API สามารถคาดเดาได้และขยายได้ง่าย — การเพิ่มประเภทการวิเคราะห์ใหม่หมายถึงการสร้างคลาสย่อยใหม่ของ VNRequest

swift
import Vision

// 1. สร้างคำขอ
let request = VNDetectFaceRectanglesRequest { req, _ in
    // 3. ประมวลผลลัพธ์
    guard let faces = req.results as? [VNFaceObservation]
    else { return }
    print("Found \\(faces.count) faces")
}

// 2. ดำเนินการผ่าน handler
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])

คุณสมบัติหลักของ VNRequest: regionOfInterest (พื้นที่สนใจบนภาพเพื่อเร่งการวิเคราะห์), preferBackgroundProcessing (โหมดพื้นหลัง), revision (เวอร์ชันของอัลกอริทึม) และ cancellationSupport การตั้งค่าคุณสมบัติเหล่านี้อย่างถูกต้องช่วยปรับประสิทธิภาพให้เหมาะสมกับงานเฉพาะ

ตามข้อมูลจาก Apple WWDC 2024 ในช่วง 7 ปีที่ Vision มีอยู่ จำนวนคลาสย่อยของ VNRequest ที่มีให้ใช้เพิ่มขึ้นจาก 8 (iOS 11) เป็น 25+ (iOS 18) ครอบคลุมงานคอมพิวเตอร์วิทัศน์หลักทั้งหมดบนอุปกรณ์มือถือ

ประเภทหลักของ VNRequest สำหรับการวิเคราะห์

Vision มีคลาสย่อยของ VNRequest มากกว่า 25 รายการ แบ่งตามหมวดหมู่: การตรวจจับ การรู้จำ การติดตาม และการจำแนกประเภท แต่ละคลาสย่อยสืบทอด VNRequest และเพิ่มคุณสมบัติเฉพาะสำหรับงานนั้น

การตรวจจับและการรู้จำ

VNDetectFaceRectanglesRequest — ค้นหาใบบนภาพ ส่งคืน VNFaceObservation พร้อมพิกัด bounding box และ confidence VNDetectHumanRectanglesRequest — คล้ายกันสำหรับคน VNDetectHumanBodyPoseRequest — กำหนดท่าทางของคน (จุดโครงกระดูก)

การวิเคราะห์ข้อความ

VNRecognizeTextRequest — การรู้จำข้อความรองรับ 13 ภาษาและสองระดับความแม่นยำ VNReadCodeRequest — สำหรับโค้ดเฉพาะทาง VNDetectTextRectanglesRequest — ค้นหาพื้นที่ข้อความโดยไม่รู้จำ (เร็วกว่า แต่ได้เฉพาะสี่เหลี่ยม)

การจำแนกประเภทและการวิเคราะห์

VNClassifyImageRequest — การจำแนกภาพตาม 1,000 หมวดหมู่ของ ImageNet VNGenerateImageFeaturePrintRequest — การดึง feature vector สำหรับเปรียบเทียบภาพ VNDetectContoursRequest — การแยกโครงร่างของวัตถุ

หมวดหมู่ตัวอย่างคำขอผลลัพธ์
การตรวจจับใบหน้าVNDetectFaceRectanglesRequestVNFaceObservation
การรู้จำข้อความVNRecognizeTextRequestVNRecognizedTextObservation
บาร์โค้ดVNDetectBarcodesRequestVNBarcodeObservation
การจำแนกประเภทVNClassifyImageRequestVNClassificationObservation
การติดตามVNTrackObjectRequestVNDetectedObjectObservation
โครงร่างVNDetectContoursRequestVNContoursObservation

VNImageRequestHandler และ VNSequenceRequestHandler

VNImageRequestHandler — ตัวจัดการสำหรับภาพนิ่ง รองรับ CGImage, CIImage หรือ Data (JPEG/PNG) และดำเนินการ VNRequest หนึ่งรายการหรือมากกว่า เป็นวิธีหลักในการใช้ Vision สำหรับรูปภาพ ภาพหน้าจอ และภาพที่อัปโหลด

VNSequenceRequestHandler — ตัวจัดการสำหรับลำดับภาพ (เฟรมวิดีโอ) รองรับประเภทภาพเดียวกัน แต่ออกแบบสำหรับการประมวลผลทีละเฟรมพร้อมกับการเก็บสถานะระหว่างเฟรม (จำเป็นสำหรับการติดตามวัตถุ)

swift
// VNImageRequestHandler สำหรับภาพเดียว
let imageHandler = VNImageRequestHandler(
    cgImage: cgImage,
    orientation: orientation,
    options: [:])

// VNSequenceRequestHandler สำหรับวิดีโอ
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
    on: cgImage)

ความแตกต่างที่สำคัญ: VNSequenceRequestHandler ไม่รองรับการดำเนินการคำขอหลายรายการแบบขนาน — แต่ละการเรียก perform() จะประมวลผลคำขอหนึ่งชุดสำหรับหนึ่งเฟรม สำหรับการประมวลผลวิดีโอแบบหลายเธรด ให้สร้างอินสแตนซ์ตัวจัดการแยกต่างหากสำหรับแต่ละเธรด

VNImageRequestHandler สามารถทำงานบนคิวพื้นหลังได้ Apple แนะนำ DispatchQueue.global(qos: .userInitiated) สำหรับสถานการณ์แบบโต้ตอบ (ผู้ใช้รอผลลัพธ์) และ .background สำหรับการประมวลผลแบบแบตช์ (เช่น การวิเคราะห์คลังภาพถ่ายทั้งหมด)

VNObservation: โครงสร้างของผลลัพธ์

VNObservation เป็นคลาสพื้นฐานสำหรับผลลัพธ์ทั้งหมดของคำขอ Vision แต่ละคลาสย่อยของ VNObservation มีข้อมูลเฉพาะสำหรับประเภทการวิเคราะห์: พิกัด bounding box ข้อความที่รู้จำ ความเชื่อมั่น (confidence) ตัวระบุเฉพาะ (uuid) และการประทับเวลา (timeRange)

คลาสย่อยหลักของ VNObservation: VNFaceObservation (ผลลัพธ์การตรวจจับใบหน้าพร้อม bounding box และ landmarks), VNRecognizedTextObservation (ข้อความที่รู้จำพร้อม candidates), VNBarcodeObservation (บาร์โค้ดที่ถอดรหัสแล้วพร้อม payload และ symbology), VNClassificationObservation (หมวดหมู่การจำแนกพร้อม confidence)

swift
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)")
    }
}

คุณสมบัติ confidence (ตั้งแต่ 0.0 ถึง 1.0) มีอยู่ใน VNObservation ทั้งหมดและแสดงความมั่นใจของโมเดลในผลลัพธ์ Apple แนะนำให้ละทิ้งการสังเกตที่มี confidence < 0.5 สำหรับงานส่วนใหญ่ สำหรับแอปพลิเคชันที่สำคัญ (การแพทย์ ความปลอดภัย) ควรเพิ่มเกณฑ์เป็น 0.8–0.9

VNObservation ยังมี timeRange (สำหรับคำขอวิดีโอ) และ uuid (ID เฉพาะสำหรับการจับคู่ระหว่างเฟรม) ซึ่งช่วยให้ติดตามวัตถุเดียวกัน (เช่น ใบหน้า) ผ่านลำดับเฟรมวิดีโอ

การดำเนินการคำขอหลายรายการพร้อมกัน

ข้อได้เปรียบสำคัญอย่างหนึ่งของ VNRequest คือความสามารถในการดำเนินการคำขอที่แตกต่างกันหลายรายการกับภาพเดียวในการเรียก handler.perform() เพียงครั้งเดียว Vision จะปรับลำดับการดำเนินการภายในและใช้การคำนวณร่วมกันซ้ำ (เช่น การประมวลผลภาพเบื้องต้น)

ซึ่งช่วยให้ได้รับชุดข้อมูลที่สมบูรณ์เกี่ยวกับภาพในรอบเดียว: ตรวจจับใบหน้า รู้จำข้อความ ค้นหาบาร์โค้ด และจำแนกเนื้อหาไปพร้อมกัน วิธีการนี้มีประสิทธิภาพมากกว่าการเรียกแต่ละคำขอตามลำดับแยกกันอย่างมาก

swift
import Vision

// คำขอหลายรายการในอาร์เรย์เดียว
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
])

// เข้าถึงผลลัพธ์จากแต่ละคำขอ
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")

ข้อจำกัด: ไม่ใช่ทุกคำขอที่สามารถรวมกับคำขออื่นได้ ตัวอย่างเช่น VNGenerateImageFeaturePrintRequest ต้องดำเนินการแยกต่างหาก Apple แนะนำให้จัดกลุ่มคำขอดตามประเภท (การตรวจจับ การรู้จำ การจำแนก) และทดสอบการรวมกันบนอุปกรณ์เป้าหมาย

ประสิทธิภาพ: การรวม 3–4 คำขอใน perform() เดียวเร็วกว่าการดำเนินการตามลำดับ 30–40% เนื่องจาก Vision ใช้การคำนวณ ML ร่วมกันและการประมวลผลภาพเบื้องต้นซ้ำ (การปรับขนาด การปรับสี)

คำขอแบบกำหนดเองด้วย VNCoreMLRequest

VNCoreMLRequest เป็นสะพานเชื่อมระหว่าง Core ML และ Vision ที่ช่วยให้เรียกใช้โมเดล Core ML ใด ๆ เป็นคำขอ Vision โมเดลจะถูกห่อใน VNCoreMLModel ส่งไปยัง VNCoreMLRequest และ Vision จะจัดการการประมวลผลภาพเบื้องต้นโดยอัตโนมัติ (การปรับขนาด การครอบตัดให้พอดีกับขนาดอินพุตของโมเดล)

VNCoreMLRequest สืบทอด VNRequest จึงรองรับความสามารถมาตรฐานทั้งหมด: regionOfInterest, completion handler, คำขอหลายรายการ ซึ่งช่วยให้รวมโมเดล ML ที่กำหนดเองกับตัวตรวจจับ Vision ในตัวในไปป์ไลน์เดียว

swift
import Vision
import CoreML

// ครอบโมเดล Core ML
guard let mlModel = try VNCoreMLModel(
    for: MyCustomClassifier().model)
else { return }

// สร้าง VNCoreMLRequest
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 กำหนดวิธีที่ Vision ปรับขนาดภาพให้พอดีกับอินพุตของโมเดล: .centerCrop (ครอบตัดตรงกลาง), .scaleFill (ยืด) หรือ .scaleFit (ปรับขนาดโดยคงสัดส่วนไว้) การเลือกขึ้นอยู่กับประเภทของโมเดลและตำแหน่งของวัตถุบนภาพ

ตัวอย่างในทางปฏิบัติ: ตรวจจับใบหน้าผ่าน VNDetectFaceRectanglesRequest จากนั้นจำแนกแต่ละใบหน้าผ่าน VNCoreMLRequest ด้วยโมเดลที่กำหนดเอง (เช่น การระบุเพศหรืออายุ) การรวมสองคำขอใน perform() เดียวช่วยให้ได้ไปป์ไลน์การวิเคราะห์ใบหน้าที่สมบูรณ์ในรอบเดียว

คำถามที่พบบ่อย

สามารถยกเลิก VNRequest ที่กำลังทำงานอยู่ได้หรือไม่?

ได้ VNRequest แต่ละตัวมีคุณสมบัติ cancel() ที่ยกเลิกการดำเนินการของคำขอ อย่างไรก็ตาม การยกเลิกทำงานได้เฉพาะก่อนเริ่มประมวลผล — หากโมเดล ML เริ่มทำงานแล้ว การยกเลิกจะไม่ขัดจังหวะการคำนวณ สำหรับการยกเลิกที่เชื่อถือได้ ให้ใช้ DispatchWorkItem.cancel() ร่วมกับ VNRequest.cancel() ใน completion handler

VNDetectFaceRectanglesRequest และ VNDetectFaceLandmarksRequest แตกต่างกันอย่างไร?

VNDetectFaceRectanglesRequest ค้นหาเฉพาะสี่เหลี่ยมของใบหน้า VNDetectFaceLandmarksRequest ระบุจุดสำคัญบนใบหน้าเพิ่มเติม 68 จุด (ตา คิ้ว จมูก ปาก โครงหน้า) VNDetectFaceLandmarksRequest ช้ากว่าแต่ให้ข้อมูลมากขึ้นสำหรับแอนิเมชัน มาสก์ และเอฟเฟกต์ AR สำหรับการนับจำนวนใบหน้าอย่างง่าย VNDetectFaceRectanglesRequest ก็เพียงพอ

คำขอสำหรับค้นหาบาร์โค้ดคือ VNDetectBarcodesRequest หรือไม่?

ใช่ VNDetectBarcodesRequest เป็นคำขอที่ถูกต้องสำหรับบาร์โค้ดและ QR-code ทุกประเภท รองรับ EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR และรูปแบบอื่น ๆ ผลลัพธ์ถูกส่งกลับใน VNBarcodeObservation พร้อม payload และ symbology สำหรับวิดีโอสตรีม ให้ใช้ AVCaptureMetadataOutput — เร็วกว่าสำหรับการสแกนแบบสด

สามารถดำเนินการ VNRequest บน CIImage แทน CGImage ได้หรือไม่?

ได้ VNImageRequestHandler รองรับ CIImage ผ่าน initializer init(ciImage:options:) และยังรองรับ Data (JPEG/PNG) และ NSURL (พาธไปยังไฟล์) CIImage สะดวกเมื่อภาพถูกโหลดผ่าน Core Image pipeline แล้ว — หลีกเลี่ยงการคัดลอกข้อมูลในหน่วยความจำโดยไม่จำเป็น

สามารถดำเนินการ VNRequest ได้กี่รายการต่อการเรียก perform() หนึ่งครั้ง?

ไม่มีข้อจำกัดด้านจำนวน แต่ในทางปฏิบัติ 3–5 คำขอ เป็นจำนวนที่เหมาะสมที่สุด มากกว่า 5 คำขออาจทำให้การใช้หน่วยความจำเพิ่มขึ้น เนื่องจากแต่ละคำขอโหลดโมเดล ML ของตัวเอง หากต้องการวิเคราะห์ที่แตกต่างกัน 10+ รายการ ให้แบ่งเป็น 2–3 กลุ่มและดำเนินการตามลำดับ

สรุป

  • VNRequest เป็นคลาสพื้นฐานของ Vision สำหรับการวิเคราะห์ภาพและวิดีโอทุกประเภทด้วยสถาปัตยกรรม Request-Response ที่เป็นหนึ่งเดียว
  • Vision มี คลาสย่อยของ VNRequest มากกว่า 25 รายการ สำหรับการตรวจจับใบหน้า OCR บาร์โค้ด การจำแนก โครงร่าง การติดตาม และโมเดล ML
  • VNImageRequestHandler ดำเนินการคำขอบนภาพนิ่ง; VNSequenceRequestHandler บนลำดับเฟรมสำหรับการติดตาม
  • ผลลัพธ์ถูกส่งกลับในรูปแบบ VNObservation พร้อม bounding box, confidence, uuid และข้อมูลเฉพาะตามประเภท
  • คำขอหลายรายการใน perform() เดียวทำงานเร็วกว่าการเรียกตามลำดับ 30–40% เนื่องจากการใช้การคำนวณ ML ร่วมกัน
  • VNCoreMLRequest รวมโมเดล Core ML ที่กำหนดเองเข้ากับไปป์ไลน์ Vision ด้วยการประมวลผลภาพเบื้องต้นอัตโนมัติ
  • คำขอทั้งหมดทำงาน บนอุปกรณ์ โดยไม่ส่งข้อมูลไปยังเซิร์ฟเวอร์ มั่นใจในความเป็นส่วนตัวและการทำงานแบบออฟไลน์

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม