Art arda gelen video karelerindeki nesneleri algılamak ve takip etmek için ML Kit'i kullanabilirsiniz.
Bir resmi ML Kit'e ilettiğinizde, resimdeki beşe kadar nesneyi algılar konumla birlikte resimdeki her bir nesnenin konumunu da içerir. Şu yolda nesneleri algılarken: her nesnenin, nesneyi izlemek için kullanabileceğiniz benzersiz bir kimliği vardır her kareden kareye geçelim. İsterseniz genel nesneyi de etkinleştirebilirsiniz. geniş kategori tanımlarına sahip nesneleri etiketleyen bir modeldir.
Deneyin
- Örnek uygulamayı kullanarak bu API'nin örnek kullanımını inceleyin.
- Materyal Tasarım vitrinini görün uygulamasının uçtan uca uygulanmasına olanak tanır.
Başlamadan önce
- Aşağıdaki ML Kit kapsüllerini Podfile'ınıza ekleyin:
pod 'GoogleMLKit/ObjectDetection', '3.2.0'
- Projenizin kapsüllerini yükledikten veya güncelledikten sonra
.xcworkspace
ML Kit, Xcode 12.4 veya sonraki sürümlerde desteklenir.
1. Nesne algılayıcıyı yapılandırma
Nesneleri algılamak ve izlemek için önce
ObjectDetector
ve isteğe bağlı olarak istediğiniz algılayıcı ayarlarını belirtin
varsayılan değeri değiştirin.
Nesne algılayıcıyı
ObjectDetectorOptions
nesne algılandı. Şunları değiştirebilirsiniz: Ayarlar:Nesne Algılayıcı Ayarları Algılama modu .stream
(varsayılan) |.singleImage
Akış modunda (varsayılan), nesne algılayıcısı çok düşük bir değerle çalışır gecikme olabilir, ancak eksik sonuçlar (belirtilmemiş sonuçlar gibi) sınırlayıcı kutu veya kategori) ekleyebilirsiniz. tıklayın. Ayrıca, akış modunda algılayıcı, izleme kodu Kareler genelinde nesneleri izlemek için kullanabileceğiniz nesne kimlikleri. Nesneleri izlemek istediğinizde veya düşük gecikme süresi olduğunda bu modu kullanın video akışları gerçek zamanlı şekilde işlenirken olduğu gibi, gerekir.
Tekli görüntü modunda, nesne algılayıcı, sonucu döndürür nesnenin sınırlayıcı kutusu belirlendikten sonra. Ayrıca, sınıflandırmasında, sınırlayıcı kutudan sonra sonucu döndürür ve kategori etiketinin her ikisi de kullanılabilir. Sonuç olarak, tespit edilen daha yüksek olur. Ayrıca, tek resim modunda izleme Kimlikler atanmadı. Gecikme kritik değilse bu modu kullanın ve bazı sonuçlar vardır.
Birden çok nesneyi algılama ve izleme false
(varsayılan) |true
Beş adede kadar veya yalnızca en fazla nesne algılayıp takip etme belirgin nesne (varsayılan).
Nesneleri sınıflandırma false
(varsayılan) |true
Algılanan nesnelerin genel kategorilerde sınıflandırılıp sınıflandırılmayacağı. Etkinleştirildiğinde, nesne algılayıcı, nesneleri şu kategoriler var: moda ürünleri, gıda, ev eşyaları, yerler ve bitkiler.
Nesne algılama ve izleme API'si, bu iki temel kullanım için optimize edilmiştir vakalar:
- Kameradaki en belirgin nesnenin canlı algılanması ve takip edilmesi vizör.
- Statik bir görüntüde birden fazla nesnenin algılanması.
API'yi bu kullanım alanlarına göre yapılandırmak için:
Swift
// Live detection and tracking let options = ObjectDetectorOptions() options.shouldEnableClassification = true // Multiple object detection in static images let options = ObjectDetectorOptions() options.detectorMode = .singleImage options.shouldEnableMultipleObjects = true options.shouldEnableClassification = true
Objective-C
// Live detection and tracking MLKObjectDetectorOptions *options = [[MLKObjectDetectorOptions alloc] init]; options.shouldEnableClassification = YES; // Multiple object detection in static images MLKObjectDetectorOptions *options = [[MLKOptions alloc] init]; options.detectorMode = MLKObjectDetectorModeSingleImage; options.shouldEnableMultipleObjects = YES; options.shouldEnableClassification = YES;
ObjectDetector
örneği alın:
Swift
let objectDetector = ObjectDetector.objectDetector() // Or, to change the default settings: let objectDetector = ObjectDetector.objectDetector(options: options)
Objective-C
MLKObjectDetector *objectDetector = [MLKObjectDetector objectDetector]; // Or, to change the default settings: MLKObjectDetector *objectDetector = [MLKObjectDetector objectDetectorWithOptions:options];
2. Giriş resmini hazırlama
Nesneleri algılamak ve izlemek için her bir resim veya video karesi için aşağıdakileri yapın.
Akış modunu etkinleştirdiyseniz şuradan VisionImage
nesne oluşturmanız gerekir:
CMSampleBuffer
sn.
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. Resmi işleyin
VisionImage
öğesini, nesne algılayıcının görüntü işleme araçlarından birine iletin
yöntemlerine göz atın. Eşzamansız process(image:)
yöntemini veya
eşzamanlı results()
yöntemi.
Nesneleri eşzamansız olarak algılamak için:
Swift
objectDetector.process(image) { objects, error in guard error == nil else { // Error. return } guard !objects.isEmpty else { // No objects detected. return } // Success. Get object info here. // ... }
Objective-C
[objectDetector processImage:image completion:^(NSArray* _Nullable objects, NSError * _Nullable error) { if (error == nil) { return; } if (objects.count == 0) { // No objects detected. return; } // Success. Get object info here. }];
Nesneleri eşzamanlı olarak algılamak için:
Swift
var objects: [Object] do { objects = try objectDetector.results(in: image) } catch let error { print("Failed to detect object with error: \(error.localizedDescription).") return } guard !objects.isEmpty else { print("Object detector returned no results.") return } // Success. Get object info here.
Objective-C
NSError *error; NSArray*objects = [objectDetector resultsInImage:image error:&error]; if (error == nil) { return; } if (objects.count == 0) { // No objects detected. return; } // Success. Get object info here.
4. Algılanan nesneler hakkında bilgi alma
Görüntü işlemciye yapılan çağrı başarılı olursa Şuna bağlı olarak tamamlama işleyiciyeObject
ekler veya listeyi geri döndürür:
eşzamansız yöntemi mi yoksa eşzamanlı yöntemi mi çağırdığınız.
Her Object
aşağıdaki özellikleri içerir:
frame |
NesneninCGRect
görüntüsüdür. |
trackingID |
Nesneyi resimlerde tanımlayan bir tam sayı veya resimlerde "nil" tek resim modu. |
labels |
Algılayıcı tarafından döndürülen nesneyi açıklayan bir etiket dizisi.
Algılayıcı seçeneği ise özellik boştur
shouldEnableClassification , false olarak ayarlandı.
|
Swift
// objects contains one item if multiple object detection wasn't enabled. for object in objects { let frame = object.frame let trackingID = object.trackingID // If classification was enabled: let description = object.labels.enumerated().map { (index, label) in "Label \(index): \(label.text), \(label.confidence)" }.joined(separator:"\n") }
Objective-C
// The list of detected objects contains one item if multiple // object detection wasn't enabled. for (MLKObject *object in objects) { CGRect frame = object.frame; NSNumber *trackingID = object.trackingID; for (MLKObjectLabel *label in object.labels) { NSString *labelString = [NSString stringWithFormat: @"%@, %f, %lu", label.text, label.confidence, (unsigned long)label.index]; ... } }
Kullanılabilirliği ve performansı iyileştirme
En iyi kullanıcı deneyimi için uygulamanızda aşağıdaki yönergelere uyun:
- Nesne algılama işleminin başarılı olması, nesnenin görsel karmaşıklığına bağlıdır. İçinde az sayıda görsel özelliği olan nesnelerin algılanması için kaplamaya başlar. Kullanıcılara şu konularda yol göstermeniz gerekir: algılamak istediğiniz tür nesnelerde iyi çalışan bir giriş yakalamanızı sağlar.
- Sınıflandırma kullanırken, düşmeyen nesneleri tespit etmek isterseniz desteklenen kategorilere ayırarak, bilinmeyen nesneler'i tıklayın.
Ayrıca, Materyal Tasarım'a Makine öğrenimi destekli özellikleri içeren kalıplar koleksiyonu.
Akış modunu gerçek zamanlı bir uygulamada kullanırken aşağıdaki kuralları uygulayarak en iyi kare hızlarına ulaşın:
- Çoğu cihaz çalışmayacağından akış modunda çoklu nesne algılamayı kullanmayın. üretebilmesidir.
- İhtiyacınız yoksa sınıflandırmayı devre dışı bırakı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, öğ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.