web-dev-qa-db-fra.com

Comment compter des objets dans l'API de détection d'objets Tensorflow

J'exécute https://github.com/tensorflow/tensorflow cet exemple de détection d'objets dans une image.

Je veux obtenir le nombre d'objets détectés en suivant le code qui me donne l'objet détecté dessiné dans une image. Mais je ne peux pas compter les objets détectés.

with detection_graph.as_default():
with tf.Session(graph=detection_graph) as sess:
    for image_path in TEST_IMAGE_PATHS:
      image = Image.open(image_path)
      # the array based representation of the image will be used later in order to prepare the
      # result image with boxes and labels on it.
      image_np = load_image_into_numpy_array(image)
      # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
      image_np_expanded = np.expand_dims(image_np, axis=0)
      image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
      # Each box represents a part of the image where a particular object was detected.
      boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
      # Each score represent how level of confidence for each of the objects.
      # Score is shown on the result image, together with the class label.
      scores = detection_graph.get_tensor_by_name('detection_scores:0')
      classes = detection_graph.get_tensor_by_name('detection_classes:0')
      num_detections = detection_graph.get_tensor_by_name('num_detections:0')
      # Actual detection.
      (boxes, scores, classes, num_detections) = sess.run(
          [boxes, scores, classes, num_detections],
          feed_dict={image_tensor: image_np_expanded})
      # Visualization of the results of a detection.
      vis_util.visualize_boxes_and_labels_on_image_array(
          image_np,
          np.squeeze(boxes),
          np.squeeze(classes).astype(np.int32),
          np.squeeze(scores),
          category_index,
          use_normalized_coordinates=True,
          line_thickness=1)
      plt.figure(figsize=IMAGE_SIZE)
      plt.imshow(image_np)

C'est le bloc de code qui donne la détection d'objet réelle montrée dans l'image ci-dessous:

 enter image description here

Comment puis-je obtenir le nombre d'objets?

7
Rohit Salunke

Résolvez-le simplement en imprimant la longueur de boxes.shape

print(len(boxes.shape))
3
Rohit Salunke

ajouter cette partie pour compter les objets

final_score = np.squeeze(scores)    
    count = 0
    for i in range(100):
        if scores is None or final_score[i] > 0.5:
                count = count + 1

count est le nombre d'objets détectés

cette partie imprimera le nombre mais l’imprimera de manière continue peut-il être utilisé pour imprimer une seule fois comme le nombre final = une valeur au lieu de l’imprimer à plusieurs reprises

1
Shivam

Vous devriez vérifier les scores et compter les objets en tant que manuel . Le code est ici:

#code to test image start

    (boxes, scores, classes, num) = sess.run(
        [detection_boxes, detection_scores, detection_classes, num_detections],
        feed_dict={image_tensor: image_np_expanded})

#code to test image finish

#add this part to count objects

    final_score = np.squeeze(scores)    
        count = 0
        for i in range(100):
            if scores is None or final_score[i] > 0.5:
                    count = count + 1

#count is the number of objects detected
1
Hakan A.

Il est important de noter que le nombre de boîtes est toujours de 100.

Si vous examinez le code qui dessine réellement les cases, c'est-à-dire la fonction vis_util.visualize_boxes_and_labels_on_image_array, vous verrez qu'elles définissent un seuil - min_score_thresh=.5 - pour limiter les cases dessinées aux seules détections dont le score est> 0,5. . Vous pouvez penser à cela uniquement comme des zones de dessin où la probabilité d'une détection précise est supérieure à 50%. Vous pouvez augmenter ou diminuer ce seuil pour augmenter le nombre de cases dessinées. Si vous le diminuez trop bas, vous obtiendrez beaucoup de cases inexactes.

1
rumdrums