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'
}
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 :)
C'était la sortie du modèle sur l'image originale
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!
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
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: