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:
Comment puis-je obtenir le nombre d'objets?
Résolvez-le simplement en imprimant la longueur de boxes.shape
print(len(boxes.shape))
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
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
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.