溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用pytorch怎么將圖片數(shù)據(jù)轉(zhuǎn)換成tensor

發(fā)布時(shí)間:2021-03-05 14:49:21 來(lái)源:億速云 閱讀:373 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)使用pytorch怎么將圖片數(shù)據(jù)轉(zhuǎn)換成tensor,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、數(shù)據(jù)轉(zhuǎn)換

把圖片轉(zhuǎn)成成torch的tensor數(shù)據(jù),一般采用函數(shù):torchvision.transforms。通過(guò)一個(gè)例子說(shuō)明,先用opencv讀取一張圖片,然后在轉(zhuǎn)換;注意一點(diǎn)是:opencv儲(chǔ)存圖片的格式和torch的儲(chǔ)存方式不一樣,opencv儲(chǔ)存圖片格式是(H,W,C),而torch儲(chǔ)存的格式是(C,H,W)。

import torchvision.transforms as transforms
import cv2 as cv
img = cv.imread('image/000001.jpg')
print(img.shape)  # numpy數(shù)組格式為(H,W,C)
transf = transforms.ToTensor()
img_tensor = transf(img) # tensor數(shù)據(jù)格式是torch(C,H,W)
print(img_tensor.size())

使用pytorch怎么將圖片數(shù)據(jù)轉(zhuǎn)換成tensor

注意:使用torchvision.transforms時(shí)要注意一下,其子函數(shù) ToTensor() 是沒(méi)有參數(shù)輸入的,以下用法是會(huì)報(bào)錯(cuò)的

img_tensor = transforms.ToTensor(img)

必須是先定義和賦值轉(zhuǎn)換函數(shù),再調(diào)用并輸入?yún)?shù),正確用法:

img = cv.imread('image/000001.jpg')
transf = transforms.ToTensor()
img_tensor = transf(img)

再轉(zhuǎn)換過(guò)程中正則化

在使用 transforms.ToTensor() 進(jìn)行圖片數(shù)據(jù)轉(zhuǎn)換過(guò)程中會(huì)對(duì)圖像的像素值進(jìn)行正則化,即一般讀取的圖片像素值都是8 bit 的二進(jìn)制,那么它的十進(jìn)制的范圍為 [0, 255],而正則化會(huì)對(duì)每個(gè)像素值除以255,也就是把像素值正則化成 [0.0, 1.0]的范圍。通過(guò)例子理解一下:

import torchvision.transforms as transforms
import cv2 as cv
img = cv.imread('image/000001.jpg')
transf = transforms.ToTensor()
img_tensor = transf(img)
print('opencv', img)
print('torch', img_tensor)

使用pytorch怎么將圖片數(shù)據(jù)轉(zhuǎn)換成tensor

使用pytorch怎么將圖片數(shù)據(jù)轉(zhuǎn)換成tensor

三、自行修改正則化的范圍

使用transforms.Compose函數(shù)可以自行修改正則化的范圍,下面舉個(gè)例子正則化成 [-1.0, 1.0]

transf2 = transforms.Compose(
  [
    transforms.ToTensor(),
    transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
  ]
)
img_tensor2 = transf2(img)
print(img_tensor2)

使用pytorch怎么將圖片數(shù)據(jù)轉(zhuǎn)換成tensor

計(jì)算方式就是:

C=(C-mean)/ std

C為每個(gè)通道的所有像素值,彩色圖片為三通道圖像(BGR),所以mean和std是三個(gè)數(shù)的數(shù)組。

使用transforms.ToTensor()時(shí)已經(jīng)正則化成 [0,0, 0,1]了,那么(0.0 - 0.5)/0.5=-1.0,(1.0 - 0.5)/0.5=1.0,所以正則化成 [-1.0, 1.0]

補(bǔ)充:Python: 記錄一個(gè)關(guān)于圖片直接轉(zhuǎn)化為pytorch.tensor和numpy.array的不同之處的問(wèn)題

img = Image.open(img_path).convert("RGB")
img2 = torchvision.transforms.functional.to_tensor(img)
print(img2)
img1 = np.array(img)
print(img1)

輸出是這樣的:

使用pytorch怎么將圖片數(shù)據(jù)轉(zhuǎn)換成tensor

不僅shape不一樣,而且值也是不一樣的。

解釋如下:

tensor = torch.from_numpy(np.asarray(PIL.Image.open(path))).permute(2, 0, 1).float() / 255
tensor = torchvision.transforms.functional.to_tensor(PIL.Image.open(path)) # 兩種方法是一樣的

PIL.Image.open()得到HWC格式,直接使用numpy 去轉(zhuǎn)換得到(h,w,c)格式,而用to_tensor得到(c,h,w)格式且值已經(jīng)除了255。

byte()相當(dāng)于to(torch.uint8),tensor.numpy()是把tensor 轉(zhuǎn)化為numpy.array格式。

在這里需要注意的是PIL和OPENCV的圖像讀取得到的格式都是HWC格式,一般模型訓(xùn)練使用的是CHW格式, H為Y軸是豎直方向,W為X軸水平方向。

且torchvision.transforms.functional.to_tensor()對(duì)所有輸入都是有變換操作。

上述就是小編為大家分享的使用pytorch怎么將圖片數(shù)據(jù)轉(zhuǎn)換成tensor了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI