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}");
}
}
}