目标检测(预测阶段-后处理)-置信度过滤,非极大值抑制

参考:(讲的详细,简单易懂)https://www.bilibili.com/video/BV15w411Z7LG/?is_story_h5=false&p=4&share_from=ugc&share_medium=android_hd&share_plat=android&share_session_id=f3bd490e-6f4d-43c2-97df-4573b8556221&share_source=WEIXIN&share_tag=s_i&timestamp=1670053553&unique_k=j0ik45C

一、

对于目标检测的预测阶段,后处理是对于非常重要的,对于 YOLO 而言,后处理就是把复杂的预测出来的 98 个预测框,进行筛选、过滤,把重复的预测框只保留一个,最终获得目标检测的结果。包含把低置信度的框过滤掉,以及把重复的过滤框去掉,只保留一个,那么这个步骤称为 NMS 非极大值抑制。

 二、具体做法

首先,YOLO 是一个黑箱,在预测阶段把输入图像 448 X 448 X 3 通道的图像,进行编码、压缩处理,经过卷积层、全连接层,最后获得 7 X 7 X 30 维的张量,后处理就是把 7 X 7 X 30 维的张量变成最后的目标检测结果。

三、7 X 7 X 30 维的张量如何变成最终目标检测结果

1、

7 X 7 意味着是 7 X 7grid cell(网格单元),取出其中的一个 grid cell(网格单元)来看,应该包含 30 个数字,30 个数字是由 5,5,20 构成,第一个 5 是第一个 bounding boxes (边界框)的四个位置坐标和一个置信度坐标,第二个 5 是第二个 bounding boxes (边界框)的四个位置坐标和一个置信度坐标,20 是该 grid cell(网格单元)对 20 个类别的条件概率,即假设该grid cell(网格单元)预测物体的条件下,20 个类别的概率是多少。

2、

 

 假设 bounding boxes (边界框)负责预测物体的条件下,它是某个类别的概率,是狗的概率、猫的概率等。

3、

把20个类别的条件概率拿出来,与 bounding boxes (边界框)的置信度相乘,条件概率乘以条件本身发生的概率,就变成了它的全概率,就是说该bounding boxes (边界框)包含物体的概率就是它的置信度乘以在包含物体的条件下,各个类别的概率,那么就得到了真正是哪个类别的概率,不再是条件概率。第一个预测框的置信度乘以该grid cell(网格单元)的20个类别的条件概率得到第一个预测框的20个类别的全概率。

4、

 第二个预测框的置信度乘以该grid cell(网格单元)的20个类别的条件概率得到第二个预测框的20个类别的全概率。

5、

 每一个grid cell(网格单元)都能获得两个 20 维的全概率,分别表示两个预测框。

6、

 一共 49 grid cell(网格单元),生成 98 20 维的向量。每一列表示,对于某一个bounding boxes (边界框)而言,20 个类别的概率是多少。

7、

 目前获得中间的图。那么如何获得最后的类别结果?

四、后处理

1、

即把 7 X 7 X 30 的张量变成最终的目标检测结果。

2、

 目前获得 98 个竖条(长度均为 20 ),第一个数字就是狗的概率。假如说狗是 20 个类别中的第一个类别。这些概率里面有一些很小的,如0.002,0.003等,那么我们设置一个阈值,把所有小于阈值的数,一律归为 0 ,那么很多概率就是 0 ,再按照狗的概率的高低排序,把狗的概率高的放在前面,低的放在后面,再对排序之后的结果进行非极大值抑制 NMS

3、非极大值抑制 NMS 如何操作?

1、

比如目前获得的 98 个竖条中,某几个竖条中狗的概率不是 0 ,并且是从高到低排序的。

 2、

先把最高的拿出来,之后把每一个都跟最高的作比较。比如拿第一个跟第二个比较,如果它两个的IOU(交并比)大于某一个阈值,我们认为两者重复识别了一个物体,就把低概率的过滤掉。阈值可以调节,如果阈值很低的话,比如 0.1NMS 是非常强的,稍微跟黄框有一丁点重叠,就被替掉了;而如果阈值设置的很高,需要另外一个框与黄框有非常高的重合才可能被替掉。所以如果想加强 NMS,可以把阈值设置的低一些。

3、

再看第二高的,因为 bb20 已经被淘汰,所以看 bb15,把后面所有比 0.2 低的框和蓝框比较,IOU(交并比)大于 0.5,所以将其归 0

4、

 最后就得到了橙框蓝框两个结果。其他一律都被归 0 。这就是 NMS 的流程。这只是对狗这一个类别,那么对每一个类别都应该这样操作,就获得了最终的目标检测结果。

5、

 20个类别,就进行20次的NMS非极大值抑制。

6、

最后结果是一个稀疏矩阵,将很多值设为 0 了,如果不为0,将其拿出,将其的类别和分数拿出,作为目标检测的结果。上图中 bb3,bb4,bb97有一些类别是不为0的,把不为0的类别索引找出来,即把它代表什么找出来,再把它的概率找出来,可视化在目标检测结果上,就获得最终的目标检测结果。

        在训练阶段是不需要进行NMS的,因为每一个框都在损失函数中占据一席之地,都会影响损失函数,所以不能随便在训练阶段把预测框替换掉,把概率抹零。只是在预测阶段,在已经训练出来这个模型之后,进行待测图片的预测的时候,才需要通过后处理,把低置信度的框过滤掉,再把重复识别同样物体的重复框只挑出一个。

### 实现非极大值抑制 (NMS) 的方法 在计算机视觉领域,非极大值抑制是一种用于消除冗余检测框的技术。当多个边界框重叠并指向同一目标时,通过计算这些框之间的交并比(IoU),可以保留最有可能的一个或几个框。 #### 非极大值抑制的工作原理 给定一组候选区域及其对应的置信度分数,按照以下方式执行 NMS: 1. 将所有的预测边框按其得分降序排列; 2. 初始化一个空列表来保存最终的选择结果; 3. 对于每一个未处理过的最高分的边框 B: - 如果没有任何其他边框与其存在显著重合,则将其加入到输出集合中; - 否则移除所有与当前边框有较大 IoU 值的对象; 此过程重复直到遍历完全部候选项为止[^3]。 #### 使用 C++ 和 OpenCV 进行非极大值抑制的具体实现 下面是基于上述逻辑,在 C++ 中利用 OpenCV 库完成非极大值抑制功能的一段示范代码: ```cpp #include <opencv2/opencv.hpp> #include <vector> #include <algorithm> using namespace cv; using namespace std; // 计算两个矩形间的 IOU double iou(Rect_<float> boxA, Rect_<float> boxB){ float interX = max(0.f,min(boxA.x + boxA.width ,boxB.x + boxB.width ) - max(boxA.x,boxB.x)); float interY = max(0.f,min(boxA.y + boxA.height,boxB.y + boxB.height)-max(boxA.y,boxB.y)); float intersectionArea = interX * interY; float unionArea = boxA.area() + boxB.area() - intersectionArea; return intersectionArea / unionArea; } void nonMaxSuppression(vector<Rect>& boxes,vector<float>& scores,float overlapThresh=0.5f){ vector<int> indices(scores.size()); iota(indices.begin(),indices.end(),0); sort(indices.begin(),indices.end(), [&scores](int a,int b){return scores[a]>scores[b];}); auto it = unique_if(indices,[&boxes,&iou,&overlapThresh](auto prevIdx,auto currIdx){ return iou(boxes[prevIdx],boxes[currIdx]) >= overlapThresh; }); indices.erase(it,indices.end()); vector<Rect> filteredBoxes; transform(indices.begin(),indices.end(),back_inserter(filteredBoxes), [&](int idx){return boxes[idx];}); swap(boxes,filteredBoxes); } ``` 这段程序定义了一个 `nonMaxSuppression` 函数接受三个参数:待过滤的目标位置数组 (`boxes`)、对应的位置评分向量(`scores`)以及可选阈值参数(`overlapThresh`)。该函数会返回经过筛选后的有效目标位置集合作为新的输入变量的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值