web-dev-qa-db-fra.com

Comportement étrange de l'API de détection d'objet TensorFlow

Je jouais avec le tout nouveau API de détection d'objet de TensorFlow et j'ai décidé de le former sur d'autres jeux de données disponibles au public.

Je suis tombé par hasard sur ce ensemble de données sur l’épicerie composé d’images de différentes marques de boites à cigarettes sur les rayons des supermarchés et d’un fichier texte répertoriant les boîtiers de sélection de chaque boîte à cigarettes dans chaque image. Dix marques principales ont été étiquetées dans l'ensemble de données et toutes les autres marques entrent dans la onzième catégorie "divers".

J'ai suivi leur tutorial et j'ai réussi à former le modèle sur cet ensemble de données. En raison de limitations de la puissance de traitement, j'ai utilisé seulement un tiers de l'ensemble de données et effectué un partage 70:30 pour la formation et les données de test. J'ai utilisé le modèle plus rapide_rcnn_resnet101. Tous les paramètres de mon fichier de configuration sont les mêmes que les paramètres par défaut fournis par TF.

Après 16491 étapes globales, j'ai testé le modèle sur certaines images mais je ne suis pas trop satisfait des résultats -

  Échec de la détection des chameaux dans l'étagère supérieure, mais détection du produit dans d'autres images.

  Pourquoi ne parvient-il pas à détecter le Marlboros dans la rangée supérieure?

  Un autre problème que j’ai eu, c’est que le modèle n’a jamais détecté d’autre étiquette que celle de l’étiquette 1.

 

Ne détecte pas d'instance de recadrage du produit à partir des données d'apprentissage

 

Il détecte les boîtes de cigarettes avec une confiance de 99%, même dans les images négatives!

Quelqu'un peut-il m'aider avec ce qui ne va pas? Que puis-je faire pour améliorer la précision? Et pourquoi détecte-t-il que tous les produits appartiennent à la catégorie 1 alors que j'ai déjà mentionné qu'il y avait 11 classes au total?

Edit Ajout de ma carte d'étiquettes:

item {
  id: 1
  name: '1'
}

item {
  id: 2
  name: '2'
}

item {
  id: 3
  name: '3'
}

item {
  id: 4
  name: '4'
}

item {
  id: 5
  name: '5'
}

item {
  id: 6
  name: '6'
}

item {
  id: 7
  name: '7'
}

item {
  id: 8
  name: '8'
}

item {
  id: 9
  name: '9'
}

item {
  id: 10
  name: '10'
}

item {
  id: 11
  name: '11'
}
17
Banach Tarski

Donc, je pense avoir compris ce qui se passait. J'ai analysé le jeu de données et découvert qu'il était biaisé par rapport aux objets de la catégorie 1.

Ceci est la distribution de fréquence de chaque catégorie de 1 à 11 (en indexant sur 0)

0 10440
1 304
2 998
3 67
4 412
5 114
6 190
7 311
8 195
9 78
10 75

J'imagine que le modèle atteint des minima locaux où il est suffisant de tout étiqueter en tant que catégorie 1.

À propos du problème de ne pas détecter certaines boîtes: j'ai essayé à nouveau de m'entraîner, mais cette fois, je n'ai pas différencié les marques. Au lieu de cela, j'ai essayé d'enseigner au modèle ce qu'est une boîte à cigarettes. Il ne détectait toujours pas toutes les boîtes.

Ensuite, j'ai décidé de rogner l'image d'entrée et de la fournir en tant qu'entrée. Juste pour voir si les résultats s'améliorent et ça s'est fait!

Il s'avère que les dimensions de l'image d'entrée étaient beaucoup plus grandes que les 600 x 1024 acceptées par le modèle. Les images étaient donc réduites à 600 x 1024, ce qui signifiait que les boîtes à cigarettes perdaient leurs détails :)

J'ai donc décidé de tester le modèle original qui avait été formé sur toutes les classes d'images rognées et cela fonctionne à merveille :)

 Original image

C'était la sortie du modèle sur l'image originale

 Top left corner cropped from original image

Ceci est la sortie du modèle lorsque je découpe le quart supérieur gauche et que je le fournis comme entrée. 

Merci à tous ceux qui ont aidé! Et félicitations à l’équipe de TensorFlow pour le travail formidable accompli par l’API :) Maintenant, tout le monde peut former des modèles de détection d’objets!

13
Banach Tarski

Combien d'images y a-t-il dans le jeu de données? Plus vous disposez de données de formation, meilleure est la performance de l'API. J'ai essayé de l'entraîner sur environ 20 images par classe, la précision était plutôt mauvaise. J'ai pratiquement fait face à tous les problèmes que vous avez mentionnés ci-dessus. Lorsque j'ai généré plus de données, la précision s'est considérablement améliorée.

PS: Désolé, je n'ai pas pu commenter car je n'ai pas assez de réputation

4
Nikhil Kasukurthi

Il semble que la taille du jeu de données soit plutôt petite. Resnet est un grand réseau qui nécessitera encore plus de données pour s’entraîner correctement.

Que faire:

  1. Augmenter la taille du jeu de données
  2. Utilisez des réseaux pré-formés et ajustez finement votre jeu de données (vous le faites probablement déjà)
  3. Utiliser l’augmentation des données (redimensionnement, flou, ...; le retournement peut ne pas être approprié pour cet ensemble de données).
0
Blackberry