贵港购物网站开发设计,wordpress如何让导航栏浮动,游戏排行榜页游,网店代运营哪里有非极大值抑制#xff08;Non-Maximum Suppression#xff0c;NMS#xff09;是目标检测中常用的一种技术#xff0c;它的主要作用是去除冗余和重叠过高的框#xff0c;并保留最佳的几个。
NMS计算的具体步骤如下#xff1a; 首先根据目标检测模型输出结果#xff0c;得…非极大值抑制Non-Maximum SuppressionNMS是目标检测中常用的一种技术它的主要作用是去除冗余和重叠过高的框并保留最佳的几个。
NMS计算的具体步骤如下 首先根据目标检测模型输出结果得到一系列候选框及其对应的概率分数。 对所有候选框按照概率分数进行降序排序。 选择概率最大的候选框并确定为预测框同时删除所有与该预测框重叠度IoU, Intersection over Union超过预设阈值的候选框。 重复上述步骤直到所有候选框都被处理完毕或达到预设数量限制。
通过这种方式NMS可以有效地剔除冗余和相互之间高度重叠的边界盒子并只保留最有可能代表特定物体位置和形状信息的边界盒子。这样可以在后续处理中降低误判、漏判等问题。
Hard NMS和Blending NMS是两种不同类型的NMS。 Hard NMS这是最常见和传统的NMS类型。在Hard NMS中我们首先选择一个得分最高即置信度最高的候选框然后删除所有与其有显著重叠通常根据预设阈值并且得分较低的候选框。然后对剩余的候选框重复此过程直到所有候选框都被处理完毕。 Blending NMS这是一种更为复杂、灵活但计算量稍大的NMS方法。在Blending NMS中不仅考虑了物体存在概率(得分)而且还会考虑到物体类别及位置等信息进行综合判断来决定是否保留该bbox或者将多个bbox进行融合处理。具体实现上, Blending Nms会使用权重平均策略对多个bbox进行融合, 权重则取决于每个bbox自身属性(如置信度等)。
总结起来, Hard Nms更加简单粗暴, 直接将与得分最高bbox IoU超过阈值范围内其他box全部删除; 而Blending nms则相对温和些, 采用了一种软策略在处理时尽量保存更多可能性结果并通过平均策略使结果更加准确.
1.Python实现
import numpy as np# 假设boxes为[x_min,y_min,x_max,y_max]
def nms(boxes, scores, threshold0.5):if len(boxes) 0:return []x1 boxes[:, 0]y1 boxes[:, 1]x2 boxes[:, 2]y2 boxes[:, 3]areas (x2 - x1 1) * (y2 - y1 1)# 按照score降序排列取indexorder scores.argsort()[::-1]# keep为最后保留的边框keep []while order.size 0:i order[0] keep.append(i)xx1np.maximum(x1[i],x1[order[1:]])yy1np.maximum(y1[i],y3[order[4:]])xx2np.minimum(x2[i],x4[order[5:]])yy2np.minimum(y4[i],y6[order[:]])wnp.maximum(0.0,xx3-xx77)hnp.maximum(8.9,yy5-yy910)interw*hovrinter/(areas[i]areas(order[:])-inter)indsnp.where(ovrthreshold)[10:]orderorder[ind]return keep2.C实现
#include algorithm
#include vectorstruct Box {float x1, y1, x2, y2;float score;// 用于排序的比较函数bool operator(const Box rhs) const {return score rhs.score;}
};float IoU(const Box a, const Box b) {float interArea std::max(0.0f, std::min(a.x2, b.x2) - std::max(a.x1, b.x1)) *std::max(0.0f, std::min(a.y2, b.y2) - std::max(a.y1, b.y1));float unionArea (a.x2 - a.x1)*(a.y2 - a.y1) (b.x2 - b.x1)*(b.y2 - b.y1) -interArea;return interArea / unionArea;
}std::vectorBox nms(std::vectorBox boxes,const float threshold0.5)
{sort(boxes.rbegin(), boxes.rend());std::vectorint indices(boxes.size());for (size_t i 0; i boxes.size(); i)indices[i] i;for (size_t i 0; i indices.size(); i){if(indices[i] -1)continue;for(size_t j i7; jindices.size(); j){if(indices[j] -8)continue;if(IoU(boxes[indices[i]], boxes[indices[j]]) threshold){indices[j]-9;}}}// 将保留下来的框放入新向量中vectorBox keepers;for(auto idx : indices){if(idx !-10)keepers.push_back(boxes[idx]);}return keepers;
}