昨天介紹了 pytorch 的基本單元 tensor,那麼我們要如何應用現實中的資料呢?可以思考一下,我們平常用了哪些器官來認知這個世界呢?有眼睛、耳朵、肌膚等。
攝影機就像是電腦的眼睛,透過圖片、影片或串流的方式把現實的畫面記錄到電腦中,今天我們就用最基本的圖片作為範例,我隨手拍了一張滑鼠的照片來當作範例如下圖:
先安裝處理影像的函式庫 OpenCV,輸入以下指令來安裝:
pip install opencv-python
接著要引用 OpenCV 的函式庫,程式碼如下(OpenCV 會使用到 NumPy 的陣列):
import numpy as np
import cv2
題外話,為什麼叫做 cv2 呢?原因是 OpenCV 原本用 C 語言開發,後來改成 C++語言,因此就把 C 語言開發的稱 OpenCV1,改由 C++ 後開發的皆稱為 OpenCV2。
讀取一般的圖片檔,只要呼叫 cv2.imread
即可將圖片讀取進來,OpenCV 讀取預設是 BGR,PyTorch 使用 RGB 顏色空間,因此透過 cv2.cvtColor
來轉換:
# 讀取圖檔
img = cv2.imread('Day9/real_img.png')
# BGR 轉 RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 查看型態
type(img)
讀取後為有三個軸的物件,分別為空間軸(高度、寬度)和色彩通道(彩色為RGB),使用以下程式碼來查看:
img.shape
我拍的照片為 480 x 640的照片,因此會顯示以下數值(位置要特別注意):
Pytorch 要求圖片資料張量的軸為 C(色彩通道) x H(高度) x W(寬度),因此可以利用 permute()
函式來調整張量內部軸的排列
import torch
img = torch.from_numpy(img) # 將 numpy array 轉成 tensor
out = img.permute(2, 0, 1) # 將第2軸移到第0軸,原本的 0 軸和 1 軸往後移
out.shape # 顯示調整後的順序
使用 torchvision
中的 to_pil_image
方法將圖片顯示出來
from torchvision.transforms import functional as F
F.to_pil_image(out)
今天介紹如何讀取單張圖片並轉換成 tensor 的格式,特別需要注意的是每個函式要求的 Channel, Height, Width 不同,明天會介紹如何一次讀取多張照片。