YOLO-DYNI
Ce git a été créé avec comme objectif une prise en main de YOLOV5 plus facile. Il contient notamment un script permettant d'extraire les spectrogrammes de plusieurs enregistrements (get_spectrogram.py), un script nécessaire à la conversion des annotations LabelMe vers YOLO (labelme2yolo.py), un script pour convertir des annotations d'un dataframe vers YOLO (get_train_annot_YOLO.py), un script permettant de séparer le train et la validation de manière équilibré (get_train_val_YOLO.py) et un script qui permet de compiler les détections, d'un modèle entrainé, dans un dataframe (get_yolo_detection.py).
Install
git clone https://gitlab.lis-lab.fr/stephane.chavin/yolo-dyni.git
Annoter des images :
Extraction des spectrogrammes
python3 get_spectrogram.py -f NAME_OF_YOUR_FILE.csv -p PATH_TO_THE_DATA -d DIRECTION_OF_SAVED_DATA -m {unique,multiple}
- Le mode unique est utilisé lorsque les enregistrements font quelques secondes et que l'on veut qu'un seul spectrogramme par enregistrement (mode unique, DURATION = durée de l'enregistrement et NB_IMG_PER_REC = 1)
- Le mode multiple permet de découper l'enregistrements en plusieurs spectrogrammes de quelques secondes
WARNING : Il est important de modifier la valeur de DURATION, OFFSET et NB_IMG_PER_REC dans le code
folder = 'Spectrogramme/'
DURATION = 8
OFFSET = 2
NB_IMG_PER_REC = 30
LabelMe
- Installation de LabelMe
pip install labelme
- Conversion des annotations LabelMe vers YOLO
python3 labelme2yolo.py -p PATH_TO_THE_DATA -d DIRECTION_OF_THE_CONVERTED_FILES/FOLDER
WARNING : Les annotations .json et les images .jpg doivent être dans le même dossier (PATH_TO_THE_DATA/)
- Préparation à la séparation train/val
Il est important de déplacer les images .jpg dans un dossier images/all/ et que les labels .txt soient dans le dossier labels/
##go to the .jpg direction##
mkdir images #create a new folder
mkdir images/all/ #create the folder all in the new folder
mv *.jpg images/all/. #move all the images in the all folder
mv images ../. #place the folder images in the main direction
On se retrouve donc avec deux dossiers, un portant le nom images, contenant les .jpg, et un second portant le nom labels/ contenant les .txt
Créer un dataset à partir d'annotations sur un dataframe :
- Exemple de dataframe :
Path | label | annotation_initial_time | annotation_final_time | duree | min_frequency | max_frequency | avg_frequency | |
---|---|---|---|---|---|---|---|---|
0 | /nfs/NAS7/QUEBEC2/Montmagny_A/142_111_F01/2017/WAV... | btbw | 0.903 | 2.871 | 1.967 | 3263 | 6570 | 4917 |
1 | /nfs/NAS7/QUEBEC2/La_Vallee_de_la_Gatineau_F/124_86_H02/2018/WAV... | coye | 3.678 | 5.734 | 2.056 | 1852 | 6262 | 4057 |
2 | /nfs/NAS7/QUEBEC2/La_Vallee_de_la_Gatineau_F/124_86_H01/2018/WAV... | alfl | 0.238 | 0.998 | 0.76 | 1631 | 3836 | 2734 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
see : example.csv
Conversion des annotations
- Conversion des annotations (temps fréquence) au format YOLO (label x y w h)
python3 get_train_annot_YOLO.py -f PATH_TO_THE_FILE.csv -p PATH_TO_DATA -d DIRECTION_OF_THE_TXT_AND_IMG -m {uniform or personalized}
- Vérifier le bon placement des bounding box :
python3 get_train_annot_YOLO.py -f PATH_TO_THE_FILE.csv -p PATH_TO_DATA -d DIRECTION_OF_THE_TXT_AND_IMG -m {uniform or personalized} --export
Ajouter --export permet d'exporter les spectrogrammes avec les bounding box placées par dessus
Séparation train/val
python3 get_train_val_YOLO.py -r RATIO -p PATH_TO_DATA -d DIRECTION_OF_THE_RESULT
WARNING : Le script get_train_annot_YOLO.py exporte les .txt et .jpg dans deux dossiers nommés labels_X_Y/ et images_X_Y/ (X : Jour et Y : Mois). Pour faire tourner le code get_train_val_YOLO.py, il faut d'abord supprimer les 4 derniers caractères du nom de ces dossiers pour obtenir uniquement images/ et labels/
Entrainement et Détection YOLO
- install YOLOV5
cd yolo-dyni
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
Entrainement
python3 train.py --img IMG_SIZE --batch BATCH_SIZE --EPOCHS NB_EPOCHS --data DIRECTION_OF_THE_RESULT/custom_data.yaml --weights yolov5/weights/yolov5s.pt --cache
Détection
- Sauvegarde les annotations en .txt ainsi que les images avec les bounding box dessus
python3 detect.py --weights yolov5/runs/train/EXP_NB/weights/best.pt --img IMG_SIZE --conf 0.X --source PATH_TO_SPECTROGRAM_TO_DETECT --save-txt
WARNING : Il faut adapter EXP_NB, qui correspond au numéro de l'entrainement (exp1 pour le premier entrainement) --conf correspond à la confiance toléré par YOLO, c'est-à-dire à partir de quelle confiance d'une détection cette dernière est conservée, il faut donc modifier la valeur de X pour faire varier cette tolérence (minimum : 0.0, maximum : 1)
- Sauvegarde les annotations en .txt seulement avec la confiance de chaque détections
python3 detect.py --weights yolov5/runs/train/EXP_NB/weights/best.pt --img IMG_SIZE --conf 0.X --source PATH_TO_SPECTROGRAM_TO_DETECT --save-txt --nosave --save-conf