C# 手撸nms非极大值抑制代码

本文详细介绍了如何在C#中定义和使用`classBoundingBox`类表示边界框,以及`NMS`类中的`IntersectionOverUnion`函数计算IoU(交并比)和`NonMaxSuppression`方法执行非极大值抑制,以筛选出具有高置信度且重叠较少的边界框。
摘要由CSDN通过智能技术生成
class BoundingBox
{
    public float XMin { get; set; }
    public float YMin { get; set; }
    public float XMax { get; set; }
    public float YMax { get; set; }
    public float Confidence { get; set; }
}

class NMS
{
    public static float IntersectionOverUnion(BoundingBox box1, BoundingBox box2)
    {
        float x1 = Math.Max(box1.XMin, box2.XMin);
        float y1 = Math.Max(box1.YMin, box2.YMin);
        float x2 = Math.Min(box1.XMax, box2.XMax);
        float y2 = Math.Min(box1.YMax, box2.YMax);

        float intersectionArea = Math.Max(0, x2 - x1 + 1) * Math.Max(0, y2 - y1 + 1);

        float box1Area = (box1.XMax - box1.XMin + 1) * (box1.YMax - box1.YMin + 1);
        float box2Area = (box2.XMax - box2.XMin + 1) * (box2.YMax - box2.YMin + 1);

        float iou = intersectionArea / (box1Area + box2Area - intersectionArea);
        return iou;
    }

    public static List<BoundingBox> NonMaxSuppression(List<BoundingBox> boxes, float threshold)
    {
        List<BoundingBox> pickedBoxes = new List<BoundingBox>();

        // 根据置信度对边界框进行排序
        boxes = boxes.OrderByDescending(box => box.Confidence).ToList();

        while (boxes.Count > 0)
        {
            // 选择具有最高置信度的边界框
            BoundingBox topBox = boxes[0];
            pickedBoxes.Add(topBox);
            boxes.RemoveAt(0);

            // 删除与所选框重叠面积大于阈值的其他框
            List<BoundingBox> overlappingBoxes = new List<BoundingBox>();
            foreach (BoundingBox box in boxes)
            {
                if (IntersectionOverUnion(topBox, box) > threshold)
                {
                    overlappingBoxes.Add(box);
                }
            }
            foreach (BoundingBox box in overlappingBoxes)
            {
                boxes.Remove(box);
            }
        }

        return pickedBoxes;
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 创建一些边界框(假设每个边界框由左上角和右下角坐标表示)
        List<BoundingBox> boxes = new List<BoundingBox>
        {
            new BoundingBox { XMin = 10, YMin = 20, XMax = 100, YMax = 200, Confidence = 0.9f },
            new BoundingBox { XMin = 30, YMin = 40, XMax = 150, YMax = 180, Confidence = 0.8f },
            new BoundingBox { XMin = 50, YMin = 60, XMax = 200, YMax = 250, Confidence = 0.7f },
            // 添加更多的边界框...
        };

        // 设置NMS阈值
        float threshold = 0.5f;

        // 执行非极大值抑制
        List<BoundingBox> pickedBoxes = NMS.NonMaxSuppression(boxes, threshold);

        // 打印选择的边界框
        foreach (BoundingBox box in pickedBoxes)
        {
            Console.WriteLine($"Selected box: XMin={box.XMin}, YMin={box.YMin}, XMax={box.XMax}, YMax={box.YMax}, Confidence={box.Confidence}");
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nms非极大值抑制有以下几种方法和改进: 1. 基本的NMS方法是利用得分高的边框来抑制得分低且重叠程度高的边框。这种方法简单有效,但在更高的目标检测需求下存在一些缺点。 2. Soft NMS是一种改进的方法,它通过对重叠框的得分进行一定的衰减,而不是直接抑制掉得分低的边框。这样可以保留一些得分低但可能是真正目标的边框。 3. Softer NMS是Soft NMS的进一步改进,它在计算重叠框的得分衰减时引入了一个可学习的参数。这个参数可以根据具体的数据进行优化,从而更加灵活地调整得分衰减的方式。 4. Adaptive NMS是根据物体密集程度自适应调整NMS阈值的方法。它通过使用卷积神经网络(CNN)来判断人群的密集程度,并根据密集程度决定NMS阈值的大小。 5. IoUNet是一种基于IoU(Intersection over Union)的方法,它通过训练一个神经网络来预测边框之间的IoU值。然后,根据IoU值来判断是否进行非极大值抑制。 综上所述,nms非极大值抑制有基本的NMS方法、Soft NMS、Softer NMS、Adaptive NMS和IoUNet等不同的方法和改进。每种方法都有其特点和适用场景,可以根据具体需求选择合适的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【目标检测系列】非极大值抑制(NMS)的各类变体汇总](https://blog.csdn.net/weixin_47196664/article/details/106754955)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值