[PYTHON] Raccourcir le temps d'analyse d'Openpose à l'aide du son

Raccourcissement du temps d'analyse d'Openpose à l'aide du son

Openpose qui analyse la posture d'une personne et raccourcit ce temps d'analyse en utilisant le son. Je voudrais analyser le formulaire de boxe en utilisant cette méthode. ![rectangle_large_type_2_80d40cc7b53e4caa6a994dfebfa93937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/11f2db75-fd5f-ef58-8b08-425214a7ce7b.png)

Environnement d'exécution

Machine: GoogoleColab

Openpose: J'utilise le code source suivant pour obtenir les points clés. Pour ce faire, nous vous recommandons de le cloner de git sur votre lecteur en utilisant les techniques décrites ici. https://colab.research.google.com/drive/1VO4TGJHKXnRKgiSAsNEeQcEHRgzUFFv9

Problèmes actuels

L'analyse de la vidéo prend du temps. J'ai essayé d'analyser une vidéo de 7 minutes avec Openpose, mais même en utilisant Google Colab, il a fallu une heure et demie pour analyser pendant 1 minute. Il faut 10 heures et demie pour tout analyser, et il doit être raccourci compte tenu de la durée d'exécution et de la consommation d'énergie.

Solution

Recréez la vidéo en extrayant uniquement les scènes dont vous souhaitez utiliser le son (au moment de frapper le punch et quand il frappe). Le temps de la vidéo ayant été raccourci, le temps d'exécution sera également raccourci en l'analysant.

Je vais expliquer la suite avec le code source.

Montage du lecteur Googole

Vous pouvez citer les données sur Drive de Google Colab avec le code ci-dessous. ``` from google.colab import drive drive.mount('/content/drive') ```

Générer un fichier audio à partir de la vidéo

Importer les bibliothèques requises ``` import shutil !pip3 install pydub from pydub import AudioSegment ```

Déclarez le chemin requis pour lire et sortir le fichier vidéo ``` #Le nom du fichier vidéo à analyser onlyFileName = "box1911252" #Extension vidéo+Ajouter avec filename = onlyFileName + ".mov" #Déclarez le dossier contenant le fichier exécutable foldapath = '/content/drive/My Drive/Colab Notebooks/openpose_movie/openpose/' #Copie du dossier shutil.copy(foldapath + filename, "output.mp4") #Déclarez l'emplacement du fichier vidéo à analyser filepath = '/content/drive/My Drive/Colab Notebooks/openpose_movie/openpose/'+filename #Chemin pour enregistrer l'image de la vidéo découpée en fonction des données sonores filepath = foldapath + filename savepath = foldapath + '/resultSound/'+onlyFileName ```

Couper le fichier audio du fichier vidéo ``` #Conversion vidéo en audio !ffmpeg -i output.mp4 output.mp3 #Déclarez le chemin du fichier son filepathSound = './output.mp3' #Mettez les données sonores dans le son sound = AudioSegment.from_file(filepathSound, "mp3") ```

Obtenir le nombre d'images dans la vidéo

Afin de détecter la synchronisation du punch dans les données sonores, il est nécessaire de lier le son à l'image correspondante. Cependant, le nombre de données audio et le nombre d'images ne sont pas les mêmes, même dans la même vidéo. Par exemple, dans le cas d'une vidéo d'environ 2 minutes, le nombre de données sonores est de 3480575 mais le nombre d'images est de 2368. Par conséquent, afin de diviser les données sonores par le nombre d'images et d'extraire le son correspondant à cette image, il est nécessaire d'acquérir le nombre d'images à ce moment. ``` 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') ```

Forme d'onde des données sonores de sortie

Sortez la forme d'onde des données audio collectées ici, vérifiez-la, puis déterminez les hyper paramètres. J'avais peur de l'automatiser, mais j'ai décidé de le vérifier visuellement et de décider des paramètres pour lui donner plus de liberté.

Tout d'abord, sortez la forme d'onde avec le code suivant ``` ## 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 contient le nombre total d'images de la vidéo détectées dans la cellule précédente 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) ```

Vous pouvez voir la forme d'onde comme ceci

Cette forme d'onde est temporairement agrandie au moment du poinçonnage. Étant donné que la valeur partiellement augmentée est d'environ 10000 Hz ou plus, elle est utilisée comme hyper paramètre. Définissez l'hyper paramètre avec le code ci-dessous et enregistrez le minutage au-delà de celui dans le tableau en l'associant au numéro d'image.

#df_max est le volume du son divisé en parties égales, qui sera utilisé plus tard
print(df_max)
punchCount = []
soundSize = 10000
for i in range(len(df_max)):
 if df_max.iat[i, 0] > soundSize:  #Hyper paramètres
   #print(i,df_max.iat[i, 0])
   punchCount.append([i,df_max.iat[i, 0]])
df_punchCount = pd.DataFrame(punchCount)
print(df_punchCount)

Générer une vidéo extraite

Sur la base du traitement ci-dessus, la synchronisation du punch est sortie sous forme d'image en mouvement. ``` #Enregistrer l'image lorsque le volume spécifié ou plus est détecté 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 #Évitez de détecter les sons forts dans une rangée slipCount = 0

#Enregistrer le chemin du fichier vidéo de sortie fourcc = cv2.VideoWriter_fourcc('m','p','4','v') video = cv2.VideoWriter('/content/drive/My Drive/data/movies/'+onlyFileName+'.mp4', fourcc, 20.0, (960, 540)) #Enregistrer le chemin du fichier vidéo pour l'analyse videoAnalize = cv2.VideoWriter('/content/drive/My Drive/data/movies/'+onlyFileName+'Analize.mp4', fourcc, 20.0, (960, 540)) #Spécifiez le nombre d'images à sortir sur la vidéo numFrames=10

#while True: for i in range(frameLength): ret, a_frame = cap.read() if ret : n += 1 #Supprimer pour que la mémoire n'augmente pas trop if n > 15: frame[n-15] = [] #Non requis car plusieurs sorties ne sont pas possibles 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]) #J'obtiens une erreur car n est la longueur du tableau 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>
 Avec ce qui précède, nous avons pu générer une vidéo qui a extrait le timing du punch.
 Les vidéos générées se trouvent dans Mon Drive / données / films.
 Colab ne crée pas de dossiers, donc si vous n'en avez pas, vous devrez en créer un vous-même. </ p>

 <h2> Analyse avec Openpose </ h2>
 <p> En gros, nous utiliserons ici la méthode d'analyse vidéo. Puisque les détails sont écrits dans cette URL, seule la commande d'exécution est décrite. </ 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> Ceci termine l'analyse de la vidéo OpenPose. Vous pouvez consulter la vidéo à partir du lien ci-dessous. </ p>

<a>https://www.youtube.com/embed/BUIfu-QD8x8</a>

 <h2> Résultat </ h2>
 <p> En fonction de la valeur de l'hyper paramètre et du nombre d'images extraites, le temps d'exécution est passé de 10 heures à 1 heure à 30 minutes. </ p>
 <h2> Défis </ h2>
 <p> En utilisant ceci, vous pouvez obtenir les coordonnées de chaque partie du corps dans l'ordre chronologique.
 Cependant, lorsque plusieurs personnes sont présentées, il y a un problème en ce qu'il n'est pas possible de savoir qui est associé à quelles données, il est donc nécessaire de porter un jugement en utilisant YOLO ou similaire. </ p>
 <h2> Édition supplémentaire </ h2>
 <p> Cependant, comme une personne peut analyser normalement, nous avons utilisé cette méthode pour analyser la forme de punch de la boxe. </ p>
 <p> Un bon coup de poing en boxe a les coudes complètement étendus lorsqu'il est touché. Par conséquent, j'ai utilisé Openpose pour analyser ce que le coup de poing était étiré au moment du coup de poing de boxe et ce qui n'était pas étiré, et j'ai pris des photos et les ai comparées. </ p>
 <p> Un exemple de coup de poing où le bras n'est pas complètement étendu </ p>
 ![fullsizeoutput_2243.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/2843a471-530e-29b7-3018-734e360e937d.jpeg)
 <p> Exemple de coup de poing à bras pleins </ p>
 ![fullsizeoutput_224e.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/ddd3f991-f7da-6794-d4dd-e4635112e9a1.jpeg)
 <p> En comparant les exemples ci-dessus, le coup de poing avec les bras complètement étendus a des épaules horizontales et une ligne droite des deux épaules aux mains. En revanche, si le coup de poing n'est pas complètement déployé, une épaule est relevée et la ligne de l'épaule à l'effort n'est pas droite. À partir de là, on pense que vous serez capable de frapper un bon coup de poing en étant conscient de tourner les épaules plutôt que de tendre les mains. </ p>
 <p> À l'avenir, j'aimerais augmenter les données et calculer le coefficient de corrélation pour confirmer l'hypothèse, et analyser les données à l'aide de différentes méthodes. </ p>
 <h2> Enfin </ h2>
 <p> Je suis désolé pour tout ce putain de code m (_ _) m </ p>













Recommended Posts

Raccourcir le temps d'analyse d'Openpose à l'aide du son
Analyse de la variation temporelle des trous noirs en utilisant Python
Explication du concept d'analyse de régression à l'aide de python Partie 2
Explication du concept d'analyse de régression à l'aide de Python Partie 1
Explication du concept d'analyse de régression à l'aide de Python Extra 1
Analyse de la vie de la technologie avec les données d'articles Qiita ~ Analyse du temps de survie à l'aide du journal de contenu ~
Traiter le résultat de% time,% timeit
Recommandation d'analyse des données à l'aide de MessagePack
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Affichez le résultat de l'analyse vidéo à l'aide de l'API Cloud Video Intelligence de Colaboratory.
Illustrez instantanément la période prédominante dans les données de séries chronologiques à l'aide de l'analyse spectrale
Essayez l'analyse de cluster par K-means
Analyse des séries chronologiques 4 Construction du modèle SARIMA
Puisque l'extraction des synonymes à l'aide de Word2Vec s'est bien déroulée, j'ai essayé de résumer l'analyse
Une introduction à l'analyse de données à l'aide de Python - Pour augmenter le nombre de vues vidéo -
Prédire l'avenir des tendances démographiques dans la ville de Numazu par analyse de régression chronologique à l'aide de Prophet
J'ai essayé l'analyse par grappes de la carte météo
Estimation de l'effet des mesures à l'aide des scores de propension
Vérifiez le type de variable que vous utilisez
Sortie exclusive de l'application Django utilisant ngrok
Essayez d'utiliser jieba, un moteur d'analyse morphologique chinois
Lire la sortie du sous-processus, ouvrir en temps réel
Essayez d'utiliser LINE Notify pour le moment
Sonnez le buzzer en utilisant python sur Raspberry Pi 3!
Essayez d'utiliser le module de collections (ChainMap) de python3
Au moment de la mise à jour de python avec ubuntu
Déterminez le nombre de classes à l'aide de la formule Starges
J'ai essayé d'utiliser le filtre d'image d'OpenCV
Vérifiez l'état des données à l'aide de pandas_profiling
Gratter les données gagnantes de Numbers à l'aide de Docker
mesure du temps
Calcul de l'itinéraire le plus court selon la méthode de Monte Carlo
[Python] [Word] [python-docx] Analyse simple des données de diff en utilisant python
Découpez une partie de la chaîne à l'aide d'une tranche Python
Analyse de Big Data à l'aide du framework de contrôle de flux de données Luigi
Compréhension mathématique de l'analyse en composantes principales depuis le début
Calculer le coefficient de régression d'une analyse de régression simple avec python
Dessinez sur Jupyter en utilisant la fonction de tracé des pandas
La douleur de gRPC en utilisant Python. Novembre 2019. (Mémo personnel)
J'ai essayé d'utiliser l'API de Sakenowa Data Project
Analysons les émotions de Tweet en utilisant Chainer (2ème)
Étude de Python Hour8: Utilisation de packages
Analysons les émotions de Tweet en utilisant Chainer (1er)
L'histoire de l'utilisation de Circleci pour construire des roues Manylinux
Script pour changer la longueur du son avec REAPER
Ce que vous ne devriez pas faire dans le processus d'analyse des données de séries chronologiques (y compris la réflexion)