介绍
非极大值抑制
按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