میتوانید از ML Kit برای برچسبگذاری اشیای شناساییشده در تصویر استفاده کنید. مدل پیشفرض ارائهشده با ML Kit از بیشاز ۴۰۰ برچسب مختلف پشتیبانی میکند.
امتحان کنید
- با برنامه نمونه بازی کنید تا نمونهای از کاربرد این API را ببینید.
قبلاز شروع
- غلافهای ML Kit زیر را در Podfile خود بگنجانید:
pod 'GoogleMLKit/ImageLabeling', '8.0.0'
- پساز نصب یا بهروزرسانی Pods پروژه، پروژه Xcode را بااستفاده از
.xcworkspaceآن باز کنید. «کیت یادگیری ماشین» در Xcode نسخه ۱۲.۴ یا بالاتر پشتیبانی میشود.
اکنون آماده برچسبگذاری تصاویر هستید.
۱. آماده کردن تصویر ورودی
بااستفاده از UIImage یا CMSampleBuffer، یک شیء VisionImage ایجاد کنید.
اگر از UIImage استفاده میکنید، این مراحل را دنبال کنید:
- با
UIImage، شیءVisionImageایجاد کنید. حتماً.orientationصحیح را مشخص کنید.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
آبجکتیو-سی
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
اگر از CMSampleBuffer استفاده میکنید، این مراحل را دنبال کنید:
-
جهت دادههای تصویر موجود در
CMSampleBufferرا مشخص کنید.برای دریافت جهت تصویر:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
آبجکتیو-سی
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
- بااستفاده از
شیء
CMSampleBufferو جهتگیری، شیءVisionImageایجاد کنید:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
آبجکتیو-سی
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
۲. پیکربندی و اجرای برچسبگذار تصویر
برای برچسبگذاری اشیا در تصویر، شیءVisionImage را به
متد ImageLabeler در processImage() ارسال کنید.
- ابتدا نمونهای از
ImageLabelerرا دریافت کنید.
Swift
let labeler = ImageLabeler.imageLabeler() // Or, to set the minimum confidence required: // let options = ImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = ImageLabeler.imageLabeler(options: options)
آبجکتیو-سی
MLKImageLabeler *labeler = [MLKImageLabeler imageLabeler]; // Or, to set the minimum confidence required: // MLKImageLabelerOptions *options = // [[MLKImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // MLKImageLabeler *labeler = // [MLKImageLabeler imageLabelerWithOptions:options];
- سپس تصویر را به روش
processImage()ارسال کنید:
Swift
labeler.process(image) { labels, error in guard error == nil, let labels = labels else { return } // Task succeeded. // ... }
آبجکتیو-سی
[labeler processImage:image completion:^(NSArray*_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
۳. دریافت اطلاعات درباره اشیای برچسبگذاریشده
اگر برچسبگذاری تصویر موفقیتآمیز باشد، گرداننده تکمیل آرایهای از
اشیاء ImageLabel را دریافت میکند. هر شیء ImageLabel نشاندهنده چیزی است که در تصویر
برچسبگذاری شده است. مدل پایه از بیشاز ۴۰۰ برچسب مختلف پشتیبانی میکند.
میتوانید شرح نوشتاری هر برچسب، نمایهاش در میان همه برچسبهای پشتیبانیشده توسط مدل، و امتیاز اطمینان مطابقت را دریافت کنید. برای مثال:
Swift
for label in labels { let labelText = label.text let confidence = label.confidence let index = label.index }
آبجکتیو-سی
for (MLKImageLabel *label in labels) { NSString *labelText = label.text; float confidence = label.confidence; NSInteger index = label.index; }
نکتههایی برای بهبود عملکرد همزمان
اگر میخواهید تصاویر را در یک برنامه همزمان برچسبگذاری کنید، این دستورالعملها را دنبال کنید تا به بهترین نرخ فریم دست یابید:
- برای پردازش فریمهای ویدیو، از میانای برنامهسازی کاربردی همگام
results(in:)برچسبزن تصویر استفاده کنید. این روش را از تابعAVCaptureVideoDataOutputSampleBufferDelegatecaptureOutput(_, didOutput:from:)فراخوانی کنید تا نتایج را بهصورت همزمان از قاب ویدیو دادهشده دریافت کنید.AVCaptureVideoDataOutputalwaysDiscardsLateVideoFramesرا بهعنوانtrueنگه دارید تا تماسها با برچسبگذار تصویر محدود شود. اگر فریم ویدیو جدیدی در حین اجرای برچسبزن تصویر دردسترس قرار گیرد، حذف خواهد شد. - اگر از برونداد برچسبزن تصویر برای رونهادن گرافیک روی تصویر ورودی استفاده میکنید، ابتدا نتیجه را از ML Kit دریافت کنید، سپس تصویر و رونهاد را در یک مرحله پردازش کنید. با انجام این کار، برای هر قاب ورودی پردازششده، فقط یکبار به سطح نمایشگر رندر میکنید. برای نمونه، updatePreviewOverlayViewWithLastFrame را در نمونه راهاندازی سریع ML Kit ببینید.