C++实现NMS(⾮极⼤值抑制)具体原理解析和numpy实现见本⼈另⼀篇博客:
这⾥直接上C++代码:
喝红酒会胖吗
//!
//! \brief Performs non maximum suppression on final bounding boxes
//!
新单位自我介绍std::vector<int> nonMaximumSuppression(std::vector<std::pair<float, int>>& scoreIndex, float* bbox,
const int classNum, const int numClass, const float nmsThreshold)
{
auto overlap1D = [](float x1min, float x1max, float x2min, float x2max) -> float {
if (x1min > x2min)
{
std::swap(x1min, x2min);
std::swap(x1max, x2max);
}
return x1max < x2min ? 0 : std::min(x1max, x2max) - x2min;
};
auto computeIoU = [&overlap1D](float* bbox1, float* bbox2) -> float {孕妇梦见捡鸡蛋
float overlapX = overlap1D(bbox1[0], bbox1[2], bbox2[0], bbox2[2]);
float overlapY = overlap1D(bbox1[1], bbox1[3], bbox2[1], bbox2[3]);
float area1 = (bbox1[2] - bbox1[0]) * (bbox1[3] - bbox1[1]);
float area2 = (bbox2[2] - bbox2[0]) * (bbox2[3] - bbox2[1]);
float overlap2D = overlapX * overlapY;
float u = area1 + area2 - overlap2D;
return u == 0 ? 0 : overlap2D / u;
};
std::vector<int> indices;
for (auto i : scoreIndex)
{
const int idx = i.cond;
vivo手机如何录屏
bool keep = true;
for (unsigned k = 0; k < indices.size(); ++k)
志莲净苑
{
if (keep)
{
const int kept_idx = indices[k];
怎样催奶
float overlap = computeIoU(
&bbox[(idx * numClass + classNum) * 4], &bbox[(kept_idx * numClass + classNum) * 4]);
keep = overlap <= nmsThreshold;
}
el
{遥的近义词
break;
}
}
if (keep)
{
五年级古诗词三首indices.push_back(idx);
}
}
return indices;
}
出处: