web-dev-qa-db-fra.com

Obtenez les coordonnées du cadre de sélection dans le didacticiel de l'API de détection d'objets TensorFlow

Je suis nouveau dans les deux python et Tensorflow. J'essaie d'exécuter le fichier object_detection_tutorial à partir du API de détection d'objets Tensorflow , mais je ne trouve pas où je peux obtenir les coordonnées des boîtes englobantes lorsque des objets sont détectés.

Code pertinent:

 # The following processing is only for single image
        detection_boxes = tf.squeeze(tensor_dict['detection_boxes'], [0])
        detection_masks = tf.squeeze(tensor_dict['detection_masks'], [0])

...

L'endroit où je suppose que les boîtes englobantes sont dessinées est comme ceci:

 # Visualization of the results of a detection.
  vis_util.visualize_boxes_and_labels_on_image_array(
      image_np,
      output_dict['detection_boxes'],
      output_dict['detection_classes'],
      output_dict['detection_scores'],
      category_index,
      instance_masks=output_dict.get('detection_masks'),
      use_normalized_coordinates=True,
      line_thickness=8)
  plt.figure(figsize=IMAGE_SIZE)
  plt.imshow(image_np)

J'ai essayé d'imprimer output_dict ['detection_boxes'] mais je ne suis pas sûr de la signification des chiffres. Il y a beaucoup.

array([[ 0.56213236,  0.2780568 ,  0.91445708,  0.69120586],
       [ 0.56261235,  0.86368728,  0.59286624,  0.8893863 ],
       [ 0.57073039,  0.87096912,  0.61292225,  0.90354401],
       [ 0.51422435,  0.78449738,  0.53994244,  0.79437423],

......

   [ 0.32784131,  0.5461576 ,  0.36972913,  0.56903434],
   [ 0.03005961,  0.02714229,  0.47211722,  0.44683522],
   [ 0.43143299, 0.09211366,  0.58121657,  0.3509962 ]], dtype=float32)

J'ai trouvé des réponses à des questions similaires, mais je n'ai pas de variable appelée boîtes comme elles le font. Comment puis-je obtenir les coordonnées? Merci!

11
Mandy

J'ai essayé d'imprimer output_dict ['detection_boxes'] mais je ne suis pas sûr de la signification des chiffres

Vous pouvez vérifier le code par vous-même. visualize_boxes_and_labels_on_image_array est défini ici .

Notez que vous passez use_normalized_coordinates=True. Si vous tracez les appels de fonction, vous verrez vos numéros [ 0.56213236, 0.2780568 , 0.91445708, 0.69120586] etc. sont les valeurs [ymin, xmin, ymax, xmax] où l'image se coordonne:

(left, right, top, bottom) = (xmin * im_width, xmax * im_width, 
                              ymin * im_height, ymax * im_height)

sont calculés par la fonction:

def draw_bounding_box_on_image(image,
                           ymin,
                           xmin,
                           ymax,
                           xmax,
                           color='red',
                           thickness=4,
                           display_str_list=(),
                           use_normalized_coordinates=True):
  """Adds a bounding box to an image.
  Bounding box coordinates can be specified in either absolute (pixel) or
  normalized coordinates by setting the use_normalized_coordinates argument.
  Each string in display_str_list is displayed on a separate line above the
  bounding box in black text on a rectangle filled with the input 'color'.
  If the top of the bounding box extends to the Edge of the image, the strings
  are displayed below the bounding box.
  Args:
    image: a PIL.Image object.
    ymin: ymin of bounding box.
    xmin: xmin of bounding box.
    ymax: ymax of bounding box.
    xmax: xmax of bounding box.
    color: color to draw bounding box. Default is red.
    thickness: line thickness. Default value is 4.
    display_str_list: list of strings to display in box
                      (each to be shown on its own line).
    use_normalized_coordinates: If True (default), treat coordinates
      ymin, xmin, ymax, xmax as relative to the image.  Otherwise treat
      coordinates as absolute.
  """
  draw = ImageDraw.Draw(image)
  im_width, im_height = image.size
  if use_normalized_coordinates:
    (left, right, top, bottom) = (xmin * im_width, xmax * im_width,
                                  ymin * im_height, ymax * im_height)
8
MFisherKDX

J'ai exactement la même histoire. Vous avez un tableau avec environ cent boîtes (output_dict['detection_boxes']) lorsqu'une seule était affichée sur une image. En creusant plus profondément dans le code qui dessine un rectangle, j'ai pu extraire cela et l'utiliser dans mon inference.py:

#so detection has happened and you've got output_dict as a
# result of your inference

# then assume you've got this in your inference.py in order to draw rectangles
vis_util.visualize_boxes_and_labels_on_image_array(
    image_np,
    output_dict['detection_boxes'],
    output_dict['detection_classes'],
    output_dict['detection_scores'],
    category_index,
    instance_masks=output_dict.get('detection_masks'),
    use_normalized_coordinates=True,
    line_thickness=8)

# This is the way I'm getting my coordinates
boxes = output_dict['detection_boxes']
# get all boxes from an array
max_boxes_to_draw = boxes.shape[0]
# get scores to get a threshold
scores = output_dict['detection_scores']
# this is set as a default but feel free to adjust it to your needs
min_score_thresh=.5
# iterate over all objects found
for i in range(min(max_boxes_to_draw, boxes.shape[0])):
    # 
    if scores is None or scores[i] > min_score_thresh:
        # boxes[i] is the box which will be drawn
        class_name = category_index[output_dict['detection_classes'][i]]['name']
        print ("This box is gonna get used", boxes[i], output_dict['detection_classes'][i])
2
Vadim