Bonsoir,
Dans le cadre d'un mini-projet scientifique (TIPE pour CPGE), je me suis intéressé aux différentes méthodes de reconnaissance musicale comme Shazam. J'aimerais bien "concevoir" un petit programme sur Python très modeste, avec mes quelques notions, me permettant d'illustrer l'exposé. Le principe de shazam est de constituer une empreinte audio à partir d'un fichier sonore. A partir d'un sonagramme (diagramme en "3D", temps en abscisse, fréquence en ordonnée, amplitude en couleur), shazam constitue une grille de domaine (donc chaque case de la grille contient des informations sur l'amplitude du signal sur une période donnée, sur une gamme de fréquence donnée) et dans chaque domaine, il relève le maximum d'amplitude. Il obtient ainsi un relevé de point pour chaque case de la grille et cela constitue l'empreinte audio du fichier.
Pour ma part, je compte choper un sonagramme directement à partir de Sonic Visualiser (j'ai testé, ça rend plutôt bien pour pouvoir faire des relevés http://prntscr.com/9ztvwq ) et de travailler sur Python à partir de l'image. Mon but étant de construire une grille de domaine (découpe du temps et de la fréquence) pour pouvoir relever le maximum d'intensité dans chaque domaine sachant que l'intensité est représentée une gamme de couleur. Mais pour pouvoir faire ça il faut que je puisse comparer 2 couleurs entre eux. Savez vous comment ça marche sur Python ? Comment un pixel de couleur est caractérisé ? J'imagine que chaque couleur est référencée avec un code couleur; est-ce que par exemple 2 couleurs quasiment identiques qui diffèrent très légèrement par la teinte aura des numéro de codes proches ? Comment puis-je obtenir le code couleur d'un pixel donné ?
Mais sinon, (vous allez rire) je n'arrive pas à commencer à écrire mon programme sur Python chez moi sur mon PC Windows faute d'avoir des modules nécessaires (au lycée les modules etc ..sont tous déjà installés avec des machines sous linux). Là en l'occurrence j'aurais besoin de matplotlib, mais j'ai aucune idée de comment ça marche, qu'est-ce que je dois installer, quelle version, si ma version de python est compatible avec le module etc ... Pourriez vous me conseiller une version de python qui ne me demande pas de télécharger 10 fichiers et de faire des manips fastidieuses pour un débutant comme moi ?
Merci pour votre aide.
Tu pourras te débrouiller pour lire ton image et obtenir les données RGB de chaque pixel. Donc pour comparer deux couleurs, tu peux par exemple calculer la distance entre les valeurs RGB des pixels des deux images (via la formule de la distance dans l'espace par exemple).
Matplotlib est compatible avec les dernières versions de Python 2 et 3.
Donc une fois Python installé sur ton PC depuis le site officiel, tu vas dans le dossier source, il doit y avoir un dossier "Script" et en fouillant tu trouveras "pip.exe", tu l'éxécutes avec l'invite de commande en passant "matplotlib" en argument et ça devrait l'installer tout seul, après tu pourras faire un import sans problème. Tu auras peut-être aussi besoin d'installer numpy
Le 06 février 2016 à 20:43:56 Blaff2 a écrit :
Tu pourras te débrouiller pour lire ton image et obtenir les données RGB de chaque pixel. Donc pour comparer deux couleurs, tu peux par exemple calculer la distance entre les valeurs RGB des pixels des deux images (via la formule de la distance dans l'espace par exemple).Matplotlib est compatible avec les dernières versions de Python 2 et 3.
Donc une fois Python installé sur ton PC depuis le site officiel, tu vas dans le dossier source, il doit y avoir un dossier "Script" et en fouillant tu trouveras "pip.exe", tu l'éxécutes avec l'invite de commande en passant "matplotlib" en argument et ça devrait l'installer tout seul, après tu pourras faire un import sans problème. Tu auras peut-être aussi besoin d'installer numpy
Je suis pas trop familier avec les systèmes de couleur, si ce n'est que pour le système RGB il y'a un triplet de nombres permettant de représenter une couleur à l'aide des 3 couleurs primaires. Je n'ai pas très bien saisi cette histoire de distance.
En fait en y réfléchissant de plus près, je me suis dit qu'au final pour l'échelle de l'intensité, il n'y a pas besoin d'y inclure les couleurs en soi, une échelle noir/gris/blanc devrait suffire, j'ai d'ailleurs vu qu'on pouvait configurer ça vu Sonic Visualiser. Du coup là je pars plutôt sur une comparaison de "gris" qui je pense sera bien plus simple.Existe-t-il une commande permettant d'obtenir directement le niveau de gris d'un pixel ?
Quand je lance pip.exe j'ai une fenêtre noire qui s'ouvre (ressemblant à l'invite de commande) mais qui se ferme tout de suite après.
Voilà de quoi t'aiguiller
https://laplacian.wordpress.com/2009/01/10/how-shazam-works/
http://royvanrijn.com/blog/2010/06/creating-shazam-in-java/
http://www.toptal.com/algorithms/shazam-it-music-processing-fingerprinting-and-recognition
Le 06 février 2016 à 21:11:48 RayonSpectral a écrit :
Voilà de quoi t'aiguillerhttps://laplacian.wordpress.com/2009/01/10/how-shazam-works/
http://royvanrijn.com/blog/2010/06/creating-shazam-in-java/
http://www.toptal.com/algorithms/shazam-it-music-processing-fingerprinting-and-recognition
J'avais déjà passé en revue ces articles là, mais merci beaucoup pour ton aide
Le 06 février 2016 à 21:03:03 painlnmychest a écrit :
Je suis pas trop familier avec les systèmes de couleur, si ce n'est que pour le système RGB il y'a un triplet de nombres permettant de représenter une couleur à l'aide des 3 couleurs primaires. Je n'ai pas très bien saisi cette histoire de distance.
En fait en y réfléchissant de plus près, je me suis dit qu'au final pour l'échelle de l'intensité, il n'y a pas besoin d'y inclure les couleurs en soi, une échelle noir/gris/blanc devrait suffire, j'ai d'ailleurs vu qu'on pouvait configurer ça vu Sonic Visualiser. Du coup là je pars plutôt sur une comparaison de "gris" qui je pense sera bien plus simple.Existe-t-il une commande permettant d'obtenir directement le niveau de gris d'un pixel ? Quand je lance pip.exe j'ai une fenêtre noire qui s'ouvre (ressemblant à l'invite de commande) mais qui se ferme tout de suite après.
Oui, le système RGB utilise un tripet. Tu peux donc te représenter ces trois nombres comme des coordonnées (x, y, z), donc tu peux visualiser la couleur d'un pixel comme un endroit dans l'espace. Donc pour savoir si une couleur est proche d'une autre, tu peux calculer la distance dans l'espace entre ces deux couleurs.
La formule étant sqrt((x1 - x2)² + (y1 - y2)² + (z1 - z2)²). Bien sûr, tu l'adaptes pour que les (x, y, z) soient les valeurs RGB.
Après, tu peux déterminer arbitrairement si les couleurs sont plus ou moins proche selon le résultat obtenu.
Ce n'est qu'un exemple, il y a d'autres formules que tu peux utiliser, mais c'est celle qui me paraissait la plus simple.
Après, s'il est question d'intensité, je crois que le système HSV est mieux.
Pour pip.exe écoute, fais des recherches Google il doit y en avoir à la masse des tutos pour apprendre à utiliser cette commande sous Windows
Sachant que pour éviter qu'elle se ferme tu lances cmd et après tu glisse le fichier dans la fenêtre et tu appuies sur enter, t'auras le message d'erreur / de succès sans que l'invite de commande se ferme
Mais le mieux c'est encore de se déplacer vers le fichier pip.exe à travers l'invite de commande, en utilisant cd. Et une fois que t'es dans le bon dossier tu fais "pip.exe install matplotlib"
Je passe juste pour dire que c'est intéressant votre topic
Les liens, les infos toussa toussa
J'ai finalement réussi à lancer la commande, mais y'a un message d'erreur à la fin en rouge qui dit que ça a échouer et que je devrais prendre une nouvelle version de pip.exe
Sinon je suis tombé sur un tuto pour enthought canopy, j'ai installé numpy et matplotlib, mais ça ne marche toujours pas.
Le message d'erreur sur Python : " import matplotlib.pyplot as plt
ImportError: No module named 'matplotlib.pyplot'"
Je vais tout réinstaller parce que là j'ai une dizaine de version de python, de matplotlib etc ...
Le message pour la version de pip c'est plutôt un warning qu'une réelle erreur à mon avis
Sinon tu peux aussi de récupérer les fichier wheel des bibliothèques qu t'intéressent ici : http://www.lfd.uci.edu/~gohlke/pythonlibs/#xarray
Et au lieu de faire "pip install matplotlib" tu fais "pip install le_nom_du_fichier_téléchargé.whl"
Ah c'est bon tout est réglé, j'ai réussi à installer numpy et matplotlib et tout a l'air de rouler. Bon je commence à réfléchir au codage, j'upperais ce topic quand j'aurai quelque chose à montrer
T'auras besoin de PIL aussi à mon avis pour pouvoir lire ton image
Le 06 février 2016 à 22:10:02 Blaff2 a écrit :
T'auras besoin de PIL aussi à mon avis pour pouvoir lire ton image
Je peux pas juste utiliser matplotlib pour tout faire ? Là j'ai déjà réussi à afficher mon image sur python avec matplotlib.image.
Par contre je trouve pas la commande pour renvoyer le RGB d'un pixel.
Le 06 février 2016 à 22:23:15 painlnmychest a écrit :
Le 06 février 2016 à 22:10:02 Blaff2 a écrit :
T'auras besoin de PIL aussi à mon avis pour pouvoir lire ton imageJe peux pas juste utiliser matplotlib pour tout faire ? Là j'ai déjà réussi à afficher mon image sur python avec matplotlib.image.
Par contre je trouve pas la commande pour renvoyer le RGB d'un pixel.
Effectivement tu peux utiliser ça, je connais pas bien matplotlib
La méthode matplotlib.image.imread devrait t'intéresser : http://matplotlib.org/api/image_api.html#matplotlib.image.imread
Ca retourne ton image sous forme d'un tableau de pixel.
Donc en faisaitn mon_tableau[5][3][0] tu obtiendras la valeur R du 3ème pixel de la 5ème ligne par exemple, je présume