来源Coursera吴恩达深度学习课程
目前为止的目标检测中可能出现的问题是你的算法可能对同一个对象做出多次检测。非极大值抑制non-max suppression这个方法可以确保你的算法对每个对象只检测一次我们讲一个例子。
假设你需要在这张图片里检测行人和汽车你可能会在上面放个19×19网格理论上这辆车只有一个中点所以它应该只被分配到一个格子里左边的车子也只有一个中点所以理论上应该只有一个格子做出有车的预测。
但是当你实际在运行算法时会出现上图的情况可能好几个格子会认为有车。
当你在361个格子上都运行一次图像检测和定位算法最后可能会对同一个对象做出多次检测所以非极大值抑制做的就是清理这些检测结果。这样一辆车只检测一次而不是每辆车都触发多次检测。具体做法如下图
首先看概率最大的那个这个例子右边车辆中p_c是0.9然后就说这是最可靠的检测most confident detection所以我们就用高亮标记表明这里找到了一辆车。这么做之后非极大值抑制就会逐一审视剩下的矩形所有和这个最大的边框有很高交并比Intersection over union高度重叠的其他边界框那么这些输出就会被抑制。所以这两个矩形p_c分别是0.6和0.7和淡蓝色矩形重叠程度很高所以会被抑制变暗表示它们被抑制了。
接下来逐一审视剩下的矩形找出概率最高p_c最高的一个在这种情况下是0.8如上图我们就认为这里检测出一辆车左边车辆然后非极大值抑制算法就会去掉其他loU值很高的矩形。所以现在每个矩形都会被高亮显示highlighted或者变暗darkens如果你直接抛弃变暗的矩形那就剩下高亮显示的那些这就是最后得到的两个预测结果。
所以这就是非极大值抑制non-max suppression非最大值意味着你只输出概率最大的分类结果但抑制很接近但不是最大的其他预测结果所以这方法叫做非极大值抑制。
下面来看看算法的细节。假设这里只做汽车检测。
现在要实现非极大值抑制你可以做的
①第一件事是去掉所有p_c小于某个阈值的边界框这里假设是0.6所以只是抛弃所有低概率low probability的边界框。
②接下来使用非极大值抑制while循环的第一步你就一直选择概率p_c最高的边界框取一个边界框让它高亮显示这样做出有一辆车的预测。
③while循环的第二步是上一步变暗的那些边界框以及和高亮标记的边界重叠面积很高的那些边界框抛弃掉。
到目前为止Andrew只介绍了算法检测单个对象a single object的情况如果你尝试同时检测三个对象比如说行人、汽车、摩托那么输出向量就会有三个额外的分量three additional components。事实证明正确的做法是独立进行三次非极大值抑制对每个输出类别都做一次。
这就是非极大值抑制如果你能实现我们说过的目标检测算法你其实可以得到相当不错的结果。
说明记录学习笔记如果错误欢迎指正转载请联系我。