tf.image.non_max_suppression()非极大值抑制

介绍

非极大值抑制

按scores由大到小排序,然后选定第一个,一次对之后的做iou ,删除那些和选定的框iou大于阈值的框,循环完第一个, 再选定之后的一个,再 对它后面的框做iou,循环操作。选出最后剩余的框。选定的框不会超过设定的最大值。依次删除最小的。

注意,该算法与原点在坐标系中的位置无关。
注意,该算法对于坐标系的正交变换和平移是不变的。
因此,坐标系的平移或反射会导致算法选择相同的框。
此操作的输出是一组整数,这些整数索引到表示所选框的边界框的输入集合中。

通常与 tf.gather 搭配使用,获取与所选索引对应的边界框坐标

语法

tf.image.non_max_suppression(
    boxes,
    scores,
    max_output_size,
    iou_threshold=0.5,
    score_threshold=float('-inf'),
    name=None
)
参数
  • boxes:二维float型Tensor,形状是 [num_boxes, 4]
    以[y1,x1,y2,x2]形式提供,(y1,x1)和(y2,x2)是边框的对角坐标,可以是归一化的坐标,即[0,1]之间。返回的是被选中的那些留下来的边框在参数boxes里面的下标位置。那么你可以使用tf.gather的操作或者利用keras.backend的gather函数来从参数boxes来获取选中的边框。
  • scores:一维浮点Tensor,形状是[num_boxes],代表与每个边框的分数。
  • max_output_size:整数,符合非最大抑制的最大边框数。
  • iou_threshold=0.5:浮点数,IOU阈值。
  • score_threshold=float(‘-inf’):一个浮点数,删除边框的分数阈值。

例子

import tensorflow as tf

boxes=np.array([[1,2,3,4],[1,3,3,4],[1,3,4,4],[1,1,4,4],[1,1,3,4]],dtype="float32")

scores=np.array([0.4,0.5,0.72,0.9,0.45])



selected_indices=tf.image.non_max_suppression(boxes=boxes,scores=scores,max_output_size=5,iou_threshold=0.5)

print(selected_indices)


selected_boxes=tf.gather(boxes,selected_indices)
print(selected_boxes)

执行结果:

tf.Tensor([3 2 0], shape=(3,), dtype=int32)
tf.Tensor(
[[1. 1. 4. 4.]
 [1. 3. 4. 4.]
 [1. 2. 3. 4.]], shape=(3, 4), dtype=float32)

感谢:
https://www.cnblogs.com/fujian-code/p/10408590.html


原文出处:/show_1EF5allkhAA1.html