Optionen für die Klassifizierung von Positionen

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.

Abbildung 1: Liegestützen-Positionen nach oben und unten

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.
Abbildung 2: Beispiel für die Wiederholungszählung

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 Positionserkennung Run 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 und POSE_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.

Abbildung 3: Eine Pose interpretieren

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:

Abbildung 4: Eine Stellung in die richtigen Winkel bringen

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]];