ML Kit bietet zwei optimierte SDKs für die Posenerkennung.
SDK-Name | PoseDetection | PoseDetectionAccurate |
---|---|---|
Implementierung | Assets für den Basisdetektor werden bei der Build-Erstellung statisch mit Ihrer App verknüpft. | Assets für einen genauen Detektor werden zum Zeitpunkt der Erstellung statisch mit Ihrer App verknüpft. |
App-Größe | Bis zu 29,6 MB | Bis zu 33,2 MB |
Leistung | iPhone X: ~45 fps | iPhone X: ~29 fps |
Jetzt ausprobieren
- Probieren Sie die Beispiel-App aus, um sehen Sie sich ein Anwendungsbeispiel für diese API an.
Hinweis
Fügen Sie die folgenden ML Kit-Pods in Ihre Podfile-Datei ein:
# If you want to use the base implementation: pod 'GoogleMLKit/PoseDetection', '3.2.0' # If you want to use the accurate implementation: pod 'GoogleMLKit/PoseDetectionAccurate', '3.2.0'
Nachdem Sie die Pods Ihres Projekts installiert oder aktualisiert haben, öffnen Sie das Xcode-Projekt mit der
xcworkspace
. ML Kit wird ab Xcode-Version 13.2.1 unterstützt.
1. Instanz von PoseDetector
erstellen
Um eine Pose in einem Bild zu erkennen, erstellen Sie zuerst eine Instanz von PoseDetector
und
die Detektoreinstellungen optional.
Optionen für PoseDetector
Erkennungsmodus
PoseDetector
wird in zwei Erkennungsmodi ausgeführt. Achten Sie darauf, dass Sie diejenige auswählen,
Ihren Anwendungsfall.
stream
(Standard)- Die Positionserkennung erkennt zuerst die meisten eine bekannte Person auf dem Bild und führen Sie dann die Posenerkennung durch. In den nachfolgenden Frames wird der Schritt der Personenentdeckung erst durchgeführt, wenn die Person oder wird nicht mehr mit hoher Zuverlässigkeit erkannt. Die Pose-Erkennung Sie versuchen, die bekannteste Person zu verfolgen und jeweils ihre Position zurückzugeben. Inferenz. Dadurch wird die Latenz verringert und die Erkennung optimiert. Verwenden Sie diesen Modus, wenn Sie eine Pose in einem Videostream zu erkennen.
singleImage
- Die Positionserkennung erkennt eine Person und läuft die Pose -Erkennung. Der Schritt zur Personenentdeckung wird für jedes Bild ausgeführt, und es gibt keine Personenverfolgung. Diesen Modus in Pose verwenden Erkennung bei statischen Bildern oder bei Geräten, bei denen ein Tracking nicht erwünscht ist.
Legen Sie die Optionen für die Positionserkennung fest:
Swift
// Base pose detector with streaming, when depending on the PoseDetection SDK let options = PoseDetectorOptions() options.detectorMode = .stream // Accurate pose detector on static images, when depending on the // PoseDetectionAccurate SDK let options = AccuratePoseDetectorOptions() options.detectorMode = .singleImage
Objective-C
// Base pose detector with streaming, when depending on the PoseDetection SDK MLKPoseDetectorOptions *options = [[MLKPoseDetectorOptions alloc] init]; options.detectorMode = MLKPoseDetectorModeStream; // Accurate pose detector on static images, when depending on the // PoseDetectionAccurate SDK MLKAccuratePoseDetectorOptions *options = [[MLKAccuratePoseDetectorOptions alloc] init]; options.detectorMode = MLKPoseDetectorModeSingleImage;
Schließlich rufen Sie eine Instanz von PoseDetector
ab. Übergeben Sie die angegebenen Optionen:
Swift
let poseDetector = PoseDetector.poseDetector(options: options)
Objective-C
MLKPoseDetector *poseDetector = [MLKPoseDetector poseDetectorWithOptions:options];
2. Eingabebild vorbereiten
Um Posen zu erkennen, gehen Sie für jedes Bild oder jeden Frame des Videos folgendermaßen vor:
Wenn Sie den Streammodus aktiviert haben, müssen Sie VisionImage
-Objekte erstellen aus
CMSampleBuffer
.
Erstellen Sie ein VisionImage
-Objekt mithilfe von UIImage
oder einem
CMSampleBuffer
Wenn du ein UIImage
verwendest, gehe so vor:
- Erstellen Sie ein
VisionImage
-Objekt mit derUIImage
. Geben Sie die richtige.orientation
an.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Wenn du ein CMSampleBuffer
verwendest, gehe so vor:
-
Geben Sie die Ausrichtung der Bilddaten an, die in der
CMSampleBuffer
So ermitteln Sie die Bildausrichtung:
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; } }
- Erstellen Sie ein
VisionImage
-Objekt mithilfe derCMSampleBuffer
-Objekt und Ausrichtung: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. Bild verarbeiten
Übergib VisionImage
an eine der Bildverarbeitungsmethoden des Posendetektors. Sie können entweder die asynchrone Methode process(image:)
oder die synchrone Methode results()
verwenden.
So erkennen Sie Objekte synchron:
Swift
var results: [Pose] do { results = try poseDetector.results(in: image) } catch let error { print("Failed to detect pose with error: \(error.localizedDescription).") return } guard let detectedPoses = results, !detectedPoses.isEmpty else { print("Pose detector returned no results.") return } // Success. Get pose landmarks here.
Objective-C
NSError *error; NSArray*poses = [poseDetector resultsInImage:image error:&error]; if (error != nil) { // Error. return; } if (poses.count == 0) { // No pose detected. return; } // Success. Get pose landmarks here.
So erkennen Sie Objekte asynchron:
Swift
poseDetector.process(image) { detectedPoses, error in guard error == nil else { // Error. return } guard !detectedPoses.isEmpty else { // No pose detected. return } // Success. Get pose landmarks here. }
Objective-C
[poseDetector processImage:image completion:^(NSArray* _Nullable poses, NSError * _Nullable error) { if (error != nil) { // Error. return; } if (poses.count == 0) { // No pose detected. return; } // Success. Get pose landmarks here. }];
4. Informationen zur erkannten Pose abrufen
Wenn eine Person auf dem Bild erkannt wird, gibt die POS Detection API entweder eine
Array von Pose
-Objekten an den Abschluss-Handler oder gibt das Array
je nachdem, ob Sie die asynchrone oder die synchrone Methode aufgerufen haben.
Wenn sich die Person nicht ganz im Bild befand, weist das Modell der fehlenden Orientierungspunkte außerhalb des Frames InFrameConfidence-Werten.
Wenn keine Person erkannt wurde, ist das Array leer.
Swift
for pose in detectedPoses { let leftAnkleLandmark = pose.landmark(ofType: .leftAnkle) if leftAnkleLandmark.inFrameLikelihood > 0.5 { let position = leftAnkleLandmark.position } }
Objective-C
for (MLKPose *pose in detectedPoses) { MLKPoseLandmark *leftAnkleLandmark = [pose landmarkOfType:MLKPoseLandmarkTypeLeftAnkle]; if (leftAnkleLandmark.inFrameLikelihood > 0.5) { MLKVision3DPoint *position = leftAnkleLandmark.position; } }
Tipps zur Verbesserung der Leistung
Die Qualität Ihrer Ergebnisse hängt von der Qualität des Eingabebildes ab:
- Damit ML Kit die Pose genau erkennen kann, sollte die Person auf dem Bild ausreichende Pixeldaten dargestellt werden. um eine optimale Leistung zu erzielen, mindestens 256 x 256 Pixel groß sein.
- Wenn Sie in einer Echtzeitanwendung Posen erkennen, sollten Sie die Gesamtabmessungen der Eingabebilder. Kleinere Bilder können verarbeitet werden Um die Latenz zu verringern, nehmen Sie Bilder mit geringerer Auflösung auf, an die oben genannten Anforderungen an die Auflösung zu denken und sicherzustellen, dass die Person möglichst viel vom Bild zu sehen.
- Ein schlechter Bildfokus kann auch die Genauigkeit beeinträchtigen. Wenn Sie keine akzeptablen Ergebnisse erhalten, den Nutzer bitten, das Bild erneut aufzunehmen.
Wenn du die Posenerkennung in einer Echtzeitanwendung verwenden möchtest, solltest du die folgenden Richtlinien beachten, um die besten Framerates zu erzielen:
- Verwenden Sie das Basis-PoseDetection SDK und den
stream
-Erkennungsmodus. - Nehmen Sie Bilder mit einer niedrigeren Auflösung auf. Beachten Sie jedoch auch die Anforderungen dieser API an die Bildabmessungen.
- Verwende zum Verarbeiten von Videoframes die synchrone
results(in:)
API des Detektors. Rufen Sie diese Methode aus dem von AVCaptureVideoDataOutputSampleBufferDelegate captureOutput(_, didOutput:from:), um synchron Ergebnisse aus dem jeweiligen Videoframe abzurufen. Belassen Sie alwaysDiscardsLateVideoFrames von AVCaptureVideoDataOutput auf „true“, um Aufrufe an den Detektor zu drosseln. Wenn ein neuer Videoframe verfügbar wird, während der Detektor ausgeführt wird, wird er entfernt. - Wenn Sie die Ausgabe des Detektors verwenden, um Grafiken über das Eingabebild zu blenden, rufen Sie zuerst das Ergebnis aus ML Kit ab und rendern Sie dann das Bild und das Overlay in einem Schritt. Auf diese Weise rendern Sie auf der Anzeigeoberfläche nur einmal für jeden verarbeiteten Eingabe-Frame. Weitere Informationen finden Sie in der previewOverlayView und MLKDetectionOverlayView in der Showcase-Beispiel-App als Beispiel.
Nächste Schritte
- Informationen zum Klassifizieren von Posen mithilfe von Orientierungspunkten finden Sie unter Tipps zur Posesklassifizierung.
- Ein Beispiel für die Verwendung dieser API finden Sie im ML Kit-Schnellstartbeispiel auf GitHub.