13

I am executing https://github.com/tensorflow/tensorflow this example of detecting objects in image.

I want to get count of detected objects following is the code that gives me detected object drawn in an image. But I am not able to get count of detected objects.

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)

This is the block of code that gives actual object detection shown in below image:

enter image description here

How can I get the object count?

2
  • 1
    this gives me information of those classes. I need a count which I got from printing length of boxes.shape. Any ways thank you. Commented Aug 7, 2017 at 10:10
  • Here is an Object Counting API for TensorFlow: github.com/ahmetozlu/tensorflow_object_counting_api , you can use it to count objects and more for developing object detection and counting based projects.. Commented Jul 3, 2018 at 21:21

5 Answers 5

7

You can use the TensorFlow Object Counting API that is an open source framework built on top of TensorFlow that makes it easy to develop object counting systems to count any objects! Moreover, it provides sample projects so you can adopt them to develop your own specific case studies!

  • Sample Project#1 is "Pedestrian Counting":

Pedestrian Counting with TensorFlow (quicdemo)

  • Sample Project#2 is "Vehicle Counting":

Vehicle Counting with TensorFlow (quicdemo)

  • Sample Project#3 is "Object Counting in Real-Time":

Real-Time Object Counting with TensorFlow (quicdemo)

See the TensorFlow Object Counting API for more info and please give a star that repo for showing your support to open source community if you find it useful!

Sign up to request clarification or add additional context in comments.

Comments

4

Solve it simply print length of boxes.shape

print(len(boxes.shape))

Comments

2

You should check scores and count objects as manual. Code is here:

#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 Comment

if scores is None , does it mean it contain an object ?
1

It's important to note that the number of boxes is always 100.

If you look at the code that actually draws the boxes, i.e., the vis_util.visualize_boxes_and_labels_on_image_array function, you'll see that they're defining a threshold -- min_score_thresh=.5 -- to limit the boxes drawn to only those detections in which the score is > 0.5. You can think of this as only drawing boxes where the probability of accurate detection is >50%. You can adjust this threshold up or down to increase the number of boxes drawn. If you decrease it too low, however, you will get a lot of inaccurate boxes.

1 Comment

Just a note: If you want to know if your object detector has confidently detected any object before visualizing the image, you can put tf.reduce_max(detections['detection_scores']) > 0.8 in an "if" statement. The code returns True if the detector has a detection of over 80% confidence.
1

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

this part will print count but will print it in continuous manner can it be used to print only once like final count = some value instead of printing it repeatedly

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.