Bir görüntüde tanınan nesneleri etiketlemek için ML Kiti'ni kullanabilirsiniz. ML Kit ile sağlanan varsayılan model 400'den fazla farklı etiketi destekler.
Deneyin
- Bu API'nin örnek bir kullanımını görmek için örnek uygulamayı inceleyin.
Başlamadan önce
- Aşağıdaki ML Kiti kapsüllerini Podfile'ınıza ekleyin:
pod 'GoogleMLKit/ImageLabeling', '3.2.0'
- Projenizin Kapsüllerini yükledikten veya güncelledikten sonra Xcode projenizi,
.xcworkspace
ile açın. ML Kit, Xcode 12.4 veya üzeri sürümlerde desteklenir.
Artık resimleri etiketlemeye hazırsınız.
1. Giriş görüntüsünü hazırlama
UIImage
veya CMSampleBuffer
kullanarak VisionImage
nesnesi oluşturun.
UIImage
kullanıyorsanız aşağıdaki adımları uygulayın:
UIImage
ile birVisionImage
nesnesi oluşturun. Doğru.orientation
değerini 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 aşağıdaki adımları uygulayın:
-
CMSampleBuffer
içinde yer alan resim verilerinin yönünü belirtin.Resmin yönünü öğrenmek 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ü kullanarak birVisionImage
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. Görüntü etiketleyiciyi yapılandırma ve çalıştırma
Bir görüntüdeki nesneleri etiketlemek içinVisionImage
nesnesini ImageLabeler
processImage()
yöntemine geçirin.
- İlk olarak
ImageLabeler
öğesinin bir ö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 iletin:
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. Etiketli nesneler hakkında bilgi alma
Görüntü etiketleme başarılı olursa tamamlama işleyicisi bir ImageLabel
nesne dizisi alır. Her ImageLabel
nesnesi, resimde etiketlenmiş 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ındaki dizini 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ı iyileştirmeye yönelik ipuçları
Resimleri gerçek zamanlı bir uygulamada etiketlemek istiyorsanız en iyi kare hızlarını elde etmek için şu yönergeleri uygulayın:
- Video karelerini işlemek için görüntü etiketleyicinin
results(in:)
eşzamanlı API'sini kullanın. Belirtilen video karesinden sonuçları eşzamanlı olarak almak için bu yöntemiAVCaptureVideoDataOutputSampleBufferDelegate
captureOutput(_, didOutput:from:)
işlevinden çağırın. Resim etiketleyiciye yapılan çağrıları daraltmak içinAVCaptureVideoDataOutput
öğesininalwaysDiscardsLateVideoFrames
alwaysDiscardsLateVideoFrames
değerinitrue
olarak bırakın. Resim etiketleyici çalışırken yeni bir video karesi kullanılabilir hale gelirse bu video karesi atlanır. - Görüntü etiketleyicinin çıktısını kullanarak giriş görüntüsünün üzerine grafik bindirirseniz önce ML Kit'ten sonucu alın, ardından görüntüyü oluşturun ve tek bir adımda yer paylaşımlı yapın. Bu şekilde, işlenen her giriş çerçevesi için görüntü yüzeyinde yalnızca bir kez görüntü oluşturursunuz. Örneği görmek için ML Kit hızlı başlangıç örneğindeki updatePreviewOverlayViewWithLastFrame) örneğine bakın.