由于二者有一定共通之處,因此放在一篇文章內(nèi)介紹。
1. 關(guān)于torch.nn.functional.grid_sample函數(shù)的說明(F.grid_sample)
??該函數(shù)的作用是在圖像/體素空間中采樣特征。
1.1 輸入和輸出:
變量名 | 數(shù)據(jù)類型 | 默認值 | 含義 | 備注 |
---|---|---|---|---|
input | Tensor | - | 原始圖像/體素空間的特征 | 形狀需為 ( B , C , H , W ) (B,C,H,W) (B,C,H,W)或 ( B , C , D , H , W ) (B,C,D,H,W) (B,C,D,H,W),分別表示在圖像中采樣特征和在3D體素空間中采樣特征 |
grid | Tensor | - | 采樣圖像/體素空間的歸一化坐標(biāo) | 形狀需為 ( B , h , w , 2 ) (B,h,w,2) (B,h,w,2)(對應(yīng)4維input的情況)或 ( B , d , h , w , 3 ) (B,d,h,w,3) (B,d,h,w,3)(對應(yīng)5維input的情況),具體見1.2節(jié) |
mode | str | ‘bilinear’ | 采樣特征的插值方式 | 可為’bilinear’(雙線性插值)、‘nearest’(最近鄰插值)、‘bicubic’(雙三次插值) |
padding_mode | str | ‘zeros’ | 圖像/體素空間外側(cè)填充方式 | 可為’zeros’(零填充)、‘border’(邊界值填充)或’reflection’(反射填充,詳見官方介紹) |
align_corners | bool | False | 是否將像素看作點而非方塊 | False表示將像素看作方塊,而True表示將像素看作點(具體見1.2節(jié)) |
返回值 | Tensor | 返回值 | 采樣得到的特征圖 | 形狀為 ( B , C , h , w ) (B,C,h,w) (B,C,h,w)(對應(yīng)4維input的情況)或 ( B , C , d , h , w ) (B,C,d,h,w) (B,C,d,h,w)(對應(yīng)5維input的情況) |
1.2 需要注意的地方
以4維輸入(即從圖像采樣特征)為例,設(shè)圖像的大小為 ( H , W ) (H,W) (H,W)。
- 當(dāng)align_corner=False時,函數(shù)會將像素視為方塊,并以圖像左上角像素的左上角為原點建立坐標(biāo)系(如下左圖所示);否則函數(shù)會將像素視為點,以圖像左上角像素(中心)為原點建立坐標(biāo)系(如下右圖所示)。
- 參數(shù)grid的元素需主要分布在 [ ? 1 , 1 ] [-1,1] [?1,1]內(nèi),表示歸一化采樣坐標(biāo)。其中 ? 1 -1 ?1表示圖像范圍內(nèi)的最小坐標(biāo),而 1 1 1表示圖像范圍內(nèi)的最大坐標(biāo)(如上圖所示)。
- 參數(shù)grid中的最后一維的順序為 ( x , y ) (x,y) (x,y),但輸入圖像大小 ( H , W ) (H,W) (H,W)對應(yīng) ( y _ s i z e , x _ s i z e ) (y\_size,x\_size) (y_size,x_size)。例子如下:
a = torch.arange(12, dtype=torch.float).reshape(3,4).unsqueeze(0).unsqueeze(0) # (1,1,3,4)
grid = torch.tensor([[[-0.25,-1.0], [1.0,-1.0]],
[[-1.0, 1.0], [1.0, 1.0]]]).unsqueeze(0) # (1,2,2,2)
out = F.grid_sample(a, grid=grid, padding_mode='border') # (1,1,2,2)
# 輸出a:
# tensor([[[[ 0., 1., 2., 3.],
# [ 4., 5., 6., 7.],
# [ 8., 9., 10., 11.]]]])
# 輸出out:
# tensor([[[[ 1., 3.],
# [ 8., 11.]]]])
# 我們只關(guān)注采樣的左上角元素,坐標(biāo)為(-0.25,-1.0),對應(yīng)上左圖中的第一行第二個格子的頂部中心,
# 在雙線性插值、邊界值填充的情況下采樣特征就是該像素的特征1。
- 對于5維輸入(即從體素空間采樣特征)的情況,參數(shù)grid中的最后一維順序為 ( x , y , z ) (x,y,z) (x,y,z),但輸入體素空間大小 ( D , H , W ) (D,H,W) (D,H,W)對應(yīng) ( z _ s i z e , y _ s i z e , x _ s i z e ) (z\_size,y\_size,x\_size) (z_size,y_size,x_size)。例子如下:
a = torch.arange(12, dtype=torch.float).reshape(3,4).unsqueeze(0).unsqueeze(0) # (1,1,3,4)
grid = torch.tensor([[[[-0.25, -1.0, -1.0], [1.0, -1.0, -1.0]],
[[ -1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]]]).unsqueeze(0) # (1,1,2,2,3)
out = F.grid_sample(a, grid=grid, padding_mode='border') # (1,1,1,2,2)
# 輸出a:
# tensor([[[[[ 0., 1., 2., 3.],
# [ 4., 5., 6., 7.],
# [ 8., 9., 10., 11.]], # 第一層
#
# [[12., 13., 14., 15.],
# [16., 17., 18., 19.],
# [20., 21., 22., 23.]]]]]) # 第二層
# 輸出out:
# tensor([[[[[ 1., 3.],
# [20., 23.]]]]])
# 我們只關(guān)注采樣的左上角元素,前兩個維度的坐標(biāo)為(-0.25,-1.0),對應(yīng)上左圖中的第一行第二個格子的頂部中心;
# 而第三個維度的坐標(biāo)為-1.0,對應(yīng)最上層的最上部(自行想象3D體素空間)。在雙線性插值、邊界值填充的情況下,
# 采樣特征就是該體素(最上層、第一行第二個體素)的特征1。
2. 3D空間中的點向圖像投影時的易錯點
2.1 點向圖像的投影
??設(shè)圖像的內(nèi)參矩陣( 3 × 4 3\times4 3×4)擴維為 4 × 4 4\times4 4×4后的矩陣為 I \textbf{I} I,相機坐標(biāo)系中的點(3維)擴維到4維后的向量為 p = ( x , y , z , 1 ) T \textbf{p}=(x,y,z,1)^T p=(x,y,z,1)T,圖像坐標(biāo)系下的像素索引(可為小數(shù))為 ( u , v ) (u,v) (u,v),深度為 d d d,則 ( u d , v d , d , 1 ) T = I ? p (ud,vd,d,1)^T=\textbf{I}\cdot\textbf{p} (ud,vd,d,1)T=I?p
2.2 易錯點:小數(shù)索引轉(zhuǎn)換為整數(shù)索引(尋找對應(yīng)的像素)
??下圖所示為上述
(
u
,
v
)
(u,v)
(u,v)被定義的坐標(biāo)系以及像素的整數(shù)索引。文章來源:http://www.zghlxwxcb.cn/news/detail-423156.html
可見,應(yīng)該對小數(shù)索引進行floor()操作,以找到其對應(yīng)像素的整數(shù)索引。文章來源地址http://www.zghlxwxcb.cn/news/detail-423156.html
到了這里,關(guān)于torch.nn.functional.grid_sample(F.grid_sample)函數(shù)的說明 & 3D空間中的點向圖像投影的易錯點的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!