Bir resimde tanınan nesneleri etiketlemek için ML Kit'i kullanabilirsiniz. ML Kit ile birlikte sağlanan varsayılan model, 400'den fazla farklı etiketi destekler.
Deneyin
- Bu API'nin örnek kullanımını görmek için örnek uygulamayla denemeler yapın.
Başlamadan önce
- Aşağıdaki ML Kit kapsüllerini Podfile dosyanıza ekleyin:
pod 'GoogleMLKit/ImageLabeling', '3.2.0'
- Projenizin Kapsüllerini yükledikten veya güncelledikten sonra,
.xcworkspace
kodunu kullanarak Xcode projenizi açın. ML Kit, Xcode'un 12.4 veya sonraki sürümlerinde desteklenir.
Artık resimleri etiketlemeye hazırsınız.
1. Giriş resmini hazırlayın
UIImage
veya CMSampleBuffer
kullanarak bir VisionImage
nesnesi oluşturun.
UIImage
kullanıyorsanız şu adımları uygulayın:
UIImage
ile birVisionImage
nesnesi oluşturun. Doğru.orientation
'u belirttiğinizden emin olun.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
CMSampleBuffer
kullanıyorsanız şu adımları uygulayın:
-
CMSampleBuffer
içinde yer alan resim verilerinin yönünü belirtin.Resmin yönünü ayarlamak için:
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 } }
Objective-C
- (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
nesnesini ve yönünü kullanarakVisionImage
nesnesi oluşturun:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Objective-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
2. Resim etiketleyiciyi yapılandırma ve çalıştırma
Bir resimdeki nesneleri etiketlemek içinVisionImage
nesnesini ImageLabeler
öğesinin processImage()
yöntemine geçirin.
- Önce
ImageLabeler
örneğini alın.
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)
Objective-C
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];
- Ardından, resmi
processImage()
yöntemine geçirin:
Swift
labeler.process(image) { labels, error in guard error == nil, let labels = labels else { return } // Task succeeded. // ... }
Objective-C
[labeler processImage:image completion:^(NSArray*_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. Etiketlenen nesneler hakkında bilgi alma
Görüntü etiketleme başarılı olursa tamamlama işleyicisi bir dizi ImageLabel
nesne alır. Her ImageLabel
nesnesi, resimde etiketlenmiş olan bir öğeyi temsil eder. Temel model 400'den fazla farklı etiketi destekler.
Her etiketin metin açıklamasını, model tarafından desteklenen tüm etiketler arasında dizin oluşturabilir ve eşleşmenin güven puanını alabilirsiniz. Örneğin:
Swift
for label in labels { let labelText = label.text let confidence = label.confidence let index = label.index }
Objective-C
for (MLKImageLabel *label in labels) { NSString *labelText = label.text; float confidence = label.confidence; NSInteger index = label.index; }
Gerçek zamanlı performansı artırmak için ipuçları
Resimleri gerçek zamanlı bir uygulamada etiketlemek istiyorsanız en iyi kare hızlarına ulaşmak için şu yönergeleri izleyin:
- Video karelerini işlemek için resim etiketleyicinin
results(in:)
eşzamanlı API'sini kullanın. Belirtilen video çerçevesinden eşzamanlı olarak sonuç almak içinAVCaptureVideoDataOutputSampleBufferDelegate
captureOutput(_, didOutput:from:)
işlevinden bu yöntemi çağırın. Resim etiketleyiciyi çağrıların kısıtlanması içinAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
öğesinitrue
olarak tutun. Resim Etiketleyici çalışırken yeni bir video çerçevesi kullanılabilir hale gelirse atlanır. - Giriş resmine grafik yerleştirmek için görüntü etiketleyicinin çıkışını kullanırsanız önce ML Kit'ten sonucu alın, ardından resmi ve yer paylaşımını tek bir adımda oluşturun. Bu şekilde, her bir işlenmiş giriş çerçevesi için ekranı yalnızca bir kez oluşturursunuz. Örnek için ML Kit hızlı başlangıç örneğindeki updatepreviewOverlayViewWithLastFrame konusuna bakın.