Skip to content
Snippets Groups Projects
Select Git revision
  • c17655ee6d9cf36e8fda1b3bda66bccde4992e82
  • main default protected
  • V1
3 results

raven2yolo

  • Clone with SSH
  • Clone with HTTPS
  • stephane.chavin's avatar
    Stephane Chavin authored
    c17655ee
    History

    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
    
    pip install -r requirements.txt 
    

    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 or multiple} -n NAME_OF_THE_COLUMNS_THAT_CONTAIN_PATH -i {file or folder}
    • 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
    • -i file est à utiliser lorsque les noms de fichiers à traiter sont dans un .csv, tandis que -i folder est à utiliser pour traiter tous les .wav d'un dossier

    WARNING : Il est important de modifier la valeur de DURATION, OFFSET et NB_IMG_PER_REC dans le code (ligne 35, 36 et 39), la fréquence d'échantillonage des spectrogrammes est celle du fichier .wav

    folder = 'Spectrogram/'
    DURATION = 5
    OFFSET = 2
    
    if args.mode == 'multiple':
        NB_IMG_PER_REC = 10 
    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

    Demo

    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)

    WARNING : Ne pas oublier de modifier la valeur de DURATION et NB_CLASS (ligne 28 et 29)

    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} -u {unique or multiple} -c NAME_OF_THE_COLUMNS_CONTAINS_PATH
    • 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} -u {unique or multiple} -c NAME_OF_THE_COLUMNS_CONTAINS_PATH --export

    Ajouter --export permet d'exporter les spectrogrammes avec les bounding box placées par dessus

    WARNING : Le mode uniforme permet d'extraire des bounding box avec y = 0.5 et h = 0.8; En utilisant -u unique seul le début des enregistrements est traité tandis que multiple permet de traiter plusieurs spectrogrammes; la fonction -c correspond au nom de la colonne qui contient le path des fichiers

    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/

    ##CHANGE TO MAKE##
    
    path = str(args.path_to_data)
    direction = str(args.direction)
    NB_CLASS = 50 #CHOOSE THE X MOST REPRESENTED CLASSES

    Entrainement et Détection YOLO

    • Install YOLOV5
    cd yolo-dyni
    git clone https://github.com/lamipaul/yolov5
    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

    • Lancer un entrainement sur de l'audio
    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 --sound --sr X --sampleDur Y 
    • 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
    Compilation des détections

    cd ../
    python3 get_yolo_detection.py -p PATH_TO_THE_TXT -d DIRECTION_OF_THE_RESULT #PATH_TO_THE_TXT ~ yolov5/runs/detect/expX/labels

    WARNING : Il est important d'ajouter sa propre liste de classes (ligne 39)

    #put the classes here
    names = []
    • Calcul des détections en secondes
    cd ../
    python3 get_time_detection.py -p PATH_TO_THE_TXT -d DIRECTION_OF_THE_RESULT #PATH_TO_THE_TXT ~ yolov5/runs/detect/expX/labels

    WARNING : Il est important de modifier DUREE_SPECTRO et OVERLAP puis d'ajouter sa propre liste de classes (ligne 39)

    DUREE_SPECTRO = 8
    OVERLAP = 2
    
    #put the classes here
    names = []
    Conversion des détection YOLO vers LabelMe

    pip install globox
    
    globox convert yolov5/runs/detect/exp/labels/ DIRECTORY_TO_WICH_DATA_WILL_BE_STORED --format yolo --save_fmt labelme --img_folder PATH_TO_IMAGES
    • Ce script permet de convertir les .txt en .json pour les ouvrir dans LabelMe mais il ne prend pas en compte le paramètre 'imageData'. Le script get_json_file_YOLO.py permet donc de récupérer ces données et les ajouter aux fichiers .json.
    python3 get_json_file_YOLO.py -p PATH_TO_STORED_DATA -i PATH_TO_IMAGES -d DIRECTORY_TO_WICH_DATA_WILL_BE_STORED

    Contact

    Pour toute question, veuillez me contacter à l'adresse mail suivante : stephanechvn@gmail.com