3
votes

Évaluation du modèle de détection d'objets Tensorflow sur un jeu de données de test

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:

  1. J'ai utilisé la fonction object_detection / metrics / offline_eval_map_corloc.py pour obtenir une évaluation sur l'ensemble de données de test. Le code fonctionne bien mais j'ai des valeurs négatives ou AR et AP pour les cadres de délimitation de grande et moyenne taille.

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'
  1. J'ai également essayé object_detection / legacy / eval.py mais j'obtiens les valeurs des métriques d'évaluation comme négatives:

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'ai également essayé object_detection / utils / object_detection_evaluation pour obtenir l'évaluation. Ce n'est rien de différent que d'utiliser la 1ère approche car elle ne sert à rien les mêmes fonctions de base - évaluator.evaluate ()
  • J'apprécierais toute aide à ce sujet.


    1 commentaires

    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.


    3 Réponses :


    1
    votes

    0 commentaires

    0
    votes

    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.


    0 commentaires

    0
    votes
    !python eval.py --logtostderr --pipeline_config_path=--checkpoint_dir--eval_dir=eval/
    You can find the Eval.py in legacy folder

    0 commentaires