单阶段目标检测--NMS

目录

一、概念:

二、算法过程

三、代码实现


一、概念:

在目标检测的初始结果中,同一个物体,可能对应有多个边界框 (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)
相关推荐
小王爱学人工智能6 分钟前
OpenCV的阈值处理
人工智能·opencv·计算机视觉
新智元29 分钟前
刚刚,光刻机巨头 ASML 杀入 AI!豪掷 15 亿押注「欧版 OpenAI」,成最大股东
人工智能·openai
机器之心38 分钟前
全球图生视频榜单第一,爱诗科技PixVerse V5如何改变一亿用户的视频创作
人工智能·openai
新智元39 分钟前
2025年了,AI还看不懂时钟!90%人都能答对,顶尖AI全军覆没
人工智能·openai
湫兮之风43 分钟前
OpenCV: Mat存储方式全解析-单通道、多通道内存布局详解
人工智能·opencv·计算机视觉
机器之心1 小时前
Claude不让我们用!国产平替能顶上吗?
人工智能·openai
程序员柳1 小时前
基于YOLOv8的车辆轨迹识别与目标检测研究分析软件源代码+详细文档
人工智能·yolo·目标检测
算家计算1 小时前
一站式高质量数字人动画框架——EchoMimic-V3本地部署教程: 13 亿参数实现统一多模态、多任务人体动画生成
人工智能·开源
API流转日记1 小时前
Gemini-2.5-Flash-Image-Preview 与 GPT-4o 图像生成能力技术差异解析
人工智能·gpt·ai·chatgpt·ai作画·googlecloud
martinzh1 小时前
切块、清洗、烹饪:RAG知识库构建的三步曲
人工智能