In meiner vorherigen Frage habe ich eine hervorragende Antwort erhalten , mit deren Hilfe ich feststellen konnte, wo eine Pfote auf eine Druckplatte trifft. Jetzt habe ich jedoch Probleme, diese Ergebnisse mit den entsprechenden Pfoten zu verknüpfen:
Ich habe die Pfoten manuell kommentiert (RF = rechts vorne, RH = rechts hinten, LF = links vorne, LH = links hinten).
Wie Sie sehen, gibt es eindeutig ein sich wiederholendes Muster, das bei fast jeder Messung wieder auftritt. Hier ist ein Link zu einer Präsentation von 6 Versuchen, die manuell kommentiert wurden.
Mein erster Gedanke war, Heuristiken zu verwenden, um die Sortierung durchzuführen, wie:
- Die Gewichtsbelastung zwischen Vorder- und Hinterpfote beträgt ~ 60-40%.
- Die Hinterpfoten haben im Allgemeinen eine kleinere Oberfläche;
- Die Pfoten sind (oft) räumlich in links und rechts unterteilt.
Ich bin jedoch etwas skeptisch gegenüber meinen Heuristiken, da sie bei mir versagen würden, sobald ich auf eine Variation stoße, an die ich nicht gedacht hatte. Sie werden auch nicht in der Lage sein, Messungen von lahmen Hunden zu bewältigen, die wahrscheinlich eigene Regeln haben.
Darüber hinaus wird die von Joe vorgeschlagene Anmerkung manchmal durcheinander gebracht und berücksichtigt nicht, wie die Pfote tatsächlich aussieht.
Aufgrund der Antworten, die ich auf meine Frage zur Peakerkennung innerhalb der Pfote erhalten habe , hoffe ich, dass es fortschrittlichere Lösungen zum Sortieren der Pfoten gibt. Insbesondere, weil die Druckverteilung und deren Verlauf für jede einzelne Pfote unterschiedlich sind, fast wie bei einem Fingerabdruck. Ich hoffe, es gibt eine Methode, mit der ich meine Pfoten gruppieren kann, anstatt sie nur in der Reihenfolge ihres Auftretens zu sortieren.
Deshalb suche ich nach einer besseren Möglichkeit, die Ergebnisse mit der entsprechenden Pfote zu sortieren.
Für jeden, der sich der Herausforderung stellt, habe ich ein Wörterbuch mit allen in Scheiben geschnittenen Arrays zusammengestellt, die die Druckdaten jeder Pfote (gebündelt durch Messung) und der Scheibe enthalten, die ihre Position (Position auf der Platte und in der Zeit) beschreibt.
Zu clarfiy: walk_sliced_data ist ein Wörterbuch, das ['ser_3', 'ser_2', 'sel_1', 'sel_2', 'ser_1', 'sel_3'] enthält, die die Namen der Messungen sind. Jede Messung enthält ein anderes Wörterbuch [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] (Beispiel aus 'sel_1'), das die extrahierten Auswirkungen darstellt.
Beachten Sie auch, dass „falsche“ Stöße, z. B. wenn die Pfote teilweise gemessen wird (räumlich oder zeitlich), ignoriert werden können. Sie sind nur nützlich, weil sie beim Erkennen eines Musters helfen können, aber nicht analysiert werden.
Und für alle Interessierten führe ich einen Blog mit allen Updates zum Projekt!
quelle
walk_sliced_data
strukturiert sind? Ich sehe ein Wörterbuch mit Wörterbüchern von 3D-Arrays. Wenn ich die dritte Dimension fixiere und die ersten beiden als Bild zeichne, sehe ich Pfoten.Antworten:
In Ordung! Ich habe es endlich geschafft, dass etwas konsequent funktioniert! Dieses Problem hat mich mehrere Tage lang angezogen ... Lustiges Zeug! Entschuldigen Sie die Länge dieser Antwort, aber ich muss einige Dinge etwas näher erläutern ... (Obwohl ich möglicherweise einen Rekord für die längste Nicht-Spam-Stackoverflow-Antwort aller Zeiten aufstellen kann!)
Als Randnotiz verwende ich den vollständigen Datensatz, zu dem Ivo in seiner ursprünglichen Frage einen Link bereitgestellt hat . Es handelt sich um eine Reihe von rar-Dateien (eine pro Hund), die jeweils mehrere verschiedene Versuchsläufe enthalten, die als ASCII-Arrays gespeichert sind. Anstatt zu versuchen, eigenständige Codebeispiele in diese Frage zu kopieren und einzufügen , finden Sie hier ein Bitbucket-Quecksilber-Repository mit vollständigem, eigenständigem Code. Sie können es mit klonen
hg clone https://[email protected]/joferkington/paw-analysis
Überblick
Wie Sie in Ihrer Frage festgestellt haben, gibt es im Wesentlichen zwei Möglichkeiten, um das Problem anzugehen. Ich werde beide auf unterschiedliche Weise verwenden.
Grundsätzlich funktioniert die erste Methode so, dass die Pfoten des Hundes dem in Ivos Frage oben gezeigten trapezartigen Muster folgen, schlägt jedoch fehl, wenn die Pfoten diesem Muster nicht folgen. Es ist ziemlich einfach, programmgesteuert zu erkennen, wenn es nicht funktioniert.
Daher können wir die Messungen, bei denen es funktioniert hat, verwenden, um einen Trainingsdatensatz (von ~ 2000 Pfotenstößen von ~ 30 verschiedenen Hunden) zu erstellen, um zu erkennen, welche Pfote welche ist, und das Problem reduziert sich auf eine überwachte Klassifizierung (mit einigen zusätzlichen Falten). .. Die Bilderkennung ist etwas schwieriger als ein "normales" überwachtes Klassifizierungsproblem.
Musteranalyse
Um auf die erste Methode einzugehen: Wenn ein Hund normal läuft (nicht rennt!) (Was einige dieser Hunde möglicherweise nicht sind), erwarten wir, dass die Pfoten in der folgenden Reihenfolge aufschlagen: vorne links, hinten rechts, vorne rechts, hinten links , Vorne links usw. Das Muster kann entweder mit der vorderen linken oder der vorderen rechten Pfote beginnen.
Wenn dies immer der Fall wäre, könnten wir die Auswirkungen einfach nach der anfänglichen Kontaktzeit sortieren und sie mit einem Modulo 4 nach Pfoten gruppieren.
Selbst wenn alles "normal" ist, funktioniert dies nicht. Dies ist auf die trapezartige Form des Musters zurückzuführen. Eine Hinterpfote fällt räumlich hinter die vorherige Vorderpfote.
Daher fällt der Aufprall der Hinterpfote nach dem ersten Aufprall der Vorderpfote häufig von der Sensorplatte und wird nicht aufgezeichnet. In ähnlicher Weise ist der letzte Pfotenaufprall oft nicht der nächste Pfote in der Sequenz, da der Pfotenaufprall, bevor er von der Sensorplatte auftrat und nicht aufgezeichnet wurde.
Trotzdem können wir anhand der Form des Pfotenaufprallmusters bestimmen, wann dies geschehen ist und ob wir mit einer linken oder rechten Vorderpfote begonnen haben. (Ich ignoriere tatsächlich Probleme mit dem letzten Aufprall hier. Es ist jedoch nicht allzu schwer, ihn hinzuzufügen.)
Trotz alledem funktioniert es häufig nicht richtig. Viele der Hunde im vollständigen Datensatz scheinen zu rennen, und die Pfotenstöße folgen nicht der gleichen zeitlichen Reihenfolge wie beim Gehen des Hundes. (Oder vielleicht hat der Hund nur schwere Hüftprobleme ...)
Glücklicherweise können wir immer noch programmgesteuert feststellen, ob die Pfotenstöße unserem erwarteten räumlichen Muster folgen oder nicht:
Obwohl die einfache räumliche Klassifizierung nicht immer funktioniert, können wir daher mit hinreichender Sicherheit feststellen, wann sie funktioniert.
Trainingsdatensatz
Aus den musterbasierten Klassifikationen, bei denen es richtig funktioniert hat, können wir einen sehr großen Trainingsdatensatz korrekt klassifizierter Pfoten erstellen (~ 2400 Pfotenstöße von 32 verschiedenen Hunden!).
Wir können jetzt anfangen zu sehen, wie eine "durchschnittliche" vordere linke Pfote usw. aussieht.
Dazu benötigen wir eine Art "Pfotenmetrik", die für jeden Hund die gleiche Dimension hat. (Im vollständigen Datensatz gibt es sowohl sehr große als auch sehr kleine Hunde!) Ein Pfotenabdruck eines irischen Elchhundes ist sowohl viel breiter als auch viel "schwerer" als ein Pfotenabdruck eines Zwergpudels. Wir müssen jeden Pfotenabdruck neu skalieren, damit a) sie die gleiche Anzahl von Pixeln haben und b) die Druckwerte standardisiert sind. Zu diesem Zweck habe ich jeden Pfotenabdruck erneut auf ein 20x20-Raster abgetastet und die Druckwerte basierend auf dem maximalen, minimalen und mittleren Druckwert für den Pfotenaufprall neu skaliert.
Nach all dem können wir uns endlich ansehen, wie eine durchschnittliche Pfote links vorne, hinten rechts usw. aussieht. Beachten Sie, dass dies über> 30 Hunde mit sehr unterschiedlichen Größen gemittelt wird und wir anscheinend konsistente Ergebnisse erzielen!
Bevor wir jedoch eine Analyse dieser durchführen, müssen wir den Mittelwert (die durchschnittliche Pfote für alle Beine aller Hunde) subtrahieren.
Jetzt können wir die Unterschiede zum Mittelwert analysieren, die etwas leichter zu erkennen sind:
Bildbasierte Pfotenerkennung
Ok ... Wir haben endlich eine Reihe von Mustern, mit denen wir versuchen können, die Pfoten abzugleichen. Jede Pfote kann als 400-dimensionaler Vektor (von der
paw_image
Funktion zurückgegeben) behandelt werden, der mit diesen vier 400-dimensionalen Vektoren verglichen werden kann.Wenn wir nur einen "normalen" überwachten Klassifizierungsalgorithmus verwenden (dh anhand eines einfachen Abstands herausfinden, welches der 4 Muster einem bestimmten Pfotenabdruck am nächsten kommt), funktioniert dies leider nicht konsistent. Tatsächlich ist es nicht viel besser als zufällige Zufälle im Trainingsdatensatz.
Dies ist ein häufiges Problem bei der Bilderkennung. Aufgrund der hohen Dimensionalität der Eingabedaten und der etwas "unscharfen" Natur der Bilder (dh benachbarte Pixel haben eine hohe Kovarianz) ergibt ein einfaches Betrachten des Unterschieds eines Bildes von einem Vorlagenbild kein sehr gutes Maß für die Ähnlichkeit ihrer Formen.
Eigenpfoten
Um dies zu umgehen, müssen wir eine Reihe von "Eigenpfoten" erstellen (genau wie "Eigengesichter" bei der Gesichtserkennung) und jeden Pfotenabdruck als eine Kombination dieser Eigenpfoten beschreiben. Dies ist identisch mit der Hauptkomponentenanalyse und bietet im Grunde eine Möglichkeit, die Dimensionalität unserer Daten zu reduzieren, sodass der Abstand ein gutes Maß für die Form ist.
Da wir mehr Trainingsbilder als Dimensionen haben (2400 vs 400), ist es nicht erforderlich, eine "ausgefallene" lineare Algebra für die Geschwindigkeit zu erstellen. Wir können direkt mit der Kovarianzmatrix des Trainingsdatensatzes arbeiten:
Dies
basis_vecs
sind die "Eigenpfoten".Um diese zu verwenden, punktieren wir einfach (dh Matrixmultiplikation) jedes Pfotenbild (als 400-dimensionaler Vektor anstelle eines 20x20-Bildes) mit den Basisvektoren. Dies gibt uns einen 50-dimensionalen Vektor (ein Element pro Basisvektor), mit dem wir das Bild klassifizieren können. Anstatt ein 20x20-Bild mit dem 20x20-Bild jeder "Vorlagen" -Pfote zu vergleichen, vergleichen wir das 50-dimensionale, transformierte Bild mit jeder 50-dimensionalen transformierten Vorlagenpfote. Dies ist viel weniger empfindlich gegenüber kleinen Abweichungen in der genauen Positionierung jedes Zehs usw. und reduziert die Dimensionalität des Problems im Grunde genommen auf die relevanten Abmessungen.
Eigenpfotenbasierte Pfotenklassifikation
Jetzt können wir einfach den Abstand zwischen den 50-dimensionalen Vektoren und den "Schablonen" -Vektoren für jedes Bein verwenden, um zu klassifizieren, welche Pfote welche ist:
Hier sind einige der Ergebnisse:
Verbleibende Probleme
Es gibt immer noch einige Probleme, insbesondere bei Hunden, die zu klein sind, um einen klaren Pfotenabdruck zu erzeugen ... (Dies funktioniert am besten bei großen Hunden, da die Zehen bei der Auflösung des Sensors deutlicher voneinander getrennt sind.) Auch teilweise Pfotenabdrücke werden damit nicht erkannt System, während sie mit dem trapezförmigen Muster-basierten System sein können.
Da die Eigenpfotenanalyse jedoch von Natur aus eine Abstandsmetrik verwendet, können wir die Pfoten in beide Richtungen klassifizieren und auf das auf Trapezmustern basierende System zurückgreifen, wenn der kleinste Abstand der Eigenpfotenanalyse vom "Codebuch" einen bestimmten Schwellenwert überschreitet. Ich habe dies jedoch noch nicht implementiert.
Puh ... das war lang! Mein Hut ist weg von Ivo, weil ich so eine lustige Frage habe!
quelle
Wenn Sie die Informationen ausschließlich auf der Grundlage der Dauer verwenden, können Sie meiner Meinung nach Techniken aus der Modellierungskinematik anwenden. nämlich inverse Kinematik . In Kombination mit Orientierung, Länge, Dauer und Gesamtgewicht ergibt sich ein gewisses Maß an Periodizität, was hoffentlich der erste Schritt sein könnte, um Ihr Problem des "Sortierens der Pfoten" zu lösen.
All diese Daten könnten verwendet werden, um eine Liste von begrenzten Polygonen (oder Tupeln) zu erstellen, die Sie verwenden können, um nach Schrittgröße und dann nach Pfote [Index] zu sortieren.
quelle
Kann der Techniker, der den Test ausführt, die erste Pfote (oder die ersten beiden) manuell eingeben? Der Prozess könnte sein:
quelle