web-dev-qa-db-fra.com

Yolo Darknet détectant uniquement une classe spécifique comme une personne, un chat, un chien, etc.

Nous utilisons YOLO Darknet pour la détection d'objets. Nous utilisons Python3, tensorflow 1.0, numpy, opencv 3. Utilisation de yolo.weight pour la détection. Comme indiqué dans le lien ci-dessous: https://github.com/thtrieu/darkflow#cameravideo-file-demo

Lorsque nous l'exécutons sur une vidéo, il détecte simultanément tous les objets, qui ne sont pas nécessaires?

Veuillez nous indiquer comment nous pouvons détecter uniquement le nom de classe spécifique à rechercher.

Merci

10
Tejas Somaiya

Si vous suivez simplement les étapes mentionnées par @JP Kim - vous obtiendrez une vidéo avec uniquement vos étiquettes, mais elle produirait également d'autres objets comme l'une de vos étiquettes.

Il y a une section spécifique du dépôt darkflow qui indique exactement quoi faire si vous souhaitez avoir une sortie différente. TLDR - vous devez recycler votre modèle. Ils le montrent en prenant un exemple de 3 classes.

Mais laissez-moi vous guider tout au long du processus. Considérons que vous avez une vidéo et que vous avez juste besoin de suivre toutes les personnes qu'elle contient. Donc, nous n'avons besoin que de suivre 1 type d'objet - "personne".

  1. Nous faisons une copie du fichier tiny-yolo-voc.cfg Dans le répertoire cfg. Suivons leur convention et nommons ceci tiny-yolo-voc-1c.cfg Où le suffixe 1c Représente le nombre de classes. La raison du choix de tiny-yolo-voc Et non d'une autre configuration car notre modèle de base est qu'il s'agit d'un réseau plus petit qui peut être formé sur des GPU plus petits. D'après ce que j'ai observé, d'autres configurations nécessitent 10 Go + de mémoire graphique et elles avaient l'habitude de faire perdre de la mémoire à ma machine.

  2. Nous apporterons les modifications requises dans le fichier tiny-yolo-voc-1c.cfg:

    • modifiez la variable classes en classes=1
    • Dans la dernière section convolutional juste avant region, nous changerons la variable filter en 5 * (num_class + 5) = 5 * (1+5) = 30. Alors, définissez filters=30
  3. Nous éditerons le fichier labels.txt Dans le répertoire source de darkflow et n'aurons qu'une seule ligne à l'intérieur qui dit person, car nous n'avons besoin que d'un type d'étiquette.

  4. Maintenant, nous devons former notre modèle. Cependant, pour la formation, nous avons d'abord besoin que le jeu de données soit là.

    • Maintenant, si votre étiquette est l'une des étiquettes existantes du jeu de données VOC ou du jeu de données CoCo, vous pouvez simplement télécharger l'un des jeux de données VOC/Coco. Dans notre cas, person est le type d'objet que nous devons suivre, et c'est déjà un type d'objet dans l'ensemble de données VOC. Nous allons donc utiliser l'ensemble de données VOC.

    • Cependant, si vous souhaitez utiliser YOLO pour classer et suivre un nouveau type d'objet, vous devez préparer votre propre jeu de données et annotations. Pour cet objet personnalisé, vous pouvez suivre la partie 5-8 de cette série de vidéos youtube . Ces vidéos présentent un exemple d'utilisation de YOLO pour suivre et classer fidget_spinner.

  5. Téléchargez le jeu de données VOC car il contient suffisamment de données et d'annotations pour notre type d'objet person

    # Download the Pascal VOC dataset:
    curl -O https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
    tar xf VOCtest_06-Nov-2007.tar
    
  6. Nous n'allons pas nous entraîner à partir de zéro. Donc, nous allons en fait charger des poids pour le modèle tiny-yolo-voc Et commencer à nouveau à partir de là, pour notre cas d'utilisation spécifique (juste la classe person). Pour cela, nous devons avoir des poids téléchargés pour tiny-yolo-voc. Vous pouvez trouver les poids ici pour YOLO v2 . Nous allons télécharger les poids pour Tiny YOLO for VOC dataset . Déplacez le fichier vers le répertoire /darkflow/bin/ Après le téléchargement.

  7. Une fois que nous l'avons téléchargé, il est nécessaire d'avoir le fichier de configuration du modèle de base et le fichier de poids portant le même nom. Comme renommer la configuration n'est pas une bonne idée, nous renommerons les poids que nous avons téléchargés de yolov2-tiny-voc.weights En tiny-yolo-voc.weights. Ceci est nécessaire car lorsque nous nous entraînons, nous avons fourni un fichier de poids et darkflow essaie de prendre le fichier de configuration correspondant comme référence pour l'apprentissage du nouveau modèle.

Ceci est également mentionné sur la page de dépôt darkflow:

Lorsque darkflow voit que vous chargez tiny-yolo-voc.weights, il recherchera tiny-yolo-voc.cfg dans votre dossier cfg/et comparera ce fichier de configuration au nouveau que vous avez défini avec --model cfg/tiny-yolo -voc-1c.cfg. Dans ce cas, chaque couche aura le même nombre exact de poids à l'exception des deux derniers, donc elle chargera les poids dans toutes les couches jusqu'aux deux derniers car ils contiennent maintenant un nombre différent de poids.

  1. Maintenant, nous pouvons former notre modèle. Vous pouvez supprimer la partie --gpu 0.9 Si vous n'avez pas de GPU pour l'entraîner.

    # Train the net on the Pascal dataset:
    flow --model cfg/tiny-yolo-voc-1c.cfg --load bin/tiny-yolo-voc.weights --train --dataset "~/VOCdevkit/VOC2007/JPEGImages" --annotation "~/VOCdevkit/VOC2007/Annotations" --gpu 0.9
    
  2. Appuyez sur Ctrl + C pour mettre fin à l'entraînement lorsque vous pensez que la perte ne diminue plus. Habituellement, une bonne perte/perte moyenne est de 1 ou inférieure à 1.

Vous auriez remarqué qu'après toutes les 250 étapes, darkflow continuera à enregistrer les points de contrôle dans le répertoire ckpt/. Une fois que vous avez arrêté la formation, vous pouvez utiliser l'un de ces points de contrôle pour tester votre modèle.

  1. Nous allons l'exécuter sur une vidéo de personnes et la laisser enregistrer une nouvelle vidéo avec des prédictions de boîte englobante. Utilisons le point de contrôle de la 1500e étape pour cet exemple.

    flow --model cfg/tiny-yolo-voc-1c.cfg --load 1500 --demo video-input.mp4 --gpu 0.9 --saveVideo
    

Lorsque vous l'exécutez, cela affichera le FPS auquel le modèle est capable de travailler avec votre vidéo. Cela peut varier en fonction de votre machine. Selon le FPS et la durée de la vidéo, cela peut prendre un certain temps. Une fois le processus terminé, vous aurez un video.avi Créé dans le répertoire darkflow/.

Cela ne devrait avoir que des objets de type person détectés dans la vidéo.

Si la sortie n'est pas excellente, vous pouvez entraîner davantage votre modèle et/ou varier les seuils ou d'autres paramètres pour obtenir de meilleures sorties.

J'espère que cela t'aides.

15
Bhavul

D'après ce que j'ai trouvé, vous pouvez le faire comme suit:

  1. copiez votre fichier cfg yolo d'origine dans le nouveau fichier et modifiez la valeur des classes de la section [region] en fonction du nombre de classes que vous souhaitez détecter.
  2. créer un fichier texte d'étiquette et mettre le nom de classe que vous souhaitez détecter (sous-ensemble de classes d'origine)

puis,

flow --model cfg/your_new_copied_file.cfg --load path/to/weight_file --demo your_video.mp4 --labels your_labels.txt --saveVideo

C'est tout.

Mais le problème est que la précision globale de détection diminue considérablement. Souvent, il détecte des objets totalement différents des objets dans les étiquettes. (peut-être que darkflow choisit simplement la meilleure estimation parmi les étiquettes si elle est supérieure au seuil?)

Donc, si vous voulez détecter seulement certains objets parmi d'autres classes tout en sautant d'autres objets (c'est-à-dire les reconnaître mais en sautant), je pense qu'il est préférable de modifier les sources darkflow pour accepter des paramètres supplémentaires (comme --mark marklabels.txt).

5
JP Kim