NMS(非极大抑制)是深度学习目标检测中常用的小算法,用来过滤掉同一个物体上的那些置信度较低的bbboxes,最后只剩下该目标检测框集中最大置信度的那个。
算法原理
说它是小算法的原因是其原理很简单。
1)先对输入检测框按置信度由高到低排序
2)挑选第一个检测框(即最高置信度,记为A)和其它检测框(记为B)进行iou计算
3)如果iou大于nmsThreshold, 那就将B清除掉
4)跳转到2)从剩余得框集里面找置信度最大得框和其它框分别计算iou
5)直到所有框都过滤完。
代码实现
box的数据结构
struct Box{
float left, top, right, bottom, confidence;
float landmark[10];
cv::Rect cvbox() const{return cv::Rect(left, top, right-left, bottom-top);}
float width() const{return std::max(0.0f, right-left);}
float height() const{return std::max(0.0f, bottom-top);}
float area() const{return width() * height();}
float get_left() {return left;}
void set_left(float value) {left = value;}
float get_top() {re