Outils pour utilisateurs

Outils du site


darknet_letters

Darknet Letters


Le fond noir ne convient pas, il faut une video !

  • De l'Intelligence Artificielle pour reconnaître des lettres dans différentes polices
  • Créer des images correspondant à une musique midi
  • Lecture des images par l'Intelligence Artificielle et rejouer le midi



Darknet Letters Tous les essais

darknet-letters sur Github

YOLO Darknet V3

Conclusion finale

  • Le nombre de paramètres à optimiser est important. Pour pouvoir faire beaucoup de simulation, les calculs doivent être rapide, il est nécessaire d'avoir des cartes graphiques puissantes, et chères !
  • Pour faire mieux, une GTX 1060 ne suffit pas. Il en faudrait au minimum 2, et mieux encore RTX 2080 Ti 11GB à 1100€
  • Cela permettrait de tester les modèles plus lourds et d'agrandir les images. Passer de 416×416 à 832×832 !

Conclusion des différents apprentissages

  • Suppression des majuscules pour diminuer le nombre d'ojects de 380 à 190
  • Le modèle yolov3.cfg est trop lourd, le yolov3-tiny_3l.cfg suffit
  • Images de 416×416
  • 1 à 2 jours d'apprentissage
  • Fond video pour l'apprentissage, noir pour la détection
  • Pas 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

Créer et testé sur Debian Buster 10

Le jeu Avec un fond video Avec un fond noir: la reconnaissance est très mauvaise

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

  1. Ne pas bidouiller les scripts, à moins que vous ne soyez hollandais.
  2. Si il y a un bug, corriger dans les scripts, toujours de façon explicite, et envoyer un message à l'auteur.
  3. 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 - Lancement de letters
     SPACE pour changer de musique
 2 - Fabrication des shot pour l'IA
 3 - Conversion d'une musique en image
 H - Help
 R - Reset
 Echap - Quitter

En 1: Les fichiers du dossier /json_60 seront jouées.

En 2: 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 3: Crée un jeu d'images pour ensuite tester l'IA avec play_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

Avec le script ./letters/control/control.py

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.

Apprentissage avec yolov3-tiny_3l.cfg

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

Apprentissage avec yolov3-tiny.cfg

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 38 Mo. Malheureusement, ça plante !

Tous les essais

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 ?

  • Nuages

  • Plasma

  • nuage RGB clair

  • Très foncé en RGB

Bug: Libération de la RAM GPU à la fin d'une détection

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 €

6 mois de calcul = 150 €

Quels matériels pour un apprentissage rapide ?

Remise spéciale Education

Pour une startup fortunée

Juin 2020

  • RTX 2060 (6 GB): if you want to explore deep learning in your spare time. 360€
  • RTX 2070 or 2080 (8 GB): if you are serious about deep learning, but your GPU budget is $600-800. Eight GB of VRAM can fit the majority of models.
  • RTX 2080 Ti (11 GB): if you are serious about deep learning and your GPU budget is ~$1,200. The RTX 2080 Ti is ~40% faster than the RTX 2080.
  • Titan RTX and Quadro RTX 6000 (24 GB): if you are working on SOTA models extensively, but don't have budget for the future-proofing available with the RTX 8000. 4000€
  • Quadro RTX 8000 (48 GB): you are investing in the future and might even be lucky enough to research SOTA deep learning in 2020. 5500€

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.”

darknet_letters.txt · Dernière modification : 2020/12/27 15:11 de serge