J'ai affiné un modèle plus rapide_rcnn_resnet101 disponible sur le Model Zoo pour détecter mes objets personnalisés. J'ai eu les données divisées en ensemble train et eval, et je les ai utilisées dans le fichier de configuration pendant l'entraînement. Maintenant, une fois la formation terminée, je veux tester mon modèle sur des données invisibles (je l'appelle les données de test). J'ai utilisé quelques fonctions mais je ne peux pas déterminer avec certitude quel code utiliser à partir de l'API du tensorflow pour évaluer les performances sur l'ensemble de données de test. Voici les choses que j'ai essayées:
Précision moyenne (AP) @ [IoU = 0.50: 0.95 | aire = tout | maxDets = 100] = 0,459
Précision moyenne (AP) @ [IoU = 0,50 | aire = tout | maxDets = 100] = 0,601
Précision moyenne (AP) @ [IoU = 0,75 | aire = tout | maxDets = 100] = 0,543
Précision moyenne (AP) @ [IoU = 0,50: 0,95 | aire = petite | maxDets = 100] = 0.459
Précision moyenne (AP) @ [IoU = 0.50: 0.95 | aire = moyenne | maxDets = 100] = -1.000
Précision moyenne (AP) @ [IoU = 0.50: 0.95 | aire = grande | maxDets = 100] = -1.000
Rappel moyen (AR) @ [IoU = 0.50: 0.95 | aire = tout | maxDets = 1] = 0,543
Rappel moyen (AR) @ [IoU = 0,50: 0,95 | aire = tout | maxDets = 10] = 0,627
Rappel moyen (AR) @ [IoU = 0,50: 0,95 | aire = tout | maxDets = 100] = 0,628
Rappel moyen (AR) @ [IoU = 0,50: 0,95 | aire = petite | maxDets = 100] = 0,628
Rappel moyen (AR) @ [IoU = 0,50: 0,95 | aire = moyenne | maxDets = 100] = -1.000
Rappel moyen (AR) @ [IoU = 0.50: 0.95 | aire = grande | maxDets = 100] = -1.000
Maintenant, je sais que mAP et AR ne peuvent pas être négatifs et qu'il y a quelque chose qui ne va pas. Je veux savoir pourquoi je vois des valeurs négatives lorsque j'exécute l'évaluation hors ligne sur l'ensemble de données de test?
La requête que j'ai utilisée pour exécuter ce pipeline est: SPLIT = test
echo " label_map_path: '/training_demo/annotations/label_map.pbtxt' tf_record_input_reader: { input_path: '/training_demo/Predictions/test.record' } " > /training_demo/${SPLIT}_eval_metrics/${SPLIT}_input_config.pbtxt echo " metrics_set: 'coco_detection_metrics' " > /training_demo/${SPLIT}_eval_metrics/${SPLIT}_eval_config.pbtxt python object_detection/metrics/offline_eval_map_corloc.py \ --eval_dir='/training_demo/test_eval_metrics' \ --eval_config_path='training_demo/test_eval_metrics/test_eval_config.pbtxt' \ --input_config_path='/training_demo/test_eval_metrics/test_input_config.pbtxt'
DetectionBoxes_Recall / AR @ 100 (moyen): -1,0 DetectionBoxes_Recall / AR @ 100 (petit): -1,0 DetectionBoxes_Precision / mAP @ .50IOU: -1,0 DetectionBoxes_Precision / mAP (moyen): -1,0 etc.
J'ai utilisé le pipeline, python eval.py \ --logtostderr \ --checkpoint_dir = graphes-d'inférence formés / graphe_inférence_sortie / \ --eval_dir = test_eval_metrics \ --pipeline_config_path = training / plus rapide_rcnn_resnet101_coco-Copy1.config
Le lecteur eval_input_reader dans le fichier plus rapide_rcnn_resnet101_coco-Copy1.config pointant vers le test TFRecord avec des informations de vérité et de détection sur le terrain. >
J'apprécierais toute aide à ce sujet.
3 Réponses :
Les métriques d'évaluation sont au format COCO, vous pouvez donc vous référer à l'API COCO pour connaître la signification de ces valeurs.
Tel que spécifié dans coco api , -1
est la valeur par défaut si la catégorie est absente. Dans votre cas, tous les objets détectés n'appartiennent qu'à une «petite» zone. Les catégories de zone "petite", "moyenne" et "grande" dépendent également des pixels que la zone prend comme spécifié ici .
Pour moi, je n'exécute qu'une seule fois le model_main.py
et change le eval_input_reader dans le pipeline.config
en jeu de données de test. Mais je ne sais pas si c'est ainsi que cela doit être fait.
eval_config: { metrics_set: "coco_detection_metrics" num_examples: 721 # no of test images num_visualizations: 10 # no of visualizations for tensorboard } eval_input_reader: { tf_record_input_reader { input_path: "/path/to/test-data.record" } label_map_path: "/path/to/label_map.pbtxt" shuffle: true num_readers: 1 }
pipeline.config
python model_main.py \ --alsologtostderr \ --run_once \ --checkpoint_dir=$path_to_model \ --model_dir=$path_to_eval \ --pipeline_config_path=$path_to_config
Pour moi également, il n'y avait pas de différence de mAP entre la validation et l'ensemble de données de test. Je ne suis donc pas sûr qu'une division des données de formation, de validation et de test soit réellement nécessaire.
!python eval.py --logtostderr --pipeline_config_path=--checkpoint_dir--eval_dir=eval/ You can find the Eval.py in legacy folder
Avec quelques tests unitaires et des enquêtes, il ressort de l'utilisation d'un mappage de catégorie incorrect (carte d'étiquettes) dans les données. Par exemple, si la carte d'étiquettes ne contient pas de classe 4 mais en raison d'une erreur dans les données, il y a une classe 4 dans la vérité terrain, alors les valeurs des métriques seront -1,0.