兩者都是用來實現上採樣,假設採樣倍數爲scale, 則把(H, W, C) -->變爲(H*scale, W*scale,C)
下面以2倍上採樣爲例。
1.Upsample通過插值方法完成上採樣。所以不需要訓練參數。
nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
其中mode爲選擇的插值方法。
雙線性插值原理及公式:
所以爲了求P點需要根據P得到Q11,Q12,Q21以及Q22的座標以及值!
步驟如下:
1)求P點座標。對於目標圖上的一個點Pdst,先求取對應的在源圖上的點P,一般以像素中心爲標準.(如果標準不同會導致最後的resize結果不同, 如opencv和matlab)
2)利用P點座標求Q11,Q12,Q21以及Q22的座標以及值。因爲P點一般爲小數,則對應的4個點就是相鄰整數,如下圖所示,則值也可以求出
3)套用公式,得到目標圖上Pdst的值。
代碼如下:
for n in range(3): # 對channel循環
for dst_y in range(dst_h): # 對height循環
for dst_x in range(dst_w): # 對width循環
# 目標在源上的座標
src_x = (dst_x + 0.5) * scale_x - 0.5
src_y = (dst_y + 0.5) * scale_y - 0.5
# 計算在源圖上四個近鄰點的位置
src_x_0 = int(np.floor(src_x))
src_y_0 = int(np.floor(src_y))
src_x_1 = min(src_x_0 + 1, src_w - 1)
src_y_1 = min(src_y_0 + 1, src_h - 1)
# 雙線性插值
value0 = (src_x_1 - src_x) * src[src_y_0, src_x_0, n] + (src_x - src_x_0) * src[src_y_0, src_x_1, n]
value1 = (src_x_1 - src_x) * src[src_y_1, src_x_0, n] + (src_x - src_x_0) * src[src_y_1, src_x_1, n]
dst[dst_y, dst_x, n] = int((src_y_1 - src_y) * value0 + (src_y - src_y_0) * value1)
return dst
參考:https://zhuanlan.zhihu.com/p/49832888
2.ConvTranspose2d可以理解爲卷積的逆過程。所以可以訓練參數
nn.ConvTranspose2d(mid_channels, mid_channels, kernel_size=4, stride=2, padding=1)
其中輸出尺寸與輸入關係如下,所以,k=4, s=2, p=1即2倍上採樣。
具體執行過程爲通過對原圖插值0,擴大尺寸,然後改變卷積參數,對擴大尺寸後的進行卷積即nn.ConvTranspose2d:
1)原圖插值,在兩兩元素之間插0。
2)改變參數。新的卷積核:Stride′=1, kernel的size′ = size padding' 爲Size−padding−1
3)卷積
如圖所示:(3*3)--> (6*6)
具體計算過程參考:https://blog.csdn.net/qq_27261889/article/details/86304061
兩者的聯繫:
https://zhuanlan.zhihu.com/p/32414293
可以初始化nn.ConvTranspose2d參數模擬雙線性插值
其他參考: