C++实现NMS(⾮极⼤值抑制)具体原理解析和numpy实现见本⼈另⼀篇博客:
这⾥直接上C++代码:
//!
//! \brief Performs non maximum suppression on final bounding boxes
resigned
//!
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]);believeinyourlf
float overlap2D = overlapX * overlapY;
float u = area1 + area2 - overlap2D;
return u == 0 ? 0 : overlap2D / u;
};
december是什么意思std::vector<int> indices;
for (auto i : scoreIndex)
{
const int idx = i.cond;
bool keep = true;
dogdaysfor (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;
}
strokes}
if (keep)
很郁闷{
indices.push_back(idx);
}
}
return indices;
}
出处: