網(wǎng)站設(shè)計(jì)風(fēng)格有哪幾種網(wǎng)站服務(wù)器查詢工具
錨框的計(jì)算公式
假設(shè)原圖的高為H,寬為W
詳細(xì)公式推導(dǎo)
以同一個(gè)像素點(diǎn)為錨框,可以生成 (n個(gè)縮放 + m個(gè)寬高比 -1 )個(gè)錨框
錨框的作用:
不用直接去預(yù)測真實(shí)框的四個(gè)坐標(biāo),而是:
1.先生成多個(gè)錨框。
2.預(yù)測每個(gè)錨框里是否含有要預(yù)測的目標(biāo)。
3.如果是,預(yù)測從這個(gè)錨框到真實(shí)框的偏移(一般是中心點(diǎn)的偏移)。
計(jì)算錨框與真實(shí)框的IOU
def box_iou(boxes1,boxes2):''':param boxes1: shape = (boxes1的數(shù)量,4):param boxes2: shape = (boxes2的數(shù)量,4):param areas1: boxes1中每個(gè)框的面積 ,shape = (boxes1的數(shù)量):param areas2: boxes2中每個(gè)框的面積 ,shape = (boxes2的數(shù)量):return:'''# 定義一個(gè)Lambda函數(shù),輸入boxes,內(nèi)容是計(jì)算得到框的面積box_area = lambda boxes:((boxes[:,2] - boxes[:0]) * (boxes[:3] - boxes[:0]))# 計(jì)算面積areas1 = box_area(boxes1)areas2 = box_area(boxes2)# 計(jì)算交集 要把所有錨框的左上角坐標(biāo) 與 真實(shí)框的所有左上角坐標(biāo) 作比較,大的就是交集的左上角 ,加個(gè)None 可以讓錨框與所有真實(shí)框作對(duì)比inter_upperlefts = torch.max(boxes1[:,None,:2],boxes2[:,:2])# 把所有錨框的右下角坐標(biāo) 與 真實(shí)框的所有右下角坐標(biāo) 作比較,小的就是交集的右下角坐標(biāo) ,加個(gè)None 可以讓錨框與所有真實(shí)框作對(duì)比inter_lowerrights = torch.min(boxes1[:,None,2:],boxes2[:,2:])# 如果右下角-左上角有元素小于0,那就說明沒有交集,clamp(min-0)會(huì)將每個(gè)元素與0比較,小于0的元素將會(huì)被替換成0inters = (inter_lowerrights - inter_upperlefts).clamp(min=0) # 得到w和hinter_areas = inters[:,:,0] * inters[:,:,1] # 每個(gè)樣本的 w*h# 求錨框與真實(shí)框的并集# 將所有錨框與真實(shí)框相加,他們會(huì)多出來一個(gè)交集的面積,所以要減一個(gè)交集的面積union_areas = areas1[:,None] * areas2 - inter_areasreturn inter_areas/union_areas
給訓(xùn)練集標(biāo)注錨框
每個(gè)錨框包含的信息有:每個(gè)錨框的類別 和 偏移量。
偏移量指的是:真實(shí)邊界相對(duì)于錨框的偏移量。
預(yù)測時(shí):為每張圖片生成多個(gè)錨框,預(yù)測所有錨框的類別和偏移量。
舉例
假設(shè)有4
個(gè)真實(shí)框 B1,B2,B3,B4。
9
個(gè)錨框A1,A2,A3,A4,A5,A6,A7,A8,A9。
如上,每個(gè)真實(shí)框都要與所有的錨框計(jì)算IOU,如X23,在第三列,擁有最大的IOU,如果該IOU大于閾值,那么第2個(gè)錨框的類別就是B3,分配完類別之后,第二個(gè)錨框和第3個(gè)真實(shí)框?qū)⒉辉賲⑴c,表現(xiàn)為上面的矩陣去掉第二行第三列。
補(bǔ)充:
訓(xùn)練集不是光使用標(biāo)注的真實(shí)的框做標(biāo)簽來訓(xùn)練嗎?為啥要錨框當(dāng)做訓(xùn)練樣本?
應(yīng)該是擴(kuò)大訓(xùn)練集的方式,如果只有一張圖片,上面標(biāo)注上了一個(gè)真實(shí)的框,那么就只有一個(gè)訓(xùn)練樣本,如果生成一些錨框,根據(jù)真實(shí)的框,計(jì)算IOU,來給生成的錨框標(biāo)記上相應(yīng)的類別和與真實(shí)框的中心值偏移量,那么這些錨框也成為了訓(xùn)練樣本。
lambda匿名函數(shù)
它可以用于簡潔地定義一個(gè)單行的函數(shù)
add = lambda x, y: x + y
print(add(2, 3)) # 輸出結(jié)果為 5
torch.max(boxes1[:, None, :2], boxes2[:, :2])
import torch # 定義兩個(gè)張量
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]) 變成了兩個(gè)通道,每個(gè)通道有個(gè)一行兩列的元素
boxes2[:,:2]
tensor([[2, 3],[6, 7]])
print(torch.max(boxes1[:, None, :2], boxes2[:, :2]))
torch.max(boxes1[:, None, :2], boxes2[:, :2]).shape
tensor([[[2, 3],[6, 7]],[[5, 6],[6, 7]]])
torch.Size([2, 2, 2]) 變成兩個(gè)通道,每個(gè)通道有兩行,每行有兩列的元素
print(torch.max(boxes1[:, :2], boxes2[:, :2]))
tensor([[2, 3],[6, 7]])