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. 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)
Machine: GoogoleColab P>
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
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. p>
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. P>
Je vais expliquer la suite avec le code source. p>
Vous pouvez citer les données sur Drive de Google Colab avec le code ci-dessous. p> ``` from google.colab import drive drive.mount('/content/drive') ```
Importer les bibliothèques requises p> ``` import shutil !pip3 install pydub from pydub import AudioSegment ```
Déclarez le chemin requis pour lire et sortir le fichier vidéo p> ``` #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 p> ``` #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 p>
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. 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') ```
Forme d'onde des données sonores de sortie p>
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é. p>
Tout d'abord, sortez la forme d'onde avec le code suivant 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 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 p>
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. p>
#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)
Sur la base du traitement ci-dessus, la synchronisation du punch est sortie sous forme d'image en mouvement. p> ``` #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