[PYTHON] Ich habe versucht, Boeing die Geigenleistung durch Posenschätzung vorzustellen

Ich habe versucht, den Merkmalspunkt des rechten Handgelenks zu erkennen

ezgif.com-crop-2.gif

Einführung

Dieser Artikel wurde am 22. Tag des Fujitsu Systems Web Technology Adventskalenders 2019 veröffentlicht. Der Inhalt des Artikels ist die persönliche Meinung, und der Inhalt des Schreibens liegt in der eigenen Verantwortung des Autors. Es spielt keine Rolle, zu welcher Organisation Sie gehören. (Oyakusoku)

Überblick

Ich spiele gerne Geige als Hobby, aber Geige zu spielen ist schwer. Es ist allgemein bekannt, dass es dank Shizuka-chan schwierig ist zu spielen, aber es gibt neben dem Spielen noch andere Schwierigkeiten.

image.png

Wenn ich Geige spiele, muss ich eine bestimmte Sache erledigen, bevor ich ein Lied spiele. Es heißt Boeing und es ist eine Aufgabe zu entscheiden, ob man nacheinander mit einem steigenden oder einem fallenden Bogen spielt, während man sich die Punktzahl ansieht.

--V → Upbow (von unten nach oben) --П → Abwärtsbogen (von oben nach unten)

image.png

Ich schreibe Boeing in der Partitur unter Berücksichtigung des Phrasengefühls des Songs und der Leichtigkeit des Spielens, aber diese Arbeit ist ziemlich mühsam. Boeing hat nicht die einzig richtige Antwort, sondern zeigt auch die Sensibilität des Spielers. Wenn Sie in einem Quartett oder Orchester spielen, müssen Sie es auch mit anderen Instrumenten wie Bratsche und Cello kombinieren. Es ist keine Übertreibung zu sagen, dass die Entwicklung einer automatischen Boeing-Maschine ein Traum eines Streichers ist.

Können wir also die Zeit und den Aufwand reduzieren, indem wir Boeing aus den Leistungsvideos anderer Leute lesen und darauf verweisen, ohne zur automatischen Befestigungsmaschine von Boeing zu gehen? Ich dachte.

Strategie

Die Strategie ist dies.

Damit sollten Sie in der Lage sein, die Boeing des Performance-Videos perfekt zu verstehen! Die verwendete Bibliothek ist eine Open-Source-tf-Pose-Schätzung, die OpenPose für Tensorflow implementiert.

Was ist OpenPose?

OpenPose ist eine Technologie, die von der CMU (Carnegie Melon University) auf der CVPR2017, einer internationalen Konferenz zum Thema Computer Vision, angekündigt wurde. Sie erkennt Schlüsselpunkte und schätzt die Beziehung zwischen Schlüsselpunkten. Mit OpenPose können Sie die Koordinaten der Feature-Punkte im menschlichen Körper anzeigen, z. B. die Position der Gelenke (siehe unten).

dance_foot.gif https://github.com/CMU-Perceptual-Computing-Lab/openpose

Was ist tf-Pose-Schätzung?

Die tf-Pose-Schätzung ist eine Implementierung desselben neuronalen Netzwerks wie OpenPose for Tensorflow. Ich habe mich diesmal dafür entschieden, weil die Erweiterung der tf-Pose-Schätzung von errno-mmd nützlich zu sein schien. Ich hatte die Möglichkeit, die von der Pose geschätzten zweidimensionalen Gelenkpositionsinformationen in eine Datei im JSON-Format auszugeben, und ich wollte diese verwenden.

Leistungsvideo zu analysieren

Ich hatte keine Ahnung von den kostenlosen Videos zur Geigenperformance, daher habe ich eine Aufzeichnung meiner Performance zur Analyse verwendet. Das gespielte Lied sind die ersten 10 Takte von Mozarts Satz Aine Kleine Nachtmusik 1. Ich habe mit dem Metronom in einem konstanten Tempo gespielt.

Kleinere Korrektur, um nur den Gelenkpunkt des rechten Handgelenks zu markieren

Standardmäßig markiert die tf-Pose-Schätzung verschiedene Merkmalspunkte wie Augen, Schultern, Ellbogen, Handgelenke und Knöchel und verbindet sie mit Linien. Dieses Mal habe ich den Code ein wenig geändert, um nur das richtige Handgelenk zu markieren.

tf-pose-estimation/tf_pose/estimator.py



440                #Zeichnen Sie ein Kreisbild nur am rechten Handgelenk
441                if i == CocoPart.RWrist.value:
442                    cv2.circle(npimg, center, 8, common.CocoColors[i], thickness=3, lineType=8, shift=0)

449                #Deaktivieren Sie das Verbinden von Strichzeichnungsmerkmalen
450                # cv2.line(npimg, centers[pair[0]], centers[pair[1]], common.CocoColors[pair_order], 3)

Posenschätzung durchführen

Die Ausführungsumgebung verwendete Google Colaboratory. https://github.com/errno-mmd/tf-pose-estimation Führen Sie den folgenden Befehl aus, nachdem Sie den Setup-Befehl gemäß Read.md von ausgeführt haben.

%run -i run_video.py --video "/content/drive/My Drive/violin_playing/EineKleineNachtmusik_20191226.mp4" --model mobilenet_v2_large --write_json "/content/drive/My Drive/violin_playing/json" --no_display --number_people_max 1 --write_video "/content/drive/My Drive/violin_playing/EineKleine_keypoints_20191226.mp4"

Unter Verwendung des zuvor auf Google Drive hochgeladenen Leistungsvideos als Eingabe werden ein Video ausgegeben, das den Gelenkpunkt des rechten Handgelenks darstellt, und eine JSON-Datei, in die die Koordinaten des Gelenkpunkts für jeden Frame geschrieben sind.

Videodatei ausgeben

Hier ist das Ausgabevideo, das in Abständen von einigen Sekunden ausgeschnitten und zu einem GIF verarbeitet wurde.

ezgif.com-crop-2.gif

Wenn man dies betrachtet, scheint es, dass es den Gelenkpunkt des rechten Handgelenks mit angemessener Genauigkeit nachzeichnet.

JSON-Datei ausgeben

Eine JSON-Datei mit den Koordinaten der Feature-Punkte wird in jedem Frame (1/60 Sekunden) ausgegeben. Hier ist die JSON-Datei für den 10. Frame.

000000000010_keypoints.json


{
	"version": 1.2,
	"people": [
		{
			"pose_keypoints_2d": [
				265.5925925925926,
				113.04347826086956,
				0.7988795638084412,
				244.55555555555557,
				147.82608695652175,
				0.762155294418335,
				197.22222222222223,
				149.56521739130434,
				0.6929810643196106,
				165.66666666666669,
				189.56521739130434,
				0.7044630646705627,
				220.88888888888889,
				166.95652173913044,
				0.690696656703949,
				289.2592592592593,
				146.08695652173913,
				0.5453883409500122,
				299.77777777777777,
				212.17391304347825,
				0.6319900751113892,
				339.22222222222223,
				177.3913043478261,
				0.6045356392860413,
				213,
				253.91304347826087,
				0.23064623773097992,
				0,
				0,
				0,
				0,
				0,
				0,
				268.22222222222223,
				276.52173913043475,
				0.2685505151748657,
				0,
				0,
				0,
				0,
				0,
				0,
				257.7037037037037,
				106.08695652173913,
				0.8110038042068481,
				270.85185185185185,
				107.82608695652173,
				0.7383710741996765,
				231.4074074074074,
				107.82608695652173,
				0.7740614414215088,
				0,
				0,
				0
			]
		}
	],
	"face_keypoints_2d": [],
	"hand_left_keypoints_2d": [],
	"hand_right_keypoints_2d": [],
	"pose_keypoints_3d": [],
	"face_keypoints_3d": [],
	"hand_left_keypoints_3d": [],
	"hand_right_keypoints_3d": []
}

Beim Lesen des Codes scheint das 13. Element (Schütteln von 0) vonpose_keypoints_2d der y-Koordinatenwert des rechten Handgelenks zu sein. Im obigen Beispiel des 10. Frames wäre es "166.95652173913044".

Diagrammanzeige der y-Koordinate des rechten Handgelenks

Ich möchte mit matplotlib ein Diagramm erstellen. Sammeln Sie zunächst die Zielwerte aus der JSON-Dateiausgabe für jeden Frame.

import json
import pprint
import os
import glob

import numpy as np

files = glob.glob('/content/drive/My Drive/violin_playing/json/*')
x = list(range(len(files)))
y = []
for file in files:
    with open(file) as f:
        df = json.load(f)
        y.append(df['people'][0]['pose_keypoints_2d'][13])

Die Variable x speichert die Anzahl der Frames und die Variable y speichert den Wert der Gelenkpunkt-y-Koordinate des rechten Handgelenks.

Dann grafisch mit matplotlib. Der x-Koordinatenspeicher ist 30 Frames voneinander entfernt. Dies liegt daran, dass ich Ainek mit einem Tempo von 4 Stimmen = 120 gespielt habe, sodass 30 Bilder genau einer Viertelnote entsprechen, was es einfacher macht, die Entsprechung mit der Partitur zu erkennen.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

fig = plt.figure(figsize=(120, 10))
ax = fig.add_subplot(1, 1, 1)
ax.xaxis.set_major_locator(ticker.MultipleLocator(30))
ax.plot(x, y, "red", linestyle='solid')

Das Ausgabediagramm ist hier.

image.png

Überlagerung

Hier ist das Ergebnis der Überlagerung mit der Partitur. Die Überlagerung erfolgte manuell. image.png

Wenn es nach unten geht, geht es nach unten und wenn es nach oben geht, geht es nach oben, aber ... nun ... ich frage mich, ob es fast richtig ist (^ _ ^;) Es ist wie es ist.

Zusammenfassung

Um ehrlich zu sein, kann ich den Auslastungsgrad nicht wirklich erreichen. Es scheint schwierig zu sein, die Verbeugung kleiner Passagen wie Sechzehntelnoten mit dieser Methode zu identifizieren. Wenn es sich um ein entspannteres Lied handelt, kann es bis zu einem gewissen Grad hilfreich sein.

Die folgenden Punkte bleiben jedoch in Bezug auf die Übereinstimmung mit der Musikpartitur bestehen.

――Die Breite eines Balkens ist in der Partitur nicht gleich

Wenn der Abgleich mit der Musikpartitur nicht automatisch erfolgen kann, ist das Anbringen der Biegung nicht effizient, sodass die oben genannten Probleme überwunden werden müssen. Das Erkennen der Tonhöhe und das Zuordnen zur Tonhöhe kann eine Lösung sein. Die Schwierigkeit scheint hoch zu sein (^ _ ^;)

Dieses Mal konzentrierte ich mich darauf, die Effizienz der Befestigung von Boeing zu verbessern, aber der Ansatz, den Unterschied im Umgang mit Bögen für erfahrene Anfänger und Anfänger zu visualisieren und darauf aufmerksam zu werden, scheint interessant zu sein. Ich fand, dass die Technik zum Schätzen von Posen aus diesem Video eine wunderbare Technik mit verschiedenen möglichen Anwendungen ist.

Recommended Posts

Ich habe versucht, Boeing die Geigenleistung durch Posenschätzung vorzustellen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe versucht, den Getränkepräferenzdatensatz durch Tensorzerlegung zu visualisieren.
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
Ich habe versucht, die optimale Route des Traumlandes durch (Quanten-) Tempern zu finden
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich habe versucht, das neueste Haltungsschätzungsmodell "Dark Pose" [CVPR2020] zu erklären.
Ich habe versucht, alle Entscheidungsbäume des zufälligen Waldes mit SVG zu visualisieren
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Ich habe versucht, die Blasensortierung nach Sprache zu programmieren
Ich habe versucht, Slack über das Update von Redmine zu informieren
Ich habe versucht, durch Schaben ein Bild zu bekommen
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, Drachenkugeln nach Adalin zu klassifizieren
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
Ich habe versucht, die Daten des Laptops durch Booten unter Ubuntu zu retten
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich habe versucht, verschiedene Informationen von Remote-PC aus Python von WMI Library zu extrahieren
Python-Übung 100 Schläge Ich habe versucht, den Entscheidungsbaum von Kapitel 5 mit graphviz zu visualisieren
Ich habe versucht zu debuggen.
Ich habe versucht, die Eigenschaften der neuen Informationen über mit dem Corona-Virus infizierte Personen mit Wordcloud zu visualisieren
[Erste Datenwissenschaft ⑥] Ich habe versucht, den Marktpreis von Restaurants in Tokio zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Laufdaten des Rennspiels (Assetto Corsa) mit Plotly zu visualisieren
[Python] Ich habe versucht, Json von Tintenfischring 2 zu bekommen
Ich habe versucht, einen automatischen Nachweis der Sequenzberechnung zu implementieren
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Da die Aktie aufgrund des Einflusses des neuen Corona-Virus eingebrochen ist, habe ich versucht, die Performance meines Investment Trusts mit Python zu visualisieren.
Ich habe versucht, den Stromverbrauch meines Hauses mit Nature Remo E lite zu visualisieren
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
[Verarbeitung natürlicher Sprache] Ich habe versucht, die Bemerkungen jedes Mitglieds in der Slack-Community zu visualisieren
Ich habe versucht, den Verkauf von Spielesoftware mit VARISTA anhand des Artikels von Codexa vorherzusagen
Ich habe vergessen, die Leistung zu bewerten, weil ich die Gewohnheit hatte, "Ich habe versucht, das schnellste Fizz Buzz anzustreben" zu überspringen.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, die Erkennung von Anomalien durch spärliches Strukturlernen zu implementieren
Ich habe versucht, die Videoerstellung durch parallele Verarbeitung zu beschleunigen
[Django] Ich habe versucht, Zugriffsbeschränkungen durch Klassenvererbung zu implementieren.
[Einführung in Pandas] Ich habe versucht, die Austauschdaten durch Dateninterpolation zu erhöhen ♬
Ich habe versucht, CPython ein Post-Inkrement hinzuzufügen. Liste aller Änderungen
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Ich habe versucht, MNIST nach GNN zu klassifizieren (mit PyTorch-Geometrie).
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
[Feier: Marktwert von 2 Billionen US-Dollar] Ich habe versucht, Apples Patent zu visualisieren
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht, das Blackjack of Trump-Spiel mit Python zu implementieren
Ich habe versucht, PredNet zu lernen