Mit der ML Kit Pose Detection API können Sie aussagekräftige Interpretationen Pose, indem die relativen Positionen verschiedener Körperteile überprüft werden. Diese Seite werden einige Beispiele gezeigt.
Poseklassifizierung und Wiederholungszählung mit dem k-NN-Algorithmus
Eine der häufigsten Anwendungen der Posenerkennung ist das Fitness-Tracking. Entwicklung eines Posenklassifikators, der bestimmte Fitnesspositionen und -anzahl erkennt Wiederholungen können für Entwickler eine große Herausforderung darstellen.
In diesem Abschnitt beschreiben wir, wie wir eine individuelle Pose erstellen. Klassifikator mit dem MediaPipe Colab und einen funktionierenden Klassifikator in unserer ML Kit-Beispiel-App.
Wenn Sie mit Google Colaboratory nicht vertraut sind, finden Sie im Einführungsleitfaden.
Um Posen zu erkennen, verwenden wir den Algorithmus für die k-nächstgelegenen Nachbarn (k-NN), da er einfach ist. und ein einfacher Einstieg. Der Algorithmus bestimmt die Klasse des Objekts basierend auf dem im Trainings-Dataset am nächsten liegen.
Führen Sie die folgenden Schritte aus, um die Erkennung zu erstellen und zu trainieren:
1. Bildproben erfassen
Wir haben Bildproben der Zielübungen aus verschiedenen Quellen zusammengetragen. Mi. habe ein paar Hundert Bilder für jede Übung ausgewählt, z. B. „nach oben“ und „nach unten“ Positionen für Liegestütze. Es ist wichtig, Muster zu sammeln, die verschiedene Kameratypen abdecken Winkel, Umgebungsbedingungen, Körperformen und Trainingsvariationen.
![](https://developers-dot-devsite-v2-prod.appspot.com/static/ml-kit/images/vision/pose-detection/terminal_pose.png?authuser=9&hl=de)
2. Posenerkennung für die Beispielbilder ausführen
So erhalten Sie eine Reihe von Orientierungspunkten für die Pose, die für das Training verwendet werden können. Wir sind nicht an der Posenerkennung selbst interessiert sind, da wir unsere eigenen Modell erstellen.
Der k-NN-Algorithmus, den wir für die benutzerdefinierte Posenklassifizierung gewählt haben, erfordert eine Merkmalsvektordarstellung für jede Stichprobe und einen zu berechnenden Messwert Abstand zwischen zwei Vektoren, um das Ziel zu finden, das dem Posenbeispiel am nächsten ist. Das bedeutet, dass wir die soeben erhaltenen Posen-Landmarks umwandeln müssen.
Um Positionsmarkierungen in einen Featurevektor umzuwandeln, verwenden wir die paarweisen Abstände zwischen vordefinierten Listen von Positionsgelenken, z. B. dem Abstand zwischen Handgelenk und Schulter, Knöchel und Hüfte sowie das linke und rechte Handgelenk. Da die Größe von Bildern können, haben wir die Posen so normalisiert, dass sie dieselbe Rumpfgröße und denselben vertikalen Ausrichtung vor dem Konvertieren der Orientierungspunkte.
3. Modell trainieren und Wiederholungen zählen
Wir haben mit MediaPipe Colab auf den Code für den Klassifikator zugegriffen und das Modell trainieren.
Zum Zählen von Wiederholungen haben wir mit einem anderen Colab-Algorithmus die Wahrscheinlichkeit Grenzwert einer Zielposition. Beispiel:
- Wenn die Wahrscheinlichkeit eines „Rückwärtsgangs“ Pose-Klasse erfüllt einen bestimmten Schwellenwert erkennt der Algorithmus, dass die „schlechten“ Pose-Klasse eingegeben wurde.
- Wenn die Wahrscheinlichkeit unter den Grenzwert fällt, stellt der Algorithmus fest, "nach unten" Pose-Klasse wurde beendet und erhöht den Zähler.
![](https://developers-dot-devsite-v2-prod.appspot.com/static/ml-kit/images/vision/pose-detection/pose_classification.gif?authuser=9&hl=de)
4. In die ML Kit-Schnellstart-App einbinden
Das Colab oben erstellt eine CSV-Datei, in der Sie Ihre Posen einfügen können Proben. In diesem Abschnitt erfahren Sie, wie Sie Ihre CSV-Datei mit dem ML Kit Android-Schnellstart-App zur Anzeige einer benutzerdefinierten Posenklassifizierung in Echtzeit
Testen Sie die Pose-Klassifizierung mit Beispielen, die in der Schnellstart-App gebündelt sind.
- ML Kit Android-Schnellstart-App-Projekt herunterladen von GitHub und sorge dafür, dass sie einwandfrei funktioniert und funktioniert.
- Gehe zu
LivePreviewActivity
und aktiviere die PositionserkennungRun classification
auf der Seite „Einstellungen“ Seite. Jetzt solltest du in der Lage sein, Liegestütze und Kniebeugen zu klassifizieren.
Eigene CSV-Datei hinzufügen
- Fügen Sie die CSV-Datei dem Asset-Ordner der App hinzu.
- Führen Sie in PoseClassifierProcessor folgende Schritte aus:
Aktualisieren Sie die Variablen
POSE_SAMPLES_FILE
undPOSE_CLASSES
entsprechend Ihren CSV-Datei und Pose-Beispiele. - Erstellen Sie die Anwendung und führen Sie sie aus.
Beachten Sie, dass die Klassifizierung möglicherweise nicht gut funktioniert, wenn nicht genügend Stichproben vorhanden sind. Im Allgemeinen benötigen Sie ungefähr 100 Samples pro Positionsklasse.
Wenn Sie mehr erfahren und dies selbst ausprobieren möchten, sehen Sie sich MediaPipe Colab an und im MediaPipe-Klassifizierungsleitfaden.
Einfache Touch-Gesten werden durch Berechnen der Entfernung von Sehenswürdigkeiten erkannt
Wenn zwei oder mehr Orientierungspunkte nahe beieinander liegen, können sie verwendet werden, Gesten erkennen. Wenn beispielsweise die Markierung für einen oder mehrere Finger auf einer sich nah an der Markierung für die Nase befindet, können Sie daraus ableiten, wahrscheinlich, dass sie ihr Gesicht berühren.
![](https://developers-dot-devsite-v2-prod.appspot.com/static/ml-kit/images/vision/pose-detection/touching_face.gif?authuser=9&hl=de)
Yogastellung mit Winkelheuristik erkennen
Du kannst eine Yogastellung identifizieren, indem du die Winkel verschiedener Gelenke berechnet. Für Beispiel: Abbildung 2 zeigt die Yoga-Pose von Warrior II. Die ungefähren Winkel die diese Pose identifizieren, geschrieben in:
![](https://developers-dot-devsite-v2-prod.appspot.com/static/ml-kit/images/vision/pose-detection/warrier2_sketch.png?authuser=9&hl=de)
Diese Haltung lässt sich als die folgende Kombination aus Körperform beschreiben: Teilwinkel:
- 90-Grad-Winkel an beiden Schultern
- 180 Grad an beiden Ellbogen
- 90-Grad-Winkel am vorderen Bein und an der Taille
- 180-Grad-Winkel am hinteren Knie
- 135-Grad-Winkel an der Taille
Sie können diese Winkel mit den Orientierungspunkten für die Pose berechnen. Zum Beispiel könnte der Winkel am rechten vorderen Bein und an der Taille ist der Winkel zwischen der Linie von rechts zur rechten Hüfte und die Linie von der rechten Hüfte zum rechten Knie.
Nachdem Sie alle zur Identifizierung der Position erforderlichen Winkel berechnet haben, um zu sehen, ob es eine Übereinstimmung gibt.
Das folgende Code-Snippet zeigt, wie die X- und Y-Koordinaten verwendet werden, um um den Winkel zwischen zwei Körperteilen zu berechnen. Dieser Klassifizierungsansatz hat einige Einschränkungen. Indem Sie nur X und Y prüfen, variieren die berechneten Winkel je nach Winkel zwischen Objekt und Kamera. Sie erhalten die beste Ergebnisse mit einem waagerechten, geraden, Frontalbild zu erzielen. Sie können auch Erweitern Sie diesen Algorithmus mithilfe des Z-Koordinate und prüfen, ob sie für Ihren Anwendungsfall besser geeignet ist.
Orientierungspunkte unter Android berechnen
Die folgende Methode berechnet den Winkel zwischen drei beliebigen Sehenswürdigkeiten. Sie stellt sicher, dass der zurückgegebene Winkel zwischen 0 und 180 Grad.
Kotlin
fun getAngle(firstPoint: PoseLandmark, midPoint: PoseLandmark, lastPoint: PoseLandmark): Double { var result = Math.toDegrees(atan2(lastPoint.getPosition().y - midPoint.getPosition().y, lastPoint.getPosition().x - midPoint.getPosition().x) - atan2(firstPoint.getPosition().y - midPoint.getPosition().y, firstPoint.getPosition().x - midPoint.getPosition().x)) result = Math.abs(result) // Angle should never be negative if (result > 180) { result = 360.0 - result // Always get the acute representation of the angle } return result }
Java
static double getAngle(PoseLandmark firstPoint, PoseLandmark midPoint, PoseLandmark lastPoint) { double result = Math.toDegrees( atan2(lastPoint.getPosition().y - midPoint.getPosition().y, lastPoint.getPosition().x - midPoint.getPosition().x) - atan2(firstPoint.getPosition().y - midPoint.getPosition().y, firstPoint.getPosition().x - midPoint.getPosition().x)); result = Math.abs(result); // Angle should never be negative if (result > 180) { result = (360.0 - result); // Always get the acute representation of the angle } return result; }
So berechnen Sie den Winkel an der rechten Hüfte:
Kotlin
val rightHipAngle = getAngle( pose.getPoseLandmark(PoseLandmark.Type.RIGHT_SHOULDER), pose.getPoseLandmark(PoseLandmark.Type.RIGHT_HIP), pose.getPoseLandmark(PoseLandmark.Type.RIGHT_KNEE))
Java
double rightHipAngle = getAngle( pose.getPoseLandmark(PoseLandmark.Type.RIGHT_SHOULDER), pose.getPoseLandmark(PoseLandmark.Type.RIGHT_HIP), pose.getPoseLandmark(PoseLandmark.Type.RIGHT_KNEE));
Orientierungspunkte unter iOS berechnen
Die folgende Methode berechnet den Winkel zwischen drei beliebigen Sehenswürdigkeiten. Sie stellt sicher, dass der zurückgegebene Winkel zwischen 0 und 180 Grad.
Swift
func angle( firstLandmark: PoseLandmark, midLandmark: PoseLandmark, lastLandmark: PoseLandmark ) -> CGFloat { let radians: CGFloat = atan2(lastLandmark.position.y - midLandmark.position.y, lastLandmark.position.x - midLandmark.position.x) - atan2(firstLandmark.position.y - midLandmark.position.y, firstLandmark.position.x - midLandmark.position.x) var degrees = radians * 180.0 / .pi degrees = abs(degrees) // Angle should never be negative if degrees > 180.0 { degrees = 360.0 - degrees // Always get the acute representation of the angle } return degrees }
Objective-C
(CGFloat)angleFromFirstLandmark:(MLKPoseLandmark *)firstLandmark midLandmark:(MLKPoseLandmark *)midLandmark lastLandmark:(MLKPoseLandmark *)lastLandmark { CGFloat radians = atan2(lastLandmark.position.y - midLandmark.position.y, lastLandmark.position.x - midLandmark.position.x) - atan2(firstLandmark.position.y - midLandmark.position.y, firstLandmark.position.x - midLandmark.position.x); CGFloat degrees = radians * 180.0 / M_PI; degrees = fabs(degrees); // Angle should never be negative if (degrees > 180.0) { degrees = 360.0 - degrees; // Always get the acute representation of the angle } return degrees; }
So berechnen Sie den Winkel an der rechten Hüfte:
Swift
let rightHipAngle = angle( firstLandmark: pose.landmark(ofType: .rightShoulder), midLandmark: pose.landmark(ofType: .rightHip), lastLandmark: pose.landmark(ofType: .rightKnee))
Objective-C
CGFloat rightHipAngle = [self angleFromFirstLandmark:[pose landmarkOfType:MLKPoseLandmarkTypeRightShoulder] midLandmark:[pose landmarkOfType:MLKPoseLandmarkTypeRightHip] lastLandmark:[pose landmarkOfType:MLKPoseLandmarkTypeRightKnee]];