Upsample與ConvTranspose2d

兩者都是用來實現上採樣,假設採樣倍數爲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參數模擬雙線性插值

其他參考:

https://zhuanlan.zhihu.com/p/39240159

發佈了69 篇原創文章 · 獲贊 18 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章