iOS'te görüntüleri AutoML tarafından eğitilmiş bir modelle etiketleme
AutoML Vision Edge'i kullanarak kendi modelinizi eğittikten sonra uygulamanızda resimleri etiketlemek için kullanabilirsiniz.
AutoML Vision Edge'den eğitilen modelleri iki şekilde entegre edebilirsiniz. Şunları yapabilirsiniz: model dosyalarını Xcode projenize kopyalayarak modeli paketleyebilir veya Firebase'den dinamik olarak indirebilir.
Model paketleme seçenekleri | |
---|---|
Uygulamanızda paket olarak sunuluyor |
|
Firebase ile barındırılan |
|
Deneyin
- Örnek uygulamayı kullanarak bu API'nin örnek kullanımını inceleyin.
Başlamadan önce
1. ML Kit kitaplıklarını Podfile dosyanıza ekleyin:Bir modeli uygulamanızla paketlemek için:
pod 'GoogleMLKit/ImageLabelingAutoML'Firebase'den dinamik olarak model indirmek için
LinkFirebase
bağımlılık:
pod 'GoogleMLKit/ImageLabelingAutoML' pod 'GoogleMLKit/LinkFirebase'2. Projenizin kapsüllerini yükledikten veya güncelledikten sonra Xcode projenizi açın kendi
.xcworkspace
kodunu> kullanır. Makine Öğrenimi Kiti, Xcode'da desteklenir
Sürüm 13.2.1 veya daha yeni bir sürüme sahip olmanız gerekir.
3. Bir model indirmek istiyorsanız şunu yaptığınızdan emin olun:
Firebase'i iOS projenize ekleyin,
(ücretsizdir) . Bu,
modeli.
1. Modeli yükleme
Yerel model kaynağını yapılandırma
Modeli uygulamanızla paketlemek için:1. İndirdiğiniz zip arşivinden modeli ve meta verilerini çıkarın Firebase konsolundan bir klasöre taşımak için:
your_model_directory |____dict.txt |____manifest.json |____model.tflite. Üç dosya da aynı klasörde olmalıdır. Dosyaları (dosya adları da dahil olmak üzere) değiştirmeden yeni bir dosya indirir.
2. Klasörü Xcode projenize kopyalayın. Kopyalama işlemini Klasör başvuruları oluşturun. Model dosyası ve meta veriler uygulama paketine dahil edilecek ve ML Kit tarafından kullanılabilecek.
3.
AutoMLImageLabelerLocalModel
nesnesini oluşturarak
model manifest dosyası:
Swift
guard let manifestPath = Bundle.main.path( forResource: "manifest", ofType: "json", inDirectory: "your_model_directory" ) else { return } let localModel = AutoMLImageLabelerLocalModel(manifestPath: manifestPath)
Objective-C
NSString *manifestPath = [NSBundle.mainBundle pathForResource:@"manifest" ofType:@"json" inDirectory:@"your_model_directory"]; MLKAutoMLImageLabelerLocalModel *localModel = [[MLKAutoMLImageLabelerLocalModel alloc] initWithManifestPath:manifestPath];
Firebase tarafından barındırılan bir model kaynağını yapılandırma
Uzaktan barındırılan modeli kullanmak için bir AutoMLImageLabelerRemoteModel
oluşturun.
nesnesini tanımlarken modele atadığınız adı belirtin:
Swift
let remoteModel = AutoMLImageLabelerRemoteModel( name: "your_remote_model" // The name you assigned in // the Firebase console. )
Objective-C
MLKAutoMLImageLabelerRemoteModel *remoteModel = [[MLKAutoMLImageLabelerRemoteModel alloc] initWithName:@"your_remote_model"]; // The name you assigned in // the Firebase console.
Ardından, model indirme görevini başlatmak için model indirme görevinizi indirmeye izin vermek istiyorsunuz. Model cihazda yoksa veya sürümü kullanılabiliyorsa görev, yeni bir sürümün yüklü olduğu modeliniz:
Swift
let downloadConditions = ModelDownloadConditions( allowsCellularAccess: true, allowsBackgroundDownloading: true ) let downloadProgress = ModelManager.modelManager().download( remoteModel, conditions: downloadConditions )
Objective-C
MLKModelDownloadConditions *downloadConditions = [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:YES allowsBackgroundDownloading:YES]; NSProgress *downloadProgress = [[MLKModelManager modelManager] downloadModel:remoteModel conditions:downloadConditions];
Birçok uygulama, indirme görevini başlatma kodunda başlatır, ancak bunu, modeli kullanmaya başlamadan önce istediğiniz zaman yapabilirsiniz.
Modelinizden görüntü etiketleyici oluşturma
Model kaynaklarınızı yapılandırdıktan sonra bir kaynaktan ImageLabeler
nesnesi oluşturun
sağlayabilir.
Yalnızca yerel olarak paketlenmiş bir modeliniz varsa
AutoMLImageLabelerLocalModel
nesnesini tanımlayın ve güven puanını yapılandırın
(bkz. Modunuzu değerlendirme):
Swift
let options = AutoMLImageLabelerOptions(localModel: localModel) options.confidenceThreshold = NSNumber(value: 0.0) // Evaluate your model in the Firebase console // to determine an appropriate value. let imageLabeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKAutoMLImageLabelerOptions *options = [[MLKAutoMLImageLabelerOptions alloc] initWithLocalModel:localModel]; options.confidenceThreshold = @(0.0); // Evaluate your model in the Firebase console // to determine an appropriate value. MLKImageLabeler *imageLabeler = [MLKImageLabeler imageLabelerWithOptions:options];
Uzaktan barındırılan bir modeliniz varsa bu modelin
indiremezsiniz. Model indirme işleminin durumunu kontrol edebilirsiniz.
model yöneticisinin isModelDownloaded
(remoteModel:) yöntemini kullanarak göreviniz.
Etiketleyiciyi çalıştırmadan önce bunu onaylamanız yeterli olsa da
hem uzaktan barındırılan hem de yerel olarak paketlenen
ImageLabeler
örneğini örneklendirirken şu kontrolü gerçekleştirmek mantıklıdır:
etiketleyici indirilmişse uzak modelden ve yerel modelden
aksi takdirde.
Swift
var options: AutoMLImageLabelerOptions! if (ModelManager.modelManager().isModelDownloaded(remoteModel)) { options = AutoMLImageLabelerOptions(remoteModel: remoteModel) } else { options = AutoMLImageLabelerOptions(localModel: localModel) } options.confidenceThreshold = NSNumber(value: 0.0) // Evaluate your model in the Firebase console // to determine an appropriate value. let imageLabeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKAutoMLImageLabelerOptions *options; if ([[MLKModelManager modelManager] isModelDownloaded:remoteModel]) { options = [[MLKAutoMLImageLabelerOptions alloc] initWithRemoteModel:remoteModel]; } else { options = [[MLKAutoMLImageLabelerOptions alloc] initWithLocalModel:localModel]; } options.confidenceThreshold = @(0.0); // Evaluate your model in the Firebase console // to determine an appropriate value. MLKImageLabeler *imageLabeler = [MLKImageLabeler imageLabelerWithOptions:options];
Yalnızca uzaktan barındırılan bir modeliniz varsa modelle ilgili ayarını devre dışı bırakmanız gerekir. devre dışı bırakana veya gizleyene kadar (örneğin, modelin indirildiğini onaylayın.
Varsayılana gözlemleyiciler ekleyerek model indirme durumunu öğrenebilirsiniz.
Bildirim Merkezi. Gözlemcide self
için zayıf bir referans kullandığınızdan emin olun
biraz zaman alabilir ve kaynak nesne
indirme tamamlandığında serbest bırakılır. Örneğin:
Swift
NotificationCenter.default.addObserver( forName: .mlkitModelDownloadDidSucceed, object: nil, queue: nil ) { [weak self] notification in guard let strongSelf = self, let userInfo = notification.userInfo, let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue] as? RemoteModel, model.name == "your_remote_model" else { return } // The model was downloaded and is available on the device } NotificationCenter.default.addObserver( forName: .mlkitModelDownloadDidFail, object: nil, queue: nil ) { [weak self] notification in guard let strongSelf = self, let userInfo = notification.userInfo, let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue] as? RemoteModel else { return } let error = userInfo[ModelDownloadUserInfoKey.error.rawValue] // ... }
Objective-C
__weak typeof(self) weakSelf = self; [NSNotificationCenter.defaultCenter addObserverForName:MLKModelDownloadDidSucceedNotification object:nil queue:nil usingBlock:^(NSNotification *_Nonnull note) { if (weakSelf == nil | note.userInfo == nil) { return; } __strong typeof(self) strongSelf = weakSelf; MLKRemoteModel *model = note.userInfo[MLKModelDownloadUserInfoKeyRemoteModel]; if ([model.name isEqualToString:@"your_remote_model"]) { // The model was downloaded and is available on the device } }]; [NSNotificationCenter.defaultCenter addObserverForName:MLKModelDownloadDidFailNotification object:nil queue:nil usingBlock:^(NSNotification *_Nonnull note) { if (weakSelf == nil | note.userInfo == nil) { return; } __strong typeof(self) strongSelf = weakSelf; NSError *error = note.userInfo[MLKModelDownloadUserInfoKeyError]; }];
2. 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];
3. Görüntü etiketleyiciyi çalıştırma
Eşzamansız olarak:
Swift
imageLabeler.process(image) { labels, error in guard error == nil, let labels = labels, !labels.isEmpty else { // Handle the error. return } // Show results. }
Objective-C
[imageLabeler processImage:image completion:^(NSArray*_Nullable labels, NSError *_Nullable error) { if (labels.count == 0) { // Handle the error. return; } // Show results. }];
Eşzamanlı olarak:
Swift
var labels: [ImageLabel] do { labels = try imageLabeler.results(in: image) } catch let error { // Handle the error. return } // Show results.
Objective-C
NSError *error; NSArray*labels = [imageLabeler resultsInImage:image error:&error]; // Show results or handle the error.
4. Etiketli nesneler hakkında bilgi edinme
Görüntü etiketleme işlemi başarılı olursa bir diziImageLabel
. Her ImageLabel
bir şeyi temsil eder
resim olarak etiketlenmiştir. Her etiketin metin açıklamasını (varsa)
TensorFlow Lite model dosyasının meta verileri), güven puanı ve dizin.
Ö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 algılayıcının
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 Algılayıcıya yapılan çağrıları kısmak içintrue
olarakalwaysDiscardsLateVideoFrames
. Yeni bir Video karesi, algılayıcı çalışırken kullanılabilir hale gelir ve algılanmaz. - Algılayıcının çıkışını, üzerine grafik yerleştirmek için 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.