Ceci est une ancienne révision du document !
De l'Intelligence Artificielle pour reconnaître des lettres dans différentes polices, convertir les lettres d'un texte en musique midi.
Hardware
Le fichier python darknet-letters/letters/midi/analyse_play_midi.py permet de:
Les fichiers midi sont très optimisés. La conversion en json permet d'accéder en python aux instruments, notes, volumes facilement.
Les fichiers *.midi (“.midi”, “mid”, “kar”, “Mid”, “MID”) doivent être copié dans le dossier darknet-letters/letters/midi/music
Les *.json seront créés dans le dossier “json”.
Pour éviter ce message:
fluidsynth: warning: Failed to set thread to high priority fluidsynth: warning: Failed to pin the sample data to RAM; swapping is possible.
Editer:
sudo nano /etc/security/limits.conf
Ajouter:
@audio - rtprio 90 @audio - memlock unlimited
Le user doit être dans le groupe audio!
sudo pip3 install numpy sudo pip3 install opencv-python # Blender 2.79b mais pas 2.80 qui n'a plus de BGE sudo apt install blender sudo pip3 install mido sudo apt install fluidsynth
Installation de mon package perso: pymultilame
La Font midi peut être TimGM6mb.sf2 de Tim Brechbill qui est dans le dossier letters/midi/soundfont
C'est à définir dans letters.ini
Règles générales
Dans ce fichier, définir en particulier:
Dans le dossier darknet-letters, lancer
./play_letters.sh
1 - Retour au logo 2 - Lancement de letters SPACE pour changer de musique 3 - Fabrication des shot pour l'IA 4 - Conversion en json 5 - Conversion d'une musique en image H - Help R - Reset Echap - Quitter
En 2: Les fichiers du dossier /json seront jouées.
En 3: Pour l'apprentissage, le fichier json/get_shot.json sera utilisé. Il a été construit avec darknet-letters/letters/midi/json_for_get_shot.py
En 4: Les fichiers midi sont traduits en json pour être facilement utilisé en python. Malheureusement, la conversion dans le Blender Game Engine est très lente, plusieurs heures au lieu de quelques minutes avec le script analyse_play_midi.py
En 5: Crée un jeu d'images pour ensuite tester l'IA avec show_letters.py
Pour chaque image toto.png, un fichier fichier txt est créé pour décrire les objets dans l'image, avec le numéro de l'objet: voir Création du set d'apprentissage
Tous les shot doivent être floutés et converti en jpg avec le script ./letters/darknet/blur_and_convert.py
Avec le script ./letters/darknet/create_train_test_txt.py
Modification du Makefile pour une carte GTX 1060:
# ARCH= -gencode arch=compute_30,code=sm_30 \ # -gencode arch=compute_35,code=sm_35 \ # -gencode arch=compute_50,code=[sm_50,compute_50] \ # -gencode arch=compute_52,code=[sm_52,compute_52] \ # -gencode arch=compute_61,code=[sm_61,compute_61] # GTX 1080, GTX 1070, GTX 1060, GTX 1050, GTX 1030, Titan Xp, Tesla P40, Tesla P4 ARCH= -gencode arch=compute_61,code=sm_61 -gencode arch=compute_61,code=compute_61
Dans les sources de YOLO Darknet:
Copie de darknet/cfg/yolov3.cfg dans data, faire les modifications suivantes:
change line 8 and 9 to shot size = 640 change line batch to batch=64 change line subdivisions to subdivisions=64 change line max_batches to (classes*2000), soit 800 000 change line steps to 80% and 90% of max_batches, f.e. steps=640000,720000 change line classes=80 to your number of objects in each of 3 [yolo]-layers: Line 610 Line 696 Line 783 classes=380 change [filters=255] to filters=(classes + 5)x3 in the 3 [convolutional] before each [yolo] layer Line 603 Line 689 Line 776 filters = (classes + 5)x3 = (380 + 5) * 3 = 1155 Distinction main gauche main droite ligne 17 flip = 0
Les fichiers train.txt et test.txt doivent être collés dans data
exemple /chemin/absolu/darknet-letters/letters/shot_jpg/0/shot_33.jpg /chemin/absolu/darknet-letters/letters/shot_jpg/0/shot_18.jpg /chemin/absolu/darknet-letters/letters/shot_jpg/0/shot_51.jpg ... ...
Les noms doivent être dans l'ordre des numéro de classe des shot_xxx.txt
font_0_b ... ... font_9_S font_9_T
Définit les chemins des fichiers utilisés: les chemins relatifs sont comptés depuis le dossier darknet, d'où sera lancé la commande de l'apprentissage:
./darknet .....
classes = 380 train = data/train.txt valid = data/test.txt names = data/obj.names backup = data/backup
Non! pas de locomotive à vapeur ici !
Lors de l'estimation de l'efficacité, les images de test définies dans test.txt sont certainement chargées en mémoire.
Avec 10% des images en images test, soit 3000 images 416×416, les images occupent:
Prévoir une grosse SWAP, par exemple 64 Go !
La taille maxi des images possible est 416×416 avec 6 Go de Ram GPU
Dans le dossier /darknet:
./darknet detector train data/obj.data data/yolov3.cfg darknet53.conv.74 -map
Les chemins “data/…” doivent être cohérent avec obj.data, le dossier “backup” doit exister.
3 layers
./darknet partial data_09/yolov3-tiny_3l_09.cfg yolov3-tiny.weights data_09/yolov3-tiny.conv.15 15 ./darknet detector train data_09/obj.data data_09/yolov3-tiny_3l_09.cfg data_09/yolov3-tiny.conv.15 -map
Le fichier yolov3-tiny_3l_xx_best.weights fait 38.1 Mo
2 layers
./darknet partial data_12/yolov3-tiny_12.cfg yolov3-tiny.weights data_12/yolov3-tiny.conv.15 15 ./darknet detector train data_12/obj.data data_12/yolov3-tiny_12.cfg data_12/yolov3-tiny.conv.15 -map
Le fichier yolov3-tiny_12_best.weights fait Mo
Et le script play_letters.py du dossier play_letters. Il faut copier les fichiers:
des sources compilées de darknet dans le dossier play_letters.
Créer les images de json_to_image avec l'option 5 du jeu letters.
Les fichiers midi qui seront convertis en images sont ceux de /letters/midi/music/non_git/pour_ia
Définir le FPS dans letters.ini dans la section [json_to_image]
Il n'y a que 10 canaux midi au maximum possibles.
6 mois de calcul = 150 €
Je suis un chercheur compétitif, près de mes sous, pauvre, fou d'apprentissage automatique et comme Salvador Dali du chocolat Lanvin: GTX 1060 (6GB) en fin de série à 200 € + 35 € de RAM dans un ordinateur d'emprunt !
Einstein a dit:
“Deux choses sont infinies : l'Univers et la bêtise humaine.
Mais, en ce qui concerne l'Univers, je n'en ai pas encore acquis la certitude absolue.”