Ceci est une ancienne révision du document !
Table des matières
Darknet Letters
De l'Intelligence Artificielle pour reconnaître des lettres dans différentes polices, convertir les lettres d'un texte en musique midi.
YOLO Darknet V3
Conclusion des différents apprentissages
- 380 objets
- Images de 416×416
- 5.5 jours d'apprentissage
- Ne pas mettre de fond noir
- Les zones de définitions des objets dans les images doivent être un peu large
- Mettre un peu de flou dans les images
Hardware
- GPU Nvidia 1060 GTX
- RAM de 16 Go
- RAM GPU de 6 Go
- SWAP de 64 Go sur SSD
Les sources sur GitHub
Le jeu letters pour créer les images d'apprentissage
Conversion d'un fichier *.midi en *.json
Le fichier python darknet-letters/letters/midi/analyse_play_midi.py permet de:
- jouer un fichier midi
- convertir des fichier *.midi en *.json
- jouer un fichier *.json
Principe de la conversion d'un fichier midi en json
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”.
Message d'erreur
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!
Installation
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
Modification de la configuration
Règles générales
- Ne pas bidouiller les scripts, à moins que vous ne soyez hollandais.
- Si il y a un bug, corriger dans les scripts, toujours de façon explicite, et envoyer un message à l'auteur.
- Les modifications de configuration se font dans ./letters/letters.ini
Dans ce fichier, définir en particulier:
- les chemins de /shot/ et /shot_jpg/
- le nombre d'images à créer: 20000
- la taille des images: 416
Le jeu letters
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
Création du set d'images pour l'apprentissage
Création des images
- Création des images avec l'option 3.
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
Préparation de Darknet
Conversion
Tous les shot doivent être floutés et converti en jpg avec le script ./letters/darknet/blur_and_convert.py
Création des fichiers train.txt et test.txt
Avec le script ./letters/darknet/create_train_test_txt.py
Controle des fichiers txt de chaque image
Yolo V3 Darknet
Ressources
- Recherche sur ressources universitaires avec Google scholar.
Installation de CUDA
Compilation de Darknet
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
Détection de mes objets lettres
Dossier data
Dans les sources de YOLO Darknet:
- Renommer le dossier data des sources de darknet en data_tata_yoyo.
- Créer un dossier data avec:
- train.txt
- test.txt
- obj.data
- obj.names
- yolov3.cfg
- le dossier /backup
Fichier *.cfg
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
train.txt test.txt
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 ... ...
obj.names
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
obj.data
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
Apprentissage soit Training appelé train
Non! pas de locomotive à vapeur ici !
Hardware
RAM et SWAP
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:
- RAM: 15.5 Go sur 15.7 Go
- SWAP: 19.7 Go sur 64 Go
Prévoir une grosse SWAP, par exemple 64 Go !
Taille de la RAM GPU
- RAM GPU > 4.5 Go
La taille maxi des images possible est 416×416 avec 6 Go de Ram GPU
Apprentissage avec yolov3.cfg
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.
Modifications suite à apprentissage finissant sur une erreur
- Test avec yolov3-tiny.cfg
- Test avec yolov3_5l.cfg
- Test avec yolov3-tiny_3l.cfg
- Grosse erreur perso: dans shot_xxx.txt de l'image shot_xxx.png: non de l'objet au lieu du numéro de l'objet !
- fond noir
- fond noir remplacé par un nuage gris
- nuage gris remplacé par une video de ciel !
- Message dans le terminal: “Processus arrêté.” Achat de DDR3 1600 mHz 16 Go pour remplacer les 4 Go existants.
- Diminution des superpositions avec size de 0.6 à 0.9
- Images avec minuscules seules et images avec majuscules seules pour diminuer le nombre de lettres dans l'image et donc les superpositions.
- Reprise des 400 images des lettres pour les cadrer serrées (20 heures de boulot) !
- Ne pas déclarer des objets qui ne sont jamais dans les images !
- SWAP de 64 Go au lieu de 8 Go
Essai 02
- fond video
- flou de 3 à 7
- letters_scale = 1.09
- 30 000 images
- 90 000 itérations
- Shadeless pas de variation de couleurs et éclairage
Pas mal mais trop de lettres ne sont pas reconnues, et certaines avec 2 reconnaissances. La musique résultante est reconnaissable. C'est le meilleurs résultat des essais 02 à 06
Essai 03
- fond noir
- pas de flou
- taille 416
- 50 000 images
- vérification du nombre de lettres: objectif 2000 par lettres, réel 1948
- changement du json utilisé par créer les shot: minuscules et majuscules séparées et pas de séparation des polices avec des canaux vides.
- yolo_v3.cfg
- letters_scale = 1.01
- plage_x = 4.5
- plage_y = 4.5
- size_min = 0.6
- size_max = 0.9
- variation de couleurs et éclairage avec un Sun
- début 25/09/2019 à 10h, fin 01/10/2019 à 6h55
- 50 000 itérations
Essai 04
- Idem Essai 03 mais fond video
- Relance de 50 000 itérations supplémentaires.
Reconnaissance médiocre ! La musique résultante n'est pas reconnaissable.
Essai 05
yolov3-tiny_3l.cfg
For training for both small and large objects use modified models:
- Tiny-model: 3 yolo layers: https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3-tiny_3l.cfg
Essai 06
Le fichier tiny.cfg est paramétré pour 80 objets, et la doc dit qu'il est bien optimisé: Je cite pjreddie.com It's only 28 MB but more importantly, it's only 8×1010 floating point operations. The original Alexnet is 2.3*1012. Darknet is 2.9 times faster and it's small and it's 4% more accurate.
Même image que Essai 05, mais avec yolov3-tiny_06.cfg du Sémaphore, adapté pour 380 objets et images de 416×416.
Le fichier yolov3-tiny_06_best.weights fait 40,1 Mo, l'apprentissage est 2 fois plus rapide que yolov3.cfg, soit 2.7 jours
La reconnaissance est très décevante, le FPS sur HD5000 est de 1.8 au lieu de 0.4, mais trop de lettres ne sont pas reconnues.
L'analyse des % de reconnaissance calculés à la fin de l'apprentissage, montre que ce sont les lettres avec la couleur gris clair qui sont les plus mal reconnues.
Essai 07
- size_min = 0.9
- size_max = 1.2
- shot_size = 416
- blur_mini = 3
- blur_maxi = 7
- letters_scale = 1.07
- sun_energy_min = 3
- sun_energy_min = 4
- sun_color_min = 0.6
- sun_color_max = 1.0
- police 0 en blanc au lieu de gris clair
- les lettres sont plus grandes
- le sun plus fort
Efficacité
name font_0_i 85.00 name font_0_l 85.79 name font_2_j 87.91 name font_2_q 89.78 name font_2_o 90.16 name font_2_g 90.20 name font_0_n 90.22 name font_1_I 90.57 name font_1_J 91.31 name font_2_I 91.33 name font_0_e 91.56
Certaines lettres se ressemblent beaucoup et sont mal reconnues.
Essai 08
Suppression des majuscules: le volume sera défini à 127 pour toutes les notes, il ne reste plus que 190 objets ! 10 polices avec les lettres de b à t.
- Moins de lettres par shot en corrigeant le script json_get_shot.py
- Taille des lettres plus grandes
- 38 000 images avec 10 lettres par image, les 10 b, 10 c, … 10 B, ..10 T
- 30 000 itérations
- fond = “video”
- shot_size = 416
- plage_x = 4.5
- plage_y = 4.5
- size_min = 1.0
- size_max = 1.4
- blur_mini = 0
- blur_maxi = 6
- letters_scale = 1.07
- sun_energy_min = 3
- sun_energy_max = 4
- sun_color_min = 0.8
- sun_color_max = 1.0
Reconversion d'images en musique
Test sur le jeu d'image de json_to_image
Et le script play_letters.py du dossier play_letters. Il faut copier les fichiers:
- darknet.py
- libdarknet.so
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.
Quel fond d'image utiliser ?
Durée d'un calcul et consommation électrique avec yolov3.cfg
- 50000 itérations de 50 000 images de 416×416 = 6 jours * 24 * 0.2 kW = kwh à 0.17 € le kWh soit 5 €
Quels matériels pour un apprentissage rapide ?
- Quel serait le coût sur un Pentaflops ?
- Et si La Labomedia achète un Pentaflops ?
- timdettmers.com Which GPU(s) to Get for Deep Learning
- www.quora.com avec un graphique qui teste alexnet (yolo ?) conseille une GTX 1080 Ti à 750€ (en fin de série) ou une RTX 2080 Ti 11GB à 1100€.
- timdettmers.com A Full Hardware Guide to Deep Learning. La carte mère et le CPU peuvent être très modeste !
- lambdalabs.com Deep Learning GPU Benchmarks - Tesla V100 vs RTX 2080 Ti vs GTX 1080 Ti vs Titan V
- slavv.com/ Picking a GPU for Deep Learning
- hackernoon.com How to create your own deep learning rig: A complete hardware guide
Remise spéciale Education
- NVIDIA TITAN RTX 20% de remise sur 2720€ soit €2,159.20
Benchmark
Bilan
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 !
Morale du jour
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.”