非极大值抑制的计算方式

前言

最近一直在研究目标检测的算法,其中有个很重要的概念叫做非极大值抑制(Non-maximum suppression),其主要目的是为了消除多余的框,找到最佳的物体检测的位置。如定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。就这样一直重复,找到所有被保留下来的矩形框。

例子

给定boxes的坐标(左上角,右下角)boxes = np.array([[1, 2, 3, 4], [1, 3, 3, 4], [1, 3, 4, 4], [1, 1, 4, 4], [1, 1, 3, 4]])
以及每个boxes的置信度 scores = np.array([0.4, 0.5, 0.72, 0.9, 0.45], dtype=np.float32)
1、首先绘制图形的坐标如下所示意
在这里插入图片描述
选取置信度最大的0.9的边框(1, 1, 4, 4)那么我们可以得到他们的iou如下所示,此时剔除掉iou > 0.5的值即是boxes[4],此时先输出第一个边框boxes[3]。剩下的边框是boxes[0],boxes[1],boxes[2]
在这里插入图片描述
2、绘制剩下的boxes的坐标
在这里插入图片描述
此时剩下的boxes中置信度最高的事boxes[2]的0.72,以此以框来计算iou,此时剔除掉iou > 0.5的值即是boxes[1],此时输出第二个边框boxes[2]。剩下的边框是boxes[0],到此就结束了,如果有更多的边框就依次计算下去。
在这里插入图片描述
回顾一下,通过非极大值抑制
boxes = np.array([[1, 2, 3, 4], [1, 3, 3, 4], [1, 3, 4, 4], [1, 1, 4, 4], [1, 1, 3, 4]])
scores = np.array([0.4, 0.5, 0.72, 0.9, 0.45], dtype=np.float32)
输出最后的边框的是boxes[3],boxes[2],boxes[0]
[[1 1 4 4],[1 3 4 4],[1 2 3 4]]

TensorFlow的实现方式

上面的方法其实实现起来也很简单,只不过框架已经帮我们实现了,下面就是调用的例子

import tensorflow as tf
import numpy as np
boxes = np.array([[1, 2, 3, 4], [1, 3, 3, 4], [1, 3, 4, 4], [1, 1, 4, 4], [1, 1, 3, 4]])
scores = np.array([0.4, 0.5, 0.72, 0.9, 0.45], dtype=np.float32)
with tf.Session() as sess:
    nn = tf.image.non_max_suppression(boxes, scores, max_output_size=10,iou_threshold=0.5)
    ss = sess.run(nn)
    kk = tf.gather(boxes, ss)
    sb = sess.run(kk)
    print('索引 = 'ss)
    print('坐标 = 'sb)

#### 输出:
#### 		索引 = [3 2 0]
####		坐标 = [[1 1 4 4]
####		 		[1 3 4 4]
####		 		[1 2 3 4]]
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值