首页 > 其他分享 >单阶段目标检测--NMS

单阶段目标检测--NMS

时间:2024-06-21 18:59:55浏览次数:14  
标签:confidence end NMS -- 检测 start boxes score bounding

目录

一、概念:

二、算法过程

三、代码实现


一、概念:

        在目标检测的初始结果中,同一个物体,可能对应有多个边界框 (bounding box,bb),这些边界框通常相互重叠。如何从中选择一个最合适 的(也就是与真实目标框最接近的)呢?通常采用的做法是NMS(Nonmaximum suppression),即非极大值抑制。

二、算法过程

         非极大值抑制的大体思路就像其名一样,对于多个边界框,以置信度 (class score)最大的那个框为准,其他与之重合度高的框,则认为它们检测 的是同一个物体,将其他框除掉,也就是抑制掉。给定一系列候选框,针对每 个类别,分别执行NMS,具体流程如下:

        1. 找到置信度最大的框,该框肯定是目标,得到第1个框;

        2. 依次计算其他相同类别框与第1个框的重合度(IOU值),如果大于一 定阈值,抑制掉;

        3. 剩下的框中,同样找置信度最大的框,为第2个框,抑制掉重合的框;

        4. 反复执行上述步骤,直到剩下最后一个框,此亦为目标框。

三、代码实现

#需求
#使用nms实现图像阈值参数的提取
"""
1导包
2,定义nms对象候选边框
   2.1 边界框
   2.2 边框坐标
   2.3 边界框的置信度
   2.4 选择边界框,   2.5 计算边界框的面积
3, 根据边界框置信度排序
   3.1   迭代边界框
   3.2 边界框信心指数得分最大
   3.3 选择信心得分最大
4 ,计算相交过并并坐标(IOU)
   4.1 计算交集-过并域
   4.2 计算交集和并集之间的比率
5,图像设置--->名称
   5.1 边界框
   5.2读取图像文件
   5.3复制图像作为原始
   5.4参数设置
   5.5IOU阈值
   5.6绘制边界框和信心得分
   5.7执行非max抑制算法
   5.8绘制非最大值抑制后的边界框和置信度得分
   5.9显示图像
"""
import cv2
import numpy as np
"""
   Non-max Suppression Algorithm
   @param list Object candidate bounding boxes
   @param list Confidence score of bounding boxes
   @param float IoU threshold
   @return Rest boxes after nms operation
"""
#定义nms对象候选边框
def nms(bounding_boxes,confidence_srore,threashold): #定义nms
   if len(bounding_boxes) == 0:
       return [],[]
   boxes = np.array(bounding_boxes)
   # coordinates of bounding boxes 边框坐标
   start_x = boxes[:,0]
   start_y = boxes[:,1]   end_x = boxes[:,2]
   end_y = boxes[:,3]
   # Bounding boxes 边界框
   boxes = np.array(bounding_boxes)
   # Confidence scores of bounding boxes 边界框的置信度
   score = np.array(confidence_score)
   # Picked bounding boxes 选择边界框
   picked_boxes = []
   picked_score = []
   # Compute areas of bounding boxes 计算边界框的面积
   areas = (end_x - start_x + 1) * (end_y - start_y + 1)
   # Sort by confidence score of bounding boxes 根据边界框置
信度排序
   order = np.argsort(score)
   # Iterate bounding boxes 迭代边界框
   while order.size > 0:
       # The index of largest confidence score 边界框信心指数
得分最大
       index = order[-1] #未匹配到元素
       # Pick the bounding box with largest confidence score 
选择信心得分最大的区域
       picked_boxes.append(bounding_boxes[index])
       picked_score.append(confidence_score[index])
       # Compute ordinates of intersection-over-union(IOU) 计
算相交过并并坐标(IOU)
       x1 = np.maximum(start_x[index], start_x[order[:-1]])
       x2 = np.minimum(end_x[index], end_x[order[:-1]])
       y1 = np.maximum(start_y[index], start_y[order[:-1]])
       y2 = np.minimum(end_y[index], end_y[order[:-1]])
       # Compute areas of intersection-over-union 计算交集-过
并域
       w = np.maximum(0.0, x2 - x1 + 1)
       h = np.maximum(0.0, y2 - y1 + 1)
       intersection = w * h       # Compute the ratio between intersection and union 计
算交集和并集之间的比率
       ratio = intersection / (areas[index] + 
areas[order[:-1]] - intersection)
       left = np.where(ratio < threshold)
       order = order[left]
   return picked_boxes, picked_score
# Image name
image_name = '1.png'
# Bounding boxes 边界框
bounding_boxes = [(187, 82, 337, 317), (150, 67, 305, 282), 
(246, 121, 368, 304)]
confidence_score = [0.9, 0.75, 0.8]
# Read image 读取图像文件
image = cv2.imread(image_name)
# Copy image as original 复制图像作为原始
org = image.copy()
# Draw parameters 参数设置
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1
thickness = 2
# IoU threshold IOU阈值
threshold = 0.4
# Draw bounding boxes and confidence score 绘制边界框和信心得分
for (start_x, start_y, end_x, end_y), confidence in 
zip(bounding_boxes, confidence_score):
   (w, h), baseline = cv2.getTextSize(str(confidence), font, 
font_scale, thickness)
   cv2.rectangle(org, (start_x, start_y - (2 * baseline + 
5)), (start_x + w, start_y), (0, 255, 255), -1)
   cv2.rectangle(org, (start_x, start_y), (end_x, end_y), 
(0, 255, 255), 2) 第十一章, YOLO系列概述 
1.深度学习经典检测方法 
 
(1) tow-stage(两阶段):Faster-rcnn Mask-rcnn系列:增加了区域建议网
络(RPN),即预选框
特点
速度通常较慢(5FPS),但是效果通常不错
   cv2.putText(org, str(confidence), (start_x, start_y), 
font, font_scale, (0, 0, 0), thickness)
# Run non-max suppression algorithm 执行非max抑制算法
picked_boxes, picked_score = nms(bounding_boxes, 
confidence_score, threshold)
# Draw bounding boxes and confidence score after non-maximum 
supression 绘制非最大值抑制后的边界框和置信度得分
for (start_x, start_y, end_x, end_y), confidence in 
zip(picked_boxes, picked_score):
   (w, h), baseline = cv2.getTextSize(str(confidence), font, 
font_scale, thickness)
   cv2.rectangle(image, (start_x, start_y - (2 * baseline + 
5)), (start_x + w, start_y), (0, 255, 255), -1)
   cv2.rectangle(image, (start_x, start_y), (end_x, end_y), 
(0, 255, 255), 2)
   cv2.putText(image, str(confidence), (start_x, start_y), 
font, font_scale, (0, 0, 0), thickness)
# Show image 显示图像
cv2.imshow('Original', org)
cv2.imshow('NMS', image)
cv2.waitKey(0)

标签:confidence,end,NMS,--,检测,start,boxes,score,bounding
From: https://blog.csdn.net/lbr15660656263/article/details/139822686

相关文章

  • Unity初始位置初始化设置
    一、Transform面板介绍参数说明:        Position:位置;        Rotation:角度;        Scale:   比例。二、在Transform面板填写参数,如图所示:三、编写代码转换物体位置、角度、比例   1、位置转换:代码说明:        将目前游戏......
  • Unity相机及物体的移动步骤
    一、在Scenes场景文件夹建立游戏场景 二、在游戏场景里面建立游戏对象并且初始化位置1、建立游戏对象  2、初始化位置 3、把相机拉到游戏对象上(Reset一下位置)【注:这一步是操作相机的移动,物品的操作不用此步骤。】  三、建立CharacterController组件1、有Ca......
  • 深度学习原理
    目录一、简介 二、用一个求函数表达式的问题解析深度学习原理2.1线性和非线性函数2.1.1线性函数(LinearFunction)2.1.2非线性函数(Non-linearFunction)2.2深度学习原理2.2.1函数分段2.2.2引入非线性函数2.2.3非线性函数图形变换2.2.4线性操作与非线性操作示......
  • Windows C++ 应用软件开发从入门到精通详解
    目录1、引言2、IDE开发环境介绍2.1、VisualStudio 2.2、QTCreator3、Windows平台实用小工具介绍3.1、代码编辑器VSCode3.2、代码查看编辑器SourceInsight3.3、文本编辑器Notepad++3.4、文件搜索工具Everything4、C++语言特性4.1、熟悉泛型编程4.2、了解......
  • golang openai GPT4o 示例代码
    packagemainimport( "context" "errors" "fmt" "io" "log" "os" "github.com/joho/godotenv" openai"github.com/sashabaranov/go-openai")funcmain(){ err:=godoten......
  • 免费福利:《经典图书推荐2.0》来
    往期文章推荐经典图书雷达和电子对抗经典书推荐1-信息时代的电子战雷达和电子对抗经典书推荐2-机载雷达导论雷达和电子对抗经典书推荐3-应用电子对抗雷达和电子对抗经典书推荐4-雷达手册雷达和电子对抗经典书推荐5-雷达信号处理基础雷达和电子对抗经典书推荐6-......
  • MySQL----表级锁&行级锁&排它锁和共享锁&意向锁
    MySQL的锁机制锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。在MySQL中,不同存储引擎使用不同的加锁方式;我们以InnoDB存储引擎为例介绍MySQL中的锁机制,其他存储引擎中的锁相对简单一些。表级锁&行级锁表级锁:对整张表加锁。开销小,加锁快,不会出现......
  • webshell总结
    一、webshell概况1.webshell概念:经常有客户的网站碰到被上传小马和大马,这里的“马”是木马的意思,可不是真实的马。通常,攻击者利用文件上传漏洞,上传一个可执行并且能被解析的脚本文件,通过这个脚本来获得服务器端执行命令的能力,也就是我们经常听到的WebShell,而这个脚本文件就......
  • 6.21-二叉搜索树的最近公共祖先
    235.二叉搜索树的最近公共祖先题意描述:给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。”......
  • 使用 GCD 实现属性的多读单写
    使用GrandCentralDispatch(GCD)实现多读单写的属性首先需要确保在多线程环境下的线程安全性。可以使用GCD提供的读写锁机制dispatch_rwlock_t或者dispatch_queue_t来实现这个功能。Swift版本的实现怎样创建一个并发队列?//使用Swift来实现的首个好处就是:......