文学类网站模板,wordpress建站流量,企业网站用织梦好吗,玉林博白网站建设锚框的计算公式
假设原图的高为H,宽为W
详细公式推导 以同一个像素点为锚框#xff0c;可以生成 (n个缩放 m个宽高比 -1 )个锚框 锚框的作用#xff1a;
不用直接去预测真实框的四个坐标#xff0c;而是#xff1a; 1.先生成多个锚框。 2.预测每个锚框里是否含有要预测…锚框的计算公式
假设原图的高为H,宽为W
详细公式推导 以同一个像素点为锚框可以生成 (n个缩放 m个宽高比 -1 )个锚框 锚框的作用
不用直接去预测真实框的四个坐标而是 1.先生成多个锚框。 2.预测每个锚框里是否含有要预测的目标。 3.如果是预测从这个锚框到真实框的偏移(一般是中心点的偏移)。
计算锚框与真实框的IOU
def box_iou(boxes1,boxes2)::param boxes1: shape (boxes1的数量,4):param boxes2: shape (boxes2的数量,4):param areas1: boxes1中每个框的面积 shape (boxes1的数量):param areas2: boxes2中每个框的面积 shape (boxes2的数量):return:# 定义一个Lambda函数输入boxes内容是计算得到框的面积box_area lambda boxes:((boxes[:,2] - boxes[:0]) * (boxes[:3] - boxes[:0]))# 计算面积areas1 box_area(boxes1)areas2 box_area(boxes2)# 计算交集 要把所有锚框的左上角坐标 与 真实框的所有左上角坐标 作比较,大的就是交集的左上角 ,加个None 可以让锚框与所有真实框作对比inter_upperlefts torch.max(boxes1[:,None,:2],boxes2[:,:2])# 把所有锚框的右下角坐标 与 真实框的所有右下角坐标 作比较,小的就是交集的右下角坐标 ,加个None 可以让锚框与所有真实框作对比inter_lowerrights torch.min(boxes1[:,None,2:],boxes2[:,2:])# 如果右下角-左上角有元素小于0那就说明没有交集clamp(min-0)会将每个元素与0比较小于0的元素将会被替换成0inters (inter_lowerrights - inter_upperlefts).clamp(min0) # 得到w和hinter_areas inters[:,:,0] * inters[:,:,1] # 每个样本的 w*h# 求锚框与真实框的并集# 将所有锚框与真实框相加他们会多出来一个交集的面积所以要减一个交集的面积union_areas areas1[:,None] * areas2 - inter_areasreturn inter_areas/union_areas给训练集标注锚框
每个锚框包含的信息有每个锚框的类别 和 偏移量。 偏移量指的是真实边界相对于锚框的偏移量。
预测时为每张图片生成多个锚框预测所有锚框的类别和偏移量。
举例
假设有4个真实框 B1,B2,B3,B4。 9个锚框A1,A2,A3,A4,A5,A6,A7,A8,A9。 如上每个真实框都要与所有的锚框计算IOU如X23在第三列拥有最大的IOU如果该IOU大于阈值那么第2个锚框的类别就是B3分配完类别之后第二个锚框和第3个真实框将不再参与表现为上面的矩阵去掉第二行第三列。
补充
训练集不是光使用标注的真实的框做标签来训练吗为啥要锚框当做训练样本
应该是扩大训练集的方式如果只有一张图片上面标注上了一个真实的框那么就只有一个训练样本如果生成一些锚框根据真实的框计算IOU来给生成的锚框标记上相应的类别和与真实框的中心值偏移量那么这些锚框也成为了训练样本。
lambda匿名函数
它可以用于简洁地定义一个单行的函数
add lambda x, y: x y
print(add(2, 3)) # 输出结果为 5torch.max(boxes1[:, None, :2], boxes2[:, :2])
import torch # 定义两个张量
boxes1 torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8]]) # 形状为(2, 4)
boxes2 torch.tensor([[2, 3,4,5], [6, 7,8,9]])
print(boxes1.shape, boxes2.shape)torch.Size([2, 4]) torch.Size([2, 4])
print(boxes1[:, None, :2])
print(boxes1[:, None, :2].shape)tensor([[[1, 2]],[[5, 6]]])
torch.Size([2, 1, 2]) 变成了两个通道每个通道有个一行两列的元素boxes2[:,:2]tensor([[2, 3],[6, 7]])print(torch.max(boxes1[:, None, :2], boxes2[:, :2]))
torch.max(boxes1[:, None, :2], boxes2[:, :2]).shapetensor([[[2, 3],[6, 7]],[[5, 6],[6, 7]]])
torch.Size([2, 2, 2]) 变成两个通道每个通道有两行每行有两列的元素print(torch.max(boxes1[:, :2], boxes2[:, :2]))tensor([[2, 3],[6, 7]])