亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Python圖像讀寫方法對(duì)比

瀏覽:9日期:2022-07-05 13:46:12

1 實(shí)驗(yàn)標(biāo)準(zhǔn)

因?yàn)橛?xùn)練使用的框架是Pytorch,因此讀取的實(shí)驗(yàn)標(biāo)準(zhǔn)如下:

1、讀取分辨率都為1920x1080的5張圖片(png格式一張,jpg格式四張)并保存到數(shù)組。

2、將讀取的數(shù)組轉(zhuǎn)換為維度順序?yàn)镃xHxW的Pytorch張量,并保存到顯存中(我使用GPU訓(xùn)練),其中三個(gè)通道的順序?yàn)镽GB。

3、記錄各個(gè)方法在以上操作中所耗費(fèi)的時(shí)間。因?yàn)閜ng格式的圖片大小差不多是質(zhì)量有微小差異的jpg格式的10倍,所以數(shù)據(jù)集通常不會(huì)用png來保存,就不比較這兩種格式的讀取時(shí)間差異了。

寫入的實(shí)驗(yàn)標(biāo)準(zhǔn)如下:

1、將5張1920x1080的5張圖像對(duì)應(yīng)的Pytorch張量轉(zhuǎn)換為對(duì)應(yīng)方法可使用的數(shù)據(jù)類型數(shù)組。

2、以jpg格式保存五張圖片。

3、記錄各個(gè)方法保存圖片所耗費(fèi)的時(shí)間。

2 實(shí)驗(yàn)情況

2.1 cv2

因?yàn)橛蠫PU,所以cv2讀取圖片有兩種方式:

1、先把圖片都讀取為一個(gè)numpy數(shù)組,再轉(zhuǎn)換成保存在GPU中的pytorch張量。

2、初始化一個(gè)保存在GPU中的pytorch張量,然后將每張圖直接復(fù)制進(jìn)這個(gè)張量中。

第一種方式實(shí)驗(yàn)代碼如下:

import os, torchimport cv2 as cv import numpy as np from time import time read_path = ’D:test’write_path = ’D:testwrite’ # cv2讀取 1start_t = time()imgs = np.zeros([5, 1080, 1920, 3])for img, i in zip(os.listdir(read_path), range(5)): img = cv.imread(filename=os.path.join(read_path, img)) imgs[i] = img imgs = torch.tensor(imgs).to(’cuda’)[...,[2,1,0]].permute([0,3,1,2])/255 print(’cv2 讀取時(shí)間1:’, time() - start_t) # cv2保存start_t = time()imgs = (imgs.permute([0,2,3,1])[...,[2,1,0]]*255).cpu().numpy()for i in range(imgs.shape[0]): cv.imwrite(write_path + str(i) + ’.jpg’, imgs[i])print(’cv2 保存時(shí)間:’, time() - start_t)

 實(shí)驗(yàn)結(jié)果:

cv2 讀取時(shí)間1: 0.39693760871887207cv2 保存時(shí)間: 0.3560612201690674

第二種方式實(shí)驗(yàn)代碼如下:

import os, torchimport cv2 as cv import numpy as np from time import time read_path = ’D:test’write_path = ’D:testwrite’ # cv2讀取 2start_t = time()imgs = torch.zeros([5, 1080, 1920, 3], device=’cuda’)for img, i in zip(os.listdir(read_path), range(5)): img = torch.tensor(cv.imread(filename=os.path.join(read_path, img)), device=’cuda’) imgs[i] = img imgs = imgs[...,[2,1,0]].permute([0,3,1,2])/255 print(’cv2 讀取時(shí)間2:’, time() - start_t) # cv2保存start_t = time()imgs = (imgs.permute([0,2,3,1])[...,[2,1,0]]*255).cpu().numpy()for i in range(imgs.shape[0]): cv.imwrite(write_path + str(i) + ’.jpg’, imgs[i])print(’cv2 保存時(shí)間:’, time() - start_t)

實(shí)驗(yàn)結(jié)果:

cv2 讀取時(shí)間2: 0.23636841773986816cv2 保存時(shí)間: 0.3066873550415039

2.2 matplotlib

同樣兩種讀取方式,第一種代碼如下:

import os, torch import numpy as npimport matplotlib.pyplot as plt from time import time read_path = ’D:test’write_path = ’D:testwrite’ # matplotlib 讀取 1start_t = time()imgs = np.zeros([5, 1080, 1920, 3])for img, i in zip(os.listdir(read_path), range(5)): img = plt.imread(os.path.join(read_path, img)) imgs[i] = img imgs = torch.tensor(imgs).to(’cuda’).permute([0,3,1,2])/255 print(’matplotlib 讀取時(shí)間1:’, time() - start_t) # matplotlib 保存start_t = time()imgs = (imgs.permute([0,2,3,1])).cpu().numpy()for i in range(imgs.shape[0]): plt.imsave(write_path + str(i) + ’.jpg’, imgs[i])print(’matplotlib 保存時(shí)間:’, time() - start_t)

實(shí)驗(yàn)結(jié)果:

matplotlib 讀取時(shí)間1: 0.45380306243896484matplotlib 保存時(shí)間: 0.768944263458252

第二種方式實(shí)驗(yàn)代碼:

import os, torch import numpy as npimport matplotlib.pyplot as plt from time import time read_path = ’D:test’write_path = ’D:testwrite’ # matplotlib 讀取 2start_t = time()imgs = torch.zeros([5, 1080, 1920, 3], device=’cuda’)for img, i in zip(os.listdir(read_path), range(5)): img = torch.tensor(plt.imread(os.path.join(read_path, img)), device=’cuda’) imgs[i] = img imgs = imgs.permute([0,3,1,2])/255 print(’matplotlib 讀取時(shí)間2:’, time() - start_t) # matplotlib 保存start_t = time()imgs = (imgs.permute([0,2,3,1])).cpu().numpy()for i in range(imgs.shape[0]): plt.imsave(write_path + str(i) + ’.jpg’, imgs[i])print(’matplotlib 保存時(shí)間:’, time() - start_t)

實(shí)驗(yàn)結(jié)果:

matplotlib 讀取時(shí)間2: 0.2044532299041748matplotlib 保存時(shí)間: 0.4737534523010254

需要注意的是,matplotlib讀取png格式圖片獲取的數(shù)組的數(shù)值是在[0,1][0,1]范圍內(nèi)的浮點(diǎn)數(shù),而jpg格式圖片卻是在[0,255][0,255]范圍內(nèi)的整數(shù)。所以如果數(shù)據(jù)集內(nèi)圖片格式不一致,要注意先轉(zhuǎn)換為一致再讀取,否則數(shù)據(jù)集的預(yù)處理就麻煩了。

2.3 PIL

PIL的讀取與寫入并不能直接使用pytorch張量或numpy數(shù)組,要先轉(zhuǎn)換為Image類型,所以很麻煩,時(shí)間復(fù)雜度上肯定也是占下風(fēng)的,就不實(shí)驗(yàn)了。

2.4 torchvision

torchvision提供了直接從pytorch張量保存圖片的功能,和上面讀取最快的matplotlib的方法結(jié)合,代碼如下:

import os, torch import matplotlib.pyplot as plt from time import time from torchvision import utils read_path = ’D:test’write_path = ’D:testwrite’ # matplotlib 讀取 2start_t = time()imgs = torch.zeros([5, 1080, 1920, 3], device=’cuda’)for img, i in zip(os.listdir(read_path), range(5)): img = torch.tensor(plt.imread(os.path.join(read_path, img)), device=’cuda’) imgs[i] = img imgs = imgs.permute([0,3,1,2])/255 print(’matplotlib 讀取時(shí)間2:’, time() - start_t) # torchvision 保存start_t = time() for i in range(imgs.shape[0]): utils.save_image(imgs[i], write_path + str(i) + ’.jpg’)print(’torchvision 保存時(shí)間:’, time() - start_t)

實(shí)驗(yàn)結(jié)果:

matplotlib 讀取時(shí)間2: 0.15358829498291016torchvision 保存時(shí)間: 0.14760661125183105

可以看出這兩個(gè)是最快的讀寫方法。另外,要讓圖片的讀寫盡量不影響訓(xùn)練進(jìn)程,我們還可以讓這兩個(gè)過程與訓(xùn)練并行。另外,utils.save_image可以將多張圖片拼接成一張來保存,具體使用方法如下:

utils.save_image(tensor = imgs, # 要保存的多張圖片張量 shape = [n, C, H, W] fp = ’test.jpg’, # 保存路徑 nrow = 5, # 多圖拼接時(shí),每行所占的圖片數(shù) padding = 1, # 多圖拼接時(shí),每張圖之間的間距 normalize = True, # 是否進(jìn)行規(guī)范化,通常輸出圖像用tanh,所以要用規(guī)范化 range = (-1,1)) # 規(guī)范化的范圍

以上就是Python圖像讀寫方法對(duì)比的詳細(xì)內(nèi)容,更多關(guān)于python 圖像讀寫的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产欧美亚洲精品第一区 | 五十路一区二区三区视频 | 日韩中文字幕在线视频 | 免费国产一区二区三区四区 | 国产美女在线看 | 精品视频一区二区三区在线播放 | 久久久日韩精品国产成人 | 日韩欧美国产中文字幕 | 国产大毛片 | 国产l精品国产亚洲区久久 国产ppp在线视频在线观看 | 本道久久 | 91短视频版在线观看www免费 | 91在线激情在线观看 | 欧美一区二区放荡人妇 | 青青草国产精品人人爱99 | 日韩精品你懂的在线播放 | 免费黄色网址在线播放 | 九九九久久久 | 国产在线爱做人成小视频 | 国产成+人+综合+欧美 亚洲 | 中文字幕在线久热精品 | 欧美亚洲日本国产综合网 | 美女翘臀白浆直流视频 | 97国内免费久久久久久久久久 | 亚洲美女在线视频 | 免费观看日本人成影片 | 国产成人19禁在线观看 | 91久久精品视频 | 天天噜噜色 | 久草看片| 国产亚洲精品久久麻豆 | 日韩欧美国产中文字幕 | 麻豆传媒视频网站 | 国产亚洲精品国产福利在线观看 | 久草资源在线播放 | 日韩 欧美 亚洲 | 黄色片网址在线观看 | 国产美女在线一区二区三区 | 日本无翼乌邪恶彩色大全 | 欧美夜恋影院夜恋秀场 | 国产欧美亚洲精品 |