У меня есть партия обрезанных изображений из исходного изображения, на которой я должен выполнить обнаружение объекта, я пытаюсь применить операцию NMS с тензорным потоком.
Я изучил API-интерфейсы тензорного потока и обнаружил tf.image.combined_non_max_suppression()
, но не могу понять это правильно.
Поток в моем конвейере состоит из двух этапов.
- Я получаю какое-то изображение и применяю обнаружение объекта, чтобы получить желаемую область интересов.
- На каждой из этих областей интереса я должен применить обнаружение объекта снова, поэтому я передаю его как пакет.
Для первого шага я использую простой 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 для пакетного изображения в тензор потока?