文章目录
交并比(IOU)
IoU (Interseeection over Union) 交并比:计算“预测边框”和“真实边框”的交集和并集的比值,用来衡量检测算法性能。
准确率(Precision)和召回率(Recall)
精度(Precision): 精度是精确性的度量,表示被分为正例的示例中实际为正例的比例。
Precision = TP /(TP + FP)
召回率(Recall):召回率是覆盖面的度量,度量有多少正例被分为正例。
Recall=TP/(TP + FN)
AP(平均精度)和mAP(平均精度均值)
AP和MAP是多标签分类任务的评价方法。假设整个数据集中共有5个苹果。我们收集了模型对苹果的所有预测,并根据预测的置信度(从最高的置信度到最低的置信度)对其进行排序。第二列表示预测是否正确。如果匹配ground truth和IoU 0.5,就是正确的。
当我们包含更多的预测时,召回值会增加,但精确度会上下波动。以Recall为横坐标,Precision为纵坐标,可以的得到PR曲线。
首先对PR曲线进行平滑,对于所有的Recall用最大精度替换当前精度。(线B是平滑前,线C是平滑后)
将召回值从0到1.0分成11个点,计算这11个召回值的最大精度值的平均值。
AP = (5x1 + 4x0.57 + 2x0.5)/ 11 (也可以理解为平滑后PR图线下面的面积)
mAP是所有类别的平均值,mAP = 所有类别的平均精度的和 / 所有的类别 。
非极大值抑制:NMS
NMS的作用是在目标检测中去掉重复的Bounding Box(BB)。
可以通过下面的图理解一下NMS:
NMS的整个过程:
- 获取所有的Bounding Box(BB)的信息(也就是图中的框框),按照置信分数从高到低排序,并记录当前分数最高的框。
- 计算当前最高分的框与其他框的IOU,然后删除所有IOU大于阈值的框。
- 对于剩下的框,循环执行上一步的操作直到剩下符合要求的框。
代码实现:
import numpy as np
def nms(dets, thresh):
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4]
areas = (x2-x1+1)*(y2-y1+1) # 计算面积
order = scores.argsort()[::-1] # 降序排列
keep = [] # 保存bounding box
while order.size > 0:
i = order[0]
keep.append(i)
xx1 = np.maximum(x1[i], x1[order[1:]]) # 计算xmin的max,即overlap的xmin
yy1 = np.maximum(y1[i], y1[order[1:]]) # 计算ymin的max,即overlap的ymin
xx2 = np.minimum(x2[i], x2[order[1:]]) # 计算xmax的min,即overlap的xmax
yy2 = np.minimum(y2[i], y2[order[1:]]) # 计算ymax的min,即overlap的ymax
w = np.maximum(0.0, xx2-xx1+1)
h = np.maximum(0.0, yy2-yy1+1)
inter = w*h # 计算相交部分面积
ovr = inter / (areas[i]+areas[order[1:]] - inter) # 计算IOU
inds = np.where(ovr <= thresh)[0]
order = order[inds+1]
return keep
Soft NMS
如下图所示,当两个目标重叠的时候,NMS然仍然会删除一个框,图中绿色的框会被删除。
Soft NMS通过权重下降重新调整置信度,如果一个检测框和另一个检测框有大部分重叠(IOU大),那它会有很低的分数。如果只是小部分重叠那么原有的分数不会受太大的改变。
Sliding-window(滑动窗口)
用于目标检测的一种蛮力方法是从左向右滑动窗口,从上向下滑动窗口使用分类来识别对象。 为了在不同的观察距离处检测不同的对象类型,使用大小和纵横比不同的窗口。
Select Search(选择搜索)
采用经典的滑动窗口+图像缩放的方案解决通用目标检测问题的成本太高。
在选择性搜索(SS)中,我们从每个单独的像素作为自己的组开始。 接下来,我们为每个组计算纹理并将两个最接近的纹理组合在一起。 我们将继续合并区域,直到所有内容组合在一起。