You Only Look Once
Yolov1直接采用网络特征输出,实现置信度预测、分类、边界框回归;
核心内容总结:
- 输入图像划分为 S × S 网格。如果对象的中心落入网格单元中,则该网格单元负责检测该对象;
- 每个网格单元预测 B 个边界框以及这些框的置信度分数,这些置信度分数反映了模型对盒子包含对象的置信度,以及模型认为盒子预测的准确性。
- 每个边界框由 5 个预测组成:x、y、w、h 和置信度。 (x, y) 坐标表示相对于网格单元边界的框中心。宽度和高度是相对于整个图像预测的。
- 置信度预测表示预测框与任何地面实况框之间的 IOU。每个网格单元还预测 C 个条件类概率 Pr(Classi|Object)。这些概率以包含对象的网格单元为条件。无论框 B 的数量如何,我们仅预测每个网格单元的一组类概率。
在测试时,我们将条件类概率与单个框置信度预测相乘。
置信度定义
将图像划分S*S的规则格网,根据格网分别进行边界框-置信度预测以及格网类别的预测,置信度为类别概率与之边界框真实值与预测值的交并比;每个cell预测B个边界框与置信度。
类别条件概率
类别概率是每个cell的独立条件,与边界框数量无关;
NMS
def nms(bboxes, scores, nms_thresh):
""""Pure Python NMS."""
x1 = bboxes[:, 0] #xmin
y1 = bboxes[:, 1] #ymin
x2 = bboxes[:, 2] #xmax
y2 = bboxes[:, 3] #ymax
# 根据矩阵惩罚,计算每个bbox的面积
areas = (x2 - x1) * (y2 - y1)
order = scores.argsort()[::-1]# 将score进行倒序排列;scores.argsort() 方法用于对张量(tensor)scores中的元素进行排序,但它返回的不是排序后的张量值
#,而是原始张量中元素位置的索引,这些索引表示了如果排序后它们将处于什么位置
# 进行非非极大抑制
keep = [] #
while order.size > 0:# 首先选取score最高的
i = order[0]
keep.append(i)
# 计算当前选定的边界框与其他边界框的IoU相交区域的坐标范围
# compute iou,根据左上角的最大x1,y1与右下角的最小值x2,y2,计算相交区域的边界框的坐标
xx1 = np.maximum(x1[i], x1[order[1:]])
yy1 = np.maximum(y1[i], y1[order[1:]])
xx2 = np.minimum(x2[i], x2[order[1:]])
yy2 = np.minimum(y2[i], y2[order[1:]])
# 计算交集面积,
w = np.maximum(1e-10, xx2 - xx1)
h = np.maximum(1e-10, yy2 - yy1)
inter = w * h
# IOU:交集与并集之比 = inter/(areas[i](选定区域)+area(其他区域)-inter(重叠区域的计算了两次))
iou = inter / (areas[i] + areas[order[1:]] - inter + 1e-14)
#保留iou小于该阈值的元素索引
inds = np.where(iou <= nms_thresh)[0]
order = order[inds + 1]
return keep
np.maxmium
比较两个数组元素,并返回最大值
# 示例1:两个一维数组
a = np.array([1, 2, 3, 4])
b = np.array([2, 3, 1, 5])
result = np.maximum(a, b)
print(result) # 输出:[2 3 3 5]
# 示例2:一维数组与标量
a = np.array([1, 2, 3, 4])
result = np.maximum(a, 3)
print(result) # 输出:[3 3 3 4]
# 示例3:两个多维数组
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [2, 1]])
result = np.maximum(a, b)
print(result) # 输出:[[5 6] [3 4]]
np.minmium与之类似
np.argsort()
argsort()函数是NumPy库中的一个函数,用于返回数组元素排序后的索引值。它可以用于一维或多维数组。
numpy.argsort(a, axis=-1, kind=‘quicksort’, order=None)
示例