Openpose, die die Haltung einer Person analysiert und diese Analysezeit mithilfe von Ton verkürzt. Ich möchte das Boxformular mit dieser Methode analysieren. p> ![rectangle_large_type_2_80d40cc7b53e4caa6a994dfebfa93937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/11f2db75-fd5f-ef58-8b08-425214a7ce7b.png)
Maschine: GoogoleColab P>
Openpose: Ich verwende den folgenden Quellcode, um die wichtigsten Punkte zu erhalten. Wenn Sie dies tun, empfehlen wir Ihnen, es mit den hier beschriebenen Techniken von Git auf Ihr Laufwerk zu klonen. https://colab.research.google.com/drive/1VO4TGJHKXnRKgiSAsNEeQcEHRgzUFFv9
Die Analyse des Videos dauert einige Zeit. Ich habe versucht, ein 7-minütiges Video mit Openpose zu analysieren, aber selbst mit Google Colab dauerte die Analyse eineinhalb Stunden. Die Analyse dauert 10 ½ Stunden und muss unter Berücksichtigung der Laufzeit und des Stromverbrauchs verkürzt werden. p>
Erstellen Sie das Video neu, indem Sie nur die Szenen extrahieren, für die Sie den Ton verwenden möchten (wenn Sie den Schlag ausführen). Da die Videozeit verkürzt wurde, wird auch die Ausführungszeit durch Analyse verkürzt. P>
Ich werde die Fortsetzung mit dem Quellcode erklären. p>
Sie können die Daten auf Drive von Google Colab mit dem folgenden Code zitieren. p> ``` from google.colab import drive drive.mount('/content/drive') ```
Erforderliche Bibliotheken importieren p> ``` import shutil !pip3 install pydub from pydub import AudioSegment ```
Deklarieren Sie den Pfad, der zum Lesen und Ausgeben der Videodatei erforderlich ist p> ``` #Der Name der zu analysierenden Videodatei onlyFileName = "box1911252" #Videoerweiterung+Fügen Sie mit hinzu filename = onlyFileName + ".mov" #Deklarieren Sie den Ordner mit der ausführbaren Datei foldapath = '/content/drive/My Drive/Colab Notebooks/openpose_movie/openpose/' #Kopie der Datei shutil.copy(foldapath + filename, "output.mp4") #Deklarieren Sie den Speicherort der zu analysierenden Videodatei filepath = '/content/drive/My Drive/Colab Notebooks/openpose_movie/openpose/'+filename #Pfad zum Speichern des Bildes des ausgeschnittenen Videos basierend auf den Tondaten filepath = foldapath + filename savepath = foldapath + '/resultSound/'+onlyFileName ```
Audiodatei aus Videodatei ausschneiden p> ``` #Video-Audio-Konvertierung !ffmpeg -i output.mp4 output.mp3 #Deklarieren Sie den Pfad der Audiodatei filepathSound = './output.mp3' #Sounddaten in Sound einfügen sound = AudioSegment.from_file(filepathSound, "mp3") ```
Liefert die Anzahl der Frames im Video p>
Um das Punch-Timing in den Sounddaten zu erkennen, muss der Sound mit dem entsprechenden Frame verknüpft werden. Die Anzahl der Tondaten und die Anzahl der Bilder sind jedoch auch im selben Video nicht gleich. Bei einem Video von etwa 2 Minuten beträgt die Anzahl der Audiodaten beispielsweise 3480575, die Anzahl der Frames jedoch 2368. Um die Tondaten durch die Anzahl der Bilder zu teilen und den diesem Bild entsprechenden Ton zu extrahieren, ist es daher erforderlich, die Anzahl der Bilder zu diesem Zeitpunkt zu erfassen. p> ``` import cv2 import os def save_all_frames(video_path, dir_path, ext='jpg'): cap = cv2.VideoCapture(video_path) if not cap.isOpened(): return os.makedirs(dir_path, exist_ok=True) digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))) n = 0 print(digit) while True: ret, frame = cap.read() if ret : #cv2.imwrite('{}_{}.{}'.format(base_path, str(n).zfill(digit), ext), frame) n += 1 else: print(n) frameLength = n return frameLength frameLength = save_all_frames(filepath, 'sample_video_img') ```
Ausgabe der Schalldatenwellenform p>
Geben Sie die hier gesammelte Schalldatenwellenform aus, überprüfen Sie sie und bestimmen Sie dann die Hyperparameter. Ich hatte Angst, es zu automatisieren, aber ich entschied mich, es visuell zu überprüfen und die Parameter festzulegen, um ihm mehr Freiheit zu geben. p>
Geben Sie zuerst die Wellenform mit dem folgenden Code aus p> ``` ## Input import numpy as np import matplotlib.pyplot as plt import pandas as pd samples = np.array(sound.get_array_of_samples()) sample = samples[::sound.channels] plt.plot(sample) plt.show() df = pd.DataFrame(sample) print(df) max_span = [] #frameLength enthält die Gesamtzahl der Frames des Videos, die in der vorherigen Zelle erkannt wurden len_frame = frameLength span = len_frame for i in range(span): max_span.append(df[int(len(df)/span)*i:int(len(df)/span)*(i+1)-1][0].max()) df_max = pd.DataFrame(max_span) ```
Sie können die Wellenform wie folgt sehen p>
Diese Wellenform wird zum Zeitpunkt des Stanzens vorübergehend vergrößert. Da der teilweise erhöhte Wert etwa 10000 Hz oder mehr beträgt, wird dies als Hyperparameter verwendet. Stellen Sie den Hyper-Parameter mit dem folgenden Code ein und speichern Sie das Timing darüber hinaus im Array, indem Sie ihn der Frame-Nummer zuordnen. p>
#df_max ist die Lautstärke des Klangs, wenn er in gleiche Teile geteilt wird, die später verwendet werden
print(df_max)
punchCount = []
soundSize = 10000
for i in range(len(df_max)):
if df_max.iat[i, 0] > soundSize: #Hyperparameter
#print(i,df_max.iat[i, 0])
punchCount.append([i,df_max.iat[i, 0]])
df_punchCount = pd.DataFrame(punchCount)
print(df_punchCount)
Basierend auf der obigen Verarbeitung wird der Stanzzeitpunkt als Bewegtbild ausgegeben. p> ``` #Speichern Sie den Frame, wenn das angegebene Volume oder höher erkannt wird import cv2 import os
def save_all_frames(video_path, dir_path, basename, ext='jpg'): cap = cv2.VideoCapture(video_path)
if not cap.isOpened(): return
os.makedirs(dir_path, exist_ok=True) base_path = os.path.join(dir_path, basename)
digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))) frame = []
n = 0 #Vermeiden Sie es, laute Geräusche hintereinander zu erkennen slipCount = 0
#Speichern Sie den Pfad der ausgegebenen Videodatei fourcc = cv2.VideoWriter_fourcc('m','p','4','v') video = cv2.VideoWriter('/content/drive/My Drive/data/movies/'+onlyFileName+'.mp4', fourcc, 20.0, (960, 540)) #Speichern Sie den Pfad der Videodatei zur Analyse videoAnalize = cv2.VideoWriter('/content/drive/My Drive/data/movies/'+onlyFileName+'Analize.mp4', fourcc, 20.0, (960, 540)) #Geben Sie an, wie viele Frames im Video ausgegeben werden sollen numFrames=10
#while True: for i in range(frameLength): ret, a_frame = cap.read() if ret : n += 1 #Löschen, damit der Speicher nicht zu stark vergrößert wird if n > 15: frame[n-15] = [] #Nicht erforderlich, da mehrere Ausgänge nicht möglich sind frame.append(a_frame) if n < len(df_max) and df_max.iat[n,0] > soundSize and slipCount==0: slipCount = 12 pre_name = "box"+str(n)+"-" cv2.imwrite('{}{}.{}'.format(base_path,pre_name+str(n-10).zfill(digit), ext), frame[n-10]) cv2.imwrite('{}{}.{}'.format(base_path,pre_name+str(n-2).zfill(digit), ext), frame[n-2]) #Ich erhalte eine Fehlermeldung, weil n die Länge des Arrays ist for m in range(numFrames): img = frame[n+m-numFrames] img = cv2.resize(img, (960,540)) print(img) video.write(img) if m == 0 or m>6: videoAnalize.write(img) elif slipCount > 0: slipCount -= 1 else: video.release() print(n) return
save_all_frames(filepath, savepath, 'samplePunch_img')
<p>
Mit den oben genannten Informationen konnten wir ein Video erstellen, das das Punch-Timing extrahierte.
Die generierten Videos finden Sie unter Mein Laufwerk / Daten / Filme.
Colab erstellt keine Ordner. Wenn Sie also keinen haben, müssen Sie selbst einen erstellen. </ p>
<h2> Analyse mit Openpose </ h2>
<p> Grundsätzlich verwenden wir hier die Videoanalysemethode. Da die Details in dieser URL geschrieben sind, wird nur der Ausführungsbefehl beschrieben. </ p>
<a>https://colab.research.google.com/drive/1VO4TGJHKXnRKgiSAsNEeQcEHRgzUFFv9</a>
!git clone --recursive https://github.com/hamataro0710/kempo_motion_analysis
cd /content/kempo_motion_analysis
!git pull --tags !git checkout refs/tags/track_v1.0
!bash start.sh
!python estimate_video.py --path='/content/drive/My Drive/data/' --video={onlyFileName}"Analize.mp4"
<p> Damit ist die Analyse des OpenPose-Videos abgeschlossen. Sie können das Video über den unten stehenden Link überprüfen. </ p>
<a>https://www.youtube.com/embed/BUIfu-QD8x8</a>
<h2> Ergebnis </ h2>
<p> Abhängig vom Wert des Hyperparameters und der Anzahl der extrahierten Frames hat sich die Ausführungszeit von 10 Stunden auf 1 Stunde auf 30 Minuten geändert. </ p>
<h2> Herausforderungen </ h2>
<p> Auf diese Weise können Sie die Koordinaten jedes Körperteils in chronologischer Reihenfolge abrufen.
Wenn jedoch mehrere Personen angezeigt werden, besteht das Problem, dass nicht bekannt ist, wer mit welchen Daten verknüpft ist. Daher ist es erforderlich, mit YOLO oder dergleichen ein Urteil zu fällen. </ p>
<h2> Extra Edition </ h2>
<p> Da jedoch eine Person normal analysieren kann, haben wir diese Methode verwendet, um die Schlagform des Boxens zu analysieren. </ p>
<p> Bei einem guten Schlag im Boxen sind die Ellbogen beim Treffer vollständig gestreckt. Daher habe ich Openpose verwendet, um zu analysieren, was der Schlag im Moment des Boxschlags ausgestreckt war und was nicht, und um Fotos zu machen und sie zu vergleichen. </ p>
<p> Ein Beispiel für einen Schlag, bei dem der Arm nicht vollständig ausgestreckt ist </ p>
![fullsizeoutput_2243.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/2843a471-530e-29b7-3018-734e360e937d.jpeg)
<p> Beispiel für einen Schlag mit vollen Armen </ p>
![fullsizeoutput_224e.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/ddd3f991-f7da-6794-d4dd-e4635112e9a1.jpeg)
<p> Beim Vergleich der obigen Beispiele hat der Schlag mit vollständig ausgestreckten Armen horizontale Schultern und eine gerade Linie von beiden Schultern zu den Händen. Wenn andererseits der Schlag nicht vollständig ausgefahren ist, wird eine Schulter angehoben und die Linie von der Schulter zur Anstrengung ist nicht gerade. Aus diesem Grund wird angenommen, dass Sie in der Lage sein werden, einen guten Schlag zu erzielen, wenn Sie sich bewusst sind, dass Sie Ihre Schultern drehen, anstatt Ihre Hände auszustrecken. </ p>
<p> In Zukunft möchte ich die Daten erhöhen und den Korrelationskoeffizienten berechnen, um die Hypothese zu bestätigen, und die Daten mit verschiedenen Methoden analysieren. </ p>
<h2> Endlich </ h2>
<p> Es tut mir leid für den ganzen verdammten Code m (_ _) m </ p>
Recommended Posts