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)
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.
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)
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.
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.
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).
https://github.com/CMU-Perceptual-Computing-Lab/openpose
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.
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.
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)
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.
Hier ist das Ausgabevideo, das in Abständen von einigen Sekunden ausgeschnitten und zu einem GIF verarbeitet wurde.
Wenn man dies betrachtet, scheint es, dass es den Gelenkpunkt des rechten Handgelenks mit angemessener Genauigkeit nachzeichnet.
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".
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.
Hier ist das Ergebnis der Überlagerung mit der Partitur. Die Überlagerung erfolgte manuell.
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.
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