在第一张图片中,仅对图像中的对象进行“分类”。这是一个分类问题。在第二张图片中,仅对图像中的对象进行“定位”。这是一个定位问题。在第三张图片中,同时对对象进行“分类和定位”。这是一个目标检测问题。希望对目标检测的概念有了基本的了解。如果想详细了解目标检测,可以阅读以下博客:
什么是非极大值抑制(NMS)?
图像中的对象可能具有不同的大小和形状,为了完美捕捉每一个对象,目标检测算法会创建多个边界框。理想情况下,对于图像中的每个对象,只需要一个边界框。为了从多个预测的边界框中选择最佳的边界框,这些目标检测算法使用非极大值抑制。这种技术用于“抑制”不太可能的边界框,只保留最佳的那个。
非极大值抑制如何工作?
非极大值抑制的目的是为对象选择最佳的边界框,并拒绝或“抑制”所有其他边界框。该算法迭代选择最佳边界框,比较重叠,并移除冗余的框,直到收敛。NMS考虑两个因素:模型给出的对象分数和边界框的重叠或IOU。
非极大值抑制首先选择具有最高对象分数的边界框,然后移除所有其他具有高重叠的框。在这个过程中,迭代地选择具有最高对象分数的边界框,并移除与该框重叠度(IOU)大于某个阈值的所有其他框。这个过程一直运行,直到没有更多的框被减少。最后,将得到以下结果。
NMS伪代码
现在应该对非极大值抑制有了很好的理解。让将非极大值抑制的过程分解为步骤。假设构建了一个目标检测模型来检测以下内容——狗或人。这个目标检测模型给出了以下一组边界框以及对象分数。以下是使用NMS选择最佳边界框的过程:
1. 选择具有最高对象分数的框
2. 然后,比较这个框与其他框的重叠(交集比)
3. 移除重叠(交集比)>50%的边界框
4. 然后,转到下一个最高对象分数
5. 最后,重复步骤2-4
NMS实现
现在已经很好地理解了非极大值抑制以及它的工作原理,让看看它的简单实现。假设有相同的人和狗的图像(在前一节中使用过),有六个边界框和每个边界框的对象分数。将加载图像并绘制所有六个边界框。
# 导入必要的库
from torchvision.ops import nms
# 假设boxes和scores是已经定义好的边界框坐标和对象分数
keep = nms(boxes, scores, iou_threshold=0.5)
这个函数返回一个边界框列表,作为输出,在对象分数降序排列。由于设置了一个非常低的阈值,输出只有两个框。但是如果设置一个更高的阈值,将得到更多的边界框。在这种情况下,可以选择前n个边界框(其中n应该是图像中对象的数量)。