如何建設(shè)一個(gè)屬于自己的網(wǎng)站/引擎優(yōu)化seo
1--前言
??????? 博主在處理圖片尺度問(wèn)題時(shí),習(xí)慣使用 cv2.resize() 函數(shù);但當(dāng)圖片數(shù)據(jù)需用顯卡加速運(yùn)算時(shí),數(shù)據(jù)需要在 GPU 和 CPU 之間不斷遷移,導(dǎo)致程序運(yùn)行效率降低;
??????? Pytorch 提供了一個(gè)類似于 cv2.resize() 的采樣函數(shù),即 torch.nn.functional.interpolate(),支持最近鄰插值(nearest)和雙線性插值(bilinear)等功能,通過(guò)設(shè)置合理的插值方式可以取得與 cv2.resize() 函數(shù)完全一樣的效果。
2--代碼測(cè)試
??????? ① 最近鄰方法('nearnest' 和 cv2.INTER_NEAREST):
import torch
import cv2
import torch.nn.functional as F
import numpy as npinput_data1 = torch.randint(low = 0, high = 255, size = [40, 40, 3])
input_data2 = np.array(input_data1, dtype = np.uint8)input_data1 = input_data1.permute(2, 0, 1).unsqueeze(0).float() # [1, 3, 40, 40]
output_data1 = F.interpolate(input_data1, size = (224, 224), mode='nearest').float() # [1, 3, 224, 224]
output_data2 = cv2.resize(input_data2, dsize = (224, 224), interpolation=cv2.INTER_NEAREST) # [224, 224, 3]data1 = np.array(output_data1.squeeze(0).permute(1, 2, 0), dtype=np.uint8)
data2 = np.array(output_data2, dtype=np.uint8)print(data1 == data2)print("All done !")
????????② 雙線性插值方法('bilinear' 和 cv2.INTER_LINEAR):
import torch
import cv2
import torch.nn.functional as F
import numpy as npinput_data1 = torch.randint(low = 0, high = 255, size = [40, 40, 3])
input_data2 = np.array(input_data1, dtype = np.uint8)input_data1 = input_data1.permute(2, 0, 1).unsqueeze(0).float() # [1, 3, 40, 40]
output_data1 = F.interpolate(input_data1, size = (224, 224), mode='bilinear').float() # [1, 3, 224, 224]
output_data2 = cv2.resize(input_data2, dsize = (224, 224), interpolation=cv2.INTER_LINEAR) # [224, 224, 3]data1 = np.array(output_data1.squeeze(0).permute(1, 2, 0), dtype=np.uint8)
data2 = np.array(output_data2, dtype=np.uint8)print(data1 == data2)print("All done !")
上面兩個(gè)測(cè)試代碼的結(jié)果表明,在采取相同插值方式的前提下,torch.nn.functional.interpolate() 和 cv2.resize() 兩個(gè)方法的功能是完全等價(jià)的,處理后的數(shù)據(jù)相同;
3--相關(guān)補(bǔ)充
??????? ① 使用 torch.nn.functional.interpolate()的注意事項(xiàng):
1. 插值方法(mode)與輸入數(shù)據(jù)的維度(minibatch, channels, [optional depth], [optional height], width)密切相關(guān),目前支持的數(shù)據(jù)維度有以下幾種:
????????① 3D張量輸入:minibatch, channels, width;
??????? ② 4D張量輸入:minibatch, channels, height, width;
??????? ③ 5D張量輸入:minibatch, channels, depth, height, width;
2. 插值方法和輸入維度的關(guān)系如下: