C'est le 18e jour du Calendrier de l'Avent ABEJA 2019.
C'est imais qui a rejoint ABEJA en octobre de cette année. Dans mon travail quotidien, l'équipe de développement ABEJA Insight for Retail est en charge de développer une analyse des lignes de flux qui analyse le mouvement des clients dans le magasin. ..
Dans cet article, OpenPose, qui estime la posture à partir d'images bidimensionnelles, et [ChucK](https: // chuck), qui est un langage de programmation pour la musique, Présentation de l'aperçu du système et du contenu de développement d'un simple lecteur de musique interactif créé en combinant .cs.princeton.edu /).
** "Lorsqu'un humain applaudit, les morceaux de musique sont ajoutés un par un" ** Construisez le système suivant sur MacBook Pro.
Le système fonctionne selon les étapes suivantes.
Cette fois, j'ai décidé de développer une application de contrôle en modifiant tf-pose-estimation, qui est la version TensorFlow de l'implémentation de l'application OpenPose par M. ildoonet. Fait.
Suivez le tutoriel de mdo4nt6n [TensorFlow version] OpenPose (compatible avec osx Mojave) sur MacBook pour construire l'environnement d'exploitation pour tf-pose-estimation.
Seul TensorFlow ne fonctionnait pas bien lorsque la dernière version a été installée, donc cette fois j'ai installé l'ancienne version comme suit.
$ pip install tensorflow=1.14
Comme vous pouvez le voir dans l'article du didacticiel ci-dessus, utilisez la commande suivante pour vérifier que l'estimation de la posture d'OpenPose fonctionne en temps réel sur la caméra intégrée du MacBook.
$ python run_webcam.py --model=mobilenet_thin --resize=432x368 --camera=0
ChucK
Téléchargez le programme d'installation pour Mac OS X à partir de ChucK et installez la dernière version v1.4.0.
Jack Installez le package fourni par Homebrew avec la commande suivante.
$ brew install jack
Commencez par démarrer Jack sur un terminal comme suit.
$ jackd -d coreaudio
Après avoir confirmé que Jack a démarré, sur un autre terminal, à partir des exemples inclus dans code source ChucK , Sélectionnez un fichier et lisez la musique.
$ chuck examples/rhodey.ck
Si la musique joue, vous avez du succès!
Dans run_webcam.py, qui est une application de démonstration pour estimer la posture de la caméra intégrée de MacBook incluse dans tf-pose-estimation. Ajoutez le code suivant.
if 0 < len(humans) and hand_clapped(humans[0]) and \
HAND_CLAPPING_MASK_DURATION_SEC < (time.time() - time_hand_clapped):
time_hand_clapped = time.time()
osc.send_message('/sndbuf/beats', [1])
Ce que vous faites est simple: si plus d'une personne est détectée, vérifiez avec hand_clapped
pour voir si la première personne applaudit, et si des applaudissements sont détectés, commandez ChucK (contrôlez simplement le timing) Donc j'envoie juste le numéro 1). ChucK prend en charge l'envoi et la réception de données via Open Sound Control (OSC), qui ci-dessus envoie des commandes via le canal / sndbuf / beats
de l'OSC.
Pour éviter que les commandes ne soient envoyées de manière trop continue, une fois les commandes envoyées, les commandes ne sont pas envoyées même si des applaudissements sont détectés pendant seulement HAND_CLAPPING_MASK_DURATION_SEC
secondes.
Le «hand_clapped» qui détecte les applaudissements est le suivant.
def hand_clapped(human):
parts = [part for idx, part in human.body_parts.items() if part.score > THRESHOLD_PART_CONFIDENCE]
is_rwrist, part_rwrist = include_part(parts, RWrist)
is_lwrist, part_lwrist = include_part(parts, LWrist)
if is_rwrist and is_lwrist:
dist = math.sqrt((part_rwrist.x - part_lwrist.x)**2 + (part_rwrist.y - part_lwrist.y)**2)
if dist < THRESHOLD_HAND_CLAPPING_DISTANCE:
return True
return False
C'est aussi très simple, il calcule la distance entre le poignet droit (part_rwrist
) et le poignet gauche ( part_lwrist
), et s'il est inférieur au seuil THRESHOLD_HAND_CLAPPING_DISTANCE
, il le détecte comme un applaudissement.
Donc, en réalité, tout ce que vous avez à faire est de rapprocher vos mains droite et gauche, mais tapoter dans vos mains se sent mieux et se sent mieux ☺️.
C'est le seul côté application de contrôle!
ChucK vous permet de programmer de la musique dans un style de langage procédural comme C. Le code ci-dessous ajoute les morceaux de musique précédemment stockés en «battements» à chaque fois qu'un message est reçu. Au fait, lorsque j'ai fini d'ajouter toutes les pistes, j'essaie d'arrêter les pistes de musique une par une dans l'ordre inverse de l'ajout.
while (true) {
// wait for event to arrive
oe => now;
// grab the next message from the queue.
float msg;
while (oe.nextMsg() != 0) {
oe.getInt() => msg;
<<< "Beats received: ", msg >>>;
if (msg != 0) {
if (flag == 1) {
Machine.add(beats[i]) => beat_refs[i];
if (i == 6) {
0 => flag;
} else {
i + 1 => i;
}
} else {
Machine.remove(beat_refs[i]);
if (i == 0) {
1 => flag;
} else {
i - 1 => i;
}
}
}
}
}
C'est embarrassant de télécharger une vidéo de la pose réelle, donc je vais coller une vidéo de démonstration du terminal où différents programmes sont en cours d'exécution et la musique terminée. En fait, un morceau de musique a été ajouté pour correspondre aux applaudissements: sueur:.
À propos, la piste musicale utilisée dans la vidéo est incluse dans les exemples de ChucK. [] (https://player.vimeo.com/video/380290288)
En combinant Chuck et OpenPose, j'ai créé un simple lecteur de musique interactif qui peut contrôler la synchronisation de lecture des morceaux de musique. Cette fois, c'est un système simple qui ajoute simplement de la musique en applaudissant des mains, mais le système réellement terminé est assez agréable et amusant. La prochaine fois, j'aimerais ajouter de l'animation, etc. pour améliorer l'interactivité!
Recommended Posts