[PYTHON] Verkürzung der Analysezeit von Openpose mithilfe von Sound

Verkürzung der Analysezeit von Openpose mit Sound

Openpose, die die Haltung einer Person analysiert und diese Analysezeit mithilfe von Ton verkürzt. Ich möchte das Boxformular mit dieser Methode analysieren. ![rectangle_large_type_2_80d40cc7b53e4caa6a994dfebfa93937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/11f2db75-fd5f-ef58-8b08-425214a7ce7b.png)

Ausführungsumgebung

Maschine: GoogoleColab

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

Aktuelle Probleme

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.

Lösung

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.

Ich werde die Fortsetzung mit dem Quellcode erklären.

Googole Drive Mount

Sie können die Daten auf Drive von Google Colab mit dem folgenden Code zitieren. ``` from google.colab import drive drive.mount('/content/drive') ```

Audiodatei aus Video generieren

Erforderliche Bibliotheken importieren ``` import shutil !pip3 install pydub from pydub import AudioSegment ```

Deklarieren Sie den Pfad, der zum Lesen und Ausgeben der Videodatei erforderlich ist ``` #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 ``` #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

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. ``` 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

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.

Geben Sie zuerst die Wellenform mit dem folgenden Code aus ``` ## 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

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.

#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)

Generiertes extrahiertes Video

Basierend auf der obigen Verarbeitung wird der Stanzzeitpunkt als Bewegtbild ausgegeben. ``` #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

Verkürzung der Analysezeit von Openpose mithilfe von Sound
Zeitvariationsanalyse von Schwarzen Löchern mit Python
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 2
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 1
Erläuterung des Konzepts der Regressionsanalyse mit Python Extra 1
Analyse der Lebensdauer der Technologie mit Qiita-Artikeldaten ~ Überlebenszeitanalyse mithilfe des Inhaltsprotokolls ~
Verarbeiten Sie das Ergebnis von% time,% timeit
Empfehlung zur Datenanalyse mit MessagePack
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
Zeigen Sie das Ergebnis der Videoanalyse mit der Cloud Video Intelligence API von Colaboratory an.
Veranschaulichen Sie sofort die vorherrschende Periode in Zeitreihendaten mithilfe der Spektralanalyse
Versuchen Sie die Clusteranalyse mit K-Mitteln
Zeitreihenanalyse 4 Konstruktion des SARIMA-Modells
Da die Extraktion von Synonymen mit Word2Vec gut verlief, habe ich versucht, die Analyse zusammenzufassen
Eine Einführung in die Datenanalyse mit Python - Um die Anzahl der Videoansichten zu erhöhen -
Vorhersage der Zukunft der Bevölkerungsentwicklung in Numazu City durch Zeitreihen-Regressionsanalyse mit Prophet
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Abschätzung der Wirkung von Maßnahmen anhand von Neigungswerten
Überprüfen Sie den Typ der von Ihnen verwendeten Variablen
Exklusive Veröffentlichung der Django App mit ngrok
Versuchen Sie es mit Jieba, einer chinesischen morphologischen Analyse-Engine
Lesen Sie die Ausgabe von subprocess.Popen in Echtzeit
Versuchen Sie es vorerst mit LINE Notify
Lassen Sie den Summer mit Python auf Raspberry Pi 3 erklingen!
Versuchen Sie es mit dem Sammlungsmodul (ChainMap) von python3
Zum Zeitpunkt des Python-Updates mit Ubuntu
Bestimmen Sie die Anzahl der Klassen mithilfe der Starges-Formel
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Überprüfen Sie den Status der Daten mit pandas_profiling
Scraping der Gewinndaten von Zahlen mit Docker
Zeitmessung
Berechnung der kürzesten Route nach der Monte-Carlo-Methode
[Python] [Word] [python-docx] Einfache Analyse von Diff-Daten mit Python
Schneiden Sie einen Teil der Zeichenfolge mit einem Python-Slice aus
Big-Data-Analyse mit dem Datenflusskontroll-Framework Luigi
Mathematisches Verständnis der Hauptkomponentenanalyse von Anfang an
Berechnen Sie den Regressionskoeffizienten der einfachen Regressionsanalyse mit Python
Zeichnen auf Jupyter mit der Plot-Funktion von Pandas
Der Schmerz von gRPC mit Python. November 2019. (Persönliches Memo)
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Lassen Sie uns die Emotionen von Tweet mit Chainer (2.) analysieren.
Studie aus Python Hour8: Verwenden von Paketen
Lassen Sie uns die Emotionen von Tweet mit Chainer (1.) analysieren.
Die Geschichte der Verwendung von Circleci zum Bau vieler Linux-Räder
Skript zum Ändern der Klanglänge mit REAPER
Was Sie bei der Zeitreihendatenanalyse (einschließlich Reflexion) nicht tun sollten