• 作者:老汪软件技巧
  • 发表时间:2024-01-06 15:00
  • 浏览量:

1--完整代码

// g++ nms.cpp -std=c++11 -o nms_test
// ./nms_test
#include 
#include 
#include 
// 锚框结构体
struct BoundingBox{
    float x, y, width, height, score;
};
class NMS{
public:
    NMS(){};
    // 非极大值抑制函数
    std::vector nonMaximumSuppression(const std::vector& boxes, float overlapThreshold){
        std::vector selectedBoxes; // 返回的锚框
        // 根据分数降序排序
        std::vector sortedBoxes = boxes;
        std::sort(sortedBoxes.begin(), sortedBoxes.end(), [](const BoundingBox& a, const BoundingBox& b){
            return a.score > b.score;
        });
        while(!sortedBoxes.empty()){
            // 每次取分数最高的合法锚框
            const BoundingBox& currentBox = sortedBoxes.front();
            selectedBoxes.push_back(currentBox);
            sortedBoxes.erase(sortedBoxes.begin()); // 取完后从候选锚框中删除
            // 计算剩余锚框与合法锚框的IOU
            std::vector::iterator it = sortedBoxes.begin();
            while (it != sortedBoxes.end()){
                const BoundingBox& candidateBox = *it; // 取当前候选锚框
                float intersection = intersectionArea(currentBox, candidateBox); // 计算候选框和合法框的交集面积
                float iou = intersection / (boxArea(currentBox) + boxArea(candidateBox) - intersection); // 计算iou
                if (iou >= overlapThreshold) it = sortedBoxes.erase(it);  // 根据阈值过滤锚框,过滤完it指向下一个锚框
                else it++; // 保留当前锚框,判断下一个锚框
            }
        }
        return selectedBoxes;
    }
    // 计算两个矩形框的交集面积
    float intersectionArea(const BoundingBox& box1, const BoundingBox& box2){
        float x1 = std::max(box1.x, box2.x);
        float y1 = std::max(box1.y, box2.y);
        float x2 = std::min(box1.x + box1.width, box2.x + box2.width);
        float y2 = std::min(box1.y + box1.height, box2.y + box2.height);
        if(x1 < x2 && y1 < y2) return (x2 - x1) * (y2 - y1);
        else return 0.0f;
    }
    // 计算矩形框的面积
    float boxArea(const BoundingBox& box){
        return box.width * box.height;
    }
};
int main(int argc, char *argv[]){
    // 生成一组锚框测试数据
    std::vector boxes = {{10, 10, 20, 20, 0.9},
                                      {15, 15, 25, 25, 0.85},
                                      {30, 30, 20, 20, 0.7},
                                      {12, 12, 22, 22, 0.95}};
    // 设定过滤阈值
    float overlapThreshold = 0.5;
    // nms过滤
    NMS nms;
    std::vector selectedBoxes = nms.nonMaximumSuppression(boxes, overlapThreshold);
    // 遍历打印过滤后的合法框
    for(const BoundingBox& box : selectedBoxes){
        std::cout << "Selected Box: (x=" << box.x << ", y=" << box.y << ", width=" << box.width 
                  << ", height=" << box.height << ", score=" << box.score << ")" << std::endl;
    }
    return 0;
}

2--编译运行

g++ nms.cpp -std=c++11 -o nms_test
./nms_test

上一个声音克隆,定制自己的声音,使用最新版Bert-VITS2的云端训练+推理记录

下一个间歇性微服务问题...

相关文章

管理员

元风软件技巧专注分享操作系统、办公软件和手机应用的技巧方法,致力提升软件爱好者的学习和工作效率。

热门文章