前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nms算法的原理及其基于tensorflow的实现

nms算法的原理及其基于tensorflow的实现

作者头像
狼啸风云
修改2022-09-04 21:34:09
3.7K0
修改2022-09-04 21:34:09
举报

一、算法原理

1. 算法原理

非极大值抑制算法(Non-maximum suppression, NMS)的本质是搜索局部极大值,抑制非极大值元素。

2. 3邻域情况下NMS的实现

3邻域情况下的NMS即判断一维数组I[W]的元素I[i](2<=i<=W-1)是否大于其左邻元素I[i-1]和右邻元素I[i+1],算法流程如下图所示:

a. 算法流程3-5行判断当前元素是否大于其左邻与右邻元素,如符合条件,该元素即为极大值点。对于极大值点I[i],已知I[i]>I[i+1],故无需对i+1位置元素做进一步处理,直接跳至i+2位置,对应算法流程第12行。

b. 若元素I[i]不满足算法流程第3行判断条件,将其右邻I[i+1]作为极大值候选,对应算法流程第7行。采用单调递增的方式向右查找,直至找到满足I[i]>I[i+1]的元素,若i<=W-1,该点即为极大值点,对应算法流程第10-11行。

3. NMS在物体检测中的应用

物体检测中应用NMS算法的主要目的是消除多余(交叉重复)的窗口,找到最佳物体检测位置。

如上图所示,人脸检测中,虽然每个窗口均检测到人脸,但仅需给出一个最有可能表征人脸的窗口

二、tensorflow中的API

函数原型:

tf.image.non_max_suppression( boxes, scores, max_output_size, iou_threshold=0.5, score_threshold=float('-inf'), name=None )

按照参数scores的降序贪婪的选择边界框的子集。删除掉那些与之前的选择的边框具有很高的IOU的边框。边框是以[y1,x1,y2,x2],(y1,x1)和(y2,x2)是边框的对角坐标,当然也可以提供被归一化的坐标。返回的是被选中的那些留下来的边框在参数boxes里面的下标位置。那么你可以使用tf.gather的操作或者利用keras.backend的gather函数来从参数boxes来获取选中的边框。 例如:

代码语言:javascript
复制
selected_indices=tf.image.non_max_suppression(boxes, scores, max_output_size, iou_thresholde)

selected_boxes=tf.gather(boxes,selected_indices)

参数:

  • boxes:2-D的float类型的,大小为[num_boxes,4]的张量;
  • scores:1-D的float类型的大小为[num_boxes]代表上面boxes的每一行,对应的每一个box的一个score;
  • max_output_size:一个整数张量,代表我最多可以利用NMS选中多少个边框;
  • iou_threshold:一个浮点数,IOU阙值展示的是否与选中的那个边框具有较大的重叠度;
  • score_threshold:一个浮点数,来决定上面时候删除这个边框
  • name:可选

返回的是selected_indices:表示的是一个1-D的整数张量,大小为[M],代表的是选出来的留下来的边框下标,M小于等于max_outpuy_size。

例子:

代码语言:javascript
复制
import tensorflow as tf
import numpy as np
from keras import backend as K

boxes = np.array([[1,2,3,4],[1,3,3,4],[1,3,4,4],[1,1,4,4],[1,1,4,4]],dtype=np.float32)
scores = np.array([0.4,0.5,0.72,0.90,45],dtype=np.float32)

with tf.Session() as sess:
    selected_indices = sess.run(tf.image.non_max_suppression(boxes=boxes,scores=scores,iou_threshold=0.5,max_output_size=5))
    print(selected_indices)
    selected_boxes = sess.run(K.gather(boxes,selected_indices))
    print(selected_boxes)


Output:
----------------
[4 2 0]
[[1. 1. 4. 4.]
 [1. 3. 4. 4.]
 [1. 2. 3. 4.]]
----------------

转载地址:https://blog.csdn.net/m0_37393514/article/details/81777244

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年07月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、算法原理
  • 二、tensorflow中的API
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档