非极大值抑制NMS的作用:

  • 是目标检测框架中的后处理模块,主要用于删除高度冗余的bbox。

?一、NMS【参考】

非极大值抑制NMS的过程:
  • 根据置信度得分进行排序;
  • 选择置信度最高的边界框添加到最终输出列表中,将其从原始边界框列表中删除;
  • 计算所有边界框的面积;
  • 计算置信度最高的边界框与其它候选框的IoU;
  • 删除IoU大于阈值的边界框;(一般IOU取0.3~0.5)
  • 重复上述过程,直至原始边界框列表为空。
def nms(bounding_boxes, Nt):if len(bounding_boxes) == 0:return [], []bboxes = np.array(bounding_boxes)# 计算 n 个候选框的面积大小x1 = bboxes[:, 0]y1 = bboxes[:, 1]x2 = bboxes[:, 2]y2 = bboxes[:, 3]scores = bboxes[:, 4]areas = (x2 - x1 + 1) * (y2 - y1 + 1)# 对置信度进行排序, 获取排序后的下标序号, argsort 默认从小到大排序order = np.argsort(scores)picked_boxes = []  # 返回值while order.size > 0:# 将当前置信度最大的框加入返回值列表中index = order[-1]picked_boxes.append(bounding_boxes[index])# 获取当前置信度最大的候选框与其他任意候选框的相交面积x11 = np.maximum(x1[index], x1[order[:-1]])y11 = np.maximum(y1[index], y1[order[:-1]])x22 = np.minimum(x2[index], x2[order[:-1]])y22 = np.minimum(y2[index], y2[order[:-1]])w = np.maximum(0.0, x22 - x11 + 1)h = np.maximum(0.0, y22 - y11 + 1)intersection = w * h# 利用相交的面积和两个框自身的面积计算框的交并比, 将交并比大于阈值的框删除ious = intersection / (areas[index] + areas[order[:-1]] - intersection)left = np.where(ious < Nt)order = order[left]return picked_boxes

?二、soft-NMS【论文原文】

解决的问题:
  • 物体重合度较大的情况;
soft-NMS的原理:
  • 基于NMS的改进;
  • 将置信度改为IoU的函数:f(IoU),具有较低的值而不至于从排序列表中删去
def soft_nms(bboxes, Nt=0.3, sigma2=0.5, score_thresh=0.3, method=2):# 在 bboxes 之后添加对于的下标[0, 1, 2...], 最终 bboxes 的 shape 为 [n, 5], 前四个为坐标, 后一个为下标res_bboxes = deepcopy(bboxes)N = bboxes.shape[0]  # 总的 box 的数量indexes = np.array([np.arange(N)])  # 下标: 0, 1, 2, ..., n-1bboxes = np.concatenate((bboxes, indexes.T), axis=1)  # concatenate 之后, bboxes 的操作不会对外部变量产生影响# 计算每个 box 的面积x1 = bboxes[:, 0]y1 = bboxes[:, 1]x2 = bboxes[:, 2]y2 = bboxes[:, 3]scores = bboxes[:, 4]areas = (x2 - x1 + 1) * (y2 - y1 + 1)for i in range(N):# 找出 i 后面的最大 score 及其下标pos = i + 1if i != N - 1:maxscore = np.max(scores[pos:], axis=0)maxpos = np.argmax(scores[pos:], axis=0)else:maxscore = scores[-1]maxpos = 0# 如果当前 i 的得分小于后面的最大 score, 则与之交换, 确保 i 上的 score 最大if scores[i] < maxscore:bboxes[[i, maxpos + i + 1]] = bboxes[[maxpos + i + 1, i]]scores[[i, maxpos + i + 1]] = scores[[maxpos + i + 1, i]]areas[[i, maxpos + i + 1]] = areas[[maxpos + i + 1, i]]# IoU calculatexx1 = np.maximum(bboxes[i, 0], bboxes[pos:, 0])yy1 = np.maximum(bboxes[i, 1], bboxes[pos:, 1])xx2 = np.minimum(bboxes[i, 2], bboxes[pos:, 2])yy2 = np.minimum(bboxes[i, 3], bboxes[pos:, 3])w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)intersection = w * hiou = intersection / (areas[i] + areas[pos:] - intersection)# Three methods: 1.linear 2.gaussian 3.original NMSif method == 1:  # linearweight = np.ones(iou.shape)weight[iou > Nt] = weight[iou > Nt] - iou[iou > Nt]elif method == 2:  # gaussianweight = np.exp(-(iou * iou) / sigma2)else:  # original NMSweight = np.ones(iou.shape)weight[iou > Nt] = 0scores[pos:] = weight * scores[pos:]# select the boxes and keep the corresponding indexesinds = bboxes[:, 5][scores > score_thresh]keep = inds.astype(int)return res_bboxes[keep]

?三、Softer-NMS【参考】【代码】

解决的问题:
  • 包围框精度不够的问题;
  • 高分类得分但是定位精度不统一。
softer-NMS的原理:
  • 基于soft-NMS的改进;
  • 将大于一定重叠度阈值Nt的候选包围框根据置信度加权平均
  • 提出了一种新的包围框回归的损失函数(KL Loss),用来同时学习包围框变换和定位置信度。

?四、Locality-Aware NMS文本系列【参考】

基本步骤:
  • 1.先对所有的output box集合结合相应的阈值(大于阈值则进行合并,小于阈值则不和并),依次遍历进行加权合并,得到合并后的bbox集合;
  • 2.对合并后的bbox集合进行标准的NMS操作。
import numpy as np
from shapely.geometry import Polygondef intersection(g, p):# 取g,p中的几何体信息组成多边形g = Polygon(g[:8].reshape((4, 2)))p = Polygon(p[:8].reshape((4, 2)))# 判断g,p是否为有效的多边形几何体if not g.is_valid or not p.is_valid:return 0# 取两个几何体的交集和并集inter = Polygon(g).intersection(Polygon(p)).areaunion = g.area + p.area - interif union == 0:return 0else:return inter / uniondef weighted_merge(g, p):# 取g,p两个几何体的加权(权重根据对应的检测得分计算得到)g[:8] = (g[8] * g[:8] + p[8] * p[:8]) / (g[8] + p[8])# 合并后的几何体的得分为两个几何体得分的总和g[8] = (g[8] + p[8])return gdef standard_nms(S, thres):# 标准NMSorder = np.argsort(S[:, 8])[::-1]keep = []while order.size > 0:i = order[0]keep.append(i)ovr = np.array([intersection(S[i], S[t]) for t in order[1:]])inds = np.where(ovr <= thres)[0]order = order[inds + 1]return S[keep]def nms_locality(polys, thres=0.3):'''locality aware nms of EAST:param polys: a N*9 numpy array. first 8 coordinates, then prob:return: boxes after nms'''S = []  # 合并后的几何体集合p = None  # 合并后的几何体for g in polys:if p is not None and intersection(g, p) > thres:  # 若两个几何体的相交面积大于指定的阈值,则进行合并p = weighted_merge(g, p)else:  # 反之,则保留当前的几何体if p is not None:S.append(p)p = gif p is not None:S.append(p)if len(S) == 0:return np.array([])return standard_nms(np.array(S), thres)

目标检测模型中NMS、soft-NMS、softer-NMS的原理、LNMS文本检测系列(python代码实现)相关推荐

  1. 一文速学数模-分类模型(一)SVM(Support Vector Machines)支持向量机算法原理以及应用详解+Python代码实现

    目录 前言 一.引论 二.理论铺垫 线性可分性(linear separability) 超平面 决策边界

  2. 『论文阅读笔记』目标检测模型中的性能评价方式-IOU、precision/recall、mAP、PR、Fps!

    目标检测模型中的性能评估标准-IOU.precision/recall.mAP.PR.Fps! 文章目录 一.交并比IOU 二.精确率(precision)和召回率(recall) 三.P-R(pre ...

  3. 干货 | 详解对象检测模型中的Anchors

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 导读 给大家再次解释一下Anchors ...

  4. 软件测试 | 测试开发 | 音频质量检测模型中标准数据集的构建方法

    背景 音频质量检测模型训练中,纯净高质量的音频数据集比较好获得,但是损伤音频的数据集比较少,而且损伤音频的质量得分也很难评估.我们采用了一种只依靠纯净高质量的语音数据集来制作低质量音频并打分的方法. ...

  5. resouce checker插件(检测模型中没有用到的网格、martaril、图片)

    Unity3d删除无用的美术资源 这个插件是我在国外网站逛论坛发现的,试用了一下非常好用,是一个轻量级的插件就一个类.开发中尤其是和美术合作的时候,可能你会发现Project视图中有很多没有用到的资源 ...

  6. MATLAB算法实战应用案例精讲-【智能优化算法】多目标粒子群优化(MOPSO)(补充篇)(附MATLAB和python代码实现)

    目录 前言 几个高频面试题目

  7. 基于EAST和Tesseract的文本检测与识别

    目录 导言 现实世界问题 说明 问题陈述 业务目标和约束条件 可用于文本检测和识别的数据集 数据集概述和说明 探索性数据分析(EDA) 深度学习时代之前的文本检测方法 EAST(高效精确的场景文本检测 ...

  8. NMS、soft NMS、softer NMS与IOU-Guided NMS

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 NMS.soft NMS.softer NMS与IOU-Guided NMS 一.NMS 二.soft NMS 三.softer NM ...

  9. 目标检测比赛中的 trick

    1.数据增强 可参考: 初识CV:MMDetection中文文档-4.技术细节 数据增强是增加深度模型鲁棒性和泛化性能的常用手段,随机翻转.随机裁剪.添加噪声等也被引入到检测任务的训练中来,个人认为数 ...

最新文章

  1. GTK+图形化应用程序开发学习笔记
  2. 18.自定义过滤器表头排序
  3. 呆萌直播源码:如何开发视频直播平台?
  4. 用WEB技术栈开发NATIVE应用:WEEX SDK原理详解
  5. Oracle/MySQL decimal/int/number 转字符串
  6. 解决 min-width 在 IE6 中无效的方法
  7. Learning to Ranking
  8. Struts2 简单的上传文件并且显示图片
  9. 基于mfc 组态软件_仪表人零基础学系统组态,必备知识!
  10. 2.3,2.2,2.1最新谷歌服务包发布附下载(原创)
  11. python画爱心 好看漂亮的表白代码
  12. linux解压该文件,linux上解压缩文件
  13. vue+elementUI同时上传视频和图片并回显
  14. codeforces 416C C. Booking System(贪心)
  15. R语言List列表和向量Vector互相转化源码和思路
  16. 第一批90后30岁了,该有多少存款?
  17. 【综述】分子表示与性质预测中的深度学习方法
  18. JAVA入门-菜鸟篇-
  19. 中职计算机应用基础教案1,中职计算机应用基础教案 中职学校《计算机应用基础》教学心得...
  20. 笔记119--摘自爱哥06

热门文章

  1. Unity AssetBundle打包
  2. Xtrabackup 增量备份
  3. 国企工资1万辞职去1.5万月薪私企,不想“内卷”,过来人:请三思
  4. python中将字符变为大写_python 输入一个字符,是小写转换为大写,大写转换为小写,其他字符原样输出...
  5. 机器学习 基于加州房价的线性回归实验
  6. 烽火HG680-KA/KB_Hi3798MV310_红外蓝牙语音_开启无线开关_通刷固件包
  7. 决策树在商业保险中的应用
  8. 那些年,我们一起做过的 Java 课后练习题(61 - 65)
  9. 全球名校AI课程库(44)| 慕尼黑工大 · 计算机视觉深度学习进阶课『Advanced Deep Learning for Computer Vision』
  10. JAVA个人记账本代码,Java的家庭记账本程序(L)