NMS⾮极⼤值抑制的原理与C++代码实现
原理:
对于Bounding Box的列表B及其对应的置信度S,选择具有最⼤score的检测框M,将其从B集合中移除并加⼊到最终的检测结果D中.通常将B 中剩余检测框中与M的IoU⼤于阈值Nt的框从B中移除.重复这个过程,直到B为空
实现过程:
就像上⾯的图⽚⼀样,定位⼀个车辆,最后算法就找出了⼀堆的⽅框,我们需要判别哪些矩形框是没⽤的。
⾮极⼤值抑制:先假设有6个候选框,根据分类器类别分类概率做排序,从⼩到⼤分别属于车辆的概率分别为A、B、C、D、E、F。
1、从最⼤概率矩形框F开始,分别判断A~E与F的重叠度IOU是否⼤于某个设定的阈值;
2、假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第⼀个矩形框F,是我们保留下来的。
3、从剩下的矩形框A、C、E中,选择概率最⼤的E,然后判断E与A、C的重叠度,重叠度⼤于⼀定的阈值,那么就扔掉;并标记E是我们保留下来的第⼆个矩形框。最美的风景
4、⼀直重复这个过程,找到所有曾经被保留下来的矩形框。
C++代码实现:
//升序排列
bool cmpScore(Bbox lsh, Bbox rsh) {
if (lsh.score < rsh.score)
return true;
el
return fal;
}
void nms(vector<Bbox> &boundingBox_, const float overlap_threshold, string modelname = "Union"){
if(boundingBox_.empty()){
return;
}
//对各个候选框根据score的⼤⼩进⾏升序排列
sort(boundingBox_.begin(), boundingBox_.end(), cmpScore);
float IOU = 0;
float maxX = 0;
float maxY = 0;
float minX = 0;
float minY = 0;
vector<int> vPick;
int nPick = 0;
multimap<float, int> vScores; //存放升序排列后的score和对应的序号
const int num_boxes = boundingBox_.size();
for (int i = 0; i < num_boxes; ++i){
vScores.inrt(pair<float, int>(boundingBox_[i].score, i));
蛙泳学习}
while(vScores.size() > 0){
int last = vScores.rbegin()->cond; //反向迭代器,获得vScores序列的最后那个序列号
vPick[nPick] = last;
nPick += 1;
for (multimap<float, int>::iterator it = vScores.begin(); it != d();){
int it_idx = it->cond;
maxX = max(boundingBox_.at(it_idx).x1, boundingBox_.at(last).x1);
maxY = max(boundingBox_.at(it_idx).y1, boundingBox_.at(last).y1);
minX = min(boundingBox_.at(it_idx).x2, boundingBox_.at(last).x2);
minY = min(boundingBox_.at(it_idx).y2, boundingBox_.at(last).y2);
40岁的女人
著名的画家//转换成了两个边界框相交区域的边长
maxX = ((minX-maxX+1)>0)? (minX-maxX+1) : 0;
maxY = ((minY-maxY+1)>0)? (minY-maxY+1) : 0;
//求交并⽐IOU
IOU = (maxX * maxY)/(boundingBox_.at(it_idx).area + boundingBox_.at(last).area - IOU);
if(IOU > overlap_threshold){
老虎沟it = a(it); //删除交并⽐⼤于阈值的候选框,era返回删除元素的下⼀个元素
}el{
it++;
}
}
}
vector<Bbox> tmp_;
包子英文tmp_.resize(nPick);
for(int i = 0; i < nPick; i++){
tmp_[i] = boundingBox_[vPick[i]];
杏花沟}
boundingBox_ = tmp_;
}
其中代码中有⼀个地⽅的设计很巧妙值得注意,while循环中,先确定最⼤的score后,让所有候选框
都跟这个候选框计算交并⽐(包括⾃⼰),这样删除了交并⽐⼤于阈值的所有候选框,包括⾃⼰,这样就可以重复进⾏循环获得最终的候选框。
学困生转化计划对于Bounding Box的列表B及其对应的置信度S,采⽤下⾯的计算⽅式.选择具有最⼤score的检测框M,将其从B集合中移除并加⼊到最终的检测结果D中.通常将B中剩余检测框中与M的IoU⼤于阈值Nt的框从B中移除.重复这个过程,直到B为空
著作权归作者所有。商业转载请联系作者获得授权,⾮商业转载请注明出处。
原⽂: ©
对于Bounding Box的列表B及其对应的置信度S,采⽤下⾯的计算⽅式.选择具有最⼤score的检测框M,将其从B集合中移除并加⼊到最终的
检测结果D中.通常将B中剩余检测框中与M的IoU⼤于阈值Nt的框从B中移除.重复这个过程,直到B为空著作权归作者所有。商业转载请联系作者获得授权,⾮商业转载请注明出处。
原⽂: ©