tf.image.non_max_suppression(
boxes,
scores,
max_output_size,
iou_threshold=0.5,
score_threshold=float('-inf'),
name=None
)
tf.image.non_max_suppression()
很多文章都有提到:按照参数scores的降序贪婪的选择边界框的子集。删除掉那些与之前的选择的边框具有很高的IOU的边框。
因此大部分实例中,保留的边框数目要小于进行nms的总边框数目,并没有提到保留的边框数目要大于进行nms的总边框数目的情况。
例1:一共有四个边框被放进去进行nms,只保留2个边框的情况 即保留边框小于总边框的情况
def test3():
boxs = np.array([[1,2,3,4],[2,4,2,1],
[1,1,3,4],[1,4,4,1]],dtype=np.float)
socres = np.array([0.5,0.6,0.7,0.8],dtype=np.float)
#一共有四个边框被放进去进行nms,只保留2个边框的情况 即保留边框小于总边框的情况
nms = tf.image.non_max_suppression(boxs,socres,iou_threshold=0.5,max_output_size=2)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
nms_run = sess.run(nms)
print(nms_run)
if __name__ == '__main__':
test3()
输出[3,1]
例2:一共有四个边框被放进去进行nms,保留10个边框的情况 即保留边框大于总边框的情况
def test3():
boxs = np.array([[1,2,3,4],[2,4,2,1],
[1,1,3,4],[1,4,4,1]],dtype=np.float)
socres = np.array([0.5,0.6,0.7,0.8],dtype=np.float)
#一共有四个边框被放进去进行nms,保留10个边框的情况 即保留边框大于总边框的情况
nms = tf.image.non_max_suppression(boxs,socres,iou_threshold=0.5,max_output_size=10)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
nms_run = sess.run(nms)
print(nms_run)
if __name__ == '__main__':
test3()
输出[3 1 1 1 1 1 1 1 1 1]
由此可见 tf.image.non_max_suppression()会填充输出结果