Vision « فریمورک بینایی کامپیوتر از Apple است که اولین بار در iOS 11 در سال 2017 معرفی شد. Vision الگوریتمهای آماده برای تشخیص چهره، تشخیص متن (OCR)، شناسایی بارکد، ردیابی اشیاء، طبقهبندی تصاویر و تحلیل کانتورها را ارائه میدهد » همه با استفاده از Neural Engine روی دستگاه انجام میشود. طبق Apple WWDC 2023، Vision در برنامه استاندارد «Photos» برای تشخیص چهره و در «Camera» برای تشخیص متن در زمان واقعی در iPhone و iPad استفاده میشود.
نکات اصلی
Vision « یک فریمورک سطح بالای بینایی کامپیوتر است که الگوریتمهای پیچیده یادگیری ماشین را در پشت API ساده درخواستها (VNRequest) انتزاع میکند. توسعهدهنده نیازی به دانستن شبکههای عصبی کانولوشنی ندارد » کافی است یک درخواست از نوع مناسب ایجاد کند، تصویر را ارسال کند و نتیجه را دریافت کند.
معماری Vision بر اساس اصل Request → Handler → Result ساخته شده است: VNImageRequestHandler تصویر را دریافت میکند، VNRequest را اجرا میکند و آرایهای از VNObservation با نتایج بازمیگرداند. این امکان ترکیب چندین درخواست به یک تصویر را فراهم میکند » مثلاً همزمان چهرهها و متن را در یک عکس تشخیص دهد.
Vision از iOS 11+ و macOS 10.13+ پشتیبانی میکند. برای شتاب سختافزاری از طریق Neural Engine به تراشه A12 Bionic یا جدیدتر نیاز است. در دستگاههای A17 Pro و سری M، Vision تا 60 فریم در ثانیه را برای ویدیوی زنده پردازش میکند.
مزیت کلیدی Vision » محرمانگی کامل: تمام محاسبات روی دستگاه انجام میشود، تصاویر به سرور ارسال نمیشوند. این امکان استفاده از فریمورک را در برنامههای کاربردی با دادههای حساس، مثلاً پزشکی یا بانکی، فراهم میکند.
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) و landmarks » آرایهای از نقاط چهره در صورت VNDetectFaceLandmarksRequest را شامل میشود. Confidence زیر 0.5 معمولاً به معنی تشخیص نادرست است » توصیه میشود چنین نتایجی را رد کنید.
Vision همچنین از VNDetectFaceCaptureQualityRequest پشتیبانی میکند که کیفیت تصویر چهره را ارزیابی میکند: نورپردازی، وضوح، زاویه چرخش. این برای انتخاب بهترین فریم هنگام ثبتنام کاربر یا ایجاد آواتار مفید است.
VNRecognizeTextRequest « موتور OCR داخلی Apple است که در iOS 13 معرفی شد. متن چاپی را روی تصاویر با پشتیبانی از 13 زبان تشخیص میدهد: انگلیسی، روسی، چینی، ژاپنی، کرهای، ایتالیایی، آلمانی، اسپانیایی، پرتغالی، فرانسوی، عربی، ویتنامی و تایلندی.
VNRecognizeTextRequest از دو سطح دقت پشتیبانی میکند: .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، دقت VNRecognizeTextRequest در سطح .accurate برای عکسهای واضح اسناد به انگلیسی 96% و برای روسی حدود 88% است. برای متن روی بستهبندیها، تابلوها و صفحهنمایشها دقت به 75 تا 85% کاهش مییابد.
| Recognition Level | سرعت | دقت (انگلیسی) | پشتیبانی روسی |
|---|---|---|---|
| .fast | 0.1»0.3 ثانیه | ~85% | بله |
| .accurate | 0.3»1.0 ثانیه | ~96% | بله |
VNDetectBarcodesRequest « درخواست Vision برای تشخیص و رمزگشایی بارکد و QR روی تصویر. تمام فرمتهای اصلی پشتیبانی میشوند: 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، payload میتواند URL، متن یا JSON باشد. برای EAN/UPC کد عددی محصول بازگردانده میشود که میتواند برای جستجوی کالا در پایگاه داده استفاده شود.
Vision میتواند چندین بارکد را روی یک تصویر پردازش کند » آرایه observations شامل یک شیء برای هر کد پیدا شده است. این برای اسکن بستههای کالا یا اسناد با چندین بارکد مفید است.
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 دسته (مدل ResNet-50 آموزش دیده روی ImageNet) است. درخواست آرایهای از 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 اجازه اجرای مدلهای Core ML را در پایپلاین Vision میدهد و بهترین هر دو جهان را ترکیب میکند: دیتکتورهای آماده Vision + طبقهبندی سفارشی Core ML.
بله، Vision از پردازش جریان ویدیو در زمان واقعی از طریق VNSequenceRequestHandler برای ردیابی و از طریق AVCaptureVideoDataOutput برای پردازش فریم به فریم پشتیبانی میکند. در دستگاههای A12+ با Neural Engine، Vision تا 60 فریم در ثانیه را برای تشخیص چهره پردازش میکند. برای وظایف سنگین (OCR، طبقهبندی) توصیه میشود هر 5 تا 10 فریم پردازش شود.
VNRecognizeTextRequest از 13 زبان پشتیبانی میکند: انگلیسی، روسی، چینی (ساده و سنتی)، ژاپنی، کرهای، ایتالیایی، آلمانی، اسپانیایی، پرتغالی، فرانسوی، عربی، ویتنامی و تایلندی. برای تشخیص چندین زبان روی یک تصویر، آرایهای در ویژگی recognitionLanguages مشخص کنید.
بله، از طریق VNCoreMLRequest. شما یک مدل Core ML ایجاد میکنید که در VNCoreMLModel پیچیده شده و آن را به VNCoreMLRequest ارسال میکنید. Vision به طور خودکار پیشپردازش تصویر (مقیاسبندی، برش) را مدیریت کرده و آن را به مدل Core ML ارسال میکند. نتیجه به صورت VNCoreMLFeatureValueObservation با دادههای خروجی مدل بازگردانده میشود.
خیر، Vision تمام تحلیل را کاملاً روی دستگاه انجام میدهد. تصاویر دستگاه کاربر را ترک نمیکنند. این معماری اساسی Apple است: تمام فریمورکهای ML (Vision، NaturalLanguage، Core ML، Speech) برای حفظ حریم خصوصی روی دستگاه کار میکنند. هیچ دادهای به سرورهای Apple ارسال نمیشود.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید