Sie können ML Kit verwenden, um in einem Bild erkannte Objekte mit Labels zu versehen. Dazu verwenden Sie entweder On-Device- oder Cloud-Modells. In der Übersicht finden Sie Informationen zu den Vorteilen der einzelnen Ansätze.
Hinweis
- Wenn Sie Ihrer App noch nicht Firebase hinzugefügt haben, folgen Sie der im Startleitfaden.
- Fügen Sie die ML Kit-Bibliotheken in Ihre Podfile-Datei ein:
Nachdem Sie die Pods Ihres Projekts installiert oder aktualisiert haben, öffnen Sie unbedingt Ihren Xcode mithilfe derpod 'Firebase/MLVision', '6.25.0'
# If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'
.xcworkspace
zu erstellen. - Importieren Sie Firebase in Ihre App:
Swift
import Firebase
Objective-C
@import Firebase;
-
Wenn Sie das cloudbasierte Modell verwenden möchten und es noch nicht aktiviert haben die cloudbasierten APIs für Ihr Projekt zu nutzen, tun Sie dies jetzt:
- ML Kit öffnen API-Seite der Firebase-Konsole.
-
Wenn Sie Ihr Projekt noch nicht auf einen Blaze-Tarif umgestellt haben, klicken Sie auf Upgrade. Sie werden nur dann zum Upgrade aufgefordert, wenn Ihr Projekt nicht den Blaze-Tarif hat.
Cloud-basierte APIs können nur in Projekten auf Blaze-Ebene verwendet werden.
- Wenn cloudbasierte APIs noch nicht aktiviert sind, klicken Sie auf Cloudbasiertes Erstellen aktivieren APIs
Wenn Sie nur das On-Device-Modell verwenden möchten, können Sie diesen Schritt überspringen.
Jetzt können Sie Bildern mit einem On-Device-Modell oder einem Cloud-basiertes Modell an.
1. Eingabebild vorbereiten
Erstellen Sie ein VisionImage
-Objekt mithilfe von UIImage
oder einem
CMSampleBufferRef
So verwendest du UIImage
:
- Drehen Sie das Bild gegebenenfalls so, dass es
imageOrientation
Property ist.up
. - Erstellen Sie ein
VisionImage
-Objekt mit der korrekt gedrehtenUIImage
. Geben Sie keine Rotationsmetadaten an. Dies ist die Standardeinstellung. Wert.topLeft
muss verwendet werden.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
So verwenden Sie ein CMSampleBufferRef
:
-
Erstellen Sie ein
VisionImageMetadata
-Objekt, das die Ausrichtung der Bilddaten imCMSampleBufferRef
-Zwischenspeicher.So ermitteln Sie die Bildausrichtung:
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; } }
Erstellen Sie dann das Metadatenobjekt:
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];
- Erstelle ein
VisionImage
-Objekt mit demCMSampleBufferRef
-Objekt und den Rotationsmetadaten:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
2. Labelersteller für Images konfigurieren und ausführen
Um Objekte in einem Bild mit einem Label zu versehen, übergeben Sie dasVisionImage
-Objekt an die
Die Methode processImage()
von VisionImageLabeler
.
Rufen Sie zuerst eine Instanz von
VisionImageLabeler
ab.Wenn Sie den On-Device-Image-Labeler auf dem Gerät verwenden möchten:
Swift
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)
Objective-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];
So verwenden Sie den Cloud-Bildlabeler:
Swift
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)
Objective-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];
Übergeben Sie dann das Bild an die Methode
processImage()
:Swift
labeler.process(image) { labels, error in guard error == nil, let labels = labels else { return } // Task succeeded. // ... }
Objective-C
[labeler processImage:image completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. Informationen zu Objekten mit Label abrufen
Wenn das Bild-Labeling erfolgreich ist, ein Array vonVisionImageLabel
-Objekte werden an den Abschluss-Handler übergeben. Von jedem Objekt erhalten Sie
Informationen zu einem im Bild erkannten Merkmal.
Beispiel:
Swift
for label in labels {
let labelText = label.text
let entityId = label.entityID
let confidence = label.confidence
}
Objective-C
for (FIRVisionImageLabel *label in labels) {
NSString *labelText = label.text;
NSString *entityId = label.entityID;
NSNumber *confidence = label.confidence;
}
Tipps zur Verbesserung der Echtzeitleistung
Wenn Sie Bilder in einer Echtzeitanwendung mit Labels versehen möchten, gehen Sie so vor: um optimale Framerates zu erzielen:
- Drosselung von Aufrufen an den Labelersteller für Bilder Wenn ein neuer Videoframe wenn der Labelersteller ausgeführt wird, lassen Sie den Frame weg.
- Wenn Sie die Ausgabe des Bildlabelerstellers verwenden, um Grafiken Eingabebild, rufen Sie zuerst das Ergebnis aus ML Kit ab und rendern Sie das Bild in einem Schritt übereinanderlegen. Dadurch rendern Sie auf der Anzeigeoberfläche für jeden Eingabe-Frame nur einmal. Weitere Informationen finden Sie unter previewOverlayView. und FIRDetectionOverlayView in der Showcase-Beispiel-App als Beispiel.
Nächste Schritte
- Bevor Sie eine Anwendung, die eine Cloud API verwendet, für die Produktion bereitstellen, sollten Sie einige zusätzliche Schritte zur Verhinderung bzw. Schadensbehebung Auswirkungen von nicht autorisiertem API-Zugriff.