pytorch 把圖片數據轉化成tensor的操作
摘要:
在圖像識別當中,一般步驟是先讀取圖片,然後把圖片數據轉化成tensor格式,再輸送到網絡中去。本文將介紹如何把圖片轉換成tensor。
一、數據轉換
把圖片轉成成torch的tensor數據,一般采用函數:torchvision.transforms。通過一個例子說明,先用opencv讀取一張圖片,然後在轉換;註意一點是:opencv儲存圖片的格式和torch的儲存方式不一樣,opencv儲存圖片格式是(H,W,C),而torch儲存的格式是(C,H,W)。
import torchvision.transforms as transforms import cv2 as cv img = cv.imread('image/000001.jpg') print(img.shape) # numpy數組格式為(H,W,C) transf = transforms.ToTensor() img_tensor = transf(img) # tensor數據格式是torch(C,H,W) print(img_tensor.size())
註意:使用torchvision.transforms時要註意一下,其子函數 ToTensor() 是沒有參數輸入的,以下用法是會報錯的
img_tensor = transforms.ToTensor(img)
必須是先定義和賦值轉換函數,再調用並輸入參數,正確用法:
img = cv.imread('image/000001.jpg') transf = transforms.ToTensor() img_tensor = transf(img)
再轉換過程中正則化
在使用 transforms.ToTensor() 進行圖片數據轉換過程中會對圖像的像素值進行正則化,即一般讀取的圖片像素值都是8 bit 的二進制,那麼它的十進制的范圍為 [0, 255],而正則化會對每個像素值除以255,也就是把像素值正則化成 [0.0, 1.0]的范圍。通過例子理解一下:
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)
三、自行修改正則化的范圍
使用transforms.Compose函數可以自行修改正則化的范圍,下面舉個例子正則化成 [-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)
計算方式就是:
C=(C-mean)/ std
C為每個通道的所有像素值,彩色圖片為三通道圖像(BGR),所以mean和std是三個數的數組。
使用transforms.ToTensor()時已經正則化成 [0,0, 0,1]瞭,那麼(0.0 – 0.5)/0.5=-1.0,(1.0 – 0.5)/0.5=1.0,所以正則化成 [-1.0, 1.0]
補充:Python: 記錄一個關於圖片直接轉化為pytorch.tensor和numpy.array的不同之處的問題
img = Image.open(img_path).convert("RGB") img2 = torchvision.transforms.functional.to_tensor(img) print(img2) img1 = np.array(img) print(img1)
輸出是這樣的:
不僅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 去轉換得到(h,w,c)格式,而用to_tensor得到(c,h,w)格式且值已經除瞭255。
byte()相當於to(torch.uint8),tensor.numpy()是把tensor 轉化為numpy.array格式。
在這裡需要註意的是PIL和OPENCV的圖像讀取得到的格式都是HWC格式,一般模型訓練使用的是CHW格式, H為Y軸是豎直方向,W為X軸水平方向。
且torchvision.transforms.functional.to_tensor()對所有輸入都是有變換操作。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- pytorch 中transforms的使用詳解
- pytorch 如何實現HWC轉CHW
- Pytorch中的圖像增廣transforms類和預處理方法
- Pytorch使用transforms
- 初識Pytorch使用transforms的代碼