Как применить подавление Non max к пакету изображений в tenorflow 1.14? - PullRequest
1 голос
/ 04 марта 2020

У меня есть партия обрезанных изображений из исходного изображения, на которой я должен выполнить обнаружение объекта, я пытаюсь применить операцию NMS с тензорным потоком.

Я изучил API-интерфейсы тензорного потока и обнаружил tf.image.combined_non_max_suppression(), но не могу понять это правильно.

Поток в моем конвейере состоит из двух этапов.

  1. Я получаю какое-то изображение и применяю обнаружение объекта, чтобы получить желаемую область интересов.
  2. На каждой из этих областей интереса я должен применить обнаружение объекта снова, поэтому я передаю его как пакет.

Для первого шага я использую простой tf.image.non_max_suppression(), за которым следует tf.gather(), но я не могу понять, как это сделать для второго шага.

Пожалуйста, обратитесь к фрагментам кода ниже:

with tf.Session(graph = self.detection_graph) as sess:

    # input image tensor
    image_tensor1 = self.detection_graph.get_tensor_by_name('import/image_tensor:0')

    # boxes, scores and classes for first step
    boxesop1 = self.detection_graph.get_tensor_by_name('import/detection_boxes:0')
    scoresop1 = self.detection_graph.get_tensor_by_name('import/detection_scores:0')
    classesop1 = self.detection_graph.get_tensor_by_name('import/detection_classes:0')

    # getting first values, since we are predicting on single image
    boxesop1 = boxesop1[0]
    classesop1 = classesop1[0]
    scoresop1 = scoresop1[0]

    # applying NMS for the first step
    selected_indices1 = tf.image.non_max_suppression(
        boxesop1, scoresop1, 20, iou_threshold = 0.5
    )

    boxesop1 = tf.gather(boxesop1, selected_indices1)
    classesop1 = tf.gather(classesop1, selected_indices1)
    scoresop1 = tf.gather(scoresop1, selected_indices1)


    # boxes, scores and classes for second step
    boxesop2 = self.detection_graph.get_tensor_by_name('import_1/detection_boxes:0')
    scoresop2 = self.detection_graph.get_tensor_by_name('import_1/detection_scores:0')
    classesop2 = self.detection_graph.get_tensor_by_name('import_1/detection_classes:0')

    # applying NMS for the second step
    boxesop2, scoresop2, classesop2, valid_detections = tf.image.combined_non_max_suppression(
        boxesop2, scoresop2, max_output_size_per_class = 10, max_total_size = 30,
        iou_threshold = 0.5
    )

    # predicting for each images
    for imgPath, imgID in img_files:

        # reading image data
        img = cv2.imread(imgPath)
        imageHeight, imageWidth = img.shape[:2]

        # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
        image_np_expanded = np.expand_dims(img, axis=0)

        # Run inference
        (boxes1, scores1, classes1, boxes2, scores2, classes2) = sess.run(
            [boxesop1, scoresop1, classesop1, boxesop2, scoresop2, classesop2],
            feed_dict={image_tensor1: image_np_expanded}
        )

Но при попытке запустить выше я получил следующую ошибку:

Traceback (most recent call last):
  File "../env/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1356, in _do_call
    return fn(*args)
  File "../env/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1341, in _run_fn
    options, feed_dict, fetch_list, target_list, run_metadata)
  File "../env/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1429, in _call_tf_sessionrun
    run_metadata)
tensorflow.python.framework.errors_impl.InvalidArgumentError: boxes must be 4-D[20,300,4]
         [[{{node combined_non_max_suppression/CombinedNonMaxSuppression}}]]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/prediction.py", line 159, in predict
    feed_dict={image_tensor1: image_np_expanded}
  File "../env/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 950, in run
    run_metadata_ptr)
  File "../env/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1173, in _run
    feed_dict_tensor, options, run_metadata)
  File "../env/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1350, in _do_run
    run_metadata)
  File "../env/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1370, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InvalidArgumentError: boxes must be 4-D[20,300,4]
         [[node combined_non_max_suppression/CombinedNonMaxSuppression (defined at /home/prediction.py:130) ]]

Errors may have originated from an input operation.
Input Source operations connected to node combined_non_max_suppression/CombinedNonMaxSuppression:
 import_1/detection_boxes (defined at /home/prediction.py:94)

Original stack trace for 'combined_non_max_suppression/CombinedNonMaxSuppression':
  File "/home/prediction.py", line 130, in predict
    iou_threshold = 0.5
  File "../env/lib/python3.5/site-packages/tensorflow/python/ops/image_ops_impl.py", line 3707, in combined_non_max_suppression
    score_threshold, pad_per_class, clip_boxes)
  File "../env/lib/python3.5/site-packages/tensorflow/python/ops/gen_image_ops.py", line 431, in combined_non_max_suppression
    clip_boxes=clip_boxes, name=name)
  File "../env/lib/python3.5/site-packages/tensorflow/python/framework/op_def_library.py", line 788, in _apply_op_helper
    op_def=op_def)
  File "../env/lib/python3.5/site-packages/tensorflow/python/util/deprecation.py", line 507, in new_func
    return func(*args, **kwargs)
  File "../env/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 3616, in create_op
    op_def=op_def)
  File "../env/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 2005, in __init__
    self._traceback = tf_stack.extract_stack()

Как ее решить и применить NMS для пакетного изображения в тензор потока?

...