Görüntüde tanınan nesneleri etiketlemek için ML Kit'i kullanabilirsiniz. Sağlanan varsayılan model ML Kit, 400'den fazla farklı etiketi destekler.
Deneyin
- Örnek uygulamayı kullanarak bu API'nin örnek kullanımını inceleyin.
Başlamadan önce
- Aşağıdaki ML Kit kapsüllerini Podfile'ınıza ekleyin:
pod 'GoogleMLKit/ImageLabeling', '15.5.0'
. - Projenizin kapsüllerini yükledikten veya güncelledikten sonra
.xcworkspace
ML Kit, Xcode 12.4 veya sonraki sürümlerde desteklenir.
Artık görüntüleri etiketlemeye hazırsınız.
1. Giriş resmini hazırlama
Bir VisionImage
nesnesi oluşturmak için UIImage
veya
CMSampleBuffer
.
UIImage
kullanıyorsanız şu 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 şu adımları uygulayın:
-
Belgenin
CMSampleBuffer
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; } }
- Şu komutu kullanarak bir
VisionImage
nesnesi oluşturun:CMSampleBuffer
nesne ve yön: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
ürününün processImage()
yöntemi.
- İ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 edinme
Görüntü etiketleme başarılı olursa tamamlama işleyicisi
ImageLabel
nesne. Her ImageLabel
nesnesi, ilk kez
resim olarak etiketlenmiştir. Temel model 400'den fazla farklı etiketi destekler.
Her etiketin metin açıklamasını alabilir, desteklenen tüm etiketler arasında dizine
ve eşleşmenin güven puanı gibi
değişir. Ö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ı
Görüntüleri gerçek zamanlı bir uygulamada etiketlemek isterseniz şu talimatları uygulayın:
- Video karelerini işlemek için görüntü etiketleyicinin
results(in:)
eşzamanlı API'sini kullanın. Telefonla aramaAVCaptureVideoDataOutputSampleBufferDelegate
İlgili videodan eşzamanlı olarak sonuç almak içincaptureOutput(_, didOutput:from:)
işlevi çerçeve. saklaAVCaptureVideoDataOutput
adlı kullanıcının Görüntü etiketleyiciye yapılan çağrıları kısmak içintrue
olarakalwaysDiscardsLateVideoFrames
. Yeni bir video karesi, görüntü etiketleyici çalışırken kullanılabilir hale gelir ve atlanır. - Grafikleri üzerine bindirmek için görüntü etiketleyicinin çıkışını kullanırsanız giriş görüntüsünü kullanın, önce ML Kit'ten sonucu alın ve ardından görüntüyü oluşturun tek bir adımda yapabilirsiniz. Bu şekilde, oluşturduğunuz öğeleri ekran yüzeyinde işlenen her giriş çerçevesi için yalnızca bir kez. Bkz. updatePreviewOverlayViewWithLastFrame ML Kit hızlı başlangıç örneğine göz atın.