Video karelerindeki nesneleri tespit edip takip etmek için ML Kit'i kullanabilirsiniz.
Makine Öğrenimi Kiti görüntülerini ilettiğinizde, Makine Öğrenimi Kiti her görüntü için en fazla beş algılanan nesne ve bunların resimdeki konumları. Algılarken her nesnenin bir kimliği vardır. Bunları izlemek için nesnelere takılmayın. İsterseniz genel nesneyi de etkinleştirebilirsiniz. geniş kategori tanımlarına sahip nesneleri etiketleyen bir modeldir.
Başlamadan önce
- Firebase'i uygulamanıza henüz eklemediyseniz başlangıç kılavuzundaki adımlara bakın.
- ML Kit kitaplıklarını Podfile'ınıza ekleyin:
pod 'Firebase/MLVision', '6.25.0' pod 'Firebase/MLVisionObjectDetection', '6.25.0'
. Projenizin kapsüllerini yükledikten veya güncelledikten sonra Xcode.xcworkspace
kullanarak projenize dahil olabilir. - Uygulamanızda Firebase'i içe aktarın:
Swift
import Firebase
Objective-C
@import Firebase;
1. Nesne algılayıcıyı yapılandırma
Nesneleri tespit edip izlemeye başlamak için önce
VisionObjectDetector
(isteğe bağlı olarak istediğiniz algılayıcı ayarlarını belirtin)
varsayılan değeri değiştirin.
Kullanım alanınıza göre nesne algılayıcıyı
VisionObjectDetectorOptions
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) 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 dedektörü bir algılanana kadar bekler nesnenin sınırlayıcı kutusu ve (sınıflandırmayı etkinleştirdiyseniz) kategorisi kullanılabilir. Sonuç olarak, algılama gecikmesi potansiyel olarak daha yüksektir. Ayrıca, tek bir resimde izleme kimlikleri atanmadığından emin olun. Gecikme varsa bu modu kullanın kritik öneme sahip değildir ve reklamların yalnızca bir kısmını sonuç.
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: moda ürünleri, gıda, ev eşyaları, yerler, bitkiler ve bilinmeyenler.
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 resimde 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 = VisionObjectDetectorOptions() options.detectorMode = .stream options.shouldEnableMultipleObjects = false options.shouldEnableClassification = true // Optional // Multiple object detection in static images let options = VisionObjectDetectorOptions() options.detectorMode = .singleImage options.shouldEnableMultipleObjects = true options.shouldEnableClassification = true // Optional
Objective-C
// Live detection and tracking FIRVisionObjectDetectorOptions *options = [[FIRVisionObjectDetectorOptions alloc] init]; options.detectorMode = FIRVisionObjectDetectorModeStream; options.shouldEnableMultipleObjects = NO; options.shouldEnableClassification = YES; // Optional // Multiple object detection in static images FIRVisionObjectDetectorOptions *options = [[FIRVisionObjectDetectorOptions alloc] init]; options.detectorMode = FIRVisionObjectDetectorModeSingleImage; options.shouldEnableMultipleObjects = YES; options.shouldEnableClassification = YES; // Optional
FirebaseVisionObjectDetector
örneği alın:Swift
let objectDetector = Vision.vision().objectDetector() // Or, to change the default settings: let objectDetector = Vision.vision().objectDetector(options: options)
Objective-C
FIRVisionObjectDetector *objectDetector = [[FIRVision vision] objectDetector]; // Or, to change the default settings: FIRVisionObjectDetector *objectDetector = [[FIRVision vision] objectDetectorWithOptions:options];
2. Nesne algılayıcıyı çalıştırma
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:
CMSampleBufferRef
sn.
Bir
VisionImage
nesnesi oluşturmak içinUIImage
veyaCMSampleBufferRef
.UIImage
kullanmak için:- Gerekirse resmi,
imageOrientation
özellik değeri.up
. - Doğru şekilde döndürülen öğeyi kullanarak bir
VisionImage
nesnesi oluşturunUIImage
. Herhangi bir rotasyon meta verisi belirtme (varsayılan) değeri (.topLeft
) kullanılmalıdır.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
CMSampleBufferRef
kullanmak için:-
Aşağıdakini belirten bir
VisionImageMetadata
nesnesi oluşturun: içerdiği resim verilerinin yönüCMSampleBufferRef
arabellek.Resmin yönünü öğrenmek için:
Swift
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 } }
Objective-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:
Swift
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objective-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];
- Şunu kullanarak bir
VisionImage
nesnesi oluşturun:CMSampleBufferRef
nesnesi ve rotasyon meta verileri:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- Gerekirse resmi,
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ızprocess(image:)
yöntemini veya eşzamanlıresults()
yöntemi.Nesneleri eşzamansız olarak algılamak için:
Swift
objectDetector.process(image) { detectedObjects, error in guard error == nil else { // Error. return } guard let detectedObjects = detectedObjects, !detectedObjects.isEmpty else { // No objects detected. return } // Success. Get object info here. // ... }
Objective-C
[objectDetector processImage:image completion:^(NSArray<FIRVisionObject *> * _Nullable objects, NSError * _Nullable error) { if (error == nil) { return; } if (objects == nil | objects.count == 0) { // No objects detected. return; } // Success. Get object info here. // ... }];
Nesneleri eşzamanlı olarak algılamak için:
Swift
var results: [VisionObject]? = nil do { results = try objectDetector.results(in: image) } catch let error { print("Failed to detect object with error: \(error.localizedDescription).") return } guard let detectedObjects = results, !detectedObjects.isEmpty else { print("Object detector returned no results.") return } // ...
Objective-C
NSError *error; NSArray<FIRVisionObject *> *objects = [objectDetector resultsInImage:image error:&error]; if (error == nil) { return; } if (objects == nil | objects.count == 0) { // No objects detected. return; } // Success. Get object info here. // ...
Görüntü işlemciye yapılan çağrı başarılı olursa Şuna bağlı olarak tamamlama işleyiciye
VisionObject
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
VisionObject
aşağıdaki özellikleri içerir:frame
Nesnenin CGRect
görüntüsüdür.trackingID
Nesneyi resimler arasında tanımlayan bir tam sayı. Tek kişilik Nil resim moduna girer. classificationCategory
Nesnenin genel kategorisi. Nesne algılayıcı sınıflandırma etkin olduğunda bu her zaman .unknown
olur.confidence
Nesne sınıflandırmasının güven değeri. Nesne algılayıcının sınıflandırması etkinleştirilmemiş veya nesne bilinmiyor olarak sınıflandırıldı. Bu saat: nil
.Swift
// detectedObjects contains one item if multiple object detection wasn't enabled. for obj in detectedObjects { let bounds = obj.frame let id = obj.trackingID // If classification was enabled: let category = obj.classificationCategory let confidence = obj.confidence }
Objective-C
// The list of detected objects contains one item if multiple // object detection wasn't enabled. for (FIRVisionObject *obj in objects) { CGRect bounds = obj.frame; if (obj.trackingID) { NSInteger id = obj.trackingID.integerValue; } // If classification was enabled: FIRVisionObjectCategory category = obj.classificationCategory; float confidence = obj.confidence.floatValue; }
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. Nesneler az sayıda görsel özellikle birlikte kullanılması, resim olarak algılanır. Kullanıcılara, içeriklerinizin yakalanması için iyi çalışan bir girişe sahip olması gerekir.
- Sınıflandırma kullanırken, düşmeyen nesneleri tespit etmek isterseniz desteklenen kategorilere ayırarak, bilinmeyen nesneler'i tıklayın.
Ayrıca, [ML Kit Material Design vitrin uygulaması][showcase-link]{: .external } ve Materyal Tasarım Makine öğrenimi destekli özellikleri içeren kalıplar koleksiyonu.
Gerçek zamanlı bir uygulamada akış modunu kullanırken şu yönergeleri izleyin: 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.
- Algılayıcıya yapılan çağrıları hızlandırın. Yeni bir video karesi kullanılabilir durumdaysa çerçeveyi bırakın.
- Algılayıcının çıkışını üzerine grafik yerleştirmek için kullanıyorsanı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, öğeleri ekran yüzeyinde her giriş karesi için yalnızca bir kez. Bkz. previewOverlayView ve FIRDetectionOverlayView sınıfları inceleyelim.