Cihazdaki bir model veya bir bulut modeli kullanarak bir görüntüde tanınan nesneleri etiketlemek için ML Kit'i kullanabilirsiniz. Her bir yaklaşımın faydaları hakkında bilgi edinmek için genel bakışa bakın.
Sen başlamadan önce
- Henüz uygulamanıza Firebase'i eklemediyseniz, başlangıç kılavuzundaki adımları izleyerek bunu yapın.
- ML Kit kitaplıklarını Pod dosyanıza ekleyin:
pod 'Firebase/MLVision', '6.25.0'
Projenizin Pod'larını yükledikten veya güncelledikten sonra, Xcode projenizi# If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'
.xcworkspace
kullanarak açtığınızdan emin olun. - Uygulamanızda Firebase'i içe aktarın:
Süratli
import Firebase
Amaç-C
@import Firebase;
Bulut tabanlı modeli kullanmak istiyorsanız ve projeniz için Bulut tabanlı API'leri henüz etkinleştirmediyseniz, şimdi yapın:
- Firebase konsolunun ML Kit API'leri sayfasını açın.
Projenizi henüz bir Blaze fiyatlandırma planına yükseltmediyseniz, bunu yapmak için Yükselt'e tıklayın. (Yalnızca projeniz Blaze planında değilse yükseltme yapmanız istenir.)
Yalnızca Blaze düzeyindeki projeler Bulut tabanlı API'leri kullanabilir.
- Bulut tabanlı API'ler zaten etkinleştirilmemişse Bulut Tabanlı API'leri Etkinleştir 'i tıklayın.
Yalnızca cihazdaki modeli kullanmak istiyorsanız bu adımı atlayabilirsiniz.
Artık, cihazdaki bir model veya bulut tabanlı bir model kullanarak görüntüleri etiketlemeye hazırsınız.
1. Giriş görüntüsünü hazırlayın
Bir UIImage
veya bir CMSampleBufferRef
kullanarak bir VisionImage
nesnesi oluşturun.
Bir UIImage
kullanmak için:
- Gerekirse görüntüyü,
imageOrientation
özelliği.up
olacak şekilde döndürün. - Doğru döndürülmüş
UIImage
kullanarak birVisionImage
nesnesi oluşturun. Herhangi bir döndürme meta verisi belirtmeyin; varsayılan değer olan.topLeft
kullanılmalıdır.Süratli
let image = VisionImage(image: uiImage)
Amaç-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
Bir CMSampleBufferRef
kullanmak için:
CMSampleBufferRef
arabelleğinde bulunan görüntü verilerinin yönünü belirten birVisionImageMetadata
nesnesi oluşturun.Görüntü yönünü almak için:
Süratli
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Amaç-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
Ardından, meta veri nesnesini oluşturun:
Süratli
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Amaç-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
-
CMSampleBufferRef
nesnesini ve döndürme meta verilerini kullanarak birVisionImage
nesnesi oluşturun:Süratli
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Amaç-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
2. Görüntü etiketleyiciyi yapılandırın ve çalıştırın
Bir görüntüdeki nesneleri etiketlemek içinVisionImage
nesnesini VisionImageLabeler
processImage()
yöntemine iletin.İlk olarak,
VisionImageLabeler
örneğini alın.Cihazdaki görüntü etiketleyiciyi kullanmak istiyorsanız:
Süratli
let labeler = Vision.vision().onDeviceImageLabeler() // Or, to set the minimum confidence required: // let options = VisionOnDeviceImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = Vision.vision().onDeviceImageLabeler(options: options)
Amaç-C
FIRVisionImageLabeler *labeler = [[FIRVision vision] onDeviceImageLabeler]; // Or, to set the minimum confidence required: // FIRVisionOnDeviceImageLabelerOptions *options = // [[FIRVisionOnDeviceImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // FIRVisionImageLabeler *labeler = // [[FIRVision vision] onDeviceImageLabelerWithOptions:options];
Bulut görüntüsü etiketleyiciyi kullanmak istiyorsanız:
Süratli
let labeler = Vision.vision().cloudImageLabeler() // Or, to set the minimum confidence required: // let options = VisionCloudImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = Vision.vision().cloudImageLabeler(options: options)
Amaç-C
FIRVisionImageLabeler *labeler = [[FIRVision vision] cloudImageLabeler]; // Or, to set the minimum confidence required: // FIRVisionCloudImageLabelerOptions *options = // [[FIRVisionCloudImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // FIRVisionImageLabeler *labeler = // [[FIRVision vision] cloudImageLabelerWithOptions:options];
Ardından görüntüyü
processImage()
yöntemine iletin:Süratli
labeler.process(image) { labels, error in guard error == nil, let labels = labels else { return } // Task succeeded. // ... }
Amaç-C
[labeler processImage:image completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. Etiketli nesneler hakkında bilgi alın
Görüntü etiketleme başarılı olursa, tamamlama işleyicisine bir diziVisionImageLabel
nesnesi iletilecektir. Her nesneden, görüntüde tanınan bir özellik hakkında bilgi alabilirsiniz.Örneğin:
Süratli
for label in labels {
let labelText = label.text
let entityId = label.entityID
let confidence = label.confidence
}
Amaç-C
for (FIRVisionImageLabel *label in labels) {
NSString *labelText = label.text;
NSString *entityId = label.entityID;
NSNumber *confidence = label.confidence;
}
Gerçek zamanlı performansı iyileştirmeye yönelik ipuçları
Görüntüleri gerçek zamanlı bir uygulamada etiketlemek istiyorsanız, en iyi kare hızlarını elde etmek için şu yönergeleri izleyin:
- Throttle, görüntü etiketleyiciye çağrı yapar. Görüntü etiketleyici çalışırken yeni bir video karesi kullanıma sunulursa, kareyi bırakın.
- Giriş görüntüsünün üzerine grafik bindirmek için görüntü etiketleyicinin çıkışını kullanıyorsanız, önce ML Kit'ten sonucu alın, ardından görüntüyü ve bindirmeyi tek bir adımda oluşturun. Bunu yaparak, her bir giriş karesi için yalnızca bir kez görüntüleme yüzeyini oluşturursunuz. Bir örnek için vitrin örnek uygulamasında önizlemeOverlayView ve FIRDetectionOverlayView sınıflarına bakın.
Sonraki adımlar
- Cloud API kullanan bir uygulamayı üretime dağıtmadan önce , yetkisiz API erişiminin etkisini önlemek ve azaltmak için bazı ek adımlar atmalısınız.