圖像張量化的幾種方式對(duì)比

深度學(xué)習(xí)中,圖像在送入模型之前一般要做張量話(huà)處理,下面分析幾種張量化的特點(diǎn).

一般圖片打開(kāi)后,需要根據(jù)情況做一些變換:

  • 通道的順序
    通過(guò)CV打開(kāi)的圖片,為BGR格式, 順序?yàn)? h,w,c.
    PIL打開(kāi)的圖片,為RGB格式, 順序也是: h,w,c.
    通過(guò)pytorch打開(kāi)的,比較特殊,為c,h,w.

  • 歸一化處理
    歸一化處理最簡(jiǎn)單的方式就是 /255.0 變成0-1之間浮點(diǎn)數(shù).
    也可以根據(jù)需要做均值化處理,或者變成-1-1之間數(shù)值.

  • 張量化處理
    根據(jù)模型對(duì)張量的要求,使用類(lèi)似:arr = arr.transpose(2, 0, 1).reshape([1, 3, 224, 224])的numpy函數(shù)做變換.最后變換成: batch,chanel,weight,height.

我的測(cè)試代碼:

from PIL import Image
import torchvision.transforms as T
import numpy as np
import cv2

# 
def load_data_tensor(path):
    trans = T.Compose([T.Resize(224), T.CenterCrop(224), T.ToTensor()])
    img = Image.open(path)
    img_tensor = trans(img).unsqueeze(0)
    return np.array(img_tensor)

def load_data_numpy(path):
    image = Image.open(path).convert('RGB')
    image = image.resize([224, 224])
    arr = np.array(image).astype(np.float32) / 255.0
    #arr = arr * 2.0 - 1.0
    arr = arr.transpose(2, 0, 1).reshape([1, 3, 224, 224])
    return  arr

def load_data_cv(path):
    image = cv2.imread(path)
    image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    image = cv2.resize(image,(224, 224))
    arr = np.array(image).astype(np.float32) / 255.0
    #arr = arr * 2.0 - 1.0
    arr = arr.transpose(2, 0, 1).reshape([1, 3, 224, 224])
    return  arr



r0 = load_data_tensor('test_photo.jpg')
print(r0[0][0])
print('-'*50)
r1 = load_data_numpy('test_photo.jpg')
print(r1[0][0])
r2 = load_data_cv('test_photo.jpg')


image = cv2.imread('test_photo.jpg')
cv2.imshow('raw:',image)


rr0 = r0[0].transpose(1, 2, 0)
rr0 = cv2.cvtColor(rr0,cv2.COLOR_RGB2BGR)
cv2.imshow('tensor:',rr0)
rr1 = r1[0].transpose(1, 2, 0)
rr1 = cv2.cvtColor(rr1,cv2.COLOR_RGB2BGR)
cv2.imshow('numpy:',rr1)
rr2 = r2[0].transpose(1, 2, 0)
rr2 = cv2.cvtColor(rr2,cv2.COLOR_RGB2BGR)
cv2.imshow('cv:',rr2)

cv2.waitKey(0)

Screen Shot 2021-08-28 at 09.58.56.png

我測(cè)試了三種模式:

  • load_data_tensor pytorch張量模式
  • load_data_numpy PIL的numpy模式
  • load_data_cv opencv的cv模式

調(diào)用后再?gòu)?fù)原順序,可視化顯示出來(lái)作比對(duì):

  • tensor模式使用了自動(dòng)crop功能,圖片沒(méi)有變形
  • numpy模式,邏輯清晰,比較好做進(jìn)一步處理
  • cv模式不知什么原因,圖像比較其他的丟失了一些細(xì)節(jié).
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容