【深度学习实战(29)】后处理之NMS(非极大值抑制)

本文深入探讨了NMS在图像处理中的应用,展示了如何使用C++实现NMS并介绍了软NMS以处理物体密集场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、NMS工作原理

NMS 的工作原理:

  1. 置信度排序:对于每个类别,NMS 首先根据每个边界框的置信度(即预测框中含有目标的概率)进行排序。
  2. 选择最高置信度框:从置信度最高的边界框开始,将其作为当前考虑的“最大”候选。
  3. 计算交并比(IoU):计算当前最大候选与所有其他边界框的交并比(Intersection over Union)。IoU 是两个边界框交集面积与并集面积的比值,用于衡量边界框之间的重叠程度。
  4. 抑制重叠框:如果某个边界框与当前最大候选的 IoU 高于预设的阈值(例如,0.5),则认为它们检测到的是同一个目标,因此将该边界框从候选列表中移除。
  5. 更新候选列表:移除所有被抑制的边界框后,从剩余的边界框中选择置信度最高的作为新的“最大”候选。
  6. 迭代过程:重复步骤3-5,直到所有边界框都被处理完毕。

二、NMS C++代码实现

手写

在这里插入图片描述

c++




#include<vector>
#include<algorithm>
#include<iostream>


struct BBox
{
	float x, y, w, h, score;
	float area() { return w * h; };
};

float iou(BBox& b1, BBox& b2) {
	float area_1 = b1.area();
	float area_2 = b2.area();

	int x1 = std::max(b1.x - b1.w * 0.5, b2.x - b2.w * 0.5);
	int y1 = std::max(b1.y - b1.h * 0.5, b2.y - b2.h * 0.5);
	int x2 = std::min(b1.x + b1.w * 0.5, b2.x + b2.w * 0.5);
	int y2 = std::min(b1.y + b1.h * 0.5, b2.y + b2.h * 0.5);

	float area_I = std::max(0, (x2 - x1)) * std::max(0, (y2 - y1));

	float area_U = area_1 + area_2 - area_I;

	return area_I / area_U;
}


std::vector<BBox> NMS(std::vector<BBox>& in_box, float thres)
{
	std::vector<BBox> out_box;

	std::sort(in_box.begin(), in_box.end(), [](const BBox & b1, const BBox & b2)
		{
			return b1.score < b2.score;
		});

	for (auto box1 : in_box)
	{
		bool keep = true;
		for (auto box2 : out_box) {
			if (iou(box1, box2) > thres)
			{
				keep = false;
				break;
			}
		}
		if (keep) out_box.push_back(box1);
	}
	return out_box;
}


int main() {

	//设置一些BBox
	std::vector<BBox> boxes;
	boxes.push_back({ 100, 100, 50, 50, 0.9 });
	boxes.push_back({ 102, 101, 50, 50, 0.8 });
	boxes.push_back({ 98, 98, 50, 50, 0.7 });
	boxes.push_back({ 102, 98, 50, 50, 0.85 });

	//nms
	float thres = 0.82;
	std::vector<BBox> ret = NMS(boxes, thres);

	//输出
	for (size_t i = 0; i < ret.size(); i++)
	{
		std::cout << "x=" << ret[i].x << "y=" << ret[i].y << "w=" << ret[i].w << "h=" << ret[i].h << "conf=" << ret[i].score << std::endl;
	}

	system("pause");
	return 0;

}

run
在这里插入图片描述

三、soft NMS介绍

当物体密集时,传统NMS方法可能会错误地移除一些正确的检测框。而Soft-NMS考虑了所有可能的检测框,因此可以更准确地处理这种情况。soft-nms的核心就是降低置信度。比如一张人脸上有3个重叠的bounding box, 置信度分别为0.9, 0.7, 0.85 。选择得分最高的建议框,经过第一次处理过后,得分变成了0.9, 065, 0.55(此时将得分最高的保存在D中)。这时候再选择第二个bounding box作为得分最高的,处理后置信度分别为0.65, 0.45(这时候3个框也都还在),最后选择第三个,处理后得分不改变。最终经过soft-nms抑制后的三个框的置信度分别为0.9, 0.65, 0.45。最后设置阈值,将得分si小于阈值的去掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BILLY BILLY

你的奖励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值